/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.264.10 by Jelmer Vernooij
Yield inventory entries.
1
# Copyright (C) 2008-2011 Jelmer Vernooij <jelmer@samba.org>
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
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
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
17
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
18
"""An adapter between a Git index and a Bazaar Working Tree"""
19
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
20
0.200.385 by Jelmer Vernooij
Cope with removed files.
21
from cStringIO import (
22
    StringIO,
23
    )
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
24
from collections import defaultdict
0.239.4 by Jelmer Vernooij
Cope with nonexistent files and directories in get_file_sha1.
25
import errno
0.200.1096 by Jelmer Vernooij
Implement GitWorkingTreeFormat.initialize.
26
from dulwich.index import (
27
    Index,
28
    )
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
29
from dulwich.object_store import (
30
    tree_lookup_path,
31
    )
0.200.383 by Jelmer Vernooij
Simplify, support rewriting index based on inventory.
32
from dulwich.objects import (
33
    Blob,
0.200.948 by Jelmer Vernooij
Cope with empty inventories.
34
    ZERO_SHA,
35
    )
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
36
import os
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
37
import posix
0.264.10 by Jelmer Vernooij
Yield inventory entries.
38
import posixpath
0.200.384 by Jelmer Vernooij
Fix reading of inventory from index.
39
import stat
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
40
import sys
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
41
42
from bzrlib import (
0.200.382 by Jelmer Vernooij
Support flushing index.
43
    errors,
0.262.1 by Jelmer Vernooij
Fix WorkingTree.conflicts().
44
    conflicts as _mod_conflicts,
0.200.409 by Jelmer Vernooij
Support parsing .gitignore.
45
    ignores,
0.264.10 by Jelmer Vernooij
Yield inventory entries.
46
    inventory,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
47
    lockable_files,
48
    lockdir,
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
49
    osutils,
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
50
    trace,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
51
    transport,
0.200.519 by Jelmer Vernooij
Move imports down, might not be available in older bzr-git versions.
52
    tree,
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
53
    workingtree,
54
    )
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
55
from bzrlib.decorators import (
56
    needs_read_lock,
57
    )
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
58
from bzrlib.mutabletree import needs_tree_write_lock
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
59
60
0.200.1096 by Jelmer Vernooij
Implement GitWorkingTreeFormat.initialize.
61
from bzrlib.plugins.git.dir import (
62
    LocalGitDir,
63
    )
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
64
from bzrlib.plugins.git.tree import (
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
65
    changes_from_git_changes,
0.200.617 by Jelmer Vernooij
Add custom InterTree for use between git revision trees.
66
    tree_delta_from_git_changes,
67
    )
0.200.971 by Chadrik
Fix 'bzr status' after 'bzr add' in native git working trees.
68
from bzrlib.plugins.git.mapping import (
69
    GitFileIdMap,
0.264.10 by Jelmer Vernooij
Yield inventory entries.
70
    mode_kind,
0.200.971 by Chadrik
Fix 'bzr status' after 'bzr add' in native git working trees.
71
    )
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
72
0.200.409 by Jelmer Vernooij
Support parsing .gitignore.
73
IGNORE_FILENAME = ".gitignore"
74
75
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
76
class GitWorkingTree(workingtree.WorkingTree):
77
    """A Git working tree."""
78
0.200.803 by Jelmer Vernooij
Default to non-bare repositories when initializing a control directory.
79
    def __init__(self, bzrdir, repo, branch, index):
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
80
        self.basedir = bzrdir.root_transport.local_abspath('.')
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
81
        self.bzrdir = bzrdir
82
        self.repository = repo
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
83
        self.store = self.repository._git.object_store
0.200.384 by Jelmer Vernooij
Fix reading of inventory from index.
84
        self.mapping = self.repository.get_mapping()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
85
        self._branch = branch
86
        self._transport = bzrdir.transport
87
0.246.3 by Jelmer Vernooij
Simplify call to abspath, without involving private variables.
88
        self.controldir = self.bzrdir.transport.local_abspath('bzr')
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
89
90
        try:
91
            os.makedirs(self.controldir)
92
            os.makedirs(os.path.join(self.controldir, 'lock'))
93
        except OSError:
94
            pass
95
96
        self._control_files = lockable_files.LockableFiles(
97
            transport.get_transport(self.controldir), 'lock', lockdir.LockDir)
98
        self._format = GitWorkingTreeFormat()
0.200.803 by Jelmer Vernooij
Default to non-bare repositories when initializing a control directory.
99
        self.index = index
0.200.1242 by Jelmer Vernooij
Support directories better.
100
        self._versioned_dirs = None
0.200.239 by Jelmer Vernooij
Provide views.
101
        self.views = self._make_views()
0.200.1173 by Jelmer Vernooij
Provide GitWorkingTree._rules_searcher.
102
        self._rules_searcher = None
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
103
        self._detect_case_handling()
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
104
        self._reset_data()
105
        self._fileid_map = self._basis_fileid_map.copy()
0.200.173 by Jelmer Vernooij
Merge changes, open index.
106
0.200.1322 by Jelmer Vernooij
Add case detection.
107
    def _detect_case_handling(self):
108
        try:
109
            self._transport.stat(".git/cOnFiG")
110
        except errors.NoSuchFile:
