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