/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
1
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
18
"""Git Trees."""
19
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
20
from dulwich.object_store import tree_lookup_path
21
import stat
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
22
import posixpath
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
23
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
24
from bzrlib import (
25
    delta,
26
    errors,
0.264.10 by Jelmer Vernooij
Yield inventory entries.
27
    inventory,
28
    osutils,
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
29
    revisiontree,
30
    tree,
31
    )
32
33
from bzrlib.plugins.git.mapping import (
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
34
    mode_is_executable,
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
35
    mode_kind,
36
    )
37
38
39
class GitRevisionTree(revisiontree.RevisionTree):
0.200.959 by Jelmer Vernooij
Improve docstrings.
40
    """Revision tree implementation based on Git objects."""
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
41
42
    def __init__(self, repository, revision_id):
43
        self._revision_id = revision_id
44
        self._repository = repository
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
45
        self.store = repository._git.object_store
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
46
        assert isinstance(revision_id, str)
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
47
        self.commit_id, self.mapping = repository.lookup_bzr_revision_id(revision_id)
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
48
        try:
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
49
            commit = self.store[self.commit_id]
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
50
        except KeyError, r:
51
            raise errors.NoSuchRevision(repository, revision_id)
52
        self.tree = commit.tree
0.200.1328 by Jelmer Vernooij
More test fixes.
53
        self._fileid_map = self.mapping.get_fileid_map(self.store.__getitem__, self.tree)
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
54
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
55
    def get_file_revision(self, file_id, path=None):
56
        if path is None:
57
            path = self.id2path(file_id)
58
        change_scanner = self._repository._file_change_scanner
59
        (path, commit_id) = change_scanner.find_last_change_revision(path,
60
            self.commit_id)
61
        return self._repository.lookup_foreign_revision_id(commit_id, self.mapping)
62
63
    def get_file_mtime(self, file_id, path=None):
64
        revid = self.get_file_revision(file_id, path)
65
        try:
66
            rev = self._repository.get_revision(revid)
67
        except errors.NoSuchRevision:
68
            raise errors.FileTimestampUnavailable(path)
69
        return rev.timestamp
70
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
71
    def id2path(self, file_id):
0.200.1328 by Jelmer Vernooij
More test fixes.
72
        return self._fileid_map.lookup_path(file_id)
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
73
74
    def path2id(self, path):
0.200.1328 by Jelmer Vernooij
More test fixes.
75
        if self.mapping.is_special_file(path):
76
            return None
77
        return self._fileid_map.lookup_file_id(path.encode('utf-8'))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
78
0.200.1569 by Jelmer Vernooij
Implement GitRevisionTree.all_file_ids().
79
    def all_file_ids(self):
80
        return set(self._fileid_map.all_file_ids())
81
0.200.1204 by Jelmer Vernooij
Implement GitRevisionTree.get_root_id().
82
    def get_root_id(self):
83
        return self.path2id("")
84
0.200.1208 by Jelmer Vernooij
Add GitWorkingTree.has_id and GitWorkingTree.has_or_had_id.
85
    def has_or_had_id(self, file_id):
86
        return self.has_id(file_id)
87
88
    def has_id(self, file_id):
89
        try:
90
            path = self.id2path(file_id)
91
        except errors.NoSuchId:
92
            return False
93
        return self.has_filename(path)
94
0.200.1241 by Jelmer Vernooij
Implement GitRevisionTree.kind.
95
    def kind(self, file_id, path=None):
96
        if path is None:
0.200.1248 by Jelmer Vernooij
Fix handling of path in Tree.kind.
97
            path = self.id2path(file_id)
0.200.1283 by Jelmer Vernooij
Provide Repository.get_file_graph() and Tree.get_file_revision().
98
        try:
99
            (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree,
100
                path)
101
        except KeyError:
102
            raise errors.NoSuchId(self, file_id)
0.200.1253 by Jelmer Vernooij
Fix Tree.kind(TREE_ROOT).
103
        if mode is None:
104
            # the tree root is a directory
105
            return "directory"
0.200.1241 by Jelmer Vernooij
Implement GitRevisionTree.kind.
106
        return mode_kind(mode)