111
            self.case_sensitive = True
112
        else:
113
            self.case_sensitive = False
114
0.200.1315 by Jelmer Vernooij
Implement WorkingTree.merge_modified.
115
    def merge_modified(self):
116
        return {}
117
0.200.1220 by Jelmer Vernooij
Support set_parent_trees.
118
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
119
        self.set_parent_ids([p for p, t in parents_list])
120
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
121
    def _index_add_entry(self, path, file_id, kind):
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
122
        assert isinstance(path, basestring)
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
123
        assert type(file_id) == str or file_id is None
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
124
        if kind == "directory":
125
            # Git indexes don't contain directories
126
            return
127
        if kind == "file":
128
            blob = Blob()
129
            try:
130
                file, stat_val = self.get_file_with_stat(file_id, path)
131
            except (errors.NoSuchFile, IOError):
132
                # TODO: Rather than come up with something here, use the old index
133
                file = StringIO()
134
                from posix import stat_result
135
                stat_val = stat_result((stat.S_IFREG | 0644, 0, 0, 0, 0, 0, 0, 0, 0, 0))
136
            blob.set_raw_string(file.read())
137
        elif kind == "symlink":
138
            blob = Blob()
139
            try:
140
                stat_val = os.lstat(self.abspath(path))
141
            except (errors.NoSuchFile, OSError):
142
                # TODO: Rather than come up with something here, use the 
143
                # old index
144
                from posix import stat_result
145
                stat_val = stat_result((stat.S_IFLNK, 0, 0, 0, 0, 0, 0, 0, 0, 0))
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
146
            blob.set_raw_string(
147
                self.get_symlink_target(file_id, path).encode("utf-8"))
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
148
        else:
149
            raise AssertionError("unknown kind '%s'" % kind)
150
        # Add object to the repository if it didn't exist yet
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
151
        if not blob.id in self.store:
152
            self.store.add_object(blob)
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
153
        # Add an entry to the index or update the existing entry
154
        flags = 0 # FIXME
0.200.1242 by Jelmer Vernooij
Support directories better.
155
        encoded_path = path.encode("utf-8")
156
        self.index[encoded_path] = (stat_val.st_ctime,
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
157
                stat_val.st_mtime, stat_val.st_dev, stat_val.st_ino,
158
                stat_val.st_mode, stat_val.st_uid, stat_val.st_gid,
159
                stat_val.st_size, blob.id, flags)
0.200.1242 by Jelmer Vernooij
Support directories better.
160
        if self._versioned_dirs is not None:
161
            self._ensure_versioned_dir(encoded_path)
162
163
    def _ensure_versioned_dir(self, dirname):
0.200.1249 by Jelmer Vernooij
Fix file id for tree root
164
        if dirname in self._versioned_dirs:
0.200.1242 by Jelmer Vernooij
Support directories better.
165
            return
0.200.1249 by Jelmer Vernooij
Fix file id for tree root
166
        if dirname != "":
167
            self._ensure_versioned_dir(posixpath.dirname(dirname))
0.200.1242 by Jelmer Vernooij
Support directories better.
168
        self._versioned_dirs.add(dirname)
169
170
    def _load_dirs(self):
171
        self._versioned_dirs = set()
172
        for p in self.index:
173
            self._ensure_versioned_dir(posixpath.dirname(p))
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
174
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
175
    def _unversion_path(self, path):
176
        encoded_path = path.encode("utf-8")
177
        try:
178
            del self.index[encoded_path]
179
        except KeyError:
180
            # A directory, perhaps?
181
            for p in list(self.index):
182
                if p.startswith(encoded_path+"/"):
183
                    del self.index[p]
0.200.1242 by Jelmer Vernooij
Support directories better.
184
        # FIXME: remove empty directories
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
185
0.200.1328 by Jelmer Vernooij
More test fixes.
186
    @needs_tree_write_lock
0.200.1192 by Jelmer Vernooij
Implement path2id.
187
    def unversion(self, file_ids):
188
        for file_id in file_ids:
189
            path = self.id2path(file_id)
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
190
            self._unversion_path(path)
0.200.1328 by Jelmer Vernooij
More test fixes.
191
        self.flush()
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
192
0.200.1243 by Jelmer Vernooij
Implement WorkingTree.check_state.
193
    def check_state(self):
194
        """Check that the working state is/isn't valid."""
195
        pass
196
0.200.1328 by Jelmer Vernooij
More test fixes.
197
    @needs_tree_write_lock
0.200.1215 by Jelmer Vernooij
Implement GitWorkingTree.remove.
198
    def remove(self, files, verbose=False, to_file=None, keep_files=True,
199
        force=False):
200
        """Remove nominated files from the working tree metadata.
201
202
        :param files: File paths relative to the basedir.
203
        :param keep_files: If true, the files will also be kept.
204
        :param force: Delete files and directories, even if they are changed
205
            and even if the directories are not empty.
206
        """
207
        all_files = set() # specified and nested files 
208
209
        if isinstance(files, basestring):
210
            files = [files]
211
212
        if to_file is None:
213
            to_file = sys.stdout
214
215
        files = list(all_files)
216
217
        if len(files) == 0:
218
            return # nothing to do
219
220
        # Sort needed to first handle directory content before the directory
