Mercurial > hg-git
annotate hggit/compat.py @ 1092:3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Beginning with dulwich 0.18, it now supports reporting the symrefs so we
no longer need to monkey patch (will require future patches to use the
new code, though).
author | Sean Farley <sean@farley.io> |
---|---|
date | Mon, 27 Nov 2017 17:45:51 -0500 |
parents | c06d4656b77b |
children | 8e61d7a29932 |
rev | line source |
---|---|
991
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
1 from mercurial import ( |
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
2 url, |
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
3 util as hgutil, |
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
4 ) |
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
5 |
850
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
6 try: |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
7 from mercurial import encoding |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
8 hfsignoreclean = encoding.hfsignoreclean |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
9 except AttributeError: |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
10 # compat with hg 3.2.1 and earlier, which doesn't have |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
11 # hfsignoreclean (This was borrowed wholesale from hg 3.2.2.) |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
12 _ignore = [unichr(int(x, 16)).encode("utf-8") for x in |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
13 "200c 200d 200e 200f 202a 202b 202c 202d 202e " |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
14 "206a 206b 206c 206d 206e 206f feff".split()] |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
15 # verify the next function will work |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
16 assert set([i[0] for i in _ignore]) == set(["\xe2", "\xef"]) |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
17 |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
18 def hfsignoreclean(s): |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
19 """Remove codepoints ignored by HFS+ from s. |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
20 |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
21 >>> hfsignoreclean(u'.h\u200cg'.encode('utf-8')) |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
22 '.hg' |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
23 >>> hfsignoreclean(u'.h\ufeffg'.encode('utf-8')) |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
24 '.hg' |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
25 """ |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
26 if "\xe2" in s or "\xef" in s: |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
27 for c in _ignore: |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
28 s = s.replace(c, '') |
81c55f8629ba
hg2git: audit path components during export (CVE-2014-9390)
Augie Fackler <raf@durin42.com>
parents:
diff
changeset
|
29 return s |
991
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
30 |
1088
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
31 try: |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
32 from mercurial import vfs as vfsmod |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
33 hgvfs = vfsmod.vfs |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
34 except ImportError: |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
35 # vfsmod was extracted in hg 4.2 |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
36 from mercurial import scmutil |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
37 hgvfs = scmutil.vfs |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
38 |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
39 def gitvfs(repo): |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
40 """return a vfs suitable to read git related data""" |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
41 # Mercurial >= 3.3: repo.shared() |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
42 if repo.sharedpath != repo.path: |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
43 return hgvfs(repo.sharedpath) |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
44 else: |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
45 return repo.vfs |
c06d4656b77b
shared: fix compatibility with hg < 4.2
Kevin Bullock <kbullock@ringworld.org>
parents:
1080
diff
changeset
|
46 |
1035
cfcd3032355c
compat: remove unused argument
Kevin Bullock <kbullock@ringworld.org>
parents:
1005
diff
changeset
|
47 def passwordmgr(ui): |
991
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
48 try: |
1036
da62ef0569bb
compat: fix fallback for ui.passwordmgr
Kevin Bullock <kbullock@ringworld.org>
parents:
1035
diff
changeset
|
49 realm = hgutil.urlreq.httppasswordmgrwithdefaultrealm() |
da62ef0569bb
compat: fix fallback for ui.passwordmgr
Kevin Bullock <kbullock@ringworld.org>
parents:
1035
diff
changeset
|
50 return url.passwordmgr(ui, realm) |
da62ef0569bb
compat: fix fallback for ui.passwordmgr
Kevin Bullock <kbullock@ringworld.org>
parents:
1035
diff
changeset
|
51 except (TypeError, AttributeError): |
991
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
52 # compat with hg < 3.9 |
92d7702c19da
compat: add method for backwards compatible passwordmgr
Sean Farley <sean@farley.io>
parents:
850
diff
changeset
|
53 return url.passwordmgr(ui) |
1005
31f52d62ae13
compat: add method for dulwich to return the symref
Sean Farley <sean@farley.io>
parents:
991
diff
changeset
|
54 |
1092
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
55 |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
56 try: |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
57 import dulwich.client |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
58 FetchPackResult = dulwich.client.FetchPackResult |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
59 read_pkt_refs = dulwich.client.read_pkt_refs |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
60 except (AttributeError, ImportError): |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
61 # older dulwich doesn't return the symref where remote HEAD points, so we |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
62 # monkey patch it here |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
63 from dulwich.errors import GitProtocolError |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
64 from dulwich.protocol import extract_capabilities |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
65 |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
66 |
1005
31f52d62ae13
compat: add method for dulwich to return the symref
Sean Farley <sean@farley.io>
parents:
991
diff
changeset
|
67 |
1092
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
68 def read_pkt_refs(proto): |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
69 server_capabilities = None |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
70 refs = {} |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
71 # Receive refs from server |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
72 for pkt in proto.read_pkt_seq(): |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
73 (sha, ref) = pkt.rstrip('\n').split(None, 1) |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
74 if sha == 'ERR': |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
75 raise GitProtocolError(ref) |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
76 if server_capabilities is None: |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
77 (ref, server_capabilities) = extract_capabilities(ref) |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
78 symref = 'symref=HEAD:' |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
79 for cap in server_capabilities: |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
80 if cap.startswith(symref): |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
81 sha = cap.replace(symref, '') |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
82 refs[ref] = sha |
1005
31f52d62ae13
compat: add method for dulwich to return the symref
Sean Farley <sean@farley.io>
parents:
991
diff
changeset
|
83 |
1092
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
84 if len(refs) == 0: |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
85 return None, set([]) |
3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Sean Farley <sean@farley.io>
parents:
1088
diff
changeset
|
86 return refs, set(server_capabilities) |
1061
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
87 |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
88 |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
89 CONFIG_DEFAULTS = { |
1063
ae5759bf5bcd
config: register git.blockdotgit
Kevin Bullock <kbullock@ringworld.org>
parents:
1062
diff
changeset
|
90 'git': { |
1066
ddae0045de4e
config: register git.authors
Kevin Bullock <kbullock@ringworld.org>
parents:
1065
diff
changeset
|
91 'authors': None, |
1063
ae5759bf5bcd
config: register git.blockdotgit
Kevin Bullock <kbullock@ringworld.org>
parents:
1062
diff
changeset
|
92 'blockdotgit': True, |
1073
03e7c9d1fbb6
config: register git.blockdothg
Kevin Bullock <kbullock@ringworld.org>
parents:
1072
diff
changeset
|
93 'blockdothg': True, |
1065
78dc28eb4245
config: register git.branch_bookmark_suffix
Kevin Bullock <kbullock@ringworld.org>
parents:
1064
diff
changeset
|
94 'branch_bookmark_suffix': None, |
1068
914e5477b17e
config: register git.debugextrainmessage
Kevin Bullock <kbullock@ringworld.org>
parents:
1067
diff
changeset
|
95 'debugextrainmessage': False, # test only -- do not document this! |
1072
f7433379c04a
config: register git.findcopiesharder
Kevin Bullock <kbullock@ringworld.org>
parents:
1071
diff
changeset
|
96 'findcopiesharder': False, |
1064
d37336a87b70
config: register git.intree
Kevin Bullock <kbullock@ringworld.org>
parents:
1063
diff
changeset
|
97 'intree': None, |
1069
88db6948a5a8
config: register git.mindate
Kevin Bullock <kbullock@ringworld.org>
parents:
1068
diff
changeset
|
98 'mindate': None, |
1080
d96f998a718f
config: register defaults for phase-related config options
Kevin Bullock <kbullock@ringworld.org>
parents:
1073
diff
changeset
|
99 'public': list, |
1071
00baa6a2abc8
config: register git.renamelimit
Kevin Bullock <kbullock@ringworld.org>
parents:
1070
diff
changeset
|
100 'renamelimit': 400, |
1070
0b4144897f73
config: register git.similarity
Kevin Bullock <kbullock@ringworld.org>
parents:
1069
diff
changeset
|
101 'similarity': 0, |
1063
ae5759bf5bcd
config: register git.blockdotgit
Kevin Bullock <kbullock@ringworld.org>
parents:
1062
diff
changeset
|
102 }, |
1067
f4c2b42731ea
config: register hggit.mapsavefrequency
Kevin Bullock <kbullock@ringworld.org>
parents:
1066
diff
changeset
|
103 'hggit': { |
f4c2b42731ea
config: register hggit.mapsavefrequency
Kevin Bullock <kbullock@ringworld.org>
parents:
1066
diff
changeset
|
104 'mapsavefrequency': 0, |
1080
d96f998a718f
config: register defaults for phase-related config options
Kevin Bullock <kbullock@ringworld.org>
parents:
1073
diff
changeset
|
105 'usephases': False, |
1067
f4c2b42731ea
config: register hggit.mapsavefrequency
Kevin Bullock <kbullock@ringworld.org>
parents:
1066
diff
changeset
|
106 } |
1061
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
107 } |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
108 |
1062
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
109 hasconfigitems = False |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
110 |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
111 def registerconfigs(configitem): |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
112 global hasconfigitems |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
113 hasconfigitems = True |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
114 for section, items in CONFIG_DEFAULTS.iteritems(): |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
115 for item, default in items.iteritems(): |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
116 configitem(section, item, default=default) |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
117 |
1061
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
118 def config(ui, subtype, section, item): |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
119 if subtype == 'string': |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
120 subtype = '' |
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
121 getconfig = getattr(ui, 'config' + subtype) |
1062
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
122 if hasconfigitems: |
c249de74742b
compat: use config registrar if available
Kevin Bullock <kbullock@ringworld.org>
parents:
1061
diff
changeset
|
123 return getconfig(section, item) |
1061
a2eccdeed26d
config: provide a central place to define and access defaults
Kevin Bullock <kbullock@ringworld.org>
parents:
1036
diff
changeset
|
124 return getconfig(section, item, CONFIG_DEFAULTS[section][item]) |