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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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])