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