106
109
return self.repo.base
111
def get_text_by_path_and_node(self, path, node):
112
(fileid, revid) = iter(self.idmap.lookup_text_by_path_and_node(path, node)).next()
113
return "".join(self.repo.iter_files_bytes([(fileid, revid, None)]).next()[1])
108
115
def remember_manifest_text(self, revid, parent_revids, text):
109
116
"""Convenience function for remembering the text of a single manifest.
144
151
return record.get_bytes_as('fulltext')
145
152
raise KeyError(revid)
154
def _update_texts(self, revid):
155
tree = self.repo.revision_tree(revid)
156
delta = self.repo.get_revision_delta(revid)
157
def update_text(path, fileid, kind):
158
if not kind in ("file", "symlink"):
160
text_chunks = text_contents(self.repo, path, [(fileid, tree.get_file_revision(fileid))], self)
161
text_chunks.next() # base text
162
for (record, parents, node) in text_chunks:
163
self.idmap.insert_text(path.encode("utf-8"), node, fileid, revid)
164
for (path, fileid, kind) in delta.added:
165
update_text(path, fileid, kind)
166
for (oldpath, newpath, fileid, kind, text_modified, meta_modified) in delta.renamed:
168
update_text(newpath, fileid, kind)
169
for (path, fileid, kind, text_modified, meta_modified) in delta.modified:
171
update_text(path, fileid, kind)
147
173
def _update_idmap(self, stop_revision=None):
148
174
present_revids = self.idmap.revids()
149
if stop_revision is None:
150
wanted = self.repo.all_revision_ids()
152
wanted = self.repo.get_ancestry(stop_revision)[1:]
153
todo = set(wanted) - present_revids
154
revs = self.repo.get_revisions(todo)
155
175
graph = self.repo.get_graph()
156
pb = ui.ui_factory.nested_progress_bar()
177
if stop_revision is None:
178
wanted = self.repo.all_revision_ids()
179
todo = set(wanted) - present_revids
181
wanted = graph.find_unique_ancestors(stop_revision, present_revids)
182
revs = self.repo.get_revisions(todo)
183
pb = ui.ui_factory.nested_progress_bar()
158
185
for i, revid in enumerate(graph.iter_topo_order(todo)):
159
186
pb.update("updating cache", i, len(todo))
160
187
rev = self.repo.get_revision(revid)
168
195
changeset_text = self.get_changeset_text_by_revid(revid, rev,
169
196
manifest_id=manifest_id)
170
197
changeset_id = hghash(changeset_text, *as_hg_parents(rev.parent_ids[:2], lambda x: self.lookup_changeset_id_by_revid(x)[0]))
171
self.idmap.insert_revision(revid, manifest_id, changeset_id,
198
self.idmap.insert_revision(revid, manifest_id, changeset_id, self.mapping)
199
self._update_texts(revid)
192
219
return self.idmap.get_files_by_revid(revid)
194
221
delta = self.repo.get_revision_delta(revid)
195
inv = self.repo.get_inventory(revid)
196
return files_from_delta(delta, inv, revid)
222
tree = self.repo.revision_tree(revid)
223
return files_from_delta(delta, tree, revid)
198
225
def get_manifest_text(self, manifest_id):
199
226
revid = self._lookup_revision_by_manifest_id(manifest_id)
200
227
return self.get_manifest_text_by_revid(revid)
202
def _get_file_fulltext(self, key):
229
def get_file_fulltext(self, key):
203
230
ret = "".join(self.repo.iter_files_bytes([key + (None,)]).next()[1])
204
231
if ret == "": # could be a symlink
205
ie = self.repo.get_inventory(key[1])[key[0]]
206
if ie.kind == "symlink":
207
return ie.symlink_target
232
tree = self.repo.revision_tree(key[1])
233
if tree.kind(key[0]) == "symlink":
234
return tree.get_symlink_target(key[0])
210
237
def get_manifest_text_by_revid(self, revid):