221
        files.sort(reverse=True)
222
223
        def backup(file_to_backup):
224
            abs_path = self.abspath(file_to_backup)
225
            backup_name = self.bzrdir._available_backup_name(file_to_backup)
226
            osutils.rename(abs_path, self.abspath(backup_name))
227
            return "removed %s (but kept a copy: %s)" % (
228
                file_to_backup, backup_name)
229
230
        for f in files:
231
            fid = self.path2id(f)
232
            if not fid:
233
                message = "%s is not versioned." % (f,)
234
            else:
235
                abs_path = self.abspath(f)
236
                if verbose:
237
                    # having removed it, it must be either ignored or unknown
238
                    if self.is_ignored(f):
239
                        new_status = 'I'
240
                    else:
241
                        new_status = '?'
242
                    # XXX: Really should be a more abstract reporter interface
243
                    kind_ch = osutils.kind_marker(self.kind(fid))
244
                    to_file.write(new_status + '       ' + f + kind_ch + '\n')
245
                # Unversion file
246
                # FIXME: _unversion_path() is O(size-of-index) for directories
247
                self._unversion_path(f)
248
                message = "removed %s" % (f,)
249
                if osutils.lexists(abs_path):
250
                    if (osutils.isdir(abs_path) and
251
                        len(os.listdir(abs_path)) > 0):
252
                        if force:
253
                            osutils.rmtree(abs_path)
254
                            message = "deleted %s" % (f,)
255
                        else:
256
                            message = backup(f)
257
                    else:
258
                        if not keep_files:
259
                            osutils.delete_any(abs_path)
260
                            message = "deleted %s" % (f,)
261
262
            # print only one message (if any) per file.
263
            if message is not None:
264
                trace.note(message)
0.200.1328 by Jelmer Vernooij
More test fixes.
265
        self.flush()
0.200.1192 by Jelmer Vernooij
Implement path2id.
266
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
267
    def _add(self, files, ids, kinds):
268
        for (path, file_id, kind) in zip(files, ids, kinds):
0.200.1201 by Jelmer Vernooij
Implement _set_root_id.
269
            if file_id is not None:
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
270
                self._fileid_map.set_file_id(path.encode("utf-8"), file_id)
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
271
            else:
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
272
                file_id = self._fileid_map.lookup_file_id(path.encode("utf-8"))
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
273
            self._index_add_entry(path, file_id, kind)
0.200.1201 by Jelmer Vernooij
Implement _set_root_id.
274
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
275
    @needs_tree_write_lock
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
276
    def smart_add(self, file_list, recurse=True, action=None, save=True):
277
        added = []
278
        ignored = {}
279
        user_dirs = []
280
        for filepath in osutils.canonical_relpaths(self.basedir, file_list):
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
281
            abspath = self.abspath(filepath)
282
            kind = osutils.file_kind(abspath)
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
283
            if action is not None:
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
284
                file_id = action(self, None, filepath, kind)
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
285
            else:
286
                file_id = None
287
            if kind in ("file", "symlink"):
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
288
                if save:
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
289
                    self._index_add_entry(filepath, file_id, kind)
290
                added.append(filepath)
291
            elif kind == "directory":
292
                if recurse:
293
                    user_dirs.append(filepath)
294
            else:
295
                raise errors.BadFileKindError(filename=abspath, kind=kind)
296
        for user_dir in user_dirs:
297
            abs_user_dir = self.abspath(user_dir)
298
            for name in os.listdir(abs_user_dir):
299
                subp = os.path.join(user_dir, name)
0.200.1328 by Jelmer Vernooij
More test fixes.
300
                if self.is_control_filename(subp) or self.mapping.is_special_file(subp):
0.200.1257 by Jelmer Vernooij
Don't be verbose on control filenames.
301
                    continue
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
302
                ignore_glob = self.is_ignored(subp)
303
                if ignore_glob is not None:
304
                    ignored.setdefault(ignore_glob, []).append(subp)
305
                    continue
306
                abspath = self.abspath(subp)
307
                kind = osutils.file_kind(abspath)
308
                if kind == "directory":
309
                    user_dirs.append(subp)
310
                else:
311
                    if action is not None:
312
                        file_id = action()
313
                    else:
314
                        file_id = None
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
315
                    if save:
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
316
                        self._index_add_entry(subp, file_id, kind)
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
317
        if added and save:
318
            self.flush()
0.200.1240 by Jelmer Vernooij
Implement GitWorkingTree.smart_add.
319
        return added, ignored
320
0.200.1201 by Jelmer Vernooij
Implement _set_root_id.
321
    def _set_root_id(self, file_id):
322
        self._fileid_map.set_file_id("", file_id)
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
323
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
324
    @needs_tree_write_lock
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
325
    def move(self, from_paths, to_dir=None, after=False):
326
        rename_tuples = []
327
        to_abs = self.abspath(to_dir)
328
        if not os.path.isdir(to_abs):
329
            raise errors.BzrMoveFailedError('', to_dir,
330
                errors.NotADirectory(to_abs))
331
332
        for from_rel in from_paths:
333
            from_tail = os.path.split(from_rel)[-1]
334
            to_rel = os.path.join(to_dir, from_tail)
335
            self.rename_one(from_rel, to_rel, after=after)
