Mercurial > hg-git
annotate hggit/overlay.py @ 964:b867b5f0a63a
overlay: regularize mercurial imports
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Thu, 31 Dec 2015 12:37:40 -0800 |
parents | db308eba5251 |
children | 07473e474bc4 |
rev | line source |
---|---|
408 | 1 # overlay classes for repositories |
2 # unifies access to unimported git objects and committed hg objects | |
3 # designed to support incoming | |
4 # | |
5 # incomplete, implemented on demand | |
6 | |
964
b867b5f0a63a
overlay: regularize mercurial imports
Siddharth Agarwal <sid0@fb.com>
parents:
900
diff
changeset
|
7 from mercurial import ( |
b867b5f0a63a
overlay: regularize mercurial imports
Siddharth Agarwal <sid0@fb.com>
parents:
900
diff
changeset
|
8 ancestor, |
b867b5f0a63a
overlay: regularize mercurial imports
Siddharth Agarwal <sid0@fb.com>
parents:
900
diff
changeset
|
9 manifest, |
b867b5f0a63a
overlay: regularize mercurial imports
Siddharth Agarwal <sid0@fb.com>
parents:
900
diff
changeset
|
10 context, |
b867b5f0a63a
overlay: regularize mercurial imports
Siddharth Agarwal <sid0@fb.com>
parents:
900
diff
changeset
|
11 ) |
408 | 12 from mercurial.node import bin, hex, nullid |
13 | |
620
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
14 def _maybehex(n): |
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
15 if len(n) == 20: |
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
16 return hex(n) |
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
17 return n |
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
18 |
408 | 19 class overlaymanifest(object): |
20 def __init__(self, repo, sha): | |
21 self.repo = repo | |
22 self.tree = repo.handler.git.get_object(sha) | |
23 self._map = None | |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
24 self._flags = None |
408 | 25 |
466
ac16efd25cc4
overlaymanifest: add the withflags method introduced in hg change a1dcd842ce17
Augie Fackler <raf@durin42.com>
parents:
423
diff
changeset
|
26 def withflags(self): |
ac16efd25cc4
overlaymanifest: add the withflags method introduced in hg change a1dcd842ce17
Augie Fackler <raf@durin42.com>
parents:
423
diff
changeset
|
27 self.load() |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
28 return set([path for path, flag in self._flags.iteritems() |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
29 if flag != '']) |
466
ac16efd25cc4
overlaymanifest: add the withflags method introduced in hg change a1dcd842ce17
Augie Fackler <raf@durin42.com>
parents:
423
diff
changeset
|
30 |
408 | 31 def copy(self): |
32 return overlaymanifest(self.repo, self.tree.id) | |
33 | |
34 def keys(self): | |
35 self.load() | |
36 return self._map.keys() | |
37 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
38 def iterkeys(self): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
39 return iter(self.keys()) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
40 |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
41 def load(self): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
42 if self._map is not None: |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
43 return |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
44 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
45 self._map = {} |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
46 self._flags = {} |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
47 |
408 | 48 def hgflag(gitflag): |
49 if gitflag & 0100: | |
50 return 'x' | |
51 elif gitflag & 020000: | |
52 return 'l' | |
53 else: | |
54 return '' | |
55 | |
56 def addtree(tree, dirname): | |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
57 for entry in tree.iteritems(): |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
58 if entry.mode & 040000: |
408 | 59 # expand directory |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
60 subtree = self.repo.handler.git.get_object(entry.sha) |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
61 addtree(subtree, dirname + entry.path + '/') |
408 | 62 else: |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
63 path = dirname + entry.path |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
64 self._map[path] = bin(entry.sha) |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
65 self._flags[path] = hgflag(entry.mode) |
408 | 66 |
67 addtree(self.tree, '') | |
68 | |
829
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
69 def matches(self, match): |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
70 '''generate a new manifest filtered by the match argument''' |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
71 if match.always(): |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
72 return self.copy() |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
73 |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
74 mf = self.copy() |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
75 for fn in mf.keys(): |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
76 if not match(fn): |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
77 del mf[fn] |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
78 return mf |
64fa5ea18b89
manifest: add matches() to overlay
Durham Goode <durham@fb.com>
parents:
690
diff
changeset
|
79 |
597
3964de9961ec
overlaymanifest: add iteritems(), used by recent hg versions
Augie Fackler <raf@durin42.com>
parents:
570
diff
changeset
|
80 def iteritems(self): |
3964de9961ec
overlaymanifest: add iteritems(), used by recent hg versions
Augie Fackler <raf@durin42.com>
parents:
570
diff
changeset
|
81 self.load() |
3964de9961ec
overlaymanifest: add iteritems(), used by recent hg versions
Augie Fackler <raf@durin42.com>
parents:
570
diff
changeset
|
82 return self._map.iteritems() |
3964de9961ec
overlaymanifest: add iteritems(), used by recent hg versions
Augie Fackler <raf@durin42.com>
parents:
570
diff
changeset
|
83 |
408 | 84 def __iter__(self): |
85 self.load() | |
86 return self._map.__iter__() | |
87 | |
88 def __getitem__(self, path): | |
89 self.load() | |
90 return self._map[path] | |
91 | |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
92 def __contains__(self, path): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
93 self.load() |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
94 return path in self._map |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
95 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
96 def get(self, path, default=None): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
97 self.load() |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
98 return self._map.get(path, default) |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
99 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
100 def diff(self, m2, clean=False): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
101 self.load() |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
102 if isinstance(m2, overlaymanifest): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
103 m2.load() |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
104 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
105 # below code copied from manifest.py:manifestdict.diff |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
106 diff = {} |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
107 |
899
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
108 try: |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
109 m2flagget = m2.flags |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
110 except AttributeError: |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
111 # Mercurial <= 3.3 |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
112 m2flagget = m2._flags.get |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
113 |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
114 for fn, n1 in self.iteritems(): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
115 fl1 = self._flags.get(fn, '') |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
116 n2 = m2.get(fn, None) |
899
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
117 fl2 = m2flagget(fn, '') |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
118 if n2 is None: |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
119 fl2 = '' |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
120 if n1 != n2 or fl1 != fl2: |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
121 diff[fn] = ((n1, fl1), (n2, fl2)) |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
122 elif clean: |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
123 diff[fn] = None |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
124 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
125 for fn, n2 in m2.iteritems(): |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
126 if fn not in self: |
899
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
127 fl2 = m2flagget(fn, '') |
856
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
128 diff[fn] = ((None, ''), (n2, fl2)) |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
129 |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
130 return diff |
15d2b119ca99
overlaymanifest: implement more methods for Mercurial 3.3 compatibility
Siddharth Agarwal <sid0@fb.com>
parents:
855
diff
changeset
|
131 |
408 | 132 def __delitem__(self, path): |
133 del self._map[path] | |
134 | |
899
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
135 def wrapmanifestdictdiff(orig, self, m2, clean=False): |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
136 '''avoid calling into lazymanifest code if m2 is an overlaymanifest''' |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
137 if isinstance(m2, overlaymanifest): |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
138 diff = m2.diff(self, clean=clean) |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
139 # since we calculated the diff with m2 vs m1, flip it around |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
140 for fn in diff: |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
141 c1, c2 = diff[fn] |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
142 diff[fn] = c2, c1 |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
143 return diff |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
144 else: |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
145 return orig(self, m2, clean=clean) |
11ca21820a95
overlay: adapt diff to work with lazymanifests
Siddharth Agarwal <sid0@fb.com>
parents:
896
diff
changeset
|
146 |
408 | 147 class overlayfilectx(object): |
148 def __init__(self, repo, path, fileid=None): | |
149 self.repo = repo | |
150 self._path = path | |
151 self.fileid = fileid | |
152 | |
153 # this is a hack to skip copy detection | |
154 def ancestors(self): | |
155 return [self, self] | |
156 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
157 def filenode(self): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
158 return nullid |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
159 |
408 | 160 def rev(self): |
161 return -1 | |
162 | |
163 def path(self): | |
164 return self._path | |
165 | |
166 def filelog(self): | |
167 return self.fileid | |
168 | |
169 def data(self): | |
620
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
170 blob = self.repo.handler.git.get_object(_maybehex(self.fileid)) |
408 | 171 return blob.data |
172 | |
173 class overlaychangectx(context.changectx): | |
174 def __init__(self, repo, sha): | |
175 self.repo = repo | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
176 if not isinstance(sha, basestring): |
896 | 177 sha = sha.hex() |
620
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
178 self.commit = repo.handler.git.get_object(_maybehex(sha)) |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
179 self._overlay = getattr(repo, 'gitoverlay', repo) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
180 self._rev = self._overlay.rev(bin(self.commit.id)) |
408 | 181 |
182 def node(self): | |
183 return bin(self.commit.id) | |
184 | |
185 def rev(self): | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
186 return self._rev |
408 | 187 |
188 def date(self): | |
189 return self.commit.author_time, self.commit.author_timezone | |
190 | |
191 def branch(self): | |
192 return 'default' | |
193 | |
194 def user(self): | |
195 return self.commit.author | |
196 | |
197 def files(self): | |
198 return [] | |
199 | |
200 def extra(self): | |
201 return {} | |
202 | |
203 def description(self): | |
204 return self.commit.message | |
205 | |
206 def parents(self): | |
900
db308eba5251
overlaychangectx: use overlayrevlog logic to determine parents
Siddharth Agarwal <sid0@fb.com>
parents:
899
diff
changeset
|
207 cl = self.repo.changelog |
db308eba5251
overlaychangectx: use overlayrevlog logic to determine parents
Siddharth Agarwal <sid0@fb.com>
parents:
899
diff
changeset
|
208 parents = cl.parents(cl.node(self._rev)) |
873
517cf1b5e626
overlaychangectx: return nullrev if commit has no parents
Siddharth Agarwal <sid0@fb.com>
parents:
856
diff
changeset
|
209 if not parents: |
517cf1b5e626
overlaychangectx: return nullrev if commit has no parents
Siddharth Agarwal <sid0@fb.com>
parents:
856
diff
changeset
|
210 return [self.repo['null']] |
900
db308eba5251
overlaychangectx: use overlayrevlog logic to determine parents
Siddharth Agarwal <sid0@fb.com>
parents:
899
diff
changeset
|
211 if parents[1] == nullid: |
db308eba5251
overlaychangectx: use overlayrevlog logic to determine parents
Siddharth Agarwal <sid0@fb.com>
parents:
899
diff
changeset
|
212 parents = parents[:-1] |
db308eba5251
overlaychangectx: use overlayrevlog logic to determine parents
Siddharth Agarwal <sid0@fb.com>
parents:
899
diff
changeset
|
213 return [self.repo[sha] for sha in parents] |
408 | 214 |
215 def manifestnode(self): | |
216 return bin(self.commit.tree) | |
217 | |
218 def hex(self): | |
219 return self.commit.id | |
220 | |
221 def tags(self): | |
222 return [] | |
223 | |
224 def bookmarks(self): | |
225 return [] | |
226 | |
227 def manifest(self): | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
228 return overlaymanifest(self._overlay, self.commit.tree) |
408 | 229 |
230 def filectx(self, path, filelog=None): | |
231 mf = self.manifest() | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
232 return overlayfilectx(self._overlay, path, mf[path]) |
408 | 233 |
234 def flags(self, path): | |
235 mf = self.manifest() | |
236 return mf.flags(path) | |
237 | |
238 def __nonzero__(self): | |
239 return True | |
240 | |
568
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
241 def phase(self): |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
242 try: |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
243 from mercurial import phases |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
244 return phases.draft |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
245 except ImportError: |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
246 return 1 |
41f6e3df67b1
overlaychangectx: fix compatibility with mercurial 2.4-rc (no attribute _repo)
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
247 |
855
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
248 def totuple(self): |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
249 return (self.commit.tree, self.user(), self.date(), self.files(), |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
250 self.description(), self.extra()) |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
251 |
408 | 252 class overlayrevlog(object): |
253 def __init__(self, repo, base): | |
254 self.repo = repo | |
255 self.base = base | |
256 | |
257 def parents(self, n): | |
258 gitrev = self.repo.revmap.get(n) | |
689
aa8519daf037
overlayrevlog: handle rev = 0 correctly
Siddharth Agarwal <sid0@fb.com>
parents:
684
diff
changeset
|
259 if gitrev is None: |
408 | 260 # we've reached a revision we have |
261 return self.base.parents(n) | |
620
0a514e303a06
overlay: add kludge to make sure we only ever give hexshas to dulwich
Augie Fackler <raf@durin42.com>
parents:
612
diff
changeset
|
262 commit = self.repo.handler.git.get_object(_maybehex(n)) |
408 | 263 |
690
c99941ff2d28
overlayrevlog: handle root commits correctly
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
264 if not commit.parents: |
c99941ff2d28
overlayrevlog: handle root commits correctly
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
265 return [nullid, nullid] |
c99941ff2d28
overlayrevlog: handle root commits correctly
Siddharth Agarwal <sid0@fb.com>
parents:
689
diff
changeset
|
266 |
408 | 267 def gitorhg(n): |
268 hn = self.repo.handler.map_hg_get(hex(n)) | |
269 if hn is not None: | |
270 return bin(hn) | |
271 return n | |
272 | |
273 # currently ignores the octopus | |
274 p1 = gitorhg(bin(commit.parents[0])) | |
275 if len(commit.parents) > 1: | |
276 p2 = gitorhg(bin(commit.parents[1])) | |
277 else: | |
278 p2 = nullid | |
279 | |
280 return [p1, p2] | |
281 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
282 def ancestor(self, a, b): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
283 anode = self.repo.nodemap.get(a) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
284 bnode = self.repo.nodemap.get(b) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
285 if anode is None and bnode is None: |
896 | 286 return self.base.ancestor(a, b) |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
287 ancs = ancestor.ancestors(self.parentrevs, a, b) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
288 if ancs: |
896 | 289 return min(map(self.node, ancs)) |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
290 return nullid |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
291 |
408 | 292 def parentrevs(self, rev): |
293 return [self.rev(p) for p in self.parents(self.node(rev))] | |
294 | |
295 def node(self, rev): | |
296 gitnode = self.repo.nodemap.get(rev) | |
297 if gitnode is None: | |
298 return self.base.node(rev) | |
299 return gitnode | |
300 | |
301 def rev(self, n): | |
302 gitrev = self.repo.revmap.get(n) | |
303 if gitrev is None: | |
896 | 304 return self.base.rev(n) |
408 | 305 return gitrev |
306 | |
307 def __len__(self): | |
308 return len(self.repo.handler.repo) + len(self.repo.revmap) | |
309 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
310 class overlaymanifestlog(overlayrevlog): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
311 def read(self, sha): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
312 if sha == nullid: |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
313 return manifest.manifestdict() |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
314 return overlaymanifest(self.repo, sha) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
315 |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
316 class overlaychangelog(overlayrevlog): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
317 def read(self, sha): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
318 if isinstance(sha, int): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
319 sha = self.node(sha) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
320 if sha == nullid: |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
321 return (nullid, "", (0, 0), [], "", {}) |
855
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
322 try: |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
323 return self.base.read(sha) |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
324 except LookupError: |
4538981d2c3f
overlaychangelog: return tuples for read()
Siddharth Agarwal <sid0@fb.com>
parents:
854
diff
changeset
|
325 return overlaychangectx(self.repo, sha).totuple() |
408 | 326 |
327 class overlayrepo(object): | |
328 def __init__(self, handler, commits, refs): | |
329 self.handler = handler | |
330 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
331 self.changelog = overlaychangelog(self, handler.repo.changelog) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
332 self.manifest = overlaymanifestlog(self, handler.repo.manifest) |
408 | 333 |
334 # for incoming -p | |
335 self.root = handler.repo.root | |
336 self.getcwd = handler.repo.getcwd | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
337 # self.status = handler.repo.status |
408 | 338 self.ui = handler.repo.ui |
339 | |
340 self.revmap = None | |
341 self.nodemap = None | |
342 self.refmap = None | |
343 self.tagmap = None | |
344 | |
345 self._makemaps(commits, refs) | |
346 | |
854
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
347 try: |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
348 # Mercurial >= 3.3 |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
349 from mercurial import namespaces |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
350 self.names = namespaces.namespaces() |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
351 except ImportError: |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
352 pass |
eba7dcfab1bb
overlay: add namespace support to overlayrepo to support Mercurial >= 3.3
Siddharth Agarwal <sid0@fb.com>
parents:
829
diff
changeset
|
353 |
408 | 354 def __getitem__(self, n): |
355 if n not in self.revmap: | |
356 return self.handler.repo[n] | |
357 return overlaychangectx(self, n) | |
358 | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
359 def _handlerhack(self, method, *args, **kwargs): |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
360 nothing = object() |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
361 r = self.handler.repo |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
362 oldhandler = getattr(r, 'handler', nothing) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
363 oldoverlay = getattr(r, 'gitoverlay', nothing) |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
364 r.handler = self.handler |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
365 r.gitoverlay = self |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
366 try: |
896 | 367 return getattr(r, method)(*args, **kwargs) |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
368 finally: |
896 | 369 if oldhandler is nothing: |
370 del r.handler | |
371 else: | |
372 r.handler = oldhandler | |
373 if oldoverlay is nothing: | |
374 del r.gitoverlay | |
375 else: | |
376 r.gitoverlay = oldoverlay | |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
377 |
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
378 def status(self, *args, **kwargs): |
896 | 379 return self._handlerhack('status', *args, **kwargs) |
612
bf8518b09d57
overlays: fix incoming support for hg 2.8
Augie Fackler <raf@durin42.com>
parents:
597
diff
changeset
|
380 |
557
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
381 def node(self, n): |
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
382 """Returns an Hg or Git hash for the specified Git hash""" |
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
383 if bin(n) in self.revmap: |
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
384 return n |
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
385 return self.handler.map_hg_get(n) |
4f4ab2d89375
gitrepo: initial support for listkeys
David M. Carr <david@carrclan.us>
parents:
466
diff
changeset
|
386 |
408 | 387 def nodebookmarks(self, n): |
388 return self.refmap.get(n, []) | |
389 | |
390 def nodetags(self, n): | |
391 return self.tagmap.get(n, []) | |
392 | |
393 def rev(self, n): | |
394 return self.revmap[n] | |
395 | |
396 def filectx(self, path, fileid=None): | |
397 return overlayfilectx(self, path, fileid=fileid) | |
398 | |
399 def _makemaps(self, commits, refs): | |
400 baserev = self.handler.repo['tip'].rev() | |
401 self.revmap = {} | |
402 self.nodemap = {} | |
403 for i, n in enumerate(commits): | |
404 rev = baserev + i + 1 | |
405 self.revmap[n] = rev | |
406 self.nodemap[rev] = n | |
407 | |
408 self.refmap = {} | |
409 self.tagmap = {} | |
410 for ref in refs: | |
411 if ref.startswith('refs/heads/'): | |
412 refname = ref[11:] | |
413 self.refmap.setdefault(bin(refs[ref]), []).append(refname) | |
414 elif ref.startswith('refs/tags/'): | |
415 tagname = ref[10:] | |
416 self.tagmap.setdefault(bin(refs[ref]), []).append(tagname) |