107
0.200.1197 by Jelmer Vernooij
Implement GitRevisionTree.has_filename.
108
    def has_filename(self, path):
109
        try:
110
            tree_lookup_path(self.store.__getitem__, self.tree,
111
                path.encode("utf-8"))
112
        except KeyError:
113
            return False
114
        else:
115
            return True
116
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
117
    def list_files(self, include_root=False, from_dir=None, recursive=True):
118
        if from_dir is None:
0.200.1197 by Jelmer Vernooij
Implement GitRevisionTree.has_filename.
119
            from_dir = u""
120
        (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree,
121
            from_dir.encode("utf-8"))
0.264.9 by Jelmer Vernooij
Implement basic GitWorkingTree.iter_entries_by_dir.
122
        if mode is None: # Root
0.264.10 by Jelmer Vernooij
Yield inventory entries.
123
            root_ie = self._get_dir_ie("", None)
0.264.9 by Jelmer Vernooij
Implement basic GitWorkingTree.iter_entries_by_dir.
124
        else:
0.264.10 by Jelmer Vernooij
Yield inventory entries.
125
            parent_path = posixpath.dirname(from_dir.encode("utf-8"))
0.200.1328 by Jelmer Vernooij
More test fixes.
126
            parent_id = self._fileid_map.lookup_file_id(parent_path)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
127
            if mode_kind(mode) == 'directory':
128
                root_ie = self._get_dir_ie(from_dir.encode("utf-8"), parent_id)
129
            else:
130
                root_ie = self._get_file_ie(from_dir.encode("utf-8"),
131
                    posixpath.basename(from_dir), mode, hexsha)
132
        if from_dir != "" or include_root:
133
            yield (from_dir, "V", root_ie.kind, root_ie.file_id, root_ie)
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
134
        todo = set()
0.264.10 by Jelmer Vernooij
Yield inventory entries.
135
        if root_ie.kind == 'directory':
136
            todo.add((from_dir.encode("utf-8"), hexsha, root_ie.file_id))
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
137
        while todo:
0.264.10 by Jelmer Vernooij
Yield inventory entries.
138
            (path, hexsha, parent_id) = todo.pop()
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
139
            tree = self.store[hexsha]
140
            for name, mode, hexsha in tree.iteritems():
0.200.1328 by Jelmer Vernooij
More test fixes.
141
                if self.mapping.is_special_file(name):
142
                    continue
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
143
                child_path = posixpath.join(path, name)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
144
                if stat.S_ISDIR(mode):
145
                    ie = self._get_dir_ie(child_path, parent_id)
146
                    if recursive:
147
                        todo.add((child_path, hexsha, ie.file_id))
148
                else:
149
                    ie = self._get_file_ie(child_path, name, mode, hexsha, parent_id)
150
                yield child_path, "V", ie.kind, ie.file_id, ie
151
152
    def _get_file_ie(self, path, name, mode, hexsha, parent_id):
153
        kind = mode_kind(mode)
0.200.1328 by Jelmer Vernooij
More test fixes.
154
        file_id = self._fileid_map.lookup_file_id(path)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
155
        ie = inventory.entry_factory[kind](file_id, name.decode("utf-8"), parent_id)
156
        if kind == 'symlink':
157
            ie.symlink_target = self.store[hexsha].data
0.200.1401 by Jelmer Vernooij
Cope with submodules in working trees.
158
        elif kind == 'tree-reference':
159
            ie.reference_revision = self.mapping.revision_id_foreign_to_bzr(hexsha)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
160
        else:
161
            data = self.store[hexsha].data
162
            ie.text_sha1 = osutils.sha_string(data)
163
            ie.text_size = len(data)
164
            ie.executable = mode_is_executable(mode)
165
        return ie
166
167
    def _get_dir_ie(self, path, parent_id):
0.200.1328 by Jelmer Vernooij
More test fixes.
168
        file_id = self._fileid_map.lookup_file_id(path)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
169
        return inventory.InventoryDirectory(file_id,
170
            posixpath.basename(path).decode("utf-8"), parent_id)
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
171
172
    def iter_entries_by_dir(self, specific_file_ids=None, yield_parents=False):