336
            rename_tuples.append((from_rel, to_rel))
0.200.1328 by Jelmer Vernooij
More test fixes.
337
        self.flush()
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
338
        return rename_tuples
339
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
340
    @needs_tree_write_lock
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
341
    def rename_one(self, from_rel, to_rel, after=False):
342
        if not after:
343
            os.rename(self.abspath(from_rel), self.abspath(to_rel))
0.200.1203 by Jelmer Vernooij
Fix per_workingtree.test_rename_one.TestRenameOne.test_rename_after_non_existant_non_ascii
344
        from_path = from_rel.encode("utf-8")
345
        to_path = to_rel.encode("utf-8")
346
        if not self.has_filename(to_rel):
347
            raise errors.BzrMoveFailedError(from_rel, to_rel,
348
                errors.NoSuchFile(to_rel))
349
        if not from_path in self.index:
350
            raise errors.BzrMoveFailedError(from_rel, to_rel,
351
                errors.NotVersionedError(path=from_rel))
352
        self.index[to_path] = self.index[from_path]
353
        del self.index[from_path]
0.200.1328 by Jelmer Vernooij
More test fixes.
354
        self.flush()
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
355
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
356
    def get_root_id(self):
0.200.1192 by Jelmer Vernooij
Implement path2id.
357
        return self.path2id("")
358
0.200.1242 by Jelmer Vernooij
Support directories better.
359
    def _has_dir(self, path):
360
        if self._versioned_dirs is None:
361
            self._load_dirs()
362
        return path in self._versioned_dirs
363
0.200.1192 by Jelmer Vernooij
Implement path2id.
364
    @needs_read_lock
365
    def path2id(self, path):
0.200.1242 by Jelmer Vernooij
Support directories better.
366
        encoded_path = path.encode("utf-8")
367
        if self._is_versioned(encoded_path):
368
            return self._fileid_map.lookup_file_id(encoded_path)
369
        return None
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
370
0.200.1328 by Jelmer Vernooij
More test fixes.
371
    def _iter_files_recursive(self, from_dir=None):
372
        if from_dir is None:
373
            from_dir = ""
374
        for (dirpath, dirnames, filenames) in os.walk(self.abspath(from_dir)):
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
375
            dir_relpath = dirpath[len(self.basedir):].strip("/")
376
            if self.bzrdir.is_control_filename(dir_relpath):
0.200.605 by Jelmer Vernooij
Ignore directories in WorkingTree.extras().
377
                continue
0.200.615 by Jelmer Vernooij
Optimize WorkingTree.extras().
378
            for filename in filenames:
0.200.1328 by Jelmer Vernooij
More test fixes.
379
                if not self.mapping.is_special_file(filename):
380
                    yield os.path.join(dir_relpath, filename)
0.200.1327 by Jelmer Vernooij
Factor out all file browsing in extras.
381
382
    def extras(self):
383
        """Yield all unversioned files in this WorkingTree.
384
        """
0.200.1328 by Jelmer Vernooij
More test fixes.
385
        return set(self._iter_files_recursive()) - set(self.index)
0.200.605 by Jelmer Vernooij
Ignore directories in WorkingTree.extras().
386
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
387
    def unlock(self):
0.200.224 by Jelmer Vernooij
Fix working tree locking.
388
        # non-implementation specific cleanup
389
        self._cleanup()
390
391
        # reverse order of locking.
392
        try:
393
            return self._control_files.unlock()
394
        finally:
395
            self.branch.unlock()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
396
0.200.382 by Jelmer Vernooij
Support flushing index.
397
    def flush(self):
398
        # TODO: Maybe this should only write on dirty ?
399
        if self._control_files._lock_mode != 'w':
400
            raise errors.NotWriteLocked(self)
0.200.385 by Jelmer Vernooij
Cope with removed files.
401
        self.index.write()
0.200.382 by Jelmer Vernooij
Support flushing index.
402
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
403
    def __iter__(self):
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
404
        for path in self.index:
0.200.1192 by Jelmer Vernooij
Implement path2id.
405
            yield self.path2id(path)
0.200.1242 by Jelmer Vernooij
Support directories better.
406
        self._load_dirs()
407
        for path in self._versioned_dirs:
408
            yield self.path2id(path)
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
409
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
410
    def has_or_had_id(self, file_id):
411
        if self.has_id(file_id):
412
            return True
413
        if self.had_id(file_id):
414
            return True
415
        return False
416
417
    def had_id(self, file_id):
418
        path = self._basis_fileid_map.lookup_file_id(file_id)
419
        try:
420
            head = self.repository._git.head()
421
        except KeyError:
422
            # Assume no if basis is not accessible
423
            return False
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
424
        if head == ZERO_SHA:
425
            return False
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
426
        root_tree = self.store[head].tree
427
        try:
428
            tree_lookup_path(self.store.__getitem__, root_tree, path)
429
        except KeyError:
430
            return False
431
        else:
432
            return True
433
0.200.1198 by Jelmer Vernooij
Implement GitWorkingTree.has_id.
434
    def has_id(self, file_id):
435
        try:
436
            self.id2path(file_id)
437
        except errors.NoSuchId:
438
            return False
439
        else:
440
            return True
441
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
442
    def id2path(self, file_id):
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
443
        if type(file_id) != str:
444
            raise AssertionError
445
        path = self._fileid_map.lookup_path(file_id)
0.200.1213 by Jelmer Vernooij
Add note about directories.
446
        # FIXME: What about directories?
0.200.1242 by Jelmer Vernooij
Support directories better.
447
        if self._is_versioned(path):
448
            return path.decode("utf-8")
0.200.1214 by Jelmer Vernooij
Set container when raising NoSuchId.
449
        raise errors.NoSuchId(self, file_id)
0.264.1 by Jelmer Vernooij
Provide stubs using inventory for the moment.:
450
0.200.1200 by Jelmer Vernooij
Support GitWorkingTree.get_file_mtime.
451
    def get_file_mtime(self, file_id, path=None):
452
        """See Tree.get_file_mtime."""
453
        if not path:
454
            path = self.id2path(file_id)
455
        return os.lstat(self.abspath(path)).st_mtime
456
0.200.409 by Jelmer Vernooij
Support parsing .gitignore.
457
    def get_ignore_list(self):
458
        ignoreset = getattr(self, '_ignoreset', None)
459
        if ignoreset is not None:
460
            return ignoreset
461
462
        ignore_globs = set()
463
        ignore_globs.update(ignores.get_runtime_ignores())
464
        ignore_globs.update(ignores.get_user_ignores())
465
        if self.has_filename(IGNORE_FILENAME):
466
            f = self.get_file_byname(IGNORE_FILENAME)
467
            try:
0.200.1198 by Jelmer Vernooij
Implement GitWorkingTree.has_id.
468
                # FIXME: Parse git file format, rather than assuming it's
469
                # the same as for bzr's native formats.
0.200.409 by Jelmer Vernooij
Support parsing .gitignore.
470
                ignore_globs.update(ignores.parse_ignore_file(f))
471
            finally:
472
                f.close()
473
        self._ignoreset = ignore_globs
474
        return ignore_globs
475
0.200.508 by Jelmer Vernooij
Skip inventory caching bits.
476
    def set_last_revision(self, revid):
477
        self._change_last_revision(revid)
478
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
479
    def _reset_data(self):
0.248.3 by Jelmer Vernooij
Handle working trees without valid HEAD branch.
480
        try:
481
            head = self.repository._git.head()
482
        except KeyError, name:
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
483
            raise errors.NotBranchError("branch %s at %s" % (name,
484
                self.repository.base))
0.200.948 by Jelmer Vernooij
Cope with empty inventories.
485
        if head == ZERO_SHA:
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
486
            self._basis_fileid_map = GitFileIdMap({}, self.mapping)
0.200.948 by Jelmer Vernooij
Cope with empty inventories.
487
        else:
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
488
            self._basis_fileid_map = self.mapping.get_fileid_map(
489
                self.store.__getitem__, self.store[head].tree)
0.200.379 by Jelmer Vernooij
Re-enable working tree support.
490
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
491
    @needs_read_lock
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
492
    def get_file_verifier(self, file_id, path=None, stat_value=None):
493
        if path is None:
494
            path = self.id2path(file_id)
495
        return ("GIT", self.index[path][-2])
496
497
    @needs_read_lock
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
498
    def get_file_sha1(self, file_id, path=None, stat_value=None):
499
        if not path:
0.264.2 by Jelmer Vernooij
Implement GitWorkingTree.{_add,__iter__,id2path}.
500
            path = self.id2path(file_id)
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
501
        abspath = self.abspath(path).encode(osutils._fs_enc)
0.239.4 by Jelmer Vernooij
Cope with nonexistent files and directories in get_file_sha1.
502
        try:
0.200.1302 by Jelmer Vernooij
Significantly improve performance of WorkingTree.extras().
503
            return osutils.sha_file_by_name(abspath)
0.239.4 by Jelmer Vernooij
Cope with nonexistent files and directories in get_file_sha1.
504
        except OSError, (num, msg):
505
            if num in (errno.EISDIR, errno.ENOENT):
506
                return None
507
            raise
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
508
0.200.610 by Jelmer Vernooij
Support retrieving basis tree properly.
509
    def revision_tree(self, revid):
510
        return self.repository.revision_tree(revid)
511
0.200.1242 by Jelmer Vernooij
Support directories better.
512
    def _is_versioned(self, path):
513
        return (path in self.index or self._has_dir(path))
514
0.200.1239 by Jelmer Vernooij
Implement GitWorkingTree.filter_unversioned_files.
515
    def filter_unversioned_files(self, files):
0.200.1316 by Jelmer Vernooij
Fix filter_unversioned_files.
516
        return set([p for p in files if not self._is_versioned(p.encode("utf-8"))])
0.200.1239 by Jelmer Vernooij
Implement GitWorkingTree.filter_unversioned_files.
517
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
518
    def _get_dir_ie(self, path, parent_id):
0.200.1192 by Jelmer Vernooij
Implement path2id.
519
        file_id = self.path2id(path)
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
520
        return inventory.InventoryDirectory(file_id,
0.200.1190 by Jelmer Vernooij
Fix get_symlink_target call.
521
            posixpath.basename(path).strip("/"), parent_id)
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
522
523
    def _add_missing_parent_ids(self, path, dir_ids):
524
        if path in dir_ids:
525
            return []
