302
303
obj = tree_lookup_path(
303
304
self._git.object_store.__getitem__, root_tree,
304
path.encode('utf-8'))
305
encode_git_path(path))
305
306
if isinstance(obj, tuple):
306
307
(mode, item_id) = obj
307
308
obj = self._git.object_store[item_id]
544
545
raise ValueError('invalid revision id %s' % revision_id)
545
546
return GitRevisionTree(self, revision_id)
547
def get_deltas_for_revisions(self, revisions, specific_fileids=None):
548
"""Produce a generator of revision deltas.
550
Note that the input is a sequence of REVISIONS, not revision_ids.
551
Trees will be held in memory until the generator exits.
552
Each delta is relative to the revision's lefthand predecessor.
554
:param specific_fileids: if not None, the result is filtered
555
so that only those file-ids, their parents and their
556
children are included.
558
# Get the revision-ids of interest
559
required_trees = set()
560
for revision in revisions:
561
required_trees.add(revision.revision_id)
562
required_trees.update(revision.parent_ids[:1])
564
trees = dict((t.get_revision_id(), t) for
565
t in self.revision_trees(required_trees))
567
# Calculate the deltas
568
for revision in revisions:
569
if not revision.parent_ids:
570
old_tree = self.revision_tree(_mod_revision.NULL_REVISION)
572
old_tree = trees[revision.parent_ids[0]]
573
new_tree = trees[revision.revision_id]
574
if specific_fileids is not None:
575
specific_files = [new_tree.id2path(
576
fid) for fid in specific_fileids]
578
specific_files = None
579
yield new_tree.changes_from(
580
old_tree, specific_files=specific_files)
582
548
def set_make_working_trees(self, trees):
583
549
raise errors.UnsupportedOperation(self.set_make_working_trees, self)