0.200.1285 by Jelmer Vernooij
Support specific_file_ids argument to Tree.iter_entries_by_dir.
173
        # FIXME: Support yield parents
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
174
        if specific_file_ids is not None:
0.200.1285 by Jelmer Vernooij
Support specific_file_ids argument to Tree.iter_entries_by_dir.
175
            specific_paths = [self.id2path(file_id) for file_id in specific_file_ids]
176
            if specific_paths in ([u""], []):
177
                specific_paths = None
178
            else:
179
                specific_paths = set(specific_paths)
180
        else:
181
            specific_paths = None
0.264.10 by Jelmer Vernooij
Yield inventory entries.
182
        todo = set([("", self.tree, None)])
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
183
        while todo:
0.264.10 by Jelmer Vernooij
Yield inventory entries.
184
            path, tree_sha, parent_id = todo.pop()
185
            ie = self._get_dir_ie(path, parent_id)
0.200.1285 by Jelmer Vernooij
Support specific_file_ids argument to Tree.iter_entries_by_dir.
186
            if specific_paths is None or path in specific_paths:
187
                yield path, ie
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
188
            tree = self.store[tree_sha]
189
            for name, mode, hexsha  in tree.iteritems():
0.200.1328 by Jelmer Vernooij
More test fixes.
190
                if self.mapping.is_special_file(name):
191
                    continue
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
192
                child_path = posixpath.join(path, name)
193
                if stat.S_ISDIR(mode):
0.200.1285 by Jelmer Vernooij
Support specific_file_ids argument to Tree.iter_entries_by_dir.
194
                    if (specific_paths is None or
195
                        any(filter(lambda p: p.startswith(child_path), specific_paths))):
196
                        todo.add((child_path, hexsha, ie.file_id))
197
                elif specific_paths is None or child_path in specific_paths:
0.200.1307 by Jelmer Vernooij
Formatting fixes, specify path to a couple more functions.
198
                    yield (child_path,
199
                            self._get_file_ie(child_path, name, mode, hexsha,
0.200.1285 by Jelmer Vernooij
Support specific_file_ids argument to Tree.iter_entries_by_dir.
200
                           ie.file_id))
0.264.6 by Jelmer Vernooij
Implement custom GitRevisionTree.iter_entries_by_dir, GitRevisionTree.list_files.
201
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
202
    def get_revision_id(self):
0.200.959 by Jelmer Vernooij
Improve docstrings.
203
        """See RevisionTree.get_revision_id."""
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
204
        return self._revision_id
205
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
206
    def get_file_sha1(self, file_id, path=None, stat_value=None):
0.200.1255 by Jelmer Vernooij
Implement GitRevisionTree.get_file_sha1.
207
        return osutils.sha_string(self.get_file_text(file_id, path))
208
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
209
    def get_file_verifier(self, file_id, path=None, stat_value=None):
210
        if path is None:
211
            path = self.id2path(file_id)
212
        (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree,
213
            path)
214
        return ("GIT", hexsha)
215
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
216
    def get_file_text(self, file_id, path=None):
0.200.959 by Jelmer Vernooij
Improve docstrings.
217
        """See RevisionTree.get_file_text."""
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
218
        if path is None:
219
            path = self.id2path(file_id)
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
220
        (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree, path)
0.264.3 by Jelmer Vernooij
Make RevisionTree inventoryless.
221
        if stat.S_ISREG(mode):
222
            return self.store[hexsha].data
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
223
        else:
0.200.664 by Jelmer Vernooij
Support submodules during fetch.
224
            return ""
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
225
0.200.1466 by Jelmer Vernooij
Implement GitRevisionTree.get_symlink_target.
226
    def get_symlink_target(self, file_id, path=None):
227
        """See RevisionTree.get_symlink_target."""
228
        if path is None:
229
            path = self.id2path(file_id)
230
        (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree, path)
231
        if stat.S_ISLNK(mode):
232
            return self.store[hexsha].data
233
        else:
234
            return None
235
0.264.10 by Jelmer Vernooij
Yield inventory entries.
236
    def _comparison_data(self, entry, path):
237
        if entry is None:
238
            return None, False, None
239
        return entry.kind, entry.executable, None
240
0.200.1568 by Jelmer Vernooij
Implement GitRevisionTree.path_content_summary.
241
    def path_content_summary(self, path):
242
        """See Tree.path_content_summary."""
243
        try:
244
            (mode, hexsha) = tree_lookup_path(self.store.__getitem__, self.tree, path)
245
        except KeyError:
246
            return ('missing', None, None, None)
247
        kind = mode_kind(mode)
248
        if kind == 'file':
249
            executable = mode_is_executable(mode)
250
            contents = self.store[hexsha].data
251
            return (kind, len(contents), executable, osutils.sha_string(contents))
252
        elif kind == 'symlink':
253
            return (kind, None, None, self.store[hexsha].data)
254
        else:
255
            return (kind, None, None, None)
256
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
257
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
258
def tree_delta_from_git_changes(changes, mapping,
259
        (old_fileid_map, new_fileid_map), specific_file=None,
260
        require_versioned=False):
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
261
    """Create a TreeDelta from two git trees.
0.200.959 by Jelmer Vernooij
Improve docstrings.
262
263
    source and target are iterators over tuples with:
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
264
        (filename, sha, mode)
265
    """
266
    ret = delta.TreeDelta()
267
    for (oldpath, newpath), (oldmode, newmode), (oldsha, newsha) in changes:
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
268
        if mapping.is_control_file(oldpath):
269
            oldpath = None
270
        if mapping.is_control_file(newpath):
271
            newpath = None
272
        if oldpath is None and newpath is None:
273
            continue
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
274
        if oldpath is None:
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
275
            file_id = new_fileid_map.lookup_file_id(newpath.encode("utf-8"))