526
        parent = posixpath.dirname(path).strip("/")
527
        ret = self._add_missing_parent_ids(parent, dir_ids)
528
        parent_id = dir_ids[parent]
529
        ie = self._get_dir_ie(path, parent_id)
530
        dir_ids[path] = ie.file_id
531
        ret.append((path, ie))
532
        return ret
533
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
534
    def _get_file_ie(self, name, path, value, parent_id):
535
        assert isinstance(name, unicode)
0.200.1192 by Jelmer Vernooij
Implement path2id.
536
        assert isinstance(path, unicode)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
537
        assert isinstance(value, tuple) and len(value) == 10
538
        (ctime, mtime, dev, ino, mode, uid, gid, size, sha, flags) = value
0.200.1192 by Jelmer Vernooij
Implement path2id.
539
        file_id = self.path2id(path)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
540
        if type(file_id) != str:
541
            raise AssertionError
542
        kind = mode_kind(mode)
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
543
        ie = inventory.entry_factory[kind](file_id, name, parent_id)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
544
        if kind == 'symlink':
0.200.1190 by Jelmer Vernooij
Fix get_symlink_target call.
545
            ie.symlink_target = self.get_symlink_target(file_id)
0.264.10 by Jelmer Vernooij
Yield inventory entries.
546
        else:
547
            data = self.get_file_text(file_id, path)
548
            ie.text_sha1 = osutils.sha_string(data)
549
            ie.text_size = len(data)
550
            ie.executable = self.is_executable(file_id, path)
551
        ie.revision = None
552
        return ie
553
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
554
    def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
555
        mode = stat_result.st_mode
556
        return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
557
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
558
    def stored_kind(self, file_id, path=None):
559
        if path is None:
560
            path = self.id2path(file_id)
0.200.1328 by Jelmer Vernooij
More test fixes.
561
        try:
562
            return mode_kind(self.index[path.encode("utf-8")][4])
563
        except KeyError:
564
            # Maybe it's a directory?
565
            if self._has_dir(path):
566
                return "directory"
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
567
            raise errors.NoSuchId(self, file_id)
568
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
569
    if not osutils.supports_executable():
570
        def is_executable(self, file_id, path=None):
571
            basis_tree = self.basis_tree()
572
            if file_id in basis_tree:
573
                return basis_tree.is_executable(file_id)
574
            # Default to not executable
575
            return False
576
    else:
577
        def is_executable(self, file_id, path=None):
578
            if not path:
579
                path = self.id2path(file_id)
580
            mode = os.lstat(self.abspath(path)).st_mode
581
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
582
583
        _is_executable_from_path_and_stat = \
584
            _is_executable_from_path_and_stat_from_stat
585
0.264.10 by Jelmer Vernooij
Yield inventory entries.
586
    def list_files(self, include_root=False, from_dir=None, recursive=True):
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
587
        # FIXME: Yield non-versioned files
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
588
        if from_dir is None:
589
            from_dir = ""
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
590
        dir_ids = {}
0.200.1339 by Jelmer Vernooij
Some reformatting.
591
        fk_entries = {'directory': workingtree.TreeDirectory,
592
                      'file': workingtree.TreeFile,
593
                      'symlink': workingtree.TreeLink}
0.200.1192 by Jelmer Vernooij
Implement path2id.
594
        root_ie = self._get_dir_ie(u"", None)
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
595
        if include_root and not from_dir:
596
            yield "", "V", root_ie.kind, root_ie.file_id, root_ie
0.200.1192 by Jelmer Vernooij
Implement path2id.
597
        dir_ids[u""] = root_ie.file_id
0.200.1328 by Jelmer Vernooij
More test fixes.
598
        if recursive:
599
            path_iterator = self._iter_files_recursive(from_dir)
600
        else:
601
            if from_dir is None:
602
                start = self.basedir
603
            else:
604
                start = os.path.join(self.basedir, from_dir)
605
            path_iterator = sorted([os.path.join(from_dir, name) for name in
606
                os.listdir(start) if not self.bzrdir.is_control_filename(name)
607
                and not self.mapping.is_special_file(name)])
608
        for path in path_iterator:
609
            try:
610
                value = self.index[path]
611
            except KeyError:
612
                value = None
0.200.1192 by Jelmer Vernooij
Implement path2id.
613
            path = path.decode("utf-8")
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
614
            parent, name = posixpath.split(path)
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
615
            for dir_path, dir_ie in self._add_missing_parent_ids(parent, dir_ids):
616
                yield dir_path, "V", dir_ie.kind, dir_ie.file_id, dir_ie
0.200.1328 by Jelmer Vernooij
More test fixes.
617
            if value is not None:
618
                ie = self._get_file_ie(name, path, value, dir_ids[parent])
619
                yield path, "V", ie.kind, ie.file_id, ie
620
            else:
621
                kind = osutils.file_kind(self.abspath(path))
622
                ie = fk_entries[kind]()
623
                yield path, "?", kind, None, ie
0.264.10 by Jelmer Vernooij
Yield inventory entries.
624
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
625
    def all_file_ids(self):
626
        ids = {u"": self.path2id("")}
627
        for path in self.index:
0.200.1328 by Jelmer Vernooij
More test fixes.
628
            if self.mapping.is_special_file(path):
