88
def changes_from_git_changes(changes, mapping, specific_file=None,
89
require_versioned=False):
90
"""Create a iter_changes-like generator from a git stream.
92
source and target are iterators over tuples with:
95
for (oldpath, newpath), (oldmode, newmode), (oldsha, newsha) in changes:
96
path = (oldpath, newpath)
98
fileid = mapping.generate_file_id(newpath)
104
oldexe = mode_is_executable(oldmode)
105
oldkind = mode_kind(oldmode)
107
(oldparentpath, oldname) = oldpath.rsplit("/", 1)
112
oldparent = mapping.generate_file_id(oldparentpath)
113
fileid = mapping.generate_file_id(oldpath)
120
newexe = mode_is_executable(newmode)
121
newkind = mode_kind(newmode)
123
newparentpath, newname = newpath.rsplit("/", 1)
128
newparent = mapping.generate_file_id(newparentpath)
129
yield fileid, (oldpath, newpath), (oldsha != newsha), (oldpath is not None, newpath is not None), (oldparent, newparent), (oldname, newname), (oldkind, newkind), (oldexe, newexe)
87
132
class InterGitRevisionTrees(tree.InterTree):
88
133
"""InterTree that works between two git revision trees."""
102
147
return tree_delta_from_git_changes(changes, self.target.mapping,
103
148
specific_file=specific_files)
150
def iter_changes(self, include_unchanged=False, specific_files=None,
151
pb=None, extra_trees=[], require_versioned=True, want_unversioned=False):
152
if self.source._repository._git.object_store != self.target._repository._git.object_store:
154
changes = self.source._repository._git.object_store.tree_changes(
155
self.source.tree, self.target.tree,
156
want_unchanged=include_unchanged)
157
return changes_from_git_changes(changes, self.target.mapping,
158
specific_file=specific_files)
106
161
tree.InterTree.register_optimiser(InterGitRevisionTrees)