Mercurial > hg-git
annotate hggit/overlay.py @ 423:f29401590803
overlay: stop using deprecated tree.entries() method
author | Augie Fackler <durin42@gmail.com> |
---|---|
date | Fri, 09 Sep 2011 13:44:58 -0500 |
parents | 2dcfd4bbfc1a |
children | ac16efd25cc4 |
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 | |
7 from mercurial import context | |
8 from mercurial.node import bin, hex, nullid | |
9 | |
10 class overlaymanifest(object): | |
11 def __init__(self, repo, sha): | |
12 self.repo = repo | |
13 self.tree = repo.handler.git.get_object(sha) | |
14 self._map = None | |
15 self._flagmap = None | |
16 | |
17 def copy(self): | |
18 return overlaymanifest(self.repo, self.tree.id) | |
19 | |
20 def keys(self): | |
21 self.load() | |
22 return self._map.keys() | |
23 | |
24 def flags(self, path): | |
25 self.load() | |
26 | |
27 def hgflag(gitflag): | |
28 if gitflag & 0100: | |
29 return 'x' | |
30 elif gitflag & 020000: | |
31 return 'l' | |
32 else: | |
33 return '' | |
34 | |
35 return hgflag(self._flagmap[path]) | |
36 | |
37 def load(self): | |
38 if self._map is not None: | |
39 return | |
40 | |
41 self._map = {} | |
42 self._flagmap = {} | |
43 | |
44 def addtree(tree, dirname): | |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
45 for entry in tree.iteritems(): |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
46 if entry.mode & 040000: |
408 | 47 # expand directory |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
48 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
|
49 addtree(subtree, dirname + entry.path + '/') |
408 | 50 else: |
423
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
51 path = dirname + entry.path |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
52 self._map[path] = bin(entry.sha) |
f29401590803
overlay: stop using deprecated tree.entries() method
Augie Fackler <durin42@gmail.com>
parents:
408
diff
changeset
|
53 self._flagmap[path] = entry.mode |
408 | 54 |
55 addtree(self.tree, '') | |
56 | |
57 def __iter__(self): | |
58 self.load() | |
59 return self._map.__iter__() | |
60 | |
61 def __getitem__(self, path): | |
62 self.load() | |
63 return self._map[path] | |
64 | |
65 def __delitem__(self, path): | |
66 del self._map[path] | |
67 | |
68 class overlayfilectx(object): | |
69 def __init__(self, repo, path, fileid=None): | |
70 self.repo = repo | |
71 self._path = path | |
72 self.fileid = fileid | |
73 | |
74 # this is a hack to skip copy detection | |
75 def ancestors(self): | |
76 return [self, self] | |
77 | |
78 def rev(self): | |
79 return -1 | |
80 | |
81 def path(self): | |
82 return self._path | |
83 | |
84 def filelog(self): | |
85 return self.fileid | |
86 | |
87 def data(self): | |
88 blob = self.repo.handler.git.get_object(self.fileid) | |
89 return blob.data | |
90 | |
91 class overlaychangectx(context.changectx): | |
92 def __init__(self, repo, sha): | |
93 self.repo = repo | |
94 self.commit = repo.handler.git.get_object(sha) | |
95 | |
96 def node(self): | |
97 return bin(self.commit.id) | |
98 | |
99 def rev(self): | |
100 return self.repo.rev(bin(self.commit.id)) | |
101 | |
102 def date(self): | |
103 return self.commit.author_time, self.commit.author_timezone | |
104 | |
105 def branch(self): | |
106 return 'default' | |
107 | |
108 def user(self): | |
109 return self.commit.author | |
110 | |
111 def files(self): | |
112 return [] | |
113 | |
114 def extra(self): | |
115 return {} | |
116 | |
117 def description(self): | |
118 return self.commit.message | |
119 | |
120 def parents(self): | |
121 return [overlaychangectx(self.repo, sha) for sha in self.commit.parents] | |
122 | |
123 def manifestnode(self): | |
124 return bin(self.commit.tree) | |
125 | |
126 def hex(self): | |
127 return self.commit.id | |
128 | |
129 def tags(self): | |
130 return [] | |
131 | |
132 def bookmarks(self): | |
133 return [] | |
134 | |
135 def manifest(self): | |
136 return overlaymanifest(self.repo, self.commit.tree) | |
137 | |
138 def filectx(self, path, filelog=None): | |
139 mf = self.manifest() | |
140 return overlayfilectx(self.repo, path, mf[path]) | |
141 | |
142 def flags(self, path): | |
143 mf = self.manifest() | |
144 return mf.flags(path) | |
145 | |
146 def __nonzero__(self): | |
147 return True | |
148 | |
149 class overlayrevlog(object): | |
150 def __init__(self, repo, base): | |
151 self.repo = repo | |
152 self.base = base | |
153 | |
154 def parents(self, n): | |
155 gitrev = self.repo.revmap.get(n) | |
156 if not gitrev: | |
157 # we've reached a revision we have | |
158 return self.base.parents(n) | |
159 commit = self.repo.handler.git.get_object(n) | |
160 | |
161 def gitorhg(n): | |
162 hn = self.repo.handler.map_hg_get(hex(n)) | |
163 if hn is not None: | |
164 return bin(hn) | |
165 return n | |
166 | |
167 # currently ignores the octopus | |
168 p1 = gitorhg(bin(commit.parents[0])) | |
169 if len(commit.parents) > 1: | |
170 p2 = gitorhg(bin(commit.parents[1])) | |
171 else: | |
172 p2 = nullid | |
173 | |
174 return [p1, p2] | |
175 | |
176 def parentrevs(self, rev): | |
177 return [self.rev(p) for p in self.parents(self.node(rev))] | |
178 | |
179 def node(self, rev): | |
180 gitnode = self.repo.nodemap.get(rev) | |
181 if gitnode is None: | |
182 return self.base.node(rev) | |
183 return gitnode | |
184 | |
185 def rev(self, n): | |
186 gitrev = self.repo.revmap.get(n) | |
187 if gitrev is None: | |
188 return self.base.rev(n) | |
189 return gitrev | |
190 | |
191 def nodesbetween(self, nodelist, revs): | |
192 # this is called by pre-1.9 incoming with the nodelist we returned from | |
193 # getremotechanges. Just return it back. | |
194 return [nodelist] | |
195 | |
196 def __len__(self): | |
197 return len(self.repo.handler.repo) + len(self.repo.revmap) | |
198 | |
199 | |
200 class overlayrepo(object): | |
201 def __init__(self, handler, commits, refs): | |
202 self.handler = handler | |
203 | |
204 self.changelog = overlayrevlog(self, handler.repo.changelog) | |
205 self.manifest = overlayrevlog(self, handler.repo.manifest) | |
206 | |
207 # for incoming -p | |
208 self.root = handler.repo.root | |
209 self.getcwd = handler.repo.getcwd | |
210 self.status = handler.repo.status | |
211 self.ui = handler.repo.ui | |
212 | |
213 self.revmap = None | |
214 self.nodemap = None | |
215 self.refmap = None | |
216 self.tagmap = None | |
217 | |
218 self._makemaps(commits, refs) | |
219 | |
220 def __getitem__(self, n): | |
221 if n not in self.revmap: | |
222 return self.handler.repo[n] | |
223 return overlaychangectx(self, n) | |
224 | |
225 def nodebookmarks(self, n): | |
226 return self.refmap.get(n, []) | |
227 | |
228 def nodetags(self, n): | |
229 return self.tagmap.get(n, []) | |
230 | |
231 def rev(self, n): | |
232 return self.revmap[n] | |
233 | |
234 def filectx(self, path, fileid=None): | |
235 return overlayfilectx(self, path, fileid=fileid) | |
236 | |
237 def _makemaps(self, commits, refs): | |
238 baserev = self.handler.repo['tip'].rev() | |
239 self.revmap = {} | |
240 self.nodemap = {} | |
241 for i, n in enumerate(commits): | |
242 rev = baserev + i + 1 | |
243 self.revmap[n] = rev | |
244 self.nodemap[rev] = n | |
245 | |
246 self.refmap = {} | |
247 self.tagmap = {} | |
248 for ref in refs: | |
249 if ref.startswith('refs/heads/'): | |
250 refname = ref[11:] | |
251 self.refmap.setdefault(bin(refs[ref]), []).append(refname) | |
252 elif ref.startswith('refs/tags/'): | |
253 tagname = ref[10:] | |
254 self.tagmap.setdefault(bin(refs[ref]), []).append(tagname) |