629
                continue
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
630
            path = path.decode("utf-8")
631
            parent = posixpath.dirname(path).strip("/")
632
            for e in self._add_missing_parent_ids(parent, ids):
633
                pass
634
            ids[path] = self.path2id(path)
635
        return set(ids.values())
636
0.264.9 by Jelmer Vernooij
Implement basic GitWorkingTree.iter_entries_by_dir.
637
    def iter_entries_by_dir(self, specific_file_ids=None, yield_parents=False):
638
        # FIXME: Is return order correct?
0.200.1252 by Jelmer Vernooij
Support specific_file_ids in GitWorkingTree.iter_entries_by_dir.
639
        if yield_parents:
640
            raise NotImplementedError(self.iter_entries_by_dir)
0.264.9 by Jelmer Vernooij
Implement basic GitWorkingTree.iter_entries_by_dir.
641
        if specific_file_ids is not None:
0.200.1252 by Jelmer Vernooij
Support specific_file_ids in GitWorkingTree.iter_entries_by_dir.
642
            specific_paths = [self.id2path(file_id) for file_id in specific_file_ids]
643
            if specific_paths in ([u""], []):
644
                specific_paths = None
645
            else:
646
                specific_paths = set(specific_paths)
647
        else:
648
            specific_paths = None
0.200.1192 by Jelmer Vernooij
Implement path2id.
649
        root_ie = self._get_dir_ie(u"", None)
0.200.1252 by Jelmer Vernooij
Support specific_file_ids in GitWorkingTree.iter_entries_by_dir.
650
        if specific_paths is None:
651
            yield u"", root_ie
0.200.1192 by Jelmer Vernooij
Implement path2id.
652
        dir_ids = {u"": root_ie.file_id}
0.264.10 by Jelmer Vernooij
Yield inventory entries.
653
        for path, value in self.index.iteritems():
0.200.1328 by Jelmer Vernooij
More test fixes.
654
            if self.mapping.is_special_file(path):
655
                continue
0.200.1192 by Jelmer Vernooij
Implement path2id.
656
            path = path.decode("utf-8")
0.200.1252 by Jelmer Vernooij
Support specific_file_ids in GitWorkingTree.iter_entries_by_dir.
657
            if specific_paths is not None and not path in specific_paths:
658
                continue
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
659
            (parent, name) = posixpath.split(path)
0.200.1251 by Jelmer Vernooij
Cope with files dissapearing in GitWorkingTree.
660
            try:
0.200.1321 by Jelmer Vernooij
More fixes for compatibility with bzr.dev testsuite.
661
                file_ie = self._get_file_ie(name, path, value, None)
0.200.1251 by Jelmer Vernooij
Cope with files dissapearing in GitWorkingTree.
662
            except IOError:
663
                continue
0.200.1207 by Jelmer Vernooij
Fix some formatting.
664
            for (dir_path, dir_ie) in self._add_missing_parent_ids(parent,
665
                    dir_ids):
0.264.11 by Jelmer Vernooij
Completer implementation of iter_entries_by_dir and list_files.
666
                yield dir_path, dir_ie
0.200.1251 by Jelmer Vernooij
Cope with files dissapearing in GitWorkingTree.
667
            file_ie.parent_id = self.path2id(parent)
668
            yield path, file_ie
0.264.9 by Jelmer Vernooij
Implement basic GitWorkingTree.iter_entries_by_dir.
669
0.200.619 by Jelmer Vernooij
Provide dummy WorkingTree.conflicts() implementation rather than spending a lot of time not finding any conflicts.
670
    @needs_read_lock
671
    def conflicts(self):
672
        # FIXME:
0.262.1 by Jelmer Vernooij
Fix WorkingTree.conflicts().
673
        return _mod_conflicts.ConflictList()
0.200.619 by Jelmer Vernooij
Provide dummy WorkingTree.conflicts() implementation rather than spending a lot of time not finding any conflicts.
674
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
675
    def update_basis_by_delta(self, new_revid, delta):
0.200.1196 by Jelmer Vernooij
Implement GitWorkingTree.update_basis_by_delta.
676
        # The index just contains content, which won't have changed.
0.200.1202 by Jelmer Vernooij
Implement has_or_had_id.
677
        self._reset_data()
0.200.1193 by Jelmer Vernooij
Implement GitWorkingTree.{move,rename_one}.
678
0.200.1328 by Jelmer Vernooij
More test fixes.
679
    def get_canonical_inventory_path(self, path):
680
        for p in self.index:
681
            if p.lower() == path.lower():
682
                return p
683
        else:
684
            return path
685
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
686
    def _walkdirs(self, prefix=""):
687
        if prefix != "":
688
            prefix += "/"
689
        per_dir = defaultdict(list)
690
        for path, value in self.index.iteritems():
0.200.1328 by Jelmer Vernooij
More test fixes.
691
            if self.mapping.is_special_file(path):
692
                continue
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
693
            if not path.startswith(prefix):
694
                continue
695
            (dirname, child_name) = posixpath.split(path)
696
            dirname = dirname.decode("utf-8")
697
            dir_file_id = self.path2id(dirname)
698
            assert isinstance(value, tuple) and len(value) == 10
699
            (ctime, mtime, dev, ino, mode, uid, gid, size, sha, flags) = value