276
            ret.added.append((newpath, file_id, mode_kind(newmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
277
        elif newpath is None:
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
278
            file_id = old_fileid_map.lookup_file_id(oldpath.encode("utf-8"))
279
            ret.removed.append((oldpath, file_id, mode_kind(oldmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
280
        elif oldpath != newpath:
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
281
            file_id = old_fileid_map.lookup_file_id(oldpath.encode("utf-8"))
282
            ret.renamed.append((oldpath, newpath, file_id, mode_kind(newmode), (oldsha != newsha), (oldmode != newmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
283
        elif mode_kind(oldmode) != mode_kind(newmode):
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
284
            file_id = new_fileid_map.lookup_file_id(newpath.encode("utf-8"))
285
            ret.kind_changed.append((newpath, file_id, mode_kind(oldmode), mode_kind(newmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
286
        elif oldsha != newsha or oldmode != newmode:
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
287
            file_id = new_fileid_map.lookup_file_id(newpath.encode("utf-8"))
288
            ret.modified.append((newpath, file_id, mode_kind(newmode), (oldsha != newsha), (oldmode != newmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
289
        else:
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
290
            file_id = new_fileid_map.lookup_file_id(newpath.encode("utf-8"))
291
            ret.unchanged.append((newpath, file_id, mode_kind(newmode)))
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
292
    return ret
293
294
0.200.959 by Jelmer Vernooij
Improve docstrings.
295
def changes_from_git_changes(changes, mapping, specific_file=None,
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
296
                                require_versioned=False):
297
    """Create a iter_changes-like generator from a git stream.
0.200.959 by Jelmer Vernooij
Improve docstrings.
298
299
    source and target are iterators over tuples with:
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
300
        (filename, sha, mode)
301
    """
302
    for (oldpath, newpath), (oldmode, newmode), (oldsha, newsha) in changes:
303
        path = (oldpath, newpath)
0.200.1328 by Jelmer Vernooij
More test fixes.
304
        if mapping.is_special_file(oldpath) or mapping.is_special_file(newpath):
305
            continue
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
306
        if oldpath is None:
307
            fileid = mapping.generate_file_id(newpath)
308
            oldexe = None
309
            oldkind = None
310
            oldname = None
311
            oldparent = None
312
        else:
0.200.1345 by Jelmer Vernooij
paths should be unicode when yielded by iter_changes.
313
            oldpath = oldpath.decode("utf-8")
0.200.1576 by Jelmer Vernooij
Merge a bunch of fixes from store-roundtrip-info.
314
            assert oldmode is not None
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
315
            oldexe = mode_is_executable(oldmode)
316
            oldkind = mode_kind(oldmode)
317
            try:
318
                (oldparentpath, oldname) = oldpath.rsplit("/", 1)
319
            except ValueError:
320
                oldparent = None
321
                oldname = oldpath
322
            else:
323
                oldparent = mapping.generate_file_id(oldparentpath)
324
            fileid = mapping.generate_file_id(oldpath)
325
        if newpath is None:
326
            newexe = None
327
            newkind = None
328
            newname = None
329
            newparent = None
330
        else:
0.200.1345 by Jelmer Vernooij
paths should be unicode when yielded by iter_changes.
331
            newpath = newpath.decode("utf-8")
0.200.1576 by Jelmer Vernooij
Merge a bunch of fixes from store-roundtrip-info.
332
            assert newmode is not None
333
            if newmode is not None:
334
                newexe = mode_is_executable(newmode)
335
                newkind = mode_kind(newmode)
336
            else:
337
                newexe = False
338
                newkind = None
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
339
            try:
340
                newparentpath, newname = newpath.rsplit("/", 1)
341
            except ValueError:
342
                newparent = None
343
                newname = newpath
344
            else:
345
                newparent = mapping.generate_file_id(newparentpath)
0.200.959 by Jelmer Vernooij
Improve docstrings.
346
        yield (fileid, (oldpath, newpath), (oldsha != newsha),
347
             (oldpath is not None, newpath is not None),
348
             (oldparent, newparent), (oldname, newname),
349
             (oldkind, newkind), (oldexe, newexe))
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
350
351
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
352
class InterGitRevisionTrees(tree.InterTree):
353
    """InterTree that works between two git revision trees."""
354
0.200.659 by Jelmer Vernooij
Prevent tests using InterGitRevisionTrees.
355
    _matching_from_tree_format = None
356
    _matching_to_tree_format = None
357
    _test_mutable_trees_to_test_trees = None
358
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
359
    @classmethod
360
    def is_compatible(cls, source, target):
0.200.959 by Jelmer Vernooij
Improve docstrings.
361
        return (isinstance(source, GitRevisionTree) and
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
362
                isinstance(target, GitRevisionTree))
363
364
    def compare(self, want_unchanged=False, specific_files=None,
365
                extra_trees=None, require_versioned=False, include_root=False,
366
                want_unversioned=False):
367
        if self.source._repository._git.object_store != self.target._repository._git.object_store:
368
            raise AssertionError
369
        changes = self.source._repository._git.object_store.tree_changes(
370
            self.source.tree, self.target.tree, want_unchanged=want_unchanged)
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
371
        source_fileid_map = self.source.mapping.get_fileid_map(
372
            self.source._repository._git.object_store.__getitem__,
373
            self.source.tree)
374
        target_fileid_map = self.target.mapping.get_fileid_map(
375
            self.target._repository._git.object_store.__getitem__,
376
            self.target.tree)
0.200.959 by Jelmer Vernooij
Improve docstrings.
377
        return tree_delta_from_git_changes(changes, self.target.mapping,
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
378
            (source_fileid_map, target_fileid_map),
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
379
            specific_file=specific_files)
380
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
381
    def iter_changes(self, include_unchanged=False, specific_files=None,
0.200.959 by Jelmer Vernooij
Improve docstrings.
382
        pb=None, extra_trees=[], require_versioned=True,
383
        want_unversioned=False):
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
384
        if self.source._repository._git.object_store != self.target._repository._git.object_store:
385
            raise AssertionError
386
        changes = self.source._repository._git.object_store.tree_changes(
0.200.959 by Jelmer Vernooij
Improve docstrings.
387
            self.source.tree, self.target.tree,
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
388
            want_unchanged=include_unchanged)
0.200.959 by Jelmer Vernooij
Improve docstrings.
389
        return changes_from_git_changes(changes, self.target.mapping,
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
390
            specific_file=specific_files)
391
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
392
393
tree.InterTree.register_optimiser(InterGitRevisionTrees)