0.200.1211 by Jelmer Vernooij
Fix statresult.
700
            stat_result = posix.stat_result((mode, ino,
701
                    dev, 1, uid, gid, size,
702
                    0, mtime, ctime))
0.200.1210 by Jelmer Vernooij
Implement GitWorkingTree._walkdirs.
703
            per_dir[(dirname, dir_file_id)].append(
704
                (path.decode("utf-8"), child_name.decode("utf-8"),
705
                mode_kind(mode), stat_result,
706
                self.path2id(path.decode("utf-8")),
707
                mode_kind(mode)))
708
        return per_dir.iteritems()
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
709
0.200.1308 by Jelmer Vernooij
Write index to disk after adding files.
710
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
711
class GitWorkingTreeFormat(workingtree.WorkingTreeFormat):
712
0.200.1206 by Jelmer Vernooij
Implement GitWorkingTree.all_file_ids.
713
    _tree_class = GitWorkingTree
714
0.200.1295 by Jelmer Vernooij
Mark working trees as not supporting directories.
715
    supports_versioned_directories = False
716
0.200.656 by Jelmer Vernooij
Implement GitWorkingTreeFormat._matchingbzrdir.
717
    @property
718
    def _matchingbzrdir(self):
0.200.1140 by Jelmer Vernooij
Update now that the control dir formats are no longer in __init__.
719
        from bzrlib.plugins.git.dir import LocalGitControlDirFormat
0.200.1013 by Jelmer Vernooij
More renames.
720
        return LocalGitControlDirFormat()
0.200.656 by Jelmer Vernooij
Implement GitWorkingTreeFormat._matchingbzrdir.
721
0.200.90 by Jelmer Vernooij
Basic support for opening working trees.
722
    def get_format_description(self):
723
        return "Git Working Tree"
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
724
0.200.1096 by Jelmer Vernooij
Implement GitWorkingTreeFormat.initialize.
725
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
726
                   accelerator_tree=None, hardlink=False):
727
        """See WorkingTreeFormat.initialize()."""
728
        if not isinstance(a_bzrdir, LocalGitDir):
729
            raise errors.IncompatibleFormat(self, a_bzrdir)
730
        index = Index(a_bzrdir.root_transport.local_abspath(".git/index"))
731
        index.write()
732
        return GitWorkingTree(a_bzrdir, a_bzrdir.open_repository(),
733
            a_bzrdir.open_branch(), index)
734
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
735
736
class InterIndexGitTree(tree.InterTree):
737
    """InterTree that works between a Git revision tree and an index."""
738
739
    def __init__(self, source, target):
740
        super(InterIndexGitTree, self).__init__(source, target)
741
        self._index = target.index
742
743
    @classmethod
744
    def is_compatible(cls, source, target):
745
        from bzrlib.plugins.git.repository import GitRevisionTree
746
        return (isinstance(source, GitRevisionTree) and 
747
                isinstance(target, GitWorkingTree))
748
749
    def compare(self, want_unchanged=False, specific_files=None,
750
                extra_trees=None, require_versioned=False, include_root=False,
751
                want_unversioned=False):
752
        changes = self._index.changes_from_tree(
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
753
            self.source.store, self.source.tree, 
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
754
            want_unchanged=want_unchanged)
0.200.1338 by Jelmer Vernooij
Simplify code for getting file id map.
755
        source_fileid_map = self.source._fileid_map
756
        target_fileid_map = self.target._fileid_map
0.200.1030 by Jelmer Vernooij
More work on supporting roundtripping push.
757
        ret = tree_delta_from_git_changes(changes, self.target.mapping,
0.252.43 by Jelmer Vernooij
Some refactoring, support proper file ids in revision deltas.
758
            (source_fileid_map, target_fileid_map),
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
759
            specific_file=specific_files, require_versioned=require_versioned)
760
        if want_unversioned:
761
            for e in self.target.extras():
0.200.1207 by Jelmer Vernooij
Fix some formatting.
762
                ret.unversioned.append((e, None,
763
                    osutils.file_kind(self.target.abspath(e))))
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
764
        return ret
765
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
766
    def iter_changes(self, include_unchanged=False, specific_files=None,
0.200.1207 by Jelmer Vernooij
Fix some formatting.
767
        pb=None, extra_trees=[], require_versioned=True,
768
        want_unversioned=False):
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
769
        changes = self._index.changes_from_tree(
0.200.1205 by Jelmer Vernooij
Implement GitWorkingTree.stored_kind.
770
            self.source.store, self.source.tree,
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
771
            want_unchanged=include_unchanged)
772
        # FIXME: Handle want_unversioned
0.200.1179 by Jelmer Vernooij
Avoid using verifiers for natively imported revisions, save a lot of time.
773
        return changes_from_git_changes(changes, self.target.mapping,
0.200.622 by Jelmer Vernooij
Implement InterTree.iter_changes() as well.
774
            specific_file=specific_files)
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
775
0.200.1179 by Jelmer Vernooij
Avoid using verifiers for natively imported revisions, save a lot of time.
776
0.200.616 by Jelmer Vernooij
Provide custom intertree implementation for GitRevisionTree->GitWorkingTree.
777
tree.InterTree.register_optimiser(InterIndexGitTree)