~bzr-pqm/bzr/bzr.dev

5630.2.2 by John Arbash Meinel
Start fleshing out the design. Something weird is causing my tests to all fail.
1
# Copyright (C) 2005-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
453 by Martin Pool
- Split WorkingTree into its own file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
453 by Martin Pool
- Split WorkingTree into its own file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
453 by Martin Pool
- Split WorkingTree into its own file
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
453 by Martin Pool
- Split WorkingTree into its own file
16
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
17
"""WorkingTree object and friends.
18
19
A WorkingTree represents the editable working copy of a branch.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
20
Operations which represent the WorkingTree are also done here,
21
such as renaming or adding files.  The WorkingTree has an inventory
22
which is updated by these operations.  A commit produces a
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
23
new revision based on the workingtree and its inventory.
24
25
At the moment every WorkingTree has its own branch.  Remote
26
WorkingTrees aren't supported.
27
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
28
To get a WorkingTree, call bzrdir.open_workingtree() or
29
WorkingTree.open(dir).
1185.16.72 by Martin Pool
[merge] from robert and fix up tests
30
"""
31
956 by Martin Pool
doc
32
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
33
from cStringIO import StringIO
34
import os
2423.2.1 by Alexander Belchenko
Fix for walkdirs in missing dir with Py2.4 @ win32
35
import sys
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
36
37
from bzrlib.lazy_import import lazy_import
38
lazy_import(globals(), """
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
39
from bisect import bisect_left
1732.1.9 by John Arbash Meinel
Non-recursive implementation of WorkingTree.list_files
40
import collections
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
41
import errno
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
42
import itertools
43
import operator
1398 by Robert Collins
integrate in Gustavos x-bit patch
44
import stat
2120.7.5 by Aaron Bentley
Merge bzr.dev
45
import re
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
46
1731.2.17 by Aaron Bentley
Support extracting with checkouts
47
from bzrlib import (
48
    branch,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
49
    bzrdir,
50
    conflicts as _mod_conflicts,
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
51
    controldir,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
52
    errors,
5745.3.2 by Jelmer Vernooij
Add filters to import tariff blacklist.
53
    filters as _mod_filters,
2116.4.1 by John Arbash Meinel
Update file and revision id generators.
54
    generate_ids,
2135.2.7 by Kent Gibson
Implement JAM's review suggestions.
55
    globbing,
4454.3.67 by John Arbash Meinel
Implement RevisionTree.annotate_iter and WT.annotate_iter
56
    graph as _mod_graph,
2201.1.1 by John Arbash Meinel
Fix bug #76299 by ignoring write errors during readonly hashcache write.
57
    hashcache,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
58
    ignores,
4496.3.4 by Andrew Bennetts
Tidy up unused and redundant imports in workingtree.py.
59
    inventory,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
60
    merge,
2598.5.1 by Aaron Bentley
Start eliminating the use of None to indicate null revision
61
    revision as _mod_revision,
1908.11.5 by John Arbash Meinel
[merge] bzr.dev 2240
62
    revisiontree,
5753.2.2 by Jelmer Vernooij
Remove some unnecessary imports, clean up lazy imports.
63
    rio as _mod_rio,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
64
    transform,
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
65
    transport,
2323.6.2 by Martin Pool
Move responsibility for suggesting upgrades to ui object
66
    ui,
3586.1.3 by Ian Clatworthy
add views attribute to working trees
67
    views,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
68
    xml5,
2100.3.10 by Aaron Bentley
Ensure added references are serialized properly, beef up Workingtreee3
69
    xml7,
1731.2.17 by Aaron Bentley
Support extracting with checkouts
70
    )
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
71
""")
72
1986.5.6 by Robert Collins
Merge bzr.dev.
73
from bzrlib import symbol_versioning
1534.4.28 by Robert Collins
first cut at merge from integration.
74
from bzrlib.decorators import needs_read_lock, needs_write_lock
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
75
from bzrlib.lock import LogicalLockResult
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
76
import bzrlib.mutabletree
1986.1.8 by Robert Collins
Update to bzr.dev, which involves adding lock_tree_write to MutableTree and MemoryTree.
77
from bzrlib.mutabletree import needs_tree_write_lock
2949.6.2 by Alexander Belchenko
more changes osutils.lstat -> os.lstat
78
from bzrlib import osutils
1587.1.14 by Robert Collins
Make bound branch creation happen via 'checkout'
79
from bzrlib.osutils import (
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
80
    file_kind,
81
    isdir,
2206.1.8 by Marius Kruger
Converted move/rename error messages to show source => target.
82
    normpath,
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
83
    pathjoin,
2206.1.8 by Marius Kruger
Converted move/rename error messages to show source => target.
84
    realpath,
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
85
    safe_unicode,
86
    splitpath,
87
    supports_executable,
88
    )
89
from bzrlib.trace import mutter, note
4496.3.4 by Andrew Bennetts
Tidy up unused and redundant imports in workingtree.py.
90
from bzrlib.revision import CURRENT_REVISION
91
from bzrlib.symbol_versioning import (
92
    deprecated_passed,
93
    DEPRECATED_PARAMETER,
94
    )
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
95
96
97
MERGE_MODIFIED_HEADER_1 = "BZR merge-modified list format 1"
4597.3.48 by Vincent Ladeuil
Start cleaning BRANCH.TODO by pushing changes to either the python modules or the documentation.
98
# TODO: Modifying the conflict objects or their type is currently nearly
99
# impossible as there is no clear relationship between the working tree format
100
# and the conflict list file format.
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
101
CONFLICT_HEADER_1 = "BZR conflict list format 1"
1685.1.30 by John Arbash Meinel
PEP8 for workingtree.py
102
2423.2.1 by Alexander Belchenko
Fix for walkdirs in missing dir with Py2.4 @ win32
103
ERROR_PATH_NOT_FOUND = 3    # WindowsError errno code, equivalent to ENOENT
104
2116.4.1 by John Arbash Meinel
Update file and revision id generators.
105
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
106
class TreeEntry(object):
1759.2.1 by Jelmer Vernooij
Fix some types (found using aspell).
107
    """An entry that implements the minimum interface used by commands.
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
108
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
109
    This needs further inspection, it may be better to have
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
110
    InventoryEntries without ids - though that seems wrong. For now,
111
    this is a parallel hierarchy to InventoryEntry, and needs to become
112
    one of several things: decorates to that hierarchy, children of, or
113
    parents of it.
1399.1.3 by Robert Collins
move change detection for text and metadata from delta to entry.detect_changes
114
    Another note is that these objects are currently only used when there is
115
    no InventoryEntry available - i.e. for unversioned objects.
116
    Perhaps they should be UnversionedEntry et al. ? - RBC 20051003
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
117
    """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
118
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
119
    def __eq__(self, other):
120
        # yes, this us ugly, TODO: best practice __eq__ style.
121
        return (isinstance(other, TreeEntry)
122
                and other.__class__ == self.__class__)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
123
1399.1.2 by Robert Collins
push kind character creation into InventoryEntry and TreeEntry
124
    def kind_character(self):
125
        return "???"
126
127
128
class TreeDirectory(TreeEntry):
129
    """See TreeEntry. This is a directory in a working tree."""
130
131
    def __eq__(self, other):
132
        return (isinstance(other, TreeDirectory)
133
                and other.__class__ == self.__class__)
134
135
    def kind_character(self):
136
        return "/"
137
138
139
class TreeFile(TreeEntry):
140
    """See TreeEntry. This is a regular file in a working tree."""
141
142
    def __eq__(self, other):
143
        return (isinstance(other, TreeFile)
144
                and other.__class__ == self.__class__)
145
146
    def kind_character(self):
147
        return ''
148
149
150
class TreeLink(TreeEntry):
151
    """See TreeEntry. This is a symlink in a working tree."""
152
153
    def __eq__(self, other):
154
        return (isinstance(other, TreeLink)
155
                and other.__class__ == self.__class__)
156
157
    def kind_character(self):
158
        return ''
159
160
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
161
class WorkingTree(bzrlib.mutabletree.MutableTree,
5363.2.10 by Jelmer Vernooij
base ControlDir on ControlComponent.
162
    controldir.ControlComponent):
453 by Martin Pool
- Split WorkingTree into its own file
163
    """Working copy tree.
164
5335.1.2 by Robert Collins
Add note that basedir is a unicode object as per John's review.
165
    :ivar basedir: The root of the tree on disk. This is a unicode path object
166
        (as opposed to a URL).
453 by Martin Pool
- Split WorkingTree into its own file
167
    """
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
168
3586.1.3 by Ian Clatworthy
add views attribute to working trees
169
    # override this to set the strategy for storing views
170
    def _make_views(self):
171
        return views.DisabledViews(self)
172
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
173
    def __init__(self, basedir='.',
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
174
                 branch=DEPRECATED_PARAMETER,
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
175
                 _control_files=None,
176
                 _internal=False,
177
                 _format=None,
178
                 _bzrdir=None):
2367.2.1 by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins)
179
        """Construct a WorkingTree instance. This is not a public API.
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
180
2367.2.1 by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins)
181
        :param branch: A branch to override probing for the branch.
1457.1.1 by Robert Collins
rather than getting the branch inventory, WorkingTree can use the whole Branch, or make its own.
182
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
183
        self._format = _format
1534.4.51 by Robert Collins
Test the disk layout of format3 working trees.
184
        self.bzrdir = _bzrdir
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
185
        if not _internal:
2367.2.1 by Robert Collins
Remove bzrlib 0.8 compatability where it was making the code unclear or messy. (Robert Collins)
186
            raise errors.BzrError("Please use bzrdir.open_workingtree or "
187
                "WorkingTree.open() to obtain a WorkingTree.")
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
188
        basedir = safe_unicode(basedir)
1534.5.3 by Robert Collins
Make format 4/5/6 branches share a single LockableFiles instance across wt/branch/repository.
189
        mutter("opening working tree %r", basedir)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
190
        if deprecated_passed(branch):
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
191
            self._branch = branch
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
192
        else:
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
193
            self._branch = self.bzrdir.open_branch()
1508.1.10 by Robert Collins
bzrlib.add.smart_add_branch is now smart_add_tree. (Robert Collins)
194
        self.basedir = realpath(basedir)
5582.9.4 by Jelmer Vernooij
Remove hack for loading version 2 working trees from WorkingTree.
195
        self._control_files = _control_files
3407.2.1 by Martin Pool
Deprecate LockableFiles.get
196
        self._transport = self._control_files._transport
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
197
        # update the whole cache up front and write to disk if anything changed;
198
        # in the future we might want to do this more selectively
1467 by Robert Collins
WorkingTree.__del__ has been removed.
199
        # two possible ways offer themselves : in self._unlock, write the cache
200
        # if needed, or, when the cache sees a change, append it to the hash
201
        # cache file, and have the parser take the most recent entry for a
202
        # given path only.
2220.1.6 by Marius Kruger
* change error message telling user about --after option sightly
203
        wt_trans = self.bzrdir.get_workingtree_transport(None)
204
        cache_filename = wt_trans.local_abspath('stat-cache')
2201.1.1 by John Arbash Meinel
Fix bug #76299 by ignoring write errors during readonly hashcache write.
205
        self._hashcache = hashcache.HashCache(basedir, cache_filename,
3368.2.27 by Ian Clatworthy
merge bzr.dev r3564
206
            self.bzrdir._get_file_mode(),
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
207
            self._content_filter_stack_provider())
2201.1.1 by John Arbash Meinel
Fix bug #76299 by ignoring write errors during readonly hashcache write.
208
        hc = self._hashcache
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
209
        hc.read()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
210
        # is this scan needed ? it makes things kinda slow.
1732.1.20 by John Arbash Meinel
hash cache pre-scan cost us ~500ms on a kernel sized tree
211
        #hc.scan()
866 by Martin Pool
- use new path-based hashcache for WorkingTree- squash mtime/ctime to whole seconds- update and if necessary write out hashcache when WorkingTree object is created.
212
213
        if hc.needs_write:
214
            mutter("write hc")
215
            hc.write()
453 by Martin Pool
- Split WorkingTree into its own file
216
3034.4.3 by Aaron Bentley
Add case-sensitivity handling to WorkingTree
217
        self._detect_case_handling()
3398.1.24 by Ian Clatworthy
make iter_search_rules a tree method
218
        self._rules_searcher = None
3586.1.3 by Ian Clatworthy
add views attribute to working trees
219
        self.views = self._make_views()
3034.4.3 by Aaron Bentley
Add case-sensitivity handling to WorkingTree
220
5158.6.5 by Martin Pool
Implement ControlComponent on WorkingTree
221
    @property
222
    def user_transport(self):
223
        return self.bzrdir.user_transport
224
225
    @property
226
    def control_transport(self):
227
        return self._transport
228
5699.2.1 by Jelmer Vernooij
Move is_control_filename() from Tree to MutableTree.
229
    def is_control_filename(self, filename):
230
        """True if filename is the name of a control file in this tree.
231
232
        :param filename: A filename within the tree. This is a relative path
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
233
            from the root of this tree.
5699.2.1 by Jelmer Vernooij
Move is_control_filename() from Tree to MutableTree.
234
235
        This is true IF and ONLY IF the filename is part of the meta data
236
        that bzr controls in this tree. I.E. a random .bzr directory placed
237
        on disk will not be a control file for this tree.
238
        """
239
        return self.bzrdir.is_control_filename(filename)
240
3034.4.3 by Aaron Bentley
Add case-sensitivity handling to WorkingTree
241
    def _detect_case_handling(self):
242
        wt_trans = self.bzrdir.get_workingtree_transport(None)
243
        try:
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
244
            wt_trans.stat(self._format.case_sensitive_filename)
3034.4.4 by Aaron Bentley
Fix case-sensitivity detection
245
        except errors.NoSuchFile:
3034.4.3 by Aaron Bentley
Add case-sensitivity handling to WorkingTree
246
            self.case_sensitive = True
247
        else:
248
            self.case_sensitive = False
1185.60.6 by Aaron Bentley
Fixed hashcache
249
2974.2.2 by John Arbash Meinel
Only one test failed, because it was incorrectly succeeding.
250
        self._setup_directory_is_tree_reference()
251
1681.1.1 by Robert Collins
Make WorkingTree.branch a read only property. (Robert Collins)
252
    branch = property(
253
        fget=lambda self: self._branch,
254
        doc="""The branch this WorkingTree is connected to.
255
256
            This cannot be set - it is reflective of the actual disk structure
257
            the working tree has been constructed from.
258
            """)
259
1687.1.9 by Robert Collins
Teach WorkingTree about break-lock.
260
    def break_lock(self):
261
        """Break a lock if one is present from another instance.
262
263
        Uses the ui factory to ask for confirmation if the lock may be from
264
        an active process.
265
266
        This will probe the repository for its lock as well.
267
        """
268
        self._control_files.break_lock()
269
        self.branch.break_lock()
270
2100.3.14 by Aaron Bentley
Test workingtree4 format, prevent use with old repos
271
    def requires_rich_root(self):
272
        return self._format.requires_rich_root
273
2100.3.20 by Aaron Bentley
Implement tree comparison for tree references
274
    def supports_tree_reference(self):
2255.2.232 by Robert Collins
Make WorkingTree4 report support for references based on the repositories capabilities.
275
        return False
2100.3.20 by Aaron Bentley
Implement tree comparison for tree references
276
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
277
    def supports_content_filtering(self):
278
        return self._format.supports_content_filtering()
279
3586.1.3 by Ian Clatworthy
add views attribute to working trees
280
    def supports_views(self):
281
        return self.views.supports_views()
282
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
283
    @staticmethod
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
284
    def open(path=None, _unsupported=False):
285
        """Open an existing working tree at path.
286
287
        """
288
        if path is None:
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
289
            path = osutils.getcwd()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
290
        control = bzrdir.BzrDir.open(path, _unsupported)
291
        return control.open_workingtree(_unsupported)
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
292
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
293
    @staticmethod
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
294
    def open_containing(path=None):
295
        """Open an existing working tree which has its root about path.
3753.1.1 by John Arbash Meinel
Add some simple direct tests for WT.open and WT.open_containing.
296
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
297
        This probes for a working tree at path and searches upwards from there.
298
299
        Basically we keep looking up until we find the control directory or
300
        run into /.  If there isn't one, raises NotBranchError.
301
        TODO: give this a new exception.
302
        If there is one, it is returned, along with the unused portion of path.
1685.1.27 by John Arbash Meinel
BzrDir works in URLs, but WorkingTree works in unicode paths
303
304
        :return: The WorkingTree that contains 'path', and the rest of path
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
305
        """
306
        if path is None:
1830.3.14 by John Arbash Meinel
WorkingTree.open_containing() was directly calling os.getcwdu(), which on mac returns the wrong normalization, and on win32 would have the wrong slashes
307
            path = osutils.getcwd()
1685.1.28 by John Arbash Meinel
Changing open_containing to always return a unicode path.
308
        control, relpath = bzrdir.BzrDir.open_containing(path)
309
        return control.open_workingtree(), relpath
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
310
311
    @staticmethod
5521.1.1 by Vincent Ladeuil
Handle --directory when paths are also provided to shelve and restore.
312
    def open_containing_paths(file_list, default_directory=None,
313
                              canonicalize=True, apply_view=True):
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
314
        """Open the WorkingTree that contains a set of paths.
315
316
        Fail if the paths given are not all in a single tree.
317
318
        This is used for the many command-line interfaces that take a list of
319
        any number of files and that require they all be in the same tree.
320
        """
5521.1.1 by Vincent Ladeuil
Handle --directory when paths are also provided to shelve and restore.
321
        if default_directory is None:
322
            default_directory = u'.'
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
323
        # recommended replacement for builtins.internal_tree_files
324
        if file_list is None or len(file_list) == 0:
325
            tree = WorkingTree.open_containing(default_directory)[0]
5346.4.5 by Martin Pool
Deprecate and avoid internal_tree_files and tree_files.
326
            # XXX: doesn't really belong here, and seems to have the strange
327
            # side effect of making it return a bunch of files, not the whole
328
            # tree -- mbp 20100716
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
329
            if tree.supports_views() and apply_view:
330
                view_files = tree.views.lookup_view()
331
                if view_files:
332
                    file_list = view_files
333
                    view_str = views.view_display_str(view_files)
334
                    note("Ignoring files outside view. View is %s" % view_str)
335
            return tree, file_list
5521.1.1 by Vincent Ladeuil
Handle --directory when paths are also provided to shelve and restore.
336
        if default_directory == u'.':
337
            seed = file_list[0]
338
        else:
339
            seed = default_directory
340
            file_list = [osutils.pathjoin(default_directory, f)
341
                         for f in file_list]
342
        tree = WorkingTree.open_containing(seed)[0]
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
343
        return tree, tree.safe_relpath_files(file_list, canonicalize,
5521.1.1 by Vincent Ladeuil
Handle --directory when paths are also provided to shelve and restore.
344
                                             apply_view=apply_view)
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
345
346
    def safe_relpath_files(self, file_list, canonicalize=True, apply_view=True):
347
        """Convert file_list into a list of relpaths in tree.
348
349
        :param self: A tree to operate on.
350
        :param file_list: A list of user provided paths or None.
351
        :param apply_view: if True and a view is set, apply it or check that
352
            specified files are within it
353
        :return: A list of relative paths.
354
        :raises errors.PathNotChild: When a provided path is in a different self
355
            than self.
356
        """
357
        if file_list is None:
358
            return None
359
        if self.supports_views() and apply_view:
360
            view_files = self.views.lookup_view()
361
        else:
362
            view_files = []
363
        new_list = []
364
        # self.relpath exists as a "thunk" to osutils, but canonical_relpath
365
        # doesn't - fix that up here before we enter the loop.
366
        if canonicalize:
367
            fixer = lambda p: osutils.canonical_relpath(self.basedir, p)
368
        else:
369
            fixer = self.relpath
370
        for filename in file_list:
5346.4.3 by Martin Pool
PathNotChild should not give a traceback.
371
            relpath = fixer(osutils.dereference_path(filename))
372
            if view_files and not osutils.is_inside_any(view_files, relpath):
373
                raise errors.FileOutsideView(filename, view_files)
374
            new_list.append(relpath)
5346.4.2 by Martin Pool
Move internal_tree_files and safe_relpath_files onto WorkingTree
375
        return new_list
376
377
    @staticmethod
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
378
    def open_downlevel(path=None):
379
        """Open an unsupported working tree.
380
381
        Only intended for advanced situations like upgrading part of a bzrdir.
382
        """
383
        return WorkingTree.open(path, _unsupported=True)
1508.1.1 by Robert Collins
Provide a open_containing for WorkingTree.
384
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
385
    @staticmethod
386
    def find_trees(location):
387
        def list_current(transport):
388
            return [d for d in transport.list_dir('') if d != '.bzr']
389
        def evaluate(bzrdir):
390
            try:
391
                tree = bzrdir.open_workingtree()
392
            except errors.NoWorkingTree:
393
                return True, None
394
            else:
395
                return True, tree
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
396
        t = transport.get_transport(location)
397
        iterator = bzrdir.BzrDir.find_bzrdirs(t, evaluate=evaluate,
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
398
                                              list_current=list_current)
5273.1.7 by Vincent Ladeuil
No more use of the get_transport imported *symbol*, all uses are through
399
        return [tr for tr in iterator if tr is not None]
3140.1.4 by Aaron Bentley
Add WorkingTree.find_trees
400
3146.8.16 by Aaron Bentley
Updates from review
401
    def all_file_ids(self):
3146.8.2 by Aaron Bentley
Introduce iter_all_file_ids, to avoid hitting Inventory for this case
402
        """See Tree.iter_all_file_ids"""
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
403
        raise NotImplementedError(self.all_file_ids)
3146.8.2 by Aaron Bentley
Introduce iter_all_file_ids, to avoid hitting Inventory for this case
404
453 by Martin Pool
- Split WorkingTree into its own file
405
    def __repr__(self):
406
        return "<%s of %s>" % (self.__class__.__name__,
954 by Martin Pool
- separate out code that just scans the hash cache to find files that are possibly
407
                               getattr(self, 'basedir', None))
453 by Martin Pool
- Split WorkingTree into its own file
408
409
    def abspath(self, filename):
1185.31.32 by John Arbash Meinel
Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \
410
        return pathjoin(self.basedir, filename)
2292.1.30 by Marius Kruger
* Minor text fixes.
411
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
412
    def basis_tree(self):
1927.2.3 by Robert Collins
review comment application - paired with Martin.
413
        """Return RevisionTree for the current last revision.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
414
1927.2.3 by Robert Collins
review comment application - paired with Martin.
415
        If the left most parent is a ghost then the returned tree will be an
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
416
        empty tree - one obtained by calling
3668.5.1 by Jelmer Vernooij
Use NULL_REVISION rather than None for Repository.revision_tree().
417
        repository.revision_tree(NULL_REVISION).
1927.2.3 by Robert Collins
review comment application - paired with Martin.
418
        """
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
419
        try:
420
            revision_id = self.get_parent_ids()[0]
421
        except IndexError:
422
            # no parents, return an empty revision tree.
423
            # in the future this should return the tree for
424
            # 'empty:' - the implicit root empty tree.
3668.5.1 by Jelmer Vernooij
Use NULL_REVISION rather than None for Repository.revision_tree().
425
            return self.branch.repository.revision_tree(
426
                       _mod_revision.NULL_REVISION)
1908.11.2 by Robert Collins
Implement WorkingTree interface conformance tests for
427
        try:
428
            return self.revision_tree(revision_id)
429
        except errors.NoSuchRevision:
430
            pass
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
431
        # No cached copy available, retrieve from the repository.
432
        # FIXME? RBC 20060403 should we cache the inventory locally
433
        # at this point ?
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
434
        try:
435
            return self.branch.repository.revision_tree(revision_id)
3350.6.4 by Robert Collins
First cut at pluralised VersionedFiles. Some rather massive API incompatabilities, primarily because of the difficulty of coherence among competing stores.
436
        except (errors.RevisionNotPresent, errors.NoSuchRevision):
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
437
            # the basis tree *may* be a ghost or a low level error may have
4031.3.1 by Frank Aspell
Fixing various typos
438
            # occurred. If the revision is present, its a problem, if its not
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
439
            # its a ghost.
440
            if self.branch.repository.has_revision(revision_id):
441
                raise
1927.2.3 by Robert Collins
review comment application - paired with Martin.
442
            # the basis tree is a ghost so return an empty tree.
3668.5.1 by Jelmer Vernooij
Use NULL_REVISION rather than None for Repository.revision_tree().
443
            return self.branch.repository.revision_tree(
444
                       _mod_revision.NULL_REVISION)
453 by Martin Pool
- Split WorkingTree into its own file
445
2665.3.2 by Daniel Watkins
Created _cleanup() method in WorkingTree.
446
    def _cleanup(self):
447
        self._flush_ignore_list_cache()
448
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
449
    def relpath(self, path):
450
        """Return the local path portion from a given path.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
451
452
        The path may be absolute or relative. If its a relative path it is
1713.1.9 by Robert Collins
Paired performance tuning of bzr add. (Robert Collins, Martin Pool).
453
        interpreted relative to the python current working directory.
454
        """
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
455
        return osutils.relpath(self.basedir, path)
1457.1.3 by Robert Collins
make Branch.relpath delegate to the working tree.
456
453 by Martin Pool
- Split WorkingTree into its own file
457
    def has_filename(self, filename):
1836.1.22 by John Arbash Meinel
[merge] bzr.dev 1861
458
        return osutils.lexists(self.abspath(filename))
453 by Martin Pool
- Split WorkingTree into its own file
459
3368.2.11 by Ian Clatworthy
add filtered option to get_file and get_file_byname in workingtree.py
460
    def get_file(self, file_id, path=None, filtered=True):
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
461
        return self.get_file_with_stat(file_id, path, filtered=filtered)[0]
3709.3.2 by Robert Collins
Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.
462
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
463
    def get_file_with_stat(self, file_id, path=None, filtered=True,
5609.29.5 by John Arbash Meinel
Fix bug #740932. Transform should update the sha cache.
464
                           _fstat=osutils.fstat):
4354.4.7 by Aaron Bentley
Move MutableTree.get_file_with_stat to Tree.get_file_with_stat.
465
        """See Tree.get_file_with_stat."""
2743.3.3 by Ian Clatworthy
Skip path lookup for tree.get_file() when we already know the path
466
        if path is None:
467
            path = self.id2path(file_id)
3368.2.41 by Ian Clatworthy
1st cut merge of bzr.dev r3907
468
        file_obj = self.get_file_byname(path, filtered=False)
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
469
        stat_value = _fstat(file_obj.fileno())
4413.4.3 by John Arbash Meinel
Move the boolean check to the first part of the if statement
470
        if filtered and self.supports_content_filtering():
3368.2.46 by Ian Clatworthy
minor fix
471
            filters = self._content_filter_stack(path)
5745.3.2 by Jelmer Vernooij
Add filters to import tariff blacklist.
472
            file_obj = _mod_filters.filtered_input_file(file_obj, filters)
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
473
        return (file_obj, stat_value)
453 by Martin Pool
- Split WorkingTree into its own file
474
3368.2.41 by Ian Clatworthy
1st cut merge of bzr.dev r3907
475
    def get_file_text(self, file_id, path=None, filtered=True):
5236.1.1 by Tim Penhey
Close the file after read.
476
        my_file = self.get_file(file_id, path=path, filtered=filtered)
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
477
        try:
5236.1.1 by Tim Penhey
Close the file after read.
478
            return my_file.read()
4708.2.1 by Martin
Ensure all files opened by bazaar proper are explicitly closed
479
        finally:
5236.1.1 by Tim Penhey
Close the file after read.
480
            my_file.close()
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
481
3368.2.11 by Ian Clatworthy
add filtered option to get_file and get_file_byname in workingtree.py
482
    def get_file_byname(self, filename, filtered=True):
3368.2.1 by Ian Clatworthy
first cut at working tree content filtering
483
        path = self.abspath(filename)
3368.2.11 by Ian Clatworthy
add filtered option to get_file and get_file_byname in workingtree.py
484
        f = file(path, 'rb')
4413.4.3 by John Arbash Meinel
Move the boolean check to the first part of the if statement
485
        if filtered and self.supports_content_filtering():
3368.2.11 by Ian Clatworthy
add filtered option to get_file and get_file_byname in workingtree.py
486
            filters = self._content_filter_stack(filename)
5745.3.2 by Jelmer Vernooij
Add filters to import tariff blacklist.
487
            return _mod_filters.filtered_input_file(f, filters)
3368.2.11 by Ian Clatworthy
add filtered option to get_file and get_file_byname in workingtree.py
488
        else:
489
            return f
453 by Martin Pool
- Split WorkingTree into its own file
490
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
491
    def get_file_lines(self, file_id, path=None, filtered=True):
3774.1.4 by Aaron Bentley
Use file.readlines on working trees.
492
        """See Tree.get_file_lines()"""
3368.2.45 by Ian Clatworthy
add and use supports_content_filtering API
493
        file = self.get_file(file_id, path, filtered=filtered)
3774.1.4 by Aaron Bentley
Use file.readlines on working trees.
494
        try:
495
            return file.readlines()
496
        finally:
497
            file.close()
498
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
499
    def get_parent_ids(self):
500
        """See Tree.get_parent_ids.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
501
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
502
        This implementation reads the pending merges list and last_revision
503
        value and uses that to decide what the parents list should be.
504
        """
2598.5.3 by Aaron Bentley
Push NULL_REVISION deeper
505
        last_rev = _mod_revision.ensure_null(self._last_revision())
2598.5.7 by Aaron Bentley
Updates from review
506
        if _mod_revision.NULL_REVISION == last_rev:
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
507
            parents = []
508
        else:
509
            parents = [last_rev]
1908.6.10 by Robert Collins
forward to get_parent_ids in pending_merges.
510
        try:
4852.1.7 by John Arbash Meinel
Lots of tweaks in WorkingTree.
511
            merges_bytes = self._transport.get_bytes('pending-merges')
2206.1.7 by Marius Kruger
* errors
512
        except errors.NoSuchFile:
1908.6.10 by Robert Collins
forward to get_parent_ids in pending_merges.
513
            pass
514
        else:
4852.1.9 by John Arbash Meinel
Minor typo fix.
515
            for l in osutils.split_lines(merges_bytes):
2858.2.1 by Martin Pool
Remove most calls to safe_file_id and safe_revision_id.
516
                revision_id = l.rstrip('\n')
2249.5.9 by John Arbash Meinel
Update WorkingTree to use safe_revision_id when appropriate
517
                parents.append(revision_id)
1908.6.10 by Robert Collins
forward to get_parent_ids in pending_merges.
518
        return parents
1773.2.1 by Robert Collins
Teach all trees about unknowns, conflicts and get_parent_ids.
519
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
520
    def get_root_id(self):
521
        """Return the id of this trees root"""
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
522
        raise NotImplementedError(self.get_root_id)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
523
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
524
    @needs_read_lock
2387.1.1 by Robert Collins
Remove the --basis parameter to clone etc. (Robert Collins)
525
    def clone(self, to_bzrdir, revision_id=None):
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
526
        """Duplicate this working tree into to_bzr, including all state.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
527
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
528
        Specifically modified files are kept as modified, but
529
        ignored and unknown files are discarded.
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
530
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
531
        If you want to make a new line of development, see bzrdir.sprout()
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
532
533
        revision
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
534
            If not None, the cloned tree will have its last revision set to
4031.3.1 by Frank Aspell
Fixing various typos
535
            revision, and difference between the source trees last revision
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
536
            and this one merged in.
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
537
        """
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
538
        # assumes the target bzr dir format is compatible.
3650.5.5 by Aaron Bentley
Make WorkingTree.clone use bzrdir's format
539
        result = to_bzrdir.create_workingtree()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
540
        self.copy_content_into(result, revision_id)
541
        return result
542
543
    @needs_read_lock
544
    def copy_content_into(self, tree, revision_id=None):
545
        """Copy the current content and user files of this tree into tree."""
1731.1.33 by Aaron Bentley
Revert no-special-root changes
546
        tree.set_root_id(self.get_root_id())
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
547
        if revision_id is None:
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
548
            merge.transform_tree(tree, self)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
549
        else:
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
550
            # TODO now merge from tree.last_revision to revision (to preserve
551
            # user local changes)
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
552
            merge.transform_tree(tree, self)
1908.6.3 by Robert Collins
Tidy up the last_revision_id and add_pending_merge conversion to use cleaner apis.
553
            tree.set_parent_ids([revision_id])
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
554
1248 by Martin Pool
- new weave based cleanup [broken]
555
    def id2abspath(self, file_id):
556
        return self.abspath(self.id2path(file_id))
557
5786.1.5 by John Arbash Meinel
Move the logic about InventoryDirectory => TreeReference into iter_entries
558
    def _check_for_tree_references(self, iterator):
559
        """See if directories have become tree-references."""
560
        blocked_parent_ids = set()
561
        for path, ie in iterator:
562
            if ie.parent_id in blocked_parent_ids:
563
                # This entry was pruned because one of its parents became a
564
                # TreeReference. If this is a directory, mark it as blocked.
565
                if ie.kind == 'directory':
566
                    blocked_parent_ids.add(ie.file_id)
567
                continue
568
            if ie.kind == 'directory' and self._directory_is_tree_reference(path):
569
                # This InventoryDirectory needs to be a TreeReference
570
                ie = inventory.TreeReference(ie.file_id, ie.name, ie.parent_id)
571
                blocked_parent_ids.add(ie.file_id)
572
            yield path, ie
573
574
    def iter_entries_by_dir(self, specific_file_ids=None, yield_parents=False):
575
        """See Tree.iter_entries_by_dir()"""
576
        # The only trick here is that if we supports_tree_reference then we
577
        # need to detect if a directory becomes a tree-reference.
578
        iterator = super(WorkingTree, self).iter_entries_by_dir(
579
                specific_file_ids=specific_file_ids,
580
                yield_parents=yield_parents)
581
        if not self.supports_tree_reference():
582
            return iterator
583
        else:
584
            return self._check_for_tree_references(iterator)
585
453 by Martin Pool
- Split WorkingTree into its own file
586
    def get_file_size(self, file_id):
3363.3.4 by Aaron Bentley
Add get_file_size to Tree interface
587
        """See Tree.get_file_size"""
4595.11.11 by Martin Pool
Split out _file_content_summary from path_content_summary and let it return None for size
588
        # XXX: this returns the on-disk size; it should probably return the
589
        # canonical size
3363.2.7 by Aaron Bentley
Implement alterntative-to-inventory tests
590
        try:
591
            return os.path.getsize(self.id2abspath(file_id))
592
        except OSError, e:
593
            if e.errno != errno.ENOENT:
594
                raise
595
            else:
596
                return None
453 by Martin Pool
- Split WorkingTree into its own file
597
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
598
    @needs_tree_write_lock
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
599
    def _gather_kinds(self, files, kinds):
600
        """See MutableTree._gather_kinds."""
601
        for pos, f in enumerate(files):
602
            if kinds[pos] is None:
603
                fullpath = normpath(self.abspath(f))
604
                try:
605
                    kinds[pos] = file_kind(fullpath)
606
                except OSError, e:
607
                    if e.errno == errno.ENOENT:
2206.1.7 by Marius Kruger
* errors
608
                        raise errors.NoSuchFile(fullpath)
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
609
1508.1.5 by Robert Collins
Move add from Branch to WorkingTree.
610
    @needs_write_lock
1908.5.9 by Robert Collins
Add a guard against setting the tree last-revision value to a ghost in the new tree parent management api.
611
    def add_parent_tree_id(self, revision_id, allow_leftmost_as_ghost=False):
1908.5.4 by Robert Collins
Add add_parent_tree_id WorkingTree helper api.
612
        """Add revision_id as a parent.
613
614
        This is equivalent to retrieving the current list of parent ids
615
        and setting the list to its value plus revision_id.
616
617
        :param revision_id: The revision id to add to the parent list. It may
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
618
            be a ghost revision as long as its not the first parent to be
619
            added, or the allow_leftmost_as_ghost parameter is set True.
1908.5.12 by Robert Collins
Apply review feedback - paired with Martin.
620
        :param allow_leftmost_as_ghost: Allow the first parent to be a ghost.
1908.5.4 by Robert Collins
Add add_parent_tree_id WorkingTree helper api.
621
        """
1908.5.13 by Robert Collins
Adding a parent when the first is a ghost already should not require forcing it.
622
        parents = self.get_parent_ids() + [revision_id]
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
623
        self.set_parent_ids(parents, allow_leftmost_as_ghost=len(parents) > 1
2206.1.7 by Marius Kruger
* errors
624
            or allow_leftmost_as_ghost)
1908.5.4 by Robert Collins
Add add_parent_tree_id WorkingTree helper api.
625
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
626
    @needs_tree_write_lock
1908.5.9 by Robert Collins
Add a guard against setting the tree last-revision value to a ghost in the new tree parent management api.
627
    def add_parent_tree(self, parent_tuple, allow_leftmost_as_ghost=False):
1908.5.6 by Robert Collins
Add add_parent_tree to WorkingTree.
628
        """Add revision_id, tree tuple as a parent.
629
630
        This is equivalent to retrieving the current list of parent trees
631
        and setting the list to its value plus parent_tuple. See also
632
        add_parent_tree_id - if you only have a parent id available it will be
633
        simpler to use that api. If you have the parent already available, using
634
        this api is preferred.
635
1908.5.12 by Robert Collins
Apply review feedback - paired with Martin.
636
        :param parent_tuple: The (revision id, tree) to add to the parent list.
637
            If the revision_id is a ghost, pass None for the tree.
638
        :param allow_leftmost_as_ghost: Allow the first parent to be a ghost.
1908.5.6 by Robert Collins
Add add_parent_tree to WorkingTree.
639
        """
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
640
        parent_ids = self.get_parent_ids() + [parent_tuple[0]]
641
        if len(parent_ids) > 1:
642
            # the leftmost may have already been a ghost, preserve that if it
643
            # was.
644
            allow_leftmost_as_ghost = True
645
        self.set_parent_ids(parent_ids,
1908.5.9 by Robert Collins
Add a guard against setting the tree last-revision value to a ghost in the new tree parent management api.
646
            allow_leftmost_as_ghost=allow_leftmost_as_ghost)
1908.5.6 by Robert Collins
Add add_parent_tree to WorkingTree.
647
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
648
    @needs_tree_write_lock
1457.1.15 by Robert Collins
Move add_pending_merge to WorkingTree.
649
    def add_pending_merge(self, *revision_ids):
650
        # TODO: Perhaps should check at this point that the
651
        # history of the revision is actually present?
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
652
        parents = self.get_parent_ids()
1457.1.15 by Robert Collins
Move add_pending_merge to WorkingTree.
653
        updated = False
654
        for rev_id in revision_ids:
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
655
            if rev_id in parents:
656
                continue
657
            parents.append(rev_id)
1457.1.15 by Robert Collins
Move add_pending_merge to WorkingTree.
658
            updated = True
659
        if updated:
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
660
            self.set_parent_ids(parents, allow_leftmost_as_ghost=True)
1457.1.15 by Robert Collins
Move add_pending_merge to WorkingTree.
661
2949.6.2 by Alexander Belchenko
more changes osutils.lstat -> os.lstat
662
    def path_content_summary(self, path, _lstat=os.lstat,
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
663
        _mapper=osutils.file_kind_from_stat_mode):
664
        """See Tree.path_content_summary."""
665
        abspath = self.abspath(path)
666
        try:
667
            stat_result = _lstat(abspath)
668
        except OSError, e:
669
            if getattr(e, 'errno', None) == errno.ENOENT:
670
                # no file.
671
                return ('missing', None, None, None)
2776.1.9 by Robert Collins
Review feedback.
672
            # propagate other errors
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
673
            raise
674
        kind = _mapper(stat_result.st_mode)
675
        if kind == 'file':
4595.11.11 by Martin Pool
Split out _file_content_summary from path_content_summary and let it return None for size
676
            return self._file_content_summary(path, stat_result)
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
677
        elif kind == 'directory':
678
            # perhaps it looks like a plain directory, but it's really a
679
            # reference.
680
            if self._directory_is_tree_reference(path):
681
                kind = 'tree-reference'
682
            return kind, None, None, None
683
        elif kind == 'symlink':
4241.14.18 by Vincent Ladeuil
Use better fixes for unicode symlinks handling in WTs.
684
            target = osutils.readlink(abspath)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
685
            return ('symlink', None, None, target)
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
686
        else:
687
            return (kind, None, None, None)
688
4595.11.11 by Martin Pool
Split out _file_content_summary from path_content_summary and let it return None for size
689
    def _file_content_summary(self, path, stat_result):
690
        size = stat_result.st_size
691
        executable = self._is_executable_from_path_and_stat(path, stat_result)
692
        # try for a stat cache lookup
693
        return ('file', size, executable, self._sha_from_stat(
694
            path, stat_result))
695
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
696
    def _check_parents_for_ghosts(self, revision_ids, allow_leftmost_as_ghost):
697
        """Common ghost checking functionality from set_parent_*.
698
699
        This checks that the left hand-parent exists if there are any
700
        revisions present.
701
        """
702
        if len(revision_ids) > 0:
703
            leftmost_id = revision_ids[0]
704
            if (not allow_leftmost_as_ghost and not
705
                self.branch.repository.has_revision(leftmost_id)):
706
                raise errors.GhostRevisionUnusableHere(leftmost_id)
707
708
    def _set_merges_from_parent_ids(self, parent_ids):
709
        merges = parent_ids[1:]
3407.2.7 by Martin Pool
Deprecate LockableFiles.put_utf8 and put_bytes.
710
        self._transport.put_bytes('pending-merges', '\n'.join(merges),
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
711
            mode=self.bzrdir._get_file_mode())
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
712
3462.1.2 by John Arbash Meinel
Change WT.set_parent_(ids/trees) to filter out ancestors.
713
    def _filter_parent_ids_by_ancestry(self, revision_ids):
714
        """Check that all merged revisions are proper 'heads'.
715
716
        This will always return the first revision_id, and any merged revisions
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
717
        which are
3462.1.2 by John Arbash Meinel
Change WT.set_parent_(ids/trees) to filter out ancestors.
718
        """
719
        if len(revision_ids) == 0:
720
            return revision_ids
721
        graph = self.branch.repository.get_graph()
722
        heads = graph.heads(revision_ids)
723
        new_revision_ids = revision_ids[:1]
724
        for revision_id in revision_ids[1:]:
725
            if revision_id in heads and revision_id not in new_revision_ids:
726
                new_revision_ids.append(revision_id)
727
        if new_revision_ids != revision_ids:
5753.2.2 by Jelmer Vernooij
Remove some unnecessary imports, clean up lazy imports.
728
            mutter('requested to set revision_ids = %s,'
3462.1.2 by John Arbash Meinel
Change WT.set_parent_(ids/trees) to filter out ancestors.
729
                         ' but filtered to %s', revision_ids, new_revision_ids)
730
        return new_revision_ids
731
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
732
    @needs_tree_write_lock
1908.5.9 by Robert Collins
Add a guard against setting the tree last-revision value to a ghost in the new tree parent management api.
733
    def set_parent_ids(self, revision_ids, allow_leftmost_as_ghost=False):
1908.5.5 by Robert Collins
Add WorkingTree.set_parent_ids.
734
        """Set the parent ids to revision_ids.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
735
1908.5.5 by Robert Collins
Add WorkingTree.set_parent_ids.
736
        See also set_parent_trees. This api will try to retrieve the tree data
737
        for each element of revision_ids from the trees repository. If you have
738
        tree data already available, it is more efficient to use
739
        set_parent_trees rather than set_parent_ids. set_parent_ids is however
740
        an easier API to use.
741
742
        :param revision_ids: The revision_ids to set as the parent ids of this
743
            working tree. Any of these may be ghosts.
744
        """
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
745
        self._check_parents_for_ghosts(revision_ids,
746
            allow_leftmost_as_ghost=allow_leftmost_as_ghost)
2598.5.2 by Aaron Bentley
Got all tests passing with Branch returning 'null:' for null revision
747
        for revision_id in revision_ids:
748
            _mod_revision.check_not_reserved_id(revision_id)
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
749
3462.1.2 by John Arbash Meinel
Change WT.set_parent_(ids/trees) to filter out ancestors.
750
        revision_ids = self._filter_parent_ids_by_ancestry(revision_ids)
751
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
752
        if len(revision_ids) > 0:
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
753
            self.set_last_revision(revision_ids[0])
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
754
        else:
2598.5.3 by Aaron Bentley
Push NULL_REVISION deeper
755
            self.set_last_revision(_mod_revision.NULL_REVISION)
2041.1.2 by John Arbash Meinel
Update WorkingTree.set_parent_trees() to directly cache inv.
756
757
        self._set_merges_from_parent_ids(revision_ids)
1908.5.5 by Robert Collins
Add WorkingTree.set_parent_ids.
758
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
759
    @needs_tree_write_lock
1457.1.16 by Robert Collins
Move set_pending_merges to WorkingTree.
760
    def set_pending_merges(self, rev_list):
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
761
        parents = self.get_parent_ids()
762
        leftmost = parents[:1]
763
        new_parents = leftmost + rev_list
764
        self.set_parent_ids(new_parents)
1457.1.16 by Robert Collins
Move set_pending_merges to WorkingTree.
765
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
766
    @needs_tree_write_lock
1534.7.192 by Aaron Bentley
Record hashes produced by merges
767
    def set_merge_modified(self, modified_hashes):
1534.10.3 by Aaron Bentley
Simplify set_merge_modified with rio_file
768
        def iter_stanzas():
769
            for file_id, hash in modified_hashes.iteritems():
5753.2.2 by Jelmer Vernooij
Remove some unnecessary imports, clean up lazy imports.
770
                yield _mod_rio.Stanza(file_id=file_id.decode('utf8'),
771
                    hash=hash)
1534.10.3 by Aaron Bentley
Simplify set_merge_modified with rio_file
772
        self._put_rio('merge-hashes', iter_stanzas(), MERGE_MODIFIED_HEADER_1)
773
2776.1.8 by Robert Collins
Retrieve the sha from the dirstate for path_content_summary on hash cache hits; slight performance hit but a big win for incremental commits.
774
    def _sha_from_stat(self, path, stat_result):
775
        """Get a sha digest from the tree's stat cache.
776
777
        The default implementation assumes no stat cache is present.
778
779
        :param path: The path.
780
        :param stat_result: The stat result being looked up.
781
        """
782
        return None
783
1534.10.3 by Aaron Bentley
Simplify set_merge_modified with rio_file
784
    def _put_rio(self, filename, stanzas, header):
2298.1.1 by Martin Pool
Add test for merge_modified
785
        self._must_be_locked()
5753.2.2 by Jelmer Vernooij
Remove some unnecessary imports, clean up lazy imports.
786
        my_file = _mod_rio.rio_file(stanzas, header)
3407.2.7 by Martin Pool
Deprecate LockableFiles.put_utf8 and put_bytes.
787
        self._transport.put_file(filename, my_file,
3407.2.18 by Martin Pool
BzrDir takes responsibility for default file/dir modes
788
            mode=self.bzrdir._get_file_mode())
1534.7.192 by Aaron Bentley
Record hashes produced by merges
789
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
790
    @needs_write_lock # because merge pulls data into the branch.
1551.15.69 by Aaron Bentley
Add merge_type to merge_from_branch
791
    def merge_from_branch(self, branch, to_revision=None, from_revision=None,
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
792
                          merge_type=None, force=False):
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
793
        """Merge from a branch into this working tree.
794
795
        :param branch: The branch to merge from.
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
796
        :param to_revision: If non-None, the merge will merge to to_revision,
797
            but not beyond it. to_revision does not need to be in the history
2206.1.7 by Marius Kruger
* errors
798
            of the branch when it is supplied. If None, to_revision defaults to
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
799
            branch.last_revision().
800
        """
801
        from bzrlib.merge import Merger, Merge3Merger
4961.2.10 by Martin Pool
No longer need to pass pb in to Merger
802
        merger = Merger(self.branch, this_tree=self)
803
        # check that there are no local alterations
804
        if not force and self.has_changes():
805
            raise errors.UncommittedChanges(self)
806
        if to_revision is None:
807
            to_revision = _mod_revision.ensure_null(branch.last_revision())
808
        merger.other_rev_id = to_revision
809
        if _mod_revision.is_null(merger.other_rev_id):
810
            raise errors.NoCommits(branch)
811
        self.branch.fetch(branch, last_revision=merger.other_rev_id)
812
        merger.other_basis = merger.other_rev_id
813
        merger.other_tree = self.branch.repository.revision_tree(
814
            merger.other_rev_id)
815
        merger.other_branch = branch
816
        if from_revision is None:
817
            merger.find_base()
818
        else:
819
            merger.set_base_revision(from_revision, branch)
820
        if merger.base_rev_id == merger.other_rev_id:
821
            raise errors.PointlessMerge
822
        merger.backup_files = False
823
        if merge_type is None:
824
            merger.merge_type = Merge3Merger
825
        else:
826
            merger.merge_type = merge_type
827
        merger.set_interesting_files(None)
828
        merger.show_base = False
829
        merger.reprocess = False
830
        conflicts = merger.do_merge()
831
        merger.set_pending()
1979.2.1 by Robert Collins
(robertc) adds a convenience method "merge_from_branch" to WorkingTree.
832
        return conflicts
833
2255.2.156 by Martin Pool
Merge WorkingTree implementation back from trunk
834
    def merge_modified(self):
2298.1.1 by Martin Pool
Add test for merge_modified
835
        """Return a dictionary of files modified by a merge.
836
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
837
        The list is initialized by WorkingTree.set_merge_modified, which is
2298.1.1 by Martin Pool
Add test for merge_modified
838
        typically called after we make some automatic updates to the tree
839
        because of a merge.
840
841
        This returns a map of file_id->sha1, containing only files which are
842
        still in the working inventory and have that text hash.
843
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
844
        raise NotImplementedError(self.merge_modified)
2255.2.156 by Martin Pool
Merge WorkingTree implementation back from trunk
845
846
    @needs_write_lock
847
    def mkdir(self, path, file_id=None):
848
        """See MutableTree.mkdir()."""
849
        if file_id is None:
850
            file_id = generate_ids.gen_file_id(os.path.basename(path))
851
        os.mkdir(self.abspath(path))
852
        self.add(path, file_id, 'directory')
853
        return file_id
854
5858.1.1 by Jelmer Vernooij
Support optional path argument to Tree.get_symlink_target.
855
    def get_symlink_target(self, file_id, path=None):
856
        if path is not None:
857
            abspath = self.abspath(path)
858
        else:
859
            abspath = self.id2abspath(file_id)
4241.14.18 by Vincent Ladeuil
Use better fixes for unicode symlinks handling in WTs.
860
        target = osutils.readlink(abspath)
4241.14.12 by Vincent Ladeuil
Far too many modifications for a single commit, need to restart.
861
        return target
2255.2.156 by Martin Pool
Merge WorkingTree implementation back from trunk
862
1731.2.1 by Aaron Bentley
Initial subsume implementation
863
    def subsume(self, other_tree):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
864
        raise NotImplementedError(self.subsume)
1731.2.1 by Aaron Bentley
Initial subsume implementation
865
2974.2.2 by John Arbash Meinel
Only one test failed, because it was incorrectly succeeding.
866
    def _setup_directory_is_tree_reference(self):
867
        if self._branch.repository._format.supports_tree_reference:
868
            self._directory_is_tree_reference = \
869
                self._directory_may_be_tree_reference
870
        else:
871
            self._directory_is_tree_reference = \
872
                self._directory_is_never_tree_reference
873
874
    def _directory_is_never_tree_reference(self, relpath):
875
        return False
876
877
    def _directory_may_be_tree_reference(self, relpath):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
878
        # as a special case, if a directory contains control files then
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
879
        # it's a tree reference, except that the root of the tree is not
880
        return relpath and osutils.isdir(self.abspath(relpath) + u"/.bzr")
881
        # TODO: We could ask all the control formats whether they
882
        # recognize this directory, but at the moment there's no cheap api
883
        # to do that.  Since we probably can only nest bzr checkouts and
884
        # they always use this name it's ok for now.  -- mbp 20060306
885
        #
886
        # FIXME: There is an unhandled case here of a subdirectory
887
        # containing .bzr but not a branch; that will probably blow up
888
        # when you try to commit it.  It might happen if there is a
889
        # checkout in a subdirectory.  This can be avoided by not adding
890
        # it.  mbp 20070306
891
1731.2.17 by Aaron Bentley
Support extracting with checkouts
892
    def extract(self, file_id, format=None):
1731.2.16 by Aaron Bentley
Get extract working for standalone trees
893
        """Extract a subtree from this tree.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
894
1731.2.16 by Aaron Bentley
Get extract working for standalone trees
895
        A new branch will be created, relative to the path for this tree.
896
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
897
        raise NotImplementedError(self.extract)
453 by Martin Pool
- Split WorkingTree into its own file
898
1986.5.3 by Robert Collins
New method ``WorkingTree.flush()`` which will write the current memory
899
    def flush(self):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
900
        """Write the in memory meta data to disk."""
901
        raise NotImplementedError(self.flush)
1986.5.3 by Robert Collins
New method ``WorkingTree.flush()`` which will write the current memory
902
1551.10.29 by Aaron Bentley
Fix tree.list_files when file kind changes
903
    def _kind(self, relpath):
904
        return osutils.file_kind(self.abspath(relpath))
905
4370.5.2 by Ian Clatworthy
extend list_files() with from_dir and recursive parameters
906
    def list_files(self, include_root=False, from_dir=None, recursive=True):
907
        """List all files as (path, class, kind, id, entry).
453 by Martin Pool
- Split WorkingTree into its own file
908
909
        Lists, but does not descend into unversioned directories.
910
        This does not include files that have been deleted in this
4370.5.2 by Ian Clatworthy
extend list_files() with from_dir and recursive parameters
911
        tree. Skips the control directory.
453 by Martin Pool
- Split WorkingTree into its own file
912
5128.1.1 by Vincent Ladeuil
Uncontroversial cleanups, mostly comments
913
        :param include_root: if True, return an entry for the root
4370.5.2 by Ian Clatworthy
extend list_files() with from_dir and recursive parameters
914
        :param from_dir: start from this directory or None for the root
915
        :param recursive: whether to recurse into subdirectories or not
453 by Martin Pool
- Split WorkingTree into its own file
916
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
917
        raise NotImplementedError(self.list_files)
918
5346.1.5 by Vincent Ladeuil
Delete the to_name parameter from WorkingTree.move()
919
    def move(self, from_paths, to_dir=None, after=False):
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
920
        """Rename files.
921
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
922
        to_dir must be known to the working tree.
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
923
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
924
        If to_dir exists and is a directory, the files are moved into
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
925
        it, keeping their old names.
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
926
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
927
        Note that to_dir is only the last component of the new name;
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
928
        this doesn't change the directory.
929
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
930
        For each entry in from_paths the move mode will be determined
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
931
        independently.
932
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
933
        The first mode moves the file in the filesystem and updates the
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
934
        working tree metadata. The second mode only updates the working tree
935
        metadata without touching the file on the filesystem.
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
936
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
937
        move uses the second mode if 'after == True' and the target is not
938
        versioned but present in the working tree.
939
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
940
        move uses the second mode if 'after == False' and the source is
941
        versioned but no longer in the working tree, and the target is not
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
942
        versioned but present in the working tree.
943
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
944
        move uses the first mode if 'after == False' and the source is
945
        versioned and present in the working tree, and the target is not
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
946
        versioned and not present in the working tree.
947
948
        Everything else results in an error.
949
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
950
        This returns a list of (from_path, to_path) pairs for each
2220.1.6 by Marius Kruger
* change error message telling user about --after option sightly
951
        entry that is moved.
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
952
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
953
        raise NotImplementedError(self.move)
1508.1.8 by Robert Collins
move move() from Branch to WorkingTree.
954
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
955
    @needs_tree_write_lock
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
956
    def rename_one(self, from_rel, to_rel, after=False):
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
957
        """Rename one file.
958
959
        This can change the directory or the filename or both.
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
960
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
961
        rename_one has several 'modes' to work. First, it can rename a physical
962
        file and change the file_id. That is the normal mode. Second, it can
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
963
        only change the file_id without touching any physical file.
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
964
5911.1.4 by Benoît Pierre
Update docstrings for WorkingTree.move() and WorkingTree.rename_one().
965
        rename_one uses the second mode if 'after == True' and 'to_rel' is
966
        either not versioned or newly added, and present in the working tree.
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
967
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
968
        rename_one uses the second mode if 'after == False' and 'from_rel' is
969
        versioned but no longer in the working tree, and 'to_rel' is not
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
970
        versioned but present in the working tree.
971
2220.1.9 by Marius Kruger
Remove all trailing white space this bundle would have
972
        rename_one uses the first mode if 'after == False' and 'from_rel' is
973
        versioned and present in the working tree, and 'to_rel' is not
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
974
        versioned and not present in the working tree.
975
976
        Everything else results in an error.
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
977
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
978
        raise NotImplementedError(self.rename_one)
2123.3.1 by Steffen Eichenberg
the mv command is now able to move files that have already been moved on the file system
979
1508.1.7 by Robert Collins
Move rename_one from Branch to WorkingTree. (Robert Collins).
980
    @needs_read_lock
453 by Martin Pool
- Split WorkingTree into its own file
981
    def unknowns(self):
1508.1.6 by Robert Collins
Move Branch.unknowns() to WorkingTree.
982
        """Return all unknown files.
983
984
        These are files in the working directory that are not versioned or
985
        control files or ignored.
986
        """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
987
        # force the extras method to be fully executed before returning, to
2255.2.15 by Robert Collins
Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.
988
        # prevent race conditions with the lock
989
        return iter(
990
            [subp for subp in self.extras() if not self.is_ignored(subp)])
2323.6.1 by Martin Pool
(broken) Give a message when opening old workingtree formats suggesting upgrade
991
1988.2.1 by Robert Collins
WorkingTree has a new api ``unversion`` which allow the unversioning of
992
    def unversion(self, file_ids):
993
        """Remove the file ids in file_ids from the current versioned set.
994
995
        When a file_id is unversioned, all of its children are automatically
996
        unversioned.
997
998
        :param file_ids: The file ids to stop versioning.
999
        :raises: NoSuchId if any fileid is not currently versioned.
1000
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1001
        raise NotImplementedError(self.unversion)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1002
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
1003
    @needs_write_lock
1551.11.10 by Aaron Bentley
Add change reporting to pull
1004
    def pull(self, source, overwrite=False, stop_revision=None,
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1005
             change_reporter=None, possible_transports=None, local=False,
1006
             show_base=False):
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
1007
        source.lock_read()
1008
        try:
2249.4.2 by Wouter van Heyst
Convert callers of Branch.revision_history() to Branch.last_revision_info() where sensible.
1009
            old_revision_info = self.branch.last_revision_info()
1563.1.4 by Robert Collins
Fix 'bzr pull' on metadir trees.
1010
            basis_tree = self.basis_tree()
2817.4.3 by Vincent Ladeuil
Add tests for commit, reuse master branch transport.
1011
            count = self.branch.pull(source, overwrite, stop_revision,
4056.6.4 by Gary van der Merwe
Implement pull --local.
1012
                                     possible_transports=possible_transports,
1013
                                     local=local)
2249.4.2 by Wouter van Heyst
Convert callers of Branch.revision_history() to Branch.last_revision_info() where sensible.
1014
            new_revision_info = self.branch.last_revision_info()
1015
            if new_revision_info != old_revision_info:
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
1016
                repository = self.branch.repository
5847.2.1 by John Arbash Meinel
Bug #780677, use a RevisionTree for pull
1017
                if repository._format.fast_deltas:
5847.2.2 by John Arbash Meinel
Forgot that sometimes we don't have any parents during pull.
1018
                    parent_ids = self.get_parent_ids()
1019
                    if parent_ids:
1020
                        basis_id = parent_ids[0]
1021
                        basis_tree = repository.revision_tree(basis_id)
2255.2.38 by Robert Collins
Fix WorkingTree4.pull to work.
1022
                basis_tree.lock_read()
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
1023
                try:
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
1024
                    new_basis_tree = self.branch.basis_tree()
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1025
                    merge.merge_inner(
1026
                                self.branch,
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
1027
                                new_basis_tree,
1028
                                basis_tree,
1029
                                this_tree=self,
4961.2.11 by Martin Pool
Pull out pbs and ProgressPhases stored in object state; just use them in single functions
1030
                                pb=None,
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1031
                                change_reporter=change_reporter,
1032
                                show_base=show_base)
4634.123.11 by John Arbash Meinel
fix 'pull' to also set the root id.
1033
                    basis_root_id = basis_tree.get_root_id()
1034
                    new_root_id = new_basis_tree.get_root_id()
1035
                    if basis_root_id != new_root_id:
1036
                        self.set_root_id(new_root_id)
1594.1.3 by Robert Collins
Fixup pb usage to use nested_progress_bar.
1037
                finally:
2255.2.38 by Robert Collins
Fix WorkingTree4.pull to work.
1038
                    basis_tree.unlock()
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
1039
                # TODO - dedup parents list with things merged by pull ?
1908.6.3 by Robert Collins
Tidy up the last_revision_id and add_pending_merge conversion to use cleaner apis.
1040
                # reuse the revisiontree we merged against to set the new
1041
                # tree data.
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
1042
                parent_trees = [(self.branch.last_revision(), new_basis_tree)]
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1043
                # we have to pull the merge trees out again, because
1044
                # merge_inner has set the ids. - this corner is not yet
1908.6.3 by Robert Collins
Tidy up the last_revision_id and add_pending_merge conversion to use cleaner apis.
1045
                # layered well enough to prevent double handling.
2255.2.38 by Robert Collins
Fix WorkingTree4.pull to work.
1046
                # XXX TODO: Fix the double handling: telling the tree about
1047
                # the already known parent data is wasteful.
1908.6.1 by Robert Collins
Change all callers of set_last_revision to use set_parent_trees.
1048
                merges = self.get_parent_ids()[1:]
1049
                parent_trees.extend([
1050
                    (parent, repository.revision_tree(parent)) for
1051
                     parent in merges])
1052
                self.set_parent_trees(parent_trees)
1185.33.44 by Martin Pool
[patch] show number of revisions pushed/pulled/merged (Robey Pointer)
1053
            return count
1442.1.67 by Robert Collins
Factor out the guts of 'pull' from the command into WorkingTree.pull().
1054
        finally:
1055
            source.unlock()
1056
1986.1.2 by Robert Collins
Various changes to allow non-workingtree specific tests to run entirely
1057
    @needs_write_lock
1058
    def put_file_bytes_non_atomic(self, file_id, bytes):
1059
        """See MutableTree.put_file_bytes_non_atomic."""
1060
        stream = file(self.id2abspath(file_id), 'wb')
1061
        try:
1062
            stream.write(bytes)
1063
        finally:
1064
            stream.close()
1065
        # TODO: update the hashcache here ?
1066
453 by Martin Pool
- Split WorkingTree into its own file
1067
    def extras(self):
2255.7.85 by Robert Collins
Teach _iter_changes to gather unversioned path details upon request.
1068
        """Yield all unversioned files in this WorkingTree.
453 by Martin Pool
- Split WorkingTree into its own file
1069
2255.7.85 by Robert Collins
Teach _iter_changes to gather unversioned path details upon request.
1070
        If there are any unversioned directories then only the directory is
1071
        returned, not all its children.  But if there are unversioned files
453 by Martin Pool
- Split WorkingTree into its own file
1072
        under a versioned subdirectory, they are returned.
1073
1074
        Currently returned depth-first, sorted by name within directories.
2255.7.85 by Robert Collins
Teach _iter_changes to gather unversioned path details upon request.
1075
        This is the same order used by 'osutils.walkdirs'.
453 by Martin Pool
- Split WorkingTree into its own file
1076
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1077
        raise NotImplementedError(self.extras)
453 by Martin Pool
- Split WorkingTree into its own file
1078
1079
    def ignored_files(self):
1080
        """Yield list of PATH, IGNORE_PATTERN"""
1081
        for subp in self.extras():
1082
            pat = self.is_ignored(subp)
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
1083
            if pat is not None:
453 by Martin Pool
- Split WorkingTree into its own file
1084
                yield subp, pat
1085
1086
    def get_ignore_list(self):
1087
        """Return list of ignore patterns.
1088
1089
        Cached in the Tree object after the first call.
1090
        """
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
1091
        ignoreset = getattr(self, '_ignoreset', None)
1092
        if ignoreset is not None:
1093
            return ignoreset
1094
2696.1.1 by Martin Pool
Remove things deprecated in 0.11 and earlier
1095
        ignore_globs = set()
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
1096
        ignore_globs.update(ignores.get_runtime_ignores())
1097
        ignore_globs.update(ignores.get_user_ignores())
453 by Martin Pool
- Split WorkingTree into its own file
1098
        if self.has_filename(bzrlib.IGNORE_FILENAME):
1099
            f = self.get_file_byname(bzrlib.IGNORE_FILENAME)
1836.1.4 by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern
1100
            try:
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
1101
                ignore_globs.update(ignores.parse_ignore_file(f))
1836.1.4 by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern
1102
            finally:
1103
                f.close()
1836.1.30 by John Arbash Meinel
Change ignore functions to use sets instead of lists.
1104
        self._ignoreset = ignore_globs
1836.1.4 by John Arbash Meinel
Cleanup is_ignored to handle comment lines, and a global ignore pattern
1105
        return ignore_globs
453 by Martin Pool
- Split WorkingTree into its own file
1106
2135.2.7 by Kent Gibson
Implement JAM's review suggestions.
1107
    def _flush_ignore_list_cache(self):
2135.2.1 by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637)
1108
        """Resets the cached ignore list to force a cache rebuild."""
1109
        self._ignoreset = None
1110
        self._ignoreglobster = None
1713.2.3 by Robert Collins
Combine ignore rules into a single regex preventing pathological behaviour during add.
1111
453 by Martin Pool
- Split WorkingTree into its own file
1112
    def is_ignored(self, filename):
1113
        r"""Check whether the filename matches an ignore pattern.
1114
1115
        Patterns containing '/' or '\' need to match the whole path;
4948.5.1 by John Whitley
Implementation of ignore exclusions and basic tests for same.
1116
        others match against only the last component.  Patterns starting
4948.5.7 by John Whitley
Terminology change: exclusion => exception.
1117
        with '!' are ignore exceptions.  Exceptions take precedence
4948.5.1 by John Whitley
Implementation of ignore exclusions and basic tests for same.
1118
        over regular patterns and cause the filename to not be ignored.
453 by Martin Pool
- Split WorkingTree into its own file
1119
1120
        If the file is ignored, returns the pattern which caused it to
1121
        be ignored, otherwise None.  So this can simply be used as a
1122
        boolean if desired."""
2135.2.1 by Kent Gibson
Added glob module to replace broken fnmatch based ignore pattern matching (#57637)
1123
        if getattr(self, '_ignoreglobster', None) is None:
4948.5.7 by John Whitley
Terminology change: exclusion => exception.
1124
            self._ignoreglobster = globbing.ExceptionGlobster(self.get_ignore_list())
4948.5.3 by John Whitley
Refactor the exclusion handling functionality out of
1125
        return self._ignoreglobster.match(filename)
1185.14.6 by Aaron Bentley
Made iter_conflicts a WorkingTree method
1126
1185.12.28 by Aaron Bentley
Removed use of readonly path for executability test
1127
    def kind(self, file_id):
1128
        return file_kind(self.id2abspath(file_id))
1129
3146.8.4 by Aaron Bentley
Eliminate direct use of inventory from transform application
1130
    def stored_kind(self, file_id):
1131
        """See Tree.stored_kind"""
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1132
        raise NotImplementedError(self.stored_kind)
3146.8.4 by Aaron Bentley
Eliminate direct use of inventory from transform application
1133
2012.1.7 by Aaron Bentley
Get tree._iter_changed down to ~ 1 stat per file
1134
    def _comparison_data(self, entry, path):
1135
        abspath = self.abspath(path)
1136
        try:
1137
            stat_value = os.lstat(abspath)
1138
        except OSError, e:
1139
            if getattr(e, 'errno', None) == errno.ENOENT:
1140
                stat_value = None
1141
                kind = None
1142
                executable = False
1143
            else:
1144
                raise
1145
        else:
1146
            mode = stat_value.st_mode
1147
            kind = osutils.file_kind_from_stat_mode(mode)
1148
            if not supports_executable():
2409.1.2 by Dmitry Vasiliev
Used one-line conditional expression instead of the multi-line one
1149
                executable = entry is not None and entry.executable
2012.1.7 by Aaron Bentley
Get tree._iter_changed down to ~ 1 stat per file
1150
            else:
1151
                executable = bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
1152
        return kind, executable, stat_value
1153
1154
    def _file_size(self, entry, stat_value):
1155
        return stat_value.st_size
1156
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1157
    def last_revision(self):
1986.1.6 by Robert Collins
Add MemoryTree.last_revision.
1158
        """Return the last revision of the branch for this tree.
1159
1160
        This format tree does not support a separate marker for last-revision
1161
        compared to the branch.
1162
1163
        See MutableTree.last_revision
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1164
        """
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
1165
        return self._last_revision()
1166
1167
    @needs_read_lock
1168
    def _last_revision(self):
1169
        """helper for get_parent_ids."""
2598.5.10 by Aaron Bentley
Return NULL_REVISION instead of None for the null revision
1170
        return _mod_revision.ensure_null(self.branch.last_revision())
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1171
1694.2.6 by Martin Pool
[merge] bzr.dev
1172
    def is_locked(self):
1173
        return self._control_files.is_locked()
1174
2298.1.1 by Martin Pool
Add test for merge_modified
1175
    def _must_be_locked(self):
1176
        if not self.is_locked():
1177
            raise errors.ObjectNotLocked(self)
1178
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1179
    def lock_read(self):
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1180
        """Lock the tree for reading.
1181
1182
        This also locks the branch, and can be unlocked via self.unlock().
1183
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1184
        :return: A bzrlib.lock.LogicalLockResult.
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1185
        """
2255.2.204 by Robert Collins
Fix info and status again.
1186
        if not self.is_locked():
1187
            self._reset_data()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1188
        self.branch.lock_read()
1189
        try:
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1190
            self._control_files.lock_read()
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1191
            return LogicalLockResult(self.unlock)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1192
        except:
1193
            self.branch.unlock()
1194
            raise
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1195
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
1196
    def lock_tree_write(self):
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1197
        """See MutableTree.lock_tree_write, and WorkingTree.unlock.
1198
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1199
        :return: A bzrlib.lock.LogicalLockResult.
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1200
        """
2255.2.204 by Robert Collins
Fix info and status again.
1201
        if not self.is_locked():
1202
            self._reset_data()
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
1203
        self.branch.lock_read()
1204
        try:
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1205
            self._control_files.lock_write()
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1206
            return LogicalLockResult(self.unlock)
1997.1.1 by Robert Collins
Add WorkingTree.lock_tree_write.
1207
        except:
1208
            self.branch.unlock()
1209
            raise
1210
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1211
    def lock_write(self):
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1212
        """See MutableTree.lock_write, and WorkingTree.unlock.
1213
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1214
        :return: A bzrlib.lock.LogicalLockResult.
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1215
        """
2255.2.204 by Robert Collins
Fix info and status again.
1216
        if not self.is_locked():
1217
            self._reset_data()
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1218
        self.branch.lock_write()
1219
        try:
5200.3.3 by Robert Collins
Lock methods on ``Tree``, ``Branch`` and ``Repository`` are now
1220
            self._control_files.lock_write()
5200.3.6 by Robert Collins
Make all lock methods return Result objects, rather than lock_read returning self, as per John's review.
1221
            return LogicalLockResult(self.unlock)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
1222
        except:
1223
            self.branch.unlock()
1224
            raise
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1225
1694.2.6 by Martin Pool
[merge] bzr.dev
1226
    def get_physical_lock_status(self):
1227
        return self._control_files.get_physical_lock_status()
1228
2255.2.204 by Robert Collins
Fix info and status again.
1229
    def _reset_data(self):
1230
        """Reset transient data that cannot be revalidated."""
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1231
        raise NotImplementedError(self._reset_data)
2255.2.204 by Robert Collins
Fix info and status again.
1232
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
1233
    def set_last_revision(self, new_revision):
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1234
        """Change the last revision in the working tree."""
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1235
        raise NotImplementedError(self.set_last_revision)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1236
1237
    def _change_last_revision(self, new_revision):
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
1238
        """Template method part of set_last_revision to perform the change.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1239
1638.1.2 by Robert Collins
Change the basis-inventory file to not have the revision-id in the file name.
1240
        This is used to allow WorkingTree3 instances to not affect branch
1241
        when their last revision is set.
1242
        """
2598.5.1 by Aaron Bentley
Start eliminating the use of None to indicate null revision
1243
        if _mod_revision.is_null(new_revision):
5718.7.13 by Jelmer Vernooij
Avoid using set_revision_history.
1244
            self.branch.set_last_revision_info(0, new_revision)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1245
            return False
5718.8.14 by Jelmer Vernooij
Check for reserved revids.
1246
        _mod_revision.check_not_reserved_id(new_revision)
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
1247
        try:
1908.1.1 by Robert Collins
Relax WorkingTree.set_last-revision to allow any revision to be set.
1248
            self.branch.generate_revision_history(new_revision)
1249
        except errors.NoSuchRevision:
1250
            # not present in the repo - dont try to set it deeper than the tip
5807.6.1 by Jelmer Vernooij
Use undeprecated wrappers.
1251
            self.branch._set_revision_history([new_revision])
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1252
        return True
1253
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
1254
    @needs_tree_write_lock
2292.1.22 by Marius Kruger
Implement TODO: Normalize names.
1255
    def remove(self, files, verbose=False, to_file=None, keep_files=True,
2292.1.10 by Marius Kruger
* workingtree.remove
1256
        force=False):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1257
        """Remove nominated files from the working tree metadata.
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1258
2292.1.22 by Marius Kruger
Implement TODO: Normalize names.
1259
        :files: File paths relative to the basedir.
2292.1.7 by Marius Kruger
First pass at only deleting files on 'bzr remove' when
1260
        :keep_files: If true, the files will also be kept.
2292.1.10 by Marius Kruger
* workingtree.remove
1261
        :force: Delete files and directories, even if they are changed and
1262
            even if the directories are not empty.
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1263
        """
1264
        if isinstance(files, basestring):
1265
            files = [files]
1266
1551.15.12 by Aaron Bentley
Stop using inventory directly in WorkingTree.remove
1267
        inv_delta = []
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1268
5340.8.3 by Marius Kruger
new_files => all_files
1269
        all_files = set() # specified and nested files 
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1270
        unknown_nested_files=set()
4792.5.2 by Martin Pool
Move stubby show_status from bzrlib.textui into remove(), its only user
1271
        if to_file is None:
1272
            to_file = sys.stdout
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1273
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1274
        files_to_backup = []
1275
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1276
        def recurse_directory_to_add_files(directory):
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1277
            # Recurse directory and add all files
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1278
            # so we can check if they have changed.
5160.2.2 by Marius Kruger
check if changed file isStillInDirToBeRemoved before bailing out
1279
            for parent_info, file_infos in self.walkdirs(directory):
3585.2.4 by Robert Collins
* Deleting directories by hand before running ``bzr rm`` will not
1280
                for relpath, basename, kind, lstat, fileid, kind in file_infos:
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1281
                    # Is it versioned or ignored?
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1282
                    if self.path2id(relpath):
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1283
                        # Add nested content for deletion.
5340.8.3 by Marius Kruger
new_files => all_files
1284
                        all_files.add(relpath)
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1285
                    else:
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1286
                        # Files which are not versioned
2655.2.16 by Marius Kruger
* Rename `unknown_files_in_directory` to `unknown_nested_files`, which
1287
                        # should be treated as unknown.
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1288
                        files_to_backup.append(relpath)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1289
1290
        for filename in files:
1291
            # Get file name into canonical form.
1551.15.11 by Aaron Bentley
Bugfix WorkingTree.remove to handle subtrees, and non-cwd trees
1292
            abspath = self.abspath(filename)
1293
            filename = self.relpath(abspath)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1294
            if len(filename) > 0:
5340.8.3 by Marius Kruger
new_files => all_files
1295
                all_files.add(filename)
3585.2.4 by Robert Collins
* Deleting directories by hand before running ``bzr rm`` will not
1296
                recurse_directory_to_add_files(filename)
2655.2.4 by Marius Kruger
* workingtree.remove
1297
5340.8.3 by Marius Kruger
new_files => all_files
1298
        files = list(all_files)
2292.1.22 by Marius Kruger
Implement TODO: Normalize names.
1299
2475.5.2 by Marius Kruger
* blackbox/test_remove
1300
        if len(files) == 0:
1301
            return # nothing to do
1302
2292.1.22 by Marius Kruger
Implement TODO: Normalize names.
1303
        # Sort needed to first handle directory content before the directory
1304
        files.sort(reverse=True)
2655.2.6 by Marius Kruger
* workingtree.remove
1305
2655.2.4 by Marius Kruger
* workingtree.remove
1306
        # Bail out if we are going to delete files we shouldn't
2292.1.11 by Marius Kruger
* workingtree.remove
1307
        if not keep_files and not force:
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1308
            for (file_id, path, content_change, versioned, parent_id, name,
1309
                 kind, executable) in self.iter_changes(self.basis_tree(),
1310
                     include_unchanged=True, require_versioned=False,
1311
                     want_unversioned=True, specific_files=files):
1312
                if versioned[0] == False:
1313
                    # The record is unknown or newly added
1314
                    files_to_backup.append(path[1])
1315
                elif (content_change and (kind[1] is not None) and
1316
                        osutils.is_inside_any(files, path[1])):
1317
                    # Versioned and changed, but not deleted, and still
1318
                    # in one of the dirs to be deleted.
1319
                    files_to_backup.append(path[1])
2475.5.2 by Marius Kruger
* blackbox/test_remove
1320
5340.8.5 by Marius Kruger
* extract backup_files
1321
        def backup(file_to_backup):
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
1322
            backup_name = self.bzrdir._available_backup_name(file_to_backup)
5340.8.5 by Marius Kruger
* extract backup_files
1323
            osutils.rename(abs_path, self.abspath(backup_name))
5409.5.4 by Vincent Ladeuil
Deprecate BzrDir.generate_backup_name and use osutils.available_backup_name.
1324
            return "removed %s (but kept a copy: %s)" % (file_to_backup,
1325
                                                         backup_name)
5340.8.5 by Marius Kruger
* extract backup_files
1326
4031.3.1 by Frank Aspell
Fixing various typos
1327
        # Build inv_delta and delete files where applicable,
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1328
        # do this before any modifications to meta data.
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1329
        for f in files:
1551.15.12 by Aaron Bentley
Stop using inventory directly in WorkingTree.remove
1330
            fid = self.path2id(f)
2655.2.4 by Marius Kruger
* workingtree.remove
1331
            message = None
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1332
            if not fid:
2655.2.4 by Marius Kruger
* workingtree.remove
1333
                message = "%s is not versioned." % (f,)
2245.5.1 by Marius Kruger
Let bzr rm rather give a warning than an error when trying to remove a non-versioned file.
1334
            else:
1335
                if verbose:
2292.1.10 by Marius Kruger
* workingtree.remove
1336
                    # having removed it, it must be either ignored or unknown
2245.5.1 by Marius Kruger
Let bzr rm rather give a warning than an error when trying to remove a non-versioned file.
1337
                    if self.is_ignored(f):
1338
                        new_status = 'I'
1339
                    else:
1340
                        new_status = '?'
4792.5.2 by Martin Pool
Move stubby show_status from bzrlib.textui into remove(), its only user
1341
                    # XXX: Really should be a more abstract reporter interface
4792.5.3 by Martin Pool
Further cleanup of removal reporting code
1342
                    kind_ch = osutils.kind_marker(self.kind(fid))
1343
                    to_file.write(new_status + '       ' + f + kind_ch + '\n')
2655.2.17 by Marius Kruger
Minor doc and spacing updates.
1344
                # Unversion file
1551.15.12 by Aaron Bentley
Stop using inventory directly in WorkingTree.remove
1345
                inv_delta.append((f, None, fid, None))
2655.2.4 by Marius Kruger
* workingtree.remove
1346
                message = "removed %s" % (f,)
2292.1.7 by Marius Kruger
First pass at only deleting files on 'bzr remove' when
1347
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
1348
            if not keep_files:
2292.1.30 by Marius Kruger
* Minor text fixes.
1349
                abs_path = self.abspath(f)
1350
                if osutils.lexists(abs_path):
1351
                    if (osutils.isdir(abs_path) and
1352
                        len(os.listdir(abs_path)) > 0):
2655.2.4 by Marius Kruger
* workingtree.remove
1353
                        if force:
1354
                            osutils.rmtree(abs_path)
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1355
                            message = "deleted %s" % (f,)
2655.2.4 by Marius Kruger
* workingtree.remove
1356
                        else:
5340.8.5 by Marius Kruger
* extract backup_files
1357
                            message = backup(f)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1358
                    else:
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1359
                        if f in files_to_backup:
5340.8.5 by Marius Kruger
* extract backup_files
1360
                            message = backup(f)
5340.8.1 by Marius Kruger
* make the backup file name generator in bzrdir available to others
1361
                        else:
1362
                            osutils.delete_any(abs_path)
1363
                            message = "deleted %s" % (f,)
2292.1.13 by Marius Kruger
* merge the unversion command back into the remove command,
1364
                elif message is not None:
2655.2.17 by Marius Kruger
Minor doc and spacing updates.
1365
                    # Only care if we haven't done anything yet.
1366
                    message = "%s does not exist." % (f,)
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1367
2655.2.17 by Marius Kruger
Minor doc and spacing updates.
1368
            # Print only one message (if any) per file.
2292.1.1 by Marius Kruger
"bzr remove" and "bzr rm" will now remove the working file.
1369
            if message is not None:
1370
                note(message)
1551.15.12 by Aaron Bentley
Stop using inventory directly in WorkingTree.remove
1371
        self.apply_inventory_delta(inv_delta)
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1372
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
1373
    @needs_tree_write_lock
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
1374
    def revert(self, filenames=None, old_tree=None, backups=True,
4961.2.9 by Martin Pool
Rip out most remaining uses of DummyProgressBar
1375
               pb=None, report_changes=False):
1996.3.6 by John Arbash Meinel
Find a few places that weren't importing their dependencies.
1376
        from bzrlib.conflicts import resolve
1501 by Robert Collins
Move revert from Branch to WorkingTree.
1377
        if old_tree is None:
2949.2.1 by Robert Collins
* Revert takes out an appropriate lock when reverting to a basis tree, and
1378
            basis_tree = self.basis_tree()
1379
            basis_tree.lock_read()
1380
            old_tree = basis_tree
1534.10.14 by Aaron Bentley
Made revert clear conflicts
1381
        else:
2949.2.1 by Robert Collins
* Revert takes out an appropriate lock when reverting to a basis tree, and
1382
            basis_tree = None
1383
        try:
1384
            conflicts = transform.revert(self, old_tree, filenames, backups, pb,
1385
                                         report_changes)
2949.2.2 by Robert Collins
Avoid dirstate parent resetting when it is not needed during revert.
1386
            if filenames is None and len(self.get_parent_ids()) > 1:
2949.2.1 by Robert Collins
* Revert takes out an appropriate lock when reverting to a basis tree, and
1387
                parent_trees = []
1388
                last_revision = self.last_revision()
4496.3.4 by Andrew Bennetts
Tidy up unused and redundant imports in workingtree.py.
1389
                if last_revision != _mod_revision.NULL_REVISION:
2949.2.1 by Robert Collins
* Revert takes out an appropriate lock when reverting to a basis tree, and
1390
                    if basis_tree is None:
1391
                        basis_tree = self.basis_tree()
1392
                        basis_tree.lock_read()
1393
                    parent_trees.append((last_revision, basis_tree))
1394
                self.set_parent_trees(parent_trees)
1395
                resolve(self)
1396
            else:
3017.2.1 by Aaron Bentley
Revert now resolves conflicts recursively (#102739)
1397
                resolve(self, filenames, ignore_misses=True, recursive=True)
2949.2.1 by Robert Collins
* Revert takes out an appropriate lock when reverting to a basis tree, and
1398
        finally:
1399
            if basis_tree is not None:
1400
                basis_tree.unlock()
1558.7.13 by Aaron Bentley
WorkingTree.revert returns conflicts
1401
        return conflicts
1501 by Robert Collins
Move revert from Branch to WorkingTree.
1402
1908.11.2 by Robert Collins
Implement WorkingTree interface conformance tests for
1403
    def revision_tree(self, revision_id):
1404
        """See Tree.revision_tree.
1405
1406
        WorkingTree can supply revision_trees for the basis revision only
1407
        because there is only one cached inventory in the bzr directory.
1408
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1409
        raise NotImplementedError(self.revision_tree)
1497 by Robert Collins
Move Branch.read_working_inventory to WorkingTree.
1410
1997.1.3 by Robert Collins
All WorkingTree methods which write to the tree, but not to the branch
1411
    @needs_tree_write_lock
1457.1.10 by Robert Collins
Move set_root_id to WorkingTree.
1412
    def set_root_id(self, file_id):
1413
        """Set the root id for this tree."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1414
        # for compatability
2858.2.4 by Martin Pool
Restore deprecated behaviour of accepting None for WorkingTree.set_root_id (thanks igc)
1415
        if file_id is None:
3400.3.6 by Martin Pool
Remove code deprecated prior to 1.1 and its tests
1416
            raise ValueError(
1417
                'WorkingTree.set_root_id with fileid=None')
1418
        file_id = osutils.safe_file_id(file_id)
2255.2.15 by Robert Collins
Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.
1419
        self._set_root_id(file_id)
1420
1421
    def _set_root_id(self, file_id):
1422
        """Set the root id for this tree, in a format specific manner.
1423
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1424
        :param file_id: The file id to assign to the root. It must not be
2255.2.15 by Robert Collins
Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.
1425
            present in the current inventory or an error will occur. It must
1426
            not be None, but rather a valid file id.
1427
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1428
        raise NotImplementedError(self._set_root_id)
1457.1.10 by Robert Collins
Move set_root_id to WorkingTree.
1429
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1430
    def unlock(self):
1431
        """See Branch.unlock.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1432
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1433
        WorkingTree locking just uses the Branch locking facilities.
1434
        This is current because all working trees have an embedded branch
1435
        within them. IF in the future, we were to make branch data shareable
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1436
        between multiple working trees, i.e. via shared storage, then we
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1437
        would probably want to lock both the local tree, and the branch.
1438
        """
1852.4.2 by Robert Collins
Refactor workingtree.unlock to be cleaner, adding a trivial test for unlock. Introduces an explicit Format2 tree type, making the base WorkingTree cleaner to derive from.
1439
        raise NotImplementedError(self.unlock)
1442.1.65 by Robert Collins
Branch.remove has been moved to WorkingTree.
1440
1907.5.7 by Matthieu Moy
Coding style fixes thanks to jam.
1441
    _marker = object()
1442
2009.1.4 by Mark Hammond
First attempt to merge .dev and resolve the conflicts (but tests are
1443
    def update(self, change_reporter=None, possible_transports=None,
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1444
               revision=None, old_tip=_marker, show_base=False):
1587.1.11 by Robert Collins
Local commits appear to be working properly.
1445
        """Update a working tree along its branch.
1446
1731.1.33 by Aaron Bentley
Revert no-special-root changes
1447
        This will update the branch if its bound too, which means we have
1448
        multiple trees involved:
1449
1450
        - The new basis tree of the master.
1451
        - The old basis tree of the branch.
1452
        - The old basis tree of the working tree.
1453
        - The current working tree state.
1454
1455
        Pathologically, all three may be different, and non-ancestors of each
1456
        other.  Conceptually we want to:
1457
1458
        - Preserve the wt.basis->wt.state changes
1459
        - Transform the wt.basis to the new master basis.
1460
        - Apply a merge of the old branch basis to get any 'local' changes from
1461
          it into the tree.
1462
        - Restore the wt.basis->wt.state changes.
1587.1.11 by Robert Collins
Local commits appear to be working properly.
1463
1464
        There isn't a single operation at the moment to do that, so we:
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1465
1731.1.33 by Aaron Bentley
Revert no-special-root changes
1466
        - Merge current state -> basis tree of the master w.r.t. the old tree
1467
          basis.
1468
        - Do a 'normal' merge of the old branch basis if it is relevant.
1907.5.4 by Matthieu Moy
Added test-cases for update -r. Tweaked the implementation too.
1469
2009.1.2 by John Arbash Meinel
minor whitespace cleanup.
1470
        :param revision: The target revision to update to. Must be in the
1471
            revision history.
1472
        :param old_tip: If branch.update() has already been run, the value it
1473
            returned (old tip of the branch or None). _marker is used
1474
            otherwise.
1587.1.11 by Robert Collins
Local commits appear to be working properly.
1475
        """
3280.5.1 by John Arbash Meinel
Avoid opening the master branch when we won't use it.
1476
        if self.branch.get_bound_location() is not None:
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
1477
            self.lock_write()
2009.1.6 by Mark Hammond
more tweaks of the merge to get the tests passing.
1478
            update_branch = (old_tip is self._marker)
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
1479
        else:
1480
            self.lock_tree_write()
1481
            update_branch = False
1482
        try:
1483
            if update_branch:
2806.2.2 by Vincent Ladeuil
Fix #128076 and #131396 by reusing bound branch transport.
1484
                old_tip = self.branch.update(possible_transports)
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
1485
            else:
2009.1.6 by Mark Hammond
more tweaks of the merge to get the tests passing.
1486
                if old_tip is self._marker:
1487
                    old_tip = None
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1488
            return self._update_tree(old_tip, change_reporter, revision, show_base)
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
1489
        finally:
1490
            self.unlock()
1491
1492
    @needs_tree_write_lock
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1493
    def _update_tree(self, old_tip=None, change_reporter=None, revision=None,
1494
                     show_base=False):
2084.2.1 by Aaron Bentley
Support updating lightweight checkouts of readonly branches
1495
        """Update a tree to the master branch.
1496
1497
        :param old_tip: if supplied, the previous tip revision the branch,
1498
            before it was changed to the master branch's tip.
1499
        """
1927.2.3 by Robert Collins
review comment application - paired with Martin.
1500
        # here if old_tip is not None, it is the old tip of the branch before
1501
        # it was updated from the master branch. This should become a pending
1502
        # merge in the working tree to preserve the user existing work.  we
1503
        # cant set that until we update the working trees last revision to be
1504
        # one from the new branch, because it will just get absorbed by the
1505
        # parent de-duplication logic.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1506
        #
1927.2.3 by Robert Collins
review comment application - paired with Martin.
1507
        # We MUST save it even if an error occurs, because otherwise the users
1508
        # local work is unreferenced and will appear to have been lost.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
1509
        #
4985.3.17 by Vincent Ladeuil
Some cleanup.
1510
        nb_conflicts = 0
1907.5.13 by Matthieu Moy
Fixed bad conflict resolution.
1511
        try:
1512
            last_rev = self.get_parent_ids()[0]
1513
        except IndexError:
2598.5.1 by Aaron Bentley
Start eliminating the use of None to indicate null revision
1514
            last_rev = _mod_revision.NULL_REVISION
1907.5.8 by Matthieu Moy
merge (with conflicts)
1515
        if revision is None:
1907.5.13 by Matthieu Moy
Fixed bad conflict resolution.
1516
            revision = self.branch.last_revision()
4985.3.17 by Vincent Ladeuil
Some cleanup.
1517
4985.3.14 by Gerard Krol
Don't compare old_tip to revision, just do the merge.
1518
        old_tip = old_tip or _mod_revision.NULL_REVISION
4985.3.17 by Vincent Ladeuil
Some cleanup.
1519
4985.3.15 by Gerard Krol
Now correctly determine the branch point (instead of some lucky guesses)
1520
        if not _mod_revision.is_null(old_tip) and old_tip != last_rev:
4985.3.14 by Gerard Krol
Don't compare old_tip to revision, just do the merge.
1521
            # the branch we are bound to was updated
1522
            # merge those changes in first
1523
            base_tree  = self.basis_tree()
4985.3.1 by Gerard Krol
Werkt wel ok
1524
            other_tree = self.branch.repository.revision_tree(old_tip)
4985.3.17 by Vincent Ladeuil
Some cleanup.
1525
            nb_conflicts = merge.merge_inner(self.branch, other_tree,
1526
                                             base_tree, this_tree=self,
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1527
                                             change_reporter=change_reporter,
1528
                                             show_base=show_base)
4985.3.17 by Vincent Ladeuil
Some cleanup.
1529
            if nb_conflicts:
4985.3.14 by Gerard Krol
Don't compare old_tip to revision, just do the merge.
1530
                self.add_parent_tree((old_tip, other_tree))
5753.2.2 by Jelmer Vernooij
Remove some unnecessary imports, clean up lazy imports.
1531
                note('Rerun update after fixing the conflicts.')
4985.3.17 by Vincent Ladeuil
Some cleanup.
1532
                return nb_conflicts
4985.3.1 by Gerard Krol
Werkt wel ok
1533
2009.1.4 by Mark Hammond
First attempt to merge .dev and resolve the conflicts (but tests are
1534
        if last_rev != _mod_revision.ensure_null(revision):
4985.3.15 by Gerard Krol
Now correctly determine the branch point (instead of some lucky guesses)
1535
            # the working tree is up to date with the branch
1536
            # we can merge the specified revision from master
1537
            to_tree = self.branch.repository.revision_tree(revision)
1538
            to_root_id = to_tree.get_root_id()
1539
1927.2.3 by Robert Collins
review comment application - paired with Martin.
1540
            basis = self.basis_tree()
2255.2.44 by Robert Collins
Fix tree unlock on readonly Format4 trees with dirty hashcache.
1541
            basis.lock_read()
1542
            try:
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1543
                if (basis.get_root_id() is None or basis.get_root_id() != to_root_id):
4634.123.10 by John Arbash Meinel
update now properly handles root-id changes.
1544
                    self.set_root_id(to_root_id)
2255.6.6 by Aaron Bentley
Fix update to set unique roots, and work with dirstate
1545
                    self.flush()
2255.2.44 by Robert Collins
Fix tree unlock on readonly Format4 trees with dirty hashcache.
1546
            finally:
1547
                basis.unlock()
4985.3.15 by Gerard Krol
Now correctly determine the branch point (instead of some lucky guesses)
1548
1549
            # determine the branch point
1550
            graph = self.branch.repository.get_graph()
4985.3.17 by Vincent Ladeuil
Some cleanup.
1551
            base_rev_id = graph.find_unique_lca(self.branch.last_revision(),
1552
                                                last_rev)
4985.3.15 by Gerard Krol
Now correctly determine the branch point (instead of some lucky guesses)
1553
            base_tree = self.branch.repository.revision_tree(base_rev_id)
1554
4985.3.17 by Vincent Ladeuil
Some cleanup.
1555
            nb_conflicts = merge.merge_inner(self.branch, to_tree, base_tree,
1556
                                             this_tree=self,
5430.7.1 by Rory Yorke
Added --show-base to pull and update (bug 202374).
1557
                                             change_reporter=change_reporter,
1558
                                             show_base=show_base)
4985.3.15 by Gerard Krol
Now correctly determine the branch point (instead of some lucky guesses)
1559
            self.set_last_revision(revision)
1908.6.6 by Robert Collins
Merge updated set_parents api.
1560
            # TODO - dedup parents list with things merged by pull ?
1561
            # reuse the tree we've updated to to set the basis:
1907.5.11 by Matthieu Moy
Simple fixes (deprecation warning, use revision where needed)
1562
            parent_trees = [(revision, to_tree)]
1908.6.6 by Robert Collins
Merge updated set_parents api.
1563
            merges = self.get_parent_ids()[1:]
1564
            # Ideally we ask the tree for the trees here, that way the working
1907.5.12 by Matthieu Moy
Manage InvalidRevisionSpec in update command.
1565
            # tree can decide whether to give us the entire tree or give us a
1908.6.6 by Robert Collins
Merge updated set_parents api.
1566
            # lazy initialised tree. dirstate for instance will have the trees
1567
            # in ram already, whereas a last-revision + basis-inventory tree
1568
            # will not, but also does not need them when setting parents.
1569
            for parent in merges:
1570
                parent_trees.append(
1571
                    (parent, self.branch.repository.revision_tree(parent)))
4985.3.14 by Gerard Krol
Don't compare old_tip to revision, just do the merge.
1572
            if not _mod_revision.is_null(old_tip):
1573
                parent_trees.append(
1574
                    (old_tip, self.branch.repository.revision_tree(old_tip)))
1908.6.6 by Robert Collins
Merge updated set_parents api.
1575
            self.set_parent_trees(parent_trees)
1908.7.6 by Robert Collins
Deprecate WorkingTree.last_revision.
1576
            last_rev = parent_trees[0][0]
4985.3.17 by Vincent Ladeuil
Some cleanup.
1577
        return nb_conflicts
1508.1.24 by Robert Collins
Add update command for use with checkouts.
1578
2201.1.1 by John Arbash Meinel
Fix bug #76299 by ignoring write errors during readonly hashcache write.
1579
    def _write_hashcache_if_dirty(self):
1580
        """Write out the hashcache if it is dirty."""
1581
        if self._hashcache.needs_write:
1582
            try:
1583
                self._hashcache.write()
1584
            except OSError, e:
1585
                if e.errno not in (errno.EPERM, errno.EACCES):
1586
                    raise
1587
                # TODO: jam 20061219 Should this be a warning? A single line
1588
                #       warning might be sufficient to let the user know what
1589
                #       is going on.
1590
                mutter('Could not write hashcache for %s\nError: %s',
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1591
                              self._hashcache.cache_file_name(), e)
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1592
1534.10.22 by Aaron Bentley
Got ConflictList implemented
1593
    def set_conflicts(self, arg):
2206.1.7 by Marius Kruger
* errors
1594
        raise errors.UnsupportedOperation(self.set_conflicts, self)
1534.10.8 by Aaron Bentley
Implemented conflict_lines in terms of old system on WorkingTree
1595
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
1596
    def add_conflicts(self, arg):
2206.1.7 by Marius Kruger
* errors
1597
        raise errors.UnsupportedOperation(self.add_conflicts, self)
1551.7.11 by Aaron Bentley
Add WorkingTree.add_conflicts
1598
1534.10.22 by Aaron Bentley
Got ConflictList implemented
1599
    def conflicts(self):
5582.10.47 by Jelmer Vernooij
Move some upgrade tests that rely on bzrdirformat 0.0.4.
1600
        raise NotImplementedError(self.conflicts)
1534.10.22 by Aaron Bentley
Got ConflictList implemented
1601
1852.15.3 by Robert Collins
Add a first-cut Tree.walkdirs method.
1602
    def walkdirs(self, prefix=""):
2255.2.18 by Robert Collins
Dirstate: all tree_implementation tests passing.
1603
        """Walk the directories of this tree.
1604
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1605
        returns a generator which yields items in the form:
2292.1.30 by Marius Kruger
* Minor text fixes.
1606
                ((curren_directory_path, fileid),
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1607
                 [(file1_path, file1_name, file1_kind, (lstat), file1_id,
1608
                   file1_kind), ... ])
1609
2255.2.18 by Robert Collins
Dirstate: all tree_implementation tests passing.
1610
        This API returns a generator, which is only valid during the current
1611
        tree transaction - within a single lock_read or lock_write duration.
1612
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1613
        If the tree is not locked, it may cause an error to be raised,
1614
        depending on the tree implementation.
2255.2.18 by Robert Collins
Dirstate: all tree_implementation tests passing.
1615
        """
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1616
        disk_top = self.abspath(prefix)
1617
        if disk_top.endswith('/'):
1618
            disk_top = disk_top[:-1]
1619
        top_strip_len = len(disk_top) + 1
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1620
        inventory_iterator = self._walkdirs(prefix)
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1621
        disk_iterator = osutils.walkdirs(disk_top, prefix)
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1622
        try:
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1623
            current_disk = disk_iterator.next()
1624
            disk_finished = False
1625
        except OSError, e:
2423.2.1 by Alexander Belchenko
Fix for walkdirs in missing dir with Py2.4 @ win32
1626
            if not (e.errno == errno.ENOENT or
1627
                (sys.platform == 'win32' and e.errno == ERROR_PATH_NOT_FOUND)):
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1628
                raise
1629
            current_disk = None
1630
            disk_finished = True
1631
        try:
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1632
            current_inv = inventory_iterator.next()
1633
            inv_finished = False
1634
        except StopIteration:
1635
            current_inv = None
1636
            inv_finished = True
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1637
        while not inv_finished or not disk_finished:
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1638
            if current_disk:
1639
                ((cur_disk_dir_relpath, cur_disk_dir_path_from_top),
1640
                    cur_disk_dir_content) = current_disk
1641
            else:
1642
                ((cur_disk_dir_relpath, cur_disk_dir_path_from_top),
1643
                    cur_disk_dir_content) = ((None, None), None)
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1644
            if not disk_finished:
1645
                # strip out .bzr dirs
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1646
                if (cur_disk_dir_path_from_top[top_strip_len:] == '' and
1647
                    len(cur_disk_dir_content) > 0):
1648
                    # osutils.walkdirs can be made nicer -
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1649
                    # yield the path-from-prefix rather than the pathjoined
1650
                    # value.
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1651
                    bzrdir_loc = bisect_left(cur_disk_dir_content,
1652
                        ('.bzr', '.bzr'))
3719.1.1 by Vincent Ladeuil
Fix bug #272648
1653
                    if (bzrdir_loc < len(cur_disk_dir_content)
4324.5.1 by Jelmer Vernooij
Use utility function to check for control filename rather than assuming it is '.bzr.'
1654
                        and self.bzrdir.is_control_filename(
1655
                            cur_disk_dir_content[bzrdir_loc][0])):
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1656
                        # we dont yield the contents of, or, .bzr itself.
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1657
                        del cur_disk_dir_content[bzrdir_loc]
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1658
            if inv_finished:
1659
                # everything is unknown
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1660
                direction = 1
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1661
            elif disk_finished:
1662
                # everything is missing
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1663
                direction = -1
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1664
            else:
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1665
                direction = cmp(current_inv[0][0], cur_disk_dir_relpath)
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1666
            if direction > 0:
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1667
                # disk is before inventory - unknown
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1668
                dirblock = [(relpath, basename, kind, stat, None, None) for
2457.2.7 by Marius Kruger
extract method as per review request
1669
                    relpath, basename, kind, stat, top_path in
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1670
                    cur_disk_dir_content]
1671
                yield (cur_disk_dir_relpath, None), dirblock
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1672
                try:
1673
                    current_disk = disk_iterator.next()
1674
                except StopIteration:
1675
                    disk_finished = True
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1676
            elif direction < 0:
1852.15.10 by Robert Collins
Tweak the Tree.walkdirs interface more to be more useful.
1677
                # inventory is before disk - missing.
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1678
                dirblock = [(relpath, basename, 'unknown', None, fileid, kind)
2457.2.7 by Marius Kruger
extract method as per review request
1679
                    for relpath, basename, dkind, stat, fileid, kind in
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1680
                    current_inv[1]]
1681
                yield (current_inv[0][0], current_inv[0][1]), dirblock
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1682
                try:
1683
                    current_inv = inventory_iterator.next()
1684
                except StopIteration:
1685
                    inv_finished = True
1686
            else:
1687
                # versioned present directory
1688
                # merge the inventory and disk data together
1689
                dirblock = []
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1690
                for relpath, subiterator in itertools.groupby(sorted(
2457.2.7 by Marius Kruger
extract method as per review request
1691
                    current_inv[1] + cur_disk_dir_content,
2457.2.3 by Marius Kruger
factor out tuples into better readable variables
1692
                    key=operator.itemgetter(0)), operator.itemgetter(1)):
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1693
                    path_elements = list(subiterator)
1694
                    if len(path_elements) == 2:
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1695
                        inv_row, disk_row = path_elements
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1696
                        # versioned, present file
1852.15.12 by Robert Collins
WorkingTree.walkdirs handling of changing file kinds, and multi-directory with missing and unknown ordering bugfix.
1697
                        dirblock.append((inv_row[0],
1698
                            inv_row[1], disk_row[2],
1699
                            disk_row[3], inv_row[4],
1700
                            inv_row[5]))
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1701
                    elif len(path_elements[0]) == 5:
1702
                        # unknown disk file
1852.15.11 by Robert Collins
Tree.walkdirs handles missing contents in workingtrees.
1703
                        dirblock.append((path_elements[0][0],
1704
                            path_elements[0][1], path_elements[0][2],
1705
                            path_elements[0][3], None, None))
1706
                    elif len(path_elements[0]) == 6:
1707
                        # versioned, absent file.
1708
                        dirblock.append((path_elements[0][0],
1709
                            path_elements[0][1], 'unknown', None,
1710
                            path_elements[0][4], path_elements[0][5]))
1711
                    else:
1712
                        raise NotImplementedError('unreachable code')
1852.15.7 by Robert Collins
Start testing behaviour of unknowns in WorkingTree.walkdirs.
1713
                yield current_inv[0], dirblock
1714
                try:
1715
                    current_inv = inventory_iterator.next()
1716
                except StopIteration:
1717
                    inv_finished = True
1718
                try:
1719
                    current_disk = disk_iterator.next()
1720
                except StopIteration:
1721
                    disk_finished = True
1722
1723
    def _walkdirs(self, prefix=""):
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1724
        """Walk the directories of this tree.
1725
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1726
        :param prefix: is used as the directrory to start with.
1727
        :returns: a generator which yields items in the form::
1728
1729
            ((curren_directory_path, fileid),
1730
             [(file1_path, file1_name, file1_kind, None, file1_id,
1731
               file1_kind), ... ])
2292.1.25 by Marius Kruger
* Add utility method delta.get_changes_as_text to get the output of .show()
1732
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1733
        raise NotImplementedError(self._walkdirs)
1852.15.3 by Robert Collins
Add a first-cut Tree.walkdirs method.
1734
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
1735
    @needs_tree_write_lock
1736
    def auto_resolve(self):
1737
        """Automatically resolve text conflicts according to contents.
1738
1739
        Only text conflicts are auto_resolvable. Files with no conflict markers
1740
        are considered 'resolved', because bzr always puts conflict markers
1741
        into files that have text conflicts.  The corresponding .THIS .BASE and
1742
        .OTHER files are deleted, as per 'resolve'.
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
1743
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
1744
        :return: a tuple of ConflictLists: (un_resolved, resolved).
1745
        """
1746
        un_resolved = _mod_conflicts.ConflictList()
1747
        resolved = _mod_conflicts.ConflictList()
1748
        conflict_re = re.compile('^(<{7}|={7}|>{7})')
1749
        for conflict in self.conflicts():
2120.7.3 by Aaron Bentley
Update resolve command to automatically mark conflicts as resolved
1750
            if (conflict.typestring != 'text conflict' or
1751
                self.kind(conflict.file_id) != 'file'):
2120.7.2 by Aaron Bentley
Move autoresolve functionality to workingtree
1752
                un_resolved.append(conflict)
1753
                continue
1754
            my_file = open(self.id2abspath(conflict.file_id), 'rb')
1755
            try:
1756
                for line in my_file:
1757
                    if conflict_re.search(line):
1758
                        un_resolved.append(conflict)
1759
                        break
1760
                else:
1761
                    resolved.append(conflict)
1762
            finally:
1763
                my_file.close()
1764
        resolved.remove_files(self)
1765
        self.set_conflicts(un_resolved)
1766
        return un_resolved, resolved
1767
2371.2.1 by John Arbash Meinel
Update DirState._validate() to detect rename errors.
1768
    def _validate(self):
1769
        """Validate internal structures.
1770
1771
        This is meant mostly for the test suite. To give it a chance to detect
1772
        corruption after actions have occurred. The default implementation is a
1773
        just a no-op.
1774
1775
        :return: None. An exception should be raised if there is an error.
1776
        """
1777
        return
1778
5630.2.3 by John Arbash Meinel
Looks like it was a stale experimental .pyd file causing trouble. Tests pass again now.
1779
    def check_state(self):
1780
        """Check that the working state is/isn't valid."""
5850.1.2 by Jelmer Vernooij
Move inventory tree specific check implementation to InventoryWorkingTree.
1781
        raise NotImplementedError(self.check_state)
5630.2.4 by John Arbash Meinel
Basically works in the case where the dirstate isn't corrupted.
1782
1783
    def reset_state(self, revision_ids=None):
1784
        """Reset the state of the working tree.
1785
1786
        This does a hard-reset to a last-known-good state. This is a way to
1787
        fix if something got corrupted (like the .bzr/checkout/dirstate file)
1788
        """
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1789
        raise NotImplementedError(self.reset_state)
5630.2.2 by John Arbash Meinel
Start fleshing out the design. Something weird is causing my tests to all fail.
1790
3398.1.24 by Ian Clatworthy
make iter_search_rules a tree method
1791
    def _get_rules_searcher(self, default_searcher):
1792
        """See Tree._get_rules_searcher."""
1793
        if self._rules_searcher is None:
1794
            self._rules_searcher = super(WorkingTree,
1795
                self)._get_rules_searcher(default_searcher)
1796
        return self._rules_searcher
1797
0.12.68 by Aaron Bentley
Update docs, move items to proper files.
1798
    def get_shelf_manager(self):
1799
        """Return the ShelfManager for this WorkingTree."""
1800
        from bzrlib.shelf import ShelfManager
1801
        return ShelfManager(self, self._transport)
1802
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
1803
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1804
class InventoryWorkingTree(WorkingTree,
1805
        bzrlib.mutabletree.MutableInventoryTree):
1806
    """Base class for working trees that are inventory-oriented.
1807
1808
    The inventory is held in the `Branch` working-inventory, and the
1809
    files are in a directory on disk.
1810
1811
    It is possible for a `WorkingTree` to have a filename which is
1812
    not listed in the Inventory and vice versa.
1813
    """
1814
1815
    def __init__(self, basedir='.',
1816
                 branch=DEPRECATED_PARAMETER,
1817
                 _inventory=None,
1818
                 _control_files=None,
1819
                 _internal=False,
1820
                 _format=None,
1821
                 _bzrdir=None):
1822
        """Construct a InventoryWorkingTree instance. This is not a public API.
1823
1824
        :param branch: A branch to override probing for the branch.
1825
        """
1826
        super(InventoryWorkingTree, self).__init__(basedir=basedir,
1827
            branch=branch, _control_files=_control_files, _internal=_internal,
1828
            _format=_format, _bzrdir=_bzrdir)
1829
1830
        if _inventory is None:
1831
            # This will be acquired on lock_read() or lock_write()
1832
            self._inventory_is_modified = False
1833
            self._inventory = None
1834
        else:
1835
            # the caller of __init__ has provided an inventory,
1836
            # we assume they know what they are doing - as its only
1837
            # the Format factory and creation methods that are
1838
            # permitted to do this.
1839
            self._set_inventory(_inventory, dirty=False)
1840
1841
    def _set_inventory(self, inv, dirty):
1842
        """Set the internal cached inventory.
1843
1844
        :param inv: The inventory to set.
1845
        :param dirty: A boolean indicating whether the inventory is the same
1846
            logical inventory as whats on disk. If True the inventory is not
1847
            the same and should be written to disk or data will be lost, if
1848
            False then the inventory is the same as that on disk and any
1849
            serialisation would be unneeded overhead.
1850
        """
1851
        self._inventory = inv
1852
        self._inventory_is_modified = dirty
1853
1854
    def _serialize(self, inventory, out_file):
1855
        xml5.serializer_v5.write_inventory(self._inventory, out_file,
1856
            working=True)
1857
1858
    def _deserialize(selt, in_file):
1859
        return xml5.serializer_v5.read_inventory(in_file)
1860
1861
    @needs_tree_write_lock
1862
    def _write_inventory(self, inv):
1863
        """Write inventory as the current inventory."""
1864
        self._set_inventory(inv, dirty=True)
1865
        self.flush()
1866
1867
    # XXX: This method should be deprecated in favour of taking in a proper
1868
    # new Inventory object.
1869
    @needs_tree_write_lock
1870
    def set_inventory(self, new_inventory_list):
1871
        from bzrlib.inventory import (Inventory,
1872
                                      InventoryDirectory,
1873
                                      InventoryFile,
1874
                                      InventoryLink)
1875
        inv = Inventory(self.get_root_id())
1876
        for path, file_id, parent, kind in new_inventory_list:
1877
            name = os.path.basename(path)
1878
            if name == "":
1879
                continue
1880
            # fixme, there should be a factory function inv,add_??
1881
            if kind == 'directory':
1882
                inv.add(InventoryDirectory(file_id, name, parent))
1883
            elif kind == 'file':
1884
                inv.add(InventoryFile(file_id, name, parent))
1885
            elif kind == 'symlink':
1886
                inv.add(InventoryLink(file_id, name, parent))
1887
            else:
1888
                raise errors.BzrError("unknown kind %r" % kind)
1889
        self._write_inventory(inv)
1890
1891
    def _write_basis_inventory(self, xml):
1892
        """Write the basis inventory XML to the basis-inventory file"""
1893
        path = self._basis_inventory_name()
1894
        sio = StringIO(xml)
1895
        self._transport.put_file(path, sio,
1896
            mode=self.bzrdir._get_file_mode())
1897
1898
    def _reset_data(self):
1899
        """Reset transient data that cannot be revalidated."""
1900
        self._inventory_is_modified = False
1901
        f = self._transport.get('inventory')
1902
        try:
1903
            result = self._deserialize(f)
1904
        finally:
1905
            f.close()
1906
        self._set_inventory(result, dirty=False)
1907
1908
    def _set_root_id(self, file_id):
1909
        """Set the root id for this tree, in a format specific manner.
1910
1911
        :param file_id: The file id to assign to the root. It must not be
1912
            present in the current inventory or an error will occur. It must
1913
            not be None, but rather a valid file id.
1914
        """
1915
        inv = self._inventory
1916
        orig_root_id = inv.root.file_id
1917
        # TODO: it might be nice to exit early if there was nothing
1918
        # to do, saving us from trigger a sync on unlock.
1919
        self._inventory_is_modified = True
1920
        # we preserve the root inventory entry object, but
1921
        # unlinkit from the byid index
1922
        del inv._byid[inv.root.file_id]
1923
        inv.root.file_id = file_id
1924
        # and link it into the index with the new changed id.
1925
        inv._byid[inv.root.file_id] = inv.root
1926
        # and finally update all children to reference the new id.
1927
        # XXX: this should be safe to just look at the root.children
1928
        # list, not the WHOLE INVENTORY.
1929
        for fid in inv:
1930
            entry = inv[fid]
1931
            if entry.parent_id == orig_root_id:
1932
                entry.parent_id = inv.root.file_id
1933
1934
    def all_file_ids(self):
1935
        """See Tree.iter_all_file_ids"""
1936
        return set(self.inventory)
1937
5807.1.1 by Jelmer Vernooij
Move inventory-specific method to InventoryWorkingTree.
1938
    @needs_tree_write_lock
1939
    def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):
1940
        """See MutableTree.set_parent_trees."""
1941
        parent_ids = [rev for (rev, tree) in parents_list]
1942
        for revision_id in parent_ids:
1943
            _mod_revision.check_not_reserved_id(revision_id)
1944
1945
        self._check_parents_for_ghosts(parent_ids,
1946
            allow_leftmost_as_ghost=allow_leftmost_as_ghost)
1947
1948
        parent_ids = self._filter_parent_ids_by_ancestry(parent_ids)
1949
1950
        if len(parent_ids) == 0:
1951
            leftmost_parent_id = _mod_revision.NULL_REVISION
1952
            leftmost_parent_tree = None
1953
        else:
1954
            leftmost_parent_id, leftmost_parent_tree = parents_list[0]
1955
1956
        if self._change_last_revision(leftmost_parent_id):
1957
            if leftmost_parent_tree is None:
1958
                # If we don't have a tree, fall back to reading the
1959
                # parent tree from the repository.
1960
                self._cache_basis_inventory(leftmost_parent_id)
1961
            else:
1962
                inv = leftmost_parent_tree.inventory
1963
                xml = self._create_basis_xml_from_inventory(
1964
                                        leftmost_parent_id, inv)
1965
                self._write_basis_inventory(xml)
1966
        self._set_merges_from_parent_ids(parent_ids)
1967
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
1968
    def _cache_basis_inventory(self, new_revision):
1969
        """Cache new_revision as the basis inventory."""
1970
        # TODO: this should allow the ready-to-use inventory to be passed in,
1971
        # as commit already has that ready-to-use [while the format is the
1972
        # same, that is].
1973
        try:
1974
            # this double handles the inventory - unpack and repack -
1975
            # but is easier to understand. We can/should put a conditional
1976
            # in here based on whether the inventory is in the latest format
1977
            # - perhaps we should repack all inventories on a repository
1978
            # upgrade ?
1979
            # the fast path is to copy the raw xml from the repository. If the
1980
            # xml contains 'revision_id="', then we assume the right
1981
            # revision_id is set. We must check for this full string, because a
1982
            # root node id can legitimately look like 'revision_id' but cannot
1983
            # contain a '"'.
1984
            xml = self.branch.repository._get_inventory_xml(new_revision)
1985
            firstline = xml.split('\n', 1)[0]
1986
            if (not 'revision_id="' in firstline or
1987
                'format="7"' not in firstline):
1988
                inv = self.branch.repository._serializer.read_inventory_from_string(
1989
                    xml, new_revision)
1990
                xml = self._create_basis_xml_from_inventory(new_revision, inv)
1991
            self._write_basis_inventory(xml)
1992
        except (errors.NoSuchRevision, errors.RevisionNotPresent):
1993
            pass
1994
1995
    def _basis_inventory_name(self):
1996
        return 'basis-inventory-cache'
1997
1998
    def _create_basis_xml_from_inventory(self, revision_id, inventory):
1999
        """Create the text that will be saved in basis-inventory"""
2000
        inventory.revision_id = revision_id
2001
        return xml7.serializer_v7.write_inventory_to_string(inventory)
2002
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
2003
    @needs_tree_write_lock
2004
    def set_conflicts(self, conflicts):
2005
        self._put_rio('conflicts', conflicts.to_stanzas(),
2006
                      CONFLICT_HEADER_1)
2007
2008
    @needs_tree_write_lock
2009
    def add_conflicts(self, new_conflicts):
2010
        conflict_set = set(self.conflicts())
2011
        conflict_set.update(set(list(new_conflicts)))
2012
        self.set_conflicts(_mod_conflicts.ConflictList(sorted(conflict_set,
2013
                                       key=_mod_conflicts.Conflict.sort_key)))
2014
2015
    @needs_read_lock
2016
    def conflicts(self):
2017
        try:
2018
            confile = self._transport.get('conflicts')
2019
        except errors.NoSuchFile:
2020
            return _mod_conflicts.ConflictList()
2021
        try:
2022
            try:
2023
                if confile.next() != CONFLICT_HEADER_1 + '\n':
2024
                    raise errors.ConflictFormatError()
2025
            except StopIteration:
2026
                raise errors.ConflictFormatError()
2027
            reader = _mod_rio.RioReader(confile)
2028
            return _mod_conflicts.ConflictList.from_stanzas(reader)
2029
        finally:
2030
            confile.close()
2031
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2032
    def read_basis_inventory(self):
2033
        """Read the cached basis inventory."""
2034
        path = self._basis_inventory_name()
2035
        return self._transport.get_bytes(path)
2036
2037
    @needs_read_lock
2038
    def read_working_inventory(self):
2039
        """Read the working inventory.
2040
2041
        :raises errors.InventoryModified: read_working_inventory will fail
2042
            when the current in memory inventory has been modified.
2043
        """
2044
        # conceptually this should be an implementation detail of the tree.
2045
        # XXX: Deprecate this.
2046
        # ElementTree does its own conversion from UTF-8, so open in
2047
        # binary.
2048
        if self._inventory_is_modified:
2049
            raise errors.InventoryModified(self)
2050
        f = self._transport.get('inventory')
2051
        try:
2052
            result = self._deserialize(f)
2053
        finally:
2054
            f.close()
2055
        self._set_inventory(result, dirty=False)
2056
        return result
2057
2058
    @needs_read_lock
2059
    def get_root_id(self):
2060
        """Return the id of this trees root"""
2061
        return self._inventory.root.file_id
2062
2063
    def has_id(self, file_id):
2064
        # files that have been deleted are excluded
2065
        inv = self.inventory
2066
        if not inv.has_id(file_id):
2067
            return False
2068
        path = inv.id2path(file_id)
2069
        return osutils.lexists(self.abspath(path))
2070
2071
    def has_or_had_id(self, file_id):
2072
        if file_id == self.inventory.root.file_id:
2073
            return True
2074
        return self.inventory.has_id(file_id)
2075
5837.2.1 by Jelmer Vernooij
Deprecate Tree.__iter__.
2076
    @symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 4, 0)))
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2077
    def __iter__(self):
2078
        """Iterate through file_ids for this tree.
2079
2080
        file_ids are in a WorkingTree if they are in the working inventory
2081
        and the working file exists.
2082
        """
2083
        inv = self._inventory
2084
        for path, ie in inv.iter_entries():
2085
            if osutils.lexists(self.abspath(path)):
2086
                yield ie.file_id
2087
2088
    @needs_tree_write_lock
2089
    def set_last_revision(self, new_revision):
2090
        """Change the last revision in the working tree."""
2091
        if self._change_last_revision(new_revision):
2092
            self._cache_basis_inventory(new_revision)
2093
5850.1.2 by Jelmer Vernooij
Move inventory tree specific check implementation to InventoryWorkingTree.
2094
    def _get_check_refs(self):
2095
        """Return the references needed to perform a check of this tree.
2096
        
2097
        The default implementation returns no refs, and is only suitable for
2098
        trees that have no local caching and can commit on ghosts at any time.
2099
2100
        :seealso: bzrlib.check for details about check_refs.
2101
        """
2102
        return []
2103
2104
    @needs_read_lock
2105
    def _check(self, references):
2106
        """Check the tree for consistency.
2107
2108
        :param references: A dict with keys matching the items returned by
2109
            self._get_check_refs(), and values from looking those keys up in
2110
            the repository.
2111
        """
2112
        tree_basis = self.basis_tree()
2113
        tree_basis.lock_read()
2114
        try:
2115
            repo_basis = references[('trees', self.last_revision())]
2116
            if len(list(repo_basis.iter_changes(tree_basis))) > 0:
2117
                raise errors.BzrCheckError(
2118
                    "Mismatched basis inventory content.")
2119
            self._validate()
2120
        finally:
2121
            tree_basis.unlock()
2122
2123
    @needs_read_lock
2124
    def check_state(self):
2125
        """Check that the working state is/isn't valid."""
2126
        check_refs = self._get_check_refs()
2127
        refs = {}
2128
        for ref in check_refs:
2129
            kind, value = ref
2130
            if kind == 'trees':
2131
                refs[ref] = self.branch.repository.revision_tree(value)
2132
        self._check(refs)
2133
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2134
    @needs_tree_write_lock
2135
    def reset_state(self, revision_ids=None):
2136
        """Reset the state of the working tree.
2137
2138
        This does a hard-reset to a last-known-good state. This is a way to
2139
        fix if something got corrupted (like the .bzr/checkout/dirstate file)
2140
        """
2141
        if revision_ids is None:
2142
            revision_ids = self.get_parent_ids()
2143
        if not revision_ids:
2144
            rt = self.branch.repository.revision_tree(
2145
                _mod_revision.NULL_REVISION)
2146
        else:
2147
            rt = self.branch.repository.revision_tree(revision_ids[0])
2148
        self._write_inventory(rt.inventory)
2149
        self.set_parent_ids(revision_ids)
2150
2151
    def flush(self):
2152
        """Write the in memory inventory to disk."""
2153
        # TODO: Maybe this should only write on dirty ?
2154
        if self._control_files._lock_mode != 'w':
2155
            raise errors.NotWriteLocked(self)
2156
        sio = StringIO()
2157
        self._serialize(self._inventory, sio)
2158
        sio.seek(0)
2159
        self._transport.put_file('inventory', sio,
2160
            mode=self.bzrdir._get_file_mode())
2161
        self._inventory_is_modified = False
2162
2163
    @needs_read_lock
2164
    def get_file_sha1(self, file_id, path=None, stat_value=None):
2165
        if not path:
2166
            path = self._inventory.id2path(file_id)
2167
        return self._hashcache.get_sha1(path, stat_value)
2168
2169
    def get_file_mtime(self, file_id, path=None):
2170
        """See Tree.get_file_mtime."""
2171
        if not path:
2172
            path = self.inventory.id2path(file_id)
2173
        return os.lstat(self.abspath(path)).st_mtime
2174
2175
    def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):
2176
        file_id = self.path2id(path)
2177
        if file_id is None:
2178
            # For unversioned files on win32, we just assume they are not
2179
            # executable
2180
            return False
2181
        return self._inventory[file_id].executable
2182
2183
    def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
2184
        mode = stat_result.st_mode
2185
        return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
2186
2187
    if not supports_executable():
2188
        def is_executable(self, file_id, path=None):
2189
            return self._inventory[file_id].executable
2190
2191
        _is_executable_from_path_and_stat = \
2192
            _is_executable_from_path_and_stat_from_basis
2193
    else:
2194
        def is_executable(self, file_id, path=None):
2195
            if not path:
2196
                path = self.id2path(file_id)
2197
            mode = os.lstat(self.abspath(path)).st_mode
2198
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
2199
2200
        _is_executable_from_path_and_stat = \
2201
            _is_executable_from_path_and_stat_from_stat
2202
2203
    @needs_tree_write_lock
2204
    def _add(self, files, ids, kinds):
2205
        """See MutableTree._add."""
2206
        # TODO: Re-adding a file that is removed in the working copy
2207
        # should probably put it back with the previous ID.
2208
        # the read and write working inventory should not occur in this
2209
        # function - they should be part of lock_write and unlock.
2210
        inv = self.inventory
2211
        for f, file_id, kind in zip(files, ids, kinds):
2212
            if file_id is None:
2213
                inv.add_path(f, kind=kind)
2214
            else:
2215
                inv.add_path(f, kind=kind, file_id=file_id)
2216
            self._inventory_is_modified = True
2217
2218
    def revision_tree(self, revision_id):
2219
        """See WorkingTree.revision_id."""
2220
        if revision_id == self.last_revision():
2221
            try:
2222
                xml = self.read_basis_inventory()
2223
            except errors.NoSuchFile:
2224
                pass
2225
            else:
2226
                try:
2227
                    inv = xml7.serializer_v7.read_inventory_from_string(xml)
2228
                    # dont use the repository revision_tree api because we want
2229
                    # to supply the inventory.
2230
                    if inv.revision_id == revision_id:
5793.2.2 by Jelmer Vernooij
Split inventory-specific code out of RevisionTree into InventoryRevisionTree.
2231
                        return revisiontree.InventoryRevisionTree(
2232
                            self.branch.repository, inv, revision_id)
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2233
                except errors.BadInventoryFormat:
2234
                    pass
2235
        # raise if there was no inventory, or if we read the wrong inventory.
2236
        raise errors.NoSuchRevisionInTree(self, revision_id)
2237
2238
    @needs_read_lock
2239
    def annotate_iter(self, file_id, default_revision=CURRENT_REVISION):
2240
        """See Tree.annotate_iter
2241
2242
        This implementation will use the basis tree implementation if possible.
2243
        Lines not in the basis are attributed to CURRENT_REVISION
2244
2245
        If there are pending merges, lines added by those merges will be
2246
        incorrectly attributed to CURRENT_REVISION (but after committing, the
2247
        attribution will be correct).
2248
        """
2249
        maybe_file_parent_keys = []
2250
        for parent_id in self.get_parent_ids():
2251
            try:
2252
                parent_tree = self.revision_tree(parent_id)
2253
            except errors.NoSuchRevisionInTree:
2254
                parent_tree = self.branch.repository.revision_tree(parent_id)
2255
            parent_tree.lock_read()
2256
            try:
5967.7.1 by Martin Pool
Deprecate __contains__ on Tree and Inventory
2257
                if not parent_tree.has_id(file_id):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2258
                    continue
2259
                ie = parent_tree.inventory[file_id]
2260
                if ie.kind != 'file':
2261
                    # Note: this is slightly unnecessary, because symlinks and
2262
                    # directories have a "text" which is the empty text, and we
2263
                    # know that won't mess up annotations. But it seems cleaner
2264
                    continue
2265
                parent_text_key = (file_id, ie.revision)
2266
                if parent_text_key not in maybe_file_parent_keys:
2267
                    maybe_file_parent_keys.append(parent_text_key)
2268
            finally:
2269
                parent_tree.unlock()
2270
        graph = _mod_graph.Graph(self.branch.repository.texts)
2271
        heads = graph.heads(maybe_file_parent_keys)
2272
        file_parent_keys = []
2273
        for key in maybe_file_parent_keys:
2274
            if key in heads:
2275
                file_parent_keys.append(key)
2276
2277
        # Now we have the parents of this content
2278
        annotator = self.branch.repository.texts.get_annotator()
2279
        text = self.get_file_text(file_id)
2280
        this_key =(file_id, default_revision)
2281
        annotator.add_special_text(this_key, file_parent_keys, text)
2282
        annotations = [(key[-1], line)
2283
                       for key, line in annotator.annotate_flat(this_key)]
2284
        return annotations
2285
2286
    @needs_read_lock
2287
    def merge_modified(self):
2288
        """Return a dictionary of files modified by a merge.
2289
2290
        The list is initialized by WorkingTree.set_merge_modified, which is
2291
        typically called after we make some automatic updates to the tree
2292
        because of a merge.
2293
2294
        This returns a map of file_id->sha1, containing only files which are
2295
        still in the working inventory and have that text hash.
2296
        """
2297
        try:
2298
            hashfile = self._transport.get('merge-hashes')
2299
        except errors.NoSuchFile:
2300
            return {}
2301
        try:
2302
            merge_hashes = {}
2303
            try:
2304
                if hashfile.next() != MERGE_MODIFIED_HEADER_1 + '\n':
2305
                    raise errors.MergeModifiedFormatError()
2306
            except StopIteration:
2307
                raise errors.MergeModifiedFormatError()
2308
            for s in _mod_rio.RioReader(hashfile):
2309
                # RioReader reads in Unicode, so convert file_ids back to utf8
2310
                file_id = osutils.safe_file_id(s.get("file_id"), warn=False)
5967.7.1 by Martin Pool
Deprecate __contains__ on Tree and Inventory
2311
                if not self.inventory.has_id(file_id):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2312
                    continue
2313
                text_hash = s.get("hash")
2314
                if text_hash == self.get_file_sha1(file_id):
2315
                    merge_hashes[file_id] = text_hash
2316
            return merge_hashes
2317
        finally:
2318
            hashfile.close()
2319
2320
    @needs_write_lock
2321
    def subsume(self, other_tree):
2322
        def add_children(inventory, entry):
2323
            for child_entry in entry.children.values():
2324
                inventory._byid[child_entry.file_id] = child_entry
2325
                if child_entry.kind == 'directory':
2326
                    add_children(inventory, child_entry)
2327
        if other_tree.get_root_id() == self.get_root_id():
2328
            raise errors.BadSubsumeSource(self, other_tree,
2329
                                          'Trees have the same root')
2330
        try:
2331
            other_tree_path = self.relpath(other_tree.basedir)
2332
        except errors.PathNotChild:
2333
            raise errors.BadSubsumeSource(self, other_tree,
2334
                'Tree is not contained by the other')
2335
        new_root_parent = self.path2id(osutils.dirname(other_tree_path))
2336
        if new_root_parent is None:
2337
            raise errors.BadSubsumeSource(self, other_tree,
2338
                'Parent directory is not versioned.')
2339
        # We need to ensure that the result of a fetch will have a
2340
        # versionedfile for the other_tree root, and only fetching into
2341
        # RepositoryKnit2 guarantees that.
2342
        if not self.branch.repository.supports_rich_root():
2343
            raise errors.SubsumeTargetNeedsUpgrade(other_tree)
2344
        other_tree.lock_tree_write()
2345
        try:
2346
            new_parents = other_tree.get_parent_ids()
2347
            other_root = other_tree.inventory.root
2348
            other_root.parent_id = new_root_parent
2349
            other_root.name = osutils.basename(other_tree_path)
2350
            self.inventory.add(other_root)
2351
            add_children(self.inventory, other_root)
2352
            self._write_inventory(self.inventory)
2353
            # normally we don't want to fetch whole repositories, but i think
2354
            # here we really do want to consolidate the whole thing.
2355
            for parent_id in other_tree.get_parent_ids():
2356
                self.branch.fetch(other_tree.branch, parent_id)
2357
                self.add_parent_tree_id(parent_id)
2358
        finally:
2359
            other_tree.unlock()
2360
        other_tree.bzrdir.retire_bzrdir()
2361
2362
    @needs_tree_write_lock
2363
    def extract(self, file_id, format=None):
2364
        """Extract a subtree from this tree.
2365
2366
        A new branch will be created, relative to the path for this tree.
2367
        """
2368
        self.flush()
2369
        def mkdirs(path):
2370
            segments = osutils.splitpath(path)
2371
            transport = self.branch.bzrdir.root_transport
2372
            for name in segments:
2373
                transport = transport.clone(name)
2374
                transport.ensure_base()
2375
            return transport
2376
2377
        sub_path = self.id2path(file_id)
2378
        branch_transport = mkdirs(sub_path)
2379
        if format is None:
2380
            format = self.bzrdir.cloning_metadir()
2381
        branch_transport.ensure_base()
2382
        branch_bzrdir = format.initialize_on_transport(branch_transport)
2383
        try:
2384
            repo = branch_bzrdir.find_repository()
2385
        except errors.NoRepositoryPresent:
2386
            repo = branch_bzrdir.create_repository()
2387
        if not repo.supports_rich_root():
2388
            raise errors.RootNotRich()
2389
        new_branch = branch_bzrdir.create_branch()
2390
        new_branch.pull(self.branch)
2391
        for parent_id in self.get_parent_ids():
2392
            new_branch.fetch(self.branch, parent_id)
2393
        tree_transport = self.bzrdir.root_transport.clone(sub_path)
2394
        if tree_transport.base != branch_transport.base:
2395
            tree_bzrdir = format.initialize_on_transport(tree_transport)
2396
            branch.BranchReferenceFormat().initialize(tree_bzrdir,
2397
                target_branch=new_branch)
2398
        else:
2399
            tree_bzrdir = branch_bzrdir
2400
        wt = tree_bzrdir.create_workingtree(_mod_revision.NULL_REVISION)
2401
        wt.set_parent_ids(self.get_parent_ids())
2402
        my_inv = self.inventory
2403
        child_inv = inventory.Inventory(root_id=None)
2404
        new_root = my_inv[file_id]
2405
        my_inv.remove_recursive_id(file_id)
2406
        new_root.parent_id = None
2407
        child_inv.add(new_root)
2408
        self._write_inventory(my_inv)
2409
        wt._write_inventory(child_inv)
2410
        return wt
2411
2412
    def list_files(self, include_root=False, from_dir=None, recursive=True):
2413
        """List all files as (path, class, kind, id, entry).
2414
2415
        Lists, but does not descend into unversioned directories.
2416
        This does not include files that have been deleted in this
2417
        tree. Skips the control directory.
2418
2419
        :param include_root: if True, return an entry for the root
2420
        :param from_dir: start from this directory or None for the root
2421
        :param recursive: whether to recurse into subdirectories or not
2422
        """
2423
        # list_files is an iterator, so @needs_read_lock doesn't work properly
2424
        # with it. So callers should be careful to always read_lock the tree.
2425
        if not self.is_locked():
2426
            raise errors.ObjectNotLocked(self)
2427
2428
        inv = self.inventory
2429
        if from_dir is None and include_root is True:
2430
            yield ('', 'V', 'directory', inv.root.file_id, inv.root)
2431
        # Convert these into local objects to save lookup times
2432
        pathjoin = osutils.pathjoin
2433
        file_kind = self._kind
2434
2435
        # transport.base ends in a slash, we want the piece
2436
        # between the last two slashes
2437
        transport_base_dir = self.bzrdir.transport.base.rsplit('/', 2)[1]
2438
2439
        fk_entries = {'directory':TreeDirectory, 'file':TreeFile, 'symlink':TreeLink}
2440
2441
        # directory file_id, relative path, absolute path, reverse sorted children
2442
        if from_dir is not None:
2443
            from_dir_id = inv.path2id(from_dir)
2444
            if from_dir_id is None:
2445
                # Directory not versioned
2446
                return
2447
            from_dir_abspath = pathjoin(self.basedir, from_dir)
2448
        else:
2449
            from_dir_id = inv.root.file_id
2450
            from_dir_abspath = self.basedir
2451
        children = os.listdir(from_dir_abspath)
2452
        children.sort()
2453
        # jam 20060527 The kernel sized tree seems equivalent whether we
2454
        # use a deque and popleft to keep them sorted, or if we use a plain
2455
        # list and just reverse() them.
2456
        children = collections.deque(children)
2457
        stack = [(from_dir_id, u'', from_dir_abspath, children)]
2458
        while stack:
2459
            from_dir_id, from_dir_relpath, from_dir_abspath, children = stack[-1]
2460
2461
            while children:
2462
                f = children.popleft()
2463
                ## TODO: If we find a subdirectory with its own .bzr
2464
                ## directory, then that is a separate tree and we
2465
                ## should exclude it.
2466
2467
                # the bzrdir for this tree
2468
                if transport_base_dir == f:
2469
                    continue
2470
2471
                # we know that from_dir_relpath and from_dir_abspath never end in a slash
2472
                # and 'f' doesn't begin with one, we can do a string op, rather
2473
                # than the checks of pathjoin(), all relative paths will have an extra slash
2474
                # at the beginning
2475
                fp = from_dir_relpath + '/' + f
2476
2477
                # absolute path
2478
                fap = from_dir_abspath + '/' + f
2479
2480
                dir_ie = inv[from_dir_id]
2481
                if dir_ie.kind == 'directory':
2482
                    f_ie = dir_ie.children.get(f)
2483
                else:
2484
                    f_ie = None
2485
                if f_ie:
2486
                    c = 'V'
2487
                elif self.is_ignored(fp[1:]):
2488
                    c = 'I'
2489
                else:
2490
                    # we may not have found this file, because of a unicode
2491
                    # issue, or because the directory was actually a symlink.
2492
                    f_norm, can_access = osutils.normalized_filename(f)
2493
                    if f == f_norm or not can_access:
2494
                        # No change, so treat this file normally
2495
                        c = '?'
2496
                    else:
2497
                        # this file can be accessed by a normalized path
2498
                        # check again if it is versioned
2499
                        # these lines are repeated here for performance
2500
                        f = f_norm
2501
                        fp = from_dir_relpath + '/' + f
2502
                        fap = from_dir_abspath + '/' + f
2503
                        f_ie = inv.get_child(from_dir_id, f)
2504
                        if f_ie:
2505
                            c = 'V'
2506
                        elif self.is_ignored(fp[1:]):
2507
                            c = 'I'
2508
                        else:
2509
                            c = '?'
2510
2511
                fk = file_kind(fap)
2512
2513
                # make a last minute entry
2514
                if f_ie:
2515
                    yield fp[1:], c, fk, f_ie.file_id, f_ie
2516
                else:
2517
                    try:
2518
                        yield fp[1:], c, fk, None, fk_entries[fk]()
2519
                    except KeyError:
2520
                        yield fp[1:], c, fk, None, TreeEntry()
2521
                    continue
2522
2523
                if fk != 'directory':
2524
                    continue
2525
2526
                # But do this child first if recursing down
2527
                if recursive:
2528
                    new_children = os.listdir(fap)
2529
                    new_children.sort()
2530
                    new_children = collections.deque(new_children)
2531
                    stack.append((f_ie.file_id, fp, fap, new_children))
2532
                    # Break out of inner loop,
2533
                    # so that we start outer loop with child
2534
                    break
2535
            else:
2536
                # if we finished all children, pop it off the stack
2537
                stack.pop()
2538
2539
    @needs_tree_write_lock
2540
    def move(self, from_paths, to_dir=None, after=False):
2541
        """Rename files.
2542
2543
        to_dir must exist in the inventory.
2544
2545
        If to_dir exists and is a directory, the files are moved into
2546
        it, keeping their old names.
2547
2548
        Note that to_dir is only the last component of the new name;
2549
        this doesn't change the directory.
2550
2551
        For each entry in from_paths the move mode will be determined
2552
        independently.
2553
2554
        The first mode moves the file in the filesystem and updates the
2555
        inventory. The second mode only updates the inventory without
2556
        touching the file on the filesystem.
2557
5911.1.4 by Benoît Pierre
Update docstrings for WorkingTree.move() and WorkingTree.rename_one().
2558
        move uses the second mode if 'after == True' and the target is
2559
        either not versioned or newly added, and present in the working tree.
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2560
2561
        move uses the second mode if 'after == False' and the source is
2562
        versioned but no longer in the working tree, and the target is not
2563
        versioned but present in the working tree.
2564
2565
        move uses the first mode if 'after == False' and the source is
2566
        versioned and present in the working tree, and the target is not
2567
        versioned and not present in the working tree.
2568
2569
        Everything else results in an error.
2570
2571
        This returns a list of (from_path, to_path) pairs for each
2572
        entry that is moved.
2573
        """
2574
        rename_entries = []
2575
        rename_tuples = []
2576
2577
        # check for deprecated use of signature
2578
        if to_dir is None:
2579
            raise TypeError('You must supply a target directory')
2580
        # check destination directory
2581
        if isinstance(from_paths, basestring):
2582
            raise ValueError()
2583
        inv = self.inventory
2584
        to_abs = self.abspath(to_dir)
2585
        if not isdir(to_abs):
2586
            raise errors.BzrMoveFailedError('',to_dir,
2587
                errors.NotADirectory(to_abs))
2588
        if not self.has_filename(to_dir):
2589
            raise errors.BzrMoveFailedError('',to_dir,
2590
                errors.NotInWorkingDirectory(to_dir))
2591
        to_dir_id = inv.path2id(to_dir)
2592
        if to_dir_id is None:
2593
            raise errors.BzrMoveFailedError('',to_dir,
2594
                errors.NotVersionedError(path=to_dir))
2595
2596
        to_dir_ie = inv[to_dir_id]
2597
        if to_dir_ie.kind != 'directory':
2598
            raise errors.BzrMoveFailedError('',to_dir,
2599
                errors.NotADirectory(to_abs))
2600
2601
        # create rename entries and tuples
2602
        for from_rel in from_paths:
2603
            from_tail = splitpath(from_rel)[-1]
2604
            from_id = inv.path2id(from_rel)
2605
            if from_id is None:
2606
                raise errors.BzrMoveFailedError(from_rel,to_dir,
2607
                    errors.NotVersionedError(path=from_rel))
2608
2609
            from_entry = inv[from_id]
2610
            from_parent_id = from_entry.parent_id
2611
            to_rel = pathjoin(to_dir, from_tail)
2612
            rename_entry = InventoryWorkingTree._RenameEntry(
2613
                from_rel=from_rel,
2614
                from_id=from_id,
2615
                from_tail=from_tail,
2616
                from_parent_id=from_parent_id,
2617
                to_rel=to_rel, to_tail=from_tail,
2618
                to_parent_id=to_dir_id)
2619
            rename_entries.append(rename_entry)
2620
            rename_tuples.append((from_rel, to_rel))
2621
2622
        # determine which move mode to use. checks also for movability
2623
        rename_entries = self._determine_mv_mode(rename_entries, after)
2624
2625
        original_modified = self._inventory_is_modified
2626
        try:
2627
            if len(from_paths):
2628
                self._inventory_is_modified = True
2629
            self._move(rename_entries)
2630
        except:
2631
            # restore the inventory on error
2632
            self._inventory_is_modified = original_modified
2633
            raise
2634
        self._write_inventory(inv)
2635
        return rename_tuples
2636
2637
    @needs_tree_write_lock
2638
    def rename_one(self, from_rel, to_rel, after=False):
2639
        """Rename one file.
2640
2641
        This can change the directory or the filename or both.
2642
2643
        rename_one has several 'modes' to work. First, it can rename a physical
2644
        file and change the file_id. That is the normal mode. Second, it can
2645
        only change the file_id without touching any physical file.
2646
2647
        rename_one uses the second mode if 'after == True' and 'to_rel' is not
2648
        versioned but present in the working tree.
2649
2650
        rename_one uses the second mode if 'after == False' and 'from_rel' is
2651
        versioned but no longer in the working tree, and 'to_rel' is not
2652
        versioned but present in the working tree.
2653
2654
        rename_one uses the first mode if 'after == False' and 'from_rel' is
2655
        versioned and present in the working tree, and 'to_rel' is not
2656
        versioned and not present in the working tree.
2657
2658
        Everything else results in an error.
2659
        """
2660
        inv = self.inventory
2661
        rename_entries = []
2662
2663
        # create rename entries and tuples
2664
        from_tail = splitpath(from_rel)[-1]
2665
        from_id = inv.path2id(from_rel)
2666
        if from_id is None:
2667
            # if file is missing in the inventory maybe it's in the basis_tree
2668
            basis_tree = self.branch.basis_tree()
2669
            from_id = basis_tree.path2id(from_rel)
2670
            if from_id is None:
2671
                raise errors.BzrRenameFailedError(from_rel,to_rel,
2672
                    errors.NotVersionedError(path=from_rel))
2673
            # put entry back in the inventory so we can rename it
2674
            from_entry = basis_tree.inventory[from_id].copy()
2675
            inv.add(from_entry)
2676
        else:
2677
            from_entry = inv[from_id]
2678
        from_parent_id = from_entry.parent_id
2679
        to_dir, to_tail = os.path.split(to_rel)
2680
        to_dir_id = inv.path2id(to_dir)
2681
        rename_entry = InventoryWorkingTree._RenameEntry(from_rel=from_rel,
2682
                                     from_id=from_id,
2683
                                     from_tail=from_tail,
2684
                                     from_parent_id=from_parent_id,
2685
                                     to_rel=to_rel, to_tail=to_tail,
2686
                                     to_parent_id=to_dir_id)
2687
        rename_entries.append(rename_entry)
2688
2689
        # determine which move mode to use. checks also for movability
2690
        rename_entries = self._determine_mv_mode(rename_entries, after)
2691
2692
        # check if the target changed directory and if the target directory is
2693
        # versioned
2694
        if to_dir_id is None:
2695
            raise errors.BzrMoveFailedError(from_rel,to_rel,
2696
                errors.NotVersionedError(path=to_dir))
2697
2698
        # all checks done. now we can continue with our actual work
2699
        mutter('rename_one:\n'
2700
               '  from_id   {%s}\n'
2701
               '  from_rel: %r\n'
2702
               '  to_rel:   %r\n'
2703
               '  to_dir    %r\n'
2704
               '  to_dir_id {%s}\n',
2705
               from_id, from_rel, to_rel, to_dir, to_dir_id)
2706
2707
        self._move(rename_entries)
2708
        self._write_inventory(inv)
2709
2710
    class _RenameEntry(object):
2711
        def __init__(self, from_rel, from_id, from_tail, from_parent_id,
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2712
                     to_rel, to_tail, to_parent_id, only_change_inv=False,
2713
                     change_id=False):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2714
            self.from_rel = from_rel
2715
            self.from_id = from_id
2716
            self.from_tail = from_tail
2717
            self.from_parent_id = from_parent_id
2718
            self.to_rel = to_rel
2719
            self.to_tail = to_tail
2720
            self.to_parent_id = to_parent_id
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2721
            self.change_id = change_id
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2722
            self.only_change_inv = only_change_inv
2723
2724
    def _determine_mv_mode(self, rename_entries, after=False):
2725
        """Determines for each from-to pair if both inventory and working tree
2726
        or only the inventory has to be changed.
2727
2728
        Also does basic plausability tests.
2729
        """
2730
        inv = self.inventory
2731
2732
        for rename_entry in rename_entries:
2733
            # store to local variables for easier reference
2734
            from_rel = rename_entry.from_rel
2735
            from_id = rename_entry.from_id
2736
            to_rel = rename_entry.to_rel
2737
            to_id = inv.path2id(to_rel)
2738
            only_change_inv = False
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2739
            change_id = False
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2740
2741
            # check the inventory for source and destination
2742
            if from_id is None:
2743
                raise errors.BzrMoveFailedError(from_rel,to_rel,
2744
                    errors.NotVersionedError(path=from_rel))
2745
            if to_id is not None:
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2746
                allowed = False
5911.1.3 by Benoît Pierre
Unlock on errors as per Vincent Ladeuil recommendation.
2747
                # allow it with --after but only if dest is newly added
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2748
                if after:
2749
                    basis = self.basis_tree()
2750
                    basis.lock_read()
5911.1.3 by Benoît Pierre
Unlock on errors as per Vincent Ladeuil recommendation.
2751
                    try:
2752
                        if not basis.has_id(to_id):
2753
                            rename_entry.change_id = True
2754
                            allowed = True
2755
                    finally:
2756
                        basis.unlock()
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2757
                if not allowed:
2758
                    raise errors.BzrMoveFailedError(from_rel,to_rel,
2759
                        errors.AlreadyVersionedError(path=to_rel))
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2760
2761
            # try to determine the mode for rename (only change inv or change
2762
            # inv and file system)
2763
            if after:
2764
                if not self.has_filename(to_rel):
2765
                    raise errors.BzrMoveFailedError(from_id,to_rel,
2766
                        errors.NoSuchFile(path=to_rel,
2767
                        extra="New file has not been created yet"))
2768
                only_change_inv = True
2769
            elif not self.has_filename(from_rel) and self.has_filename(to_rel):
2770
                only_change_inv = True
2771
            elif self.has_filename(from_rel) and not self.has_filename(to_rel):
2772
                only_change_inv = False
2773
            elif (not self.case_sensitive
2774
                  and from_rel.lower() == to_rel.lower()
2775
                  and self.has_filename(from_rel)):
2776
                only_change_inv = False
2777
            else:
2778
                # something is wrong, so lets determine what exactly
2779
                if not self.has_filename(from_rel) and \
2780
                   not self.has_filename(to_rel):
2781
                    raise errors.BzrRenameFailedError(from_rel,to_rel,
2782
                        errors.PathsDoNotExist(paths=(str(from_rel),
2783
                        str(to_rel))))
2784
                else:
2785
                    raise errors.RenameFailedFilesExist(from_rel, to_rel)
2786
            rename_entry.only_change_inv = only_change_inv
2787
        return rename_entries
2788
2789
    def _move(self, rename_entries):
2790
        """Moves a list of files.
2791
2792
        Depending on the value of the flag 'only_change_inv', the
2793
        file will be moved on the file system or not.
2794
        """
2795
        inv = self.inventory
2796
        moved = []
2797
2798
        for entry in rename_entries:
2799
            try:
2800
                self._move_entry(entry)
2801
            except:
2802
                self._rollback_move(moved)
2803
                raise
2804
            moved.append(entry)
2805
2806
    def _rollback_move(self, moved):
2807
        """Try to rollback a previous move in case of an filesystem error."""
2808
        inv = self.inventory
2809
        for entry in moved:
2810
            try:
2811
                self._move_entry(WorkingTree._RenameEntry(
2812
                    entry.to_rel, entry.from_id,
2813
                    entry.to_tail, entry.to_parent_id, entry.from_rel,
2814
                    entry.from_tail, entry.from_parent_id,
2815
                    entry.only_change_inv))
2816
            except errors.BzrMoveFailedError, e:
2817
                raise errors.BzrMoveFailedError( '', '', "Rollback failed."
2818
                        " The working tree is in an inconsistent state."
2819
                        " Please consider doing a 'bzr revert'."
2820
                        " Error message is: %s" % e)
2821
2822
    def _move_entry(self, entry):
2823
        inv = self.inventory
2824
        from_rel_abs = self.abspath(entry.from_rel)
2825
        to_rel_abs = self.abspath(entry.to_rel)
2826
        if from_rel_abs == to_rel_abs:
2827
            raise errors.BzrMoveFailedError(entry.from_rel, entry.to_rel,
2828
                "Source and target are identical.")
2829
2830
        if not entry.only_change_inv:
2831
            try:
2832
                osutils.rename(from_rel_abs, to_rel_abs)
2833
            except OSError, e:
2834
                raise errors.BzrMoveFailedError(entry.from_rel,
2835
                    entry.to_rel, e[1])
5911.1.2 by Benoît Pierre
Implement new 'mv --after' behaviour.
2836
        if entry.change_id:
2837
            to_id = inv.path2id(entry.to_rel)
2838
            inv.remove_recursive_id(to_id)
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2839
        inv.rename(entry.from_id, entry.to_parent_id, entry.to_tail)
2840
2841
    @needs_tree_write_lock
2842
    def unversion(self, file_ids):
2843
        """Remove the file ids in file_ids from the current versioned set.
2844
2845
        When a file_id is unversioned, all of its children are automatically
2846
        unversioned.
2847
2848
        :param file_ids: The file ids to stop versioning.
2849
        :raises: NoSuchId if any fileid is not currently versioned.
2850
        """
2851
        for file_id in file_ids:
5967.7.1 by Martin Pool
Deprecate __contains__ on Tree and Inventory
2852
            if not self._inventory.has_id(file_id):
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2853
                raise errors.NoSuchId(self, file_id)
2854
        for file_id in file_ids:
2855
            if self._inventory.has_id(file_id):
2856
                self._inventory.remove_recursive_id(file_id)
2857
        if len(file_ids):
2858
            # in the future this should just set a dirty bit to wait for the
2859
            # final unlock. However, until all methods of workingtree start
2860
            # with the current in -memory inventory rather than triggering
2861
            # a read, it is more complex - we need to teach read_inventory
2862
            # to know when to read, and when to not read first... and possibly
2863
            # to save first when the in memory one may be corrupted.
2864
            # so for now, we just only write it if it is indeed dirty.
2865
            # - RBC 20060907
2866
            self._write_inventory(self._inventory)
2867
2868
    def stored_kind(self, file_id):
2869
        """See Tree.stored_kind"""
2870
        return self.inventory[file_id].kind
2871
2872
    def extras(self):
2873
        """Yield all unversioned files in this WorkingTree.
2874
2875
        If there are any unversioned directories then only the directory is
2876
        returned, not all its children.  But if there are unversioned files
2877
        under a versioned subdirectory, they are returned.
2878
2879
        Currently returned depth-first, sorted by name within directories.
2880
        This is the same order used by 'osutils.walkdirs'.
2881
        """
2882
        ## TODO: Work from given directory downwards
2883
        for path, dir_entry in self.inventory.directories():
2884
            # mutter("search for unknowns in %r", path)
2885
            dirabs = self.abspath(path)
2886
            if not isdir(dirabs):
2887
                # e.g. directory deleted
2888
                continue
2889
2890
            fl = []
2891
            for subf in os.listdir(dirabs):
2892
                if self.bzrdir.is_control_filename(subf):
2893
                    continue
2894
                if subf not in dir_entry.children:
2895
                    try:
2896
                        (subf_norm,
2897
                         can_access) = osutils.normalized_filename(subf)
2898
                    except UnicodeDecodeError:
2899
                        path_os_enc = path.encode(osutils._fs_enc)
2900
                        relpath = path_os_enc + '/' + subf
2901
                        raise errors.BadFilenameEncoding(relpath,
2902
                                                         osutils._fs_enc)
2903
                    if subf_norm != subf and can_access:
2904
                        if subf_norm not in dir_entry.children:
2905
                            fl.append(subf_norm)
2906
                    else:
2907
                        fl.append(subf)
2908
2909
            fl.sort()
2910
            for subf in fl:
2911
                subp = pathjoin(path, subf)
2912
                yield subp
2913
2914
    def _walkdirs(self, prefix=""):
2915
        """Walk the directories of this tree.
2916
5891.1.2 by Andrew Bennetts
Fix a bunch of docstring formatting nits, making pydoctor a bit happier.
2917
        :param prefix: is used as the directrory to start with.
2918
        :returns: a generator which yields items in the form::
2919
2920
            ((curren_directory_path, fileid),
2921
             [(file1_path, file1_name, file1_kind, None, file1_id,
2922
               file1_kind), ... ])
5777.5.2 by Jelmer Vernooij
Split inventory-specific methods and WorkingTree interface method
2923
        """
2924
        _directory = 'directory'
2925
        # get the root in the inventory
2926
        inv = self.inventory
2927
        top_id = inv.path2id(prefix)
2928
        if top_id is None:
2929
            pending = []
2930
        else:
2931
            pending = [(prefix, '', _directory, None, top_id, None)]
2932
        while pending:
2933
            dirblock = []
2934
            currentdir = pending.pop()
2935
            # 0 - relpath, 1- basename, 2- kind, 3- stat, 4-id, 5-kind
2936
            top_id = currentdir[4]
2937
            if currentdir[0]:
2938
                relroot = currentdir[0] + '/'
2939
            else:
2940
                relroot = ""
2941
            # FIXME: stash the node in pending
2942
            entry = inv[top_id]
2943
            if entry.kind == 'directory':
2944
                for name, child in entry.sorted_children():
2945
                    dirblock.append((relroot + name, name, child.kind, None,
2946
                        child.file_id, child.kind
2947
                        ))
2948
            yield (currentdir[0], entry.file_id), dirblock
2949
            # push the user specified dirs from dirblock
2950
            for dir in reversed(dirblock):
2951
                if dir[2] == _directory:
2952
                    pending.append(dir)
2953
2954
5669.3.9 by Jelmer Vernooij
Consistent naming.
2955
class WorkingTreeFormatRegistry(controldir.ControlComponentFormatRegistry):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
2956
    """Registry for working tree formats."""
2957
2958
    def __init__(self, other_registry=None):
2959
        super(WorkingTreeFormatRegistry, self).__init__(other_registry)
2960
        self._default_format = None
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2961
        self._default_format_key = None
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
2962
2963
    def get_default(self):
2964
        """Return the current default format."""
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2965
        if (self._default_format_key is not None and
2966
            self._default_format is None):
2967
            self._default_format = self.get(self._default_format_key)
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
2968
        return self._default_format
2969
2970
    def set_default(self, format):
5816.2.3 by Jelmer Vernooij
Add docstrings.
2971
        """Set the default format."""
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
2972
        self._default_format = format
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2973
        self._default_format_key = None
2974
2975
    def set_default_key(self, format_string):
5816.2.3 by Jelmer Vernooij
Add docstrings.
2976
        """Set the default format by its format string."""
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
2977
        self._default_format_key = format_string
2978
        self._default_format = None
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
2979
2980
2981
format_registry = WorkingTreeFormatRegistry()
2982
2983
5669.3.10 by Jelmer Vernooij
Use ControlComponentFormat.
2984
class WorkingTreeFormat(controldir.ControlComponentFormat):
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
2985
    """An encapsulation of the initialization and open routines for a format.
2986
2987
    Formats provide three things:
2988
     * An initialization routine,
2989
     * a format string,
2990
     * an open routine.
2991
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2992
    Formats are placed in an dict by their format string for reference
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
2993
    during workingtree opening. Its not required that these be instances, they
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2994
    can be classes themselves with class methods - it simply depends on
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
2995
    whether state is needed for a given format or not.
2996
2997
    Once a format is deprecated, just deprecate the initialize and open
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
2998
    methods on the format class. Do not deprecate the object, as the
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
2999
    object will be created every time regardless.
3000
    """
3001
2100.3.14 by Aaron Bentley
Test workingtree4 format, prevent use with old repos
3002
    requires_rich_root = False
3003
2323.6.4 by Martin Pool
BzrDir._check_supported now also takes care of recommending upgrades, which
3004
    upgrade_recommended = False
3005
5582.10.29 by Jelmer Vernooij
Add requires_normalized_unicode_filenames
3006
    requires_normalized_unicode_filenames = False
3007
5632.1.1 by John Arbash Meinel
Make case_sensitive_filename an attribute of the format.
3008
    case_sensitive_filename = "FoRMaT"
3009
5661.1.1 by Jelmer Vernooij
Add 'WorkingTreeFormat.missing_parent_conflicts' flag to use in tests.
3010
    missing_parent_conflicts = False
3011
    """If this format supports missing parent conflicts."""
3012
5993.3.1 by Jelmer Vernooij
Add WorkingTreeFormat.supports_versioned_directories attribute.
3013
    supports_versioned_directories = None
3014
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3015
    @classmethod
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
3016
    def find_format_string(klass, a_bzrdir):
3017
        """Return format name for the working tree object in a_bzrdir."""
3018
        try:
3019
            transport = a_bzrdir.get_workingtree_transport(None)
3020
            return transport.get_bytes("format")
3021
        except errors.NoSuchFile:
3022
            raise errors.NoWorkingTree(base=transport.base)
3023
3024
    @classmethod
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3025
    def find_format(klass, a_bzrdir):
3026
        """Return the format for the working tree object in a_bzrdir."""
3027
        try:
5816.3.3 by Jelmer Vernooij
Add tariff test to make sure working tree isn't opened by 'bzr serve'
3028
            format_string = klass.find_format_string(a_bzrdir)
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3029
            return format_registry.get(format_string)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3030
        except KeyError:
3246.3.2 by Daniel Watkins
Modified uses of errors.UnknownFormatError.
3031
            raise errors.UnknownFormatError(format=format_string,
3032
                                            kind="working tree")
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3033
5683.1.1 by Jelmer Vernooij
Add stub WorkingTreeFormat.initialize().
3034
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
3035
                   accelerator_tree=None, hardlink=False):
3036
        """Initialize a new working tree in a_bzrdir.
3037
3038
        :param a_bzrdir: BzrDir to initialize the working tree in.
3039
        :param revision_id: allows creating a working tree at a different
3040
            revision than the branch is at.
3041
        :param from_branch: Branch to checkout
3042
        :param accelerator_tree: A tree which can be used for retrieving file
3043
            contents more quickly than the revision tree, i.e. a workingtree.
3044
            The revision tree will be used for cases where accelerator_tree's
3045
            content is different.
3046
        :param hardlink: If true, hard-link files from accelerator_tree,
3047
            where possible.
3048
        """
3049
        raise NotImplementedError(self.initialize)
3050
2100.3.35 by Aaron Bentley
equality operations on bzrdir
3051
    def __eq__(self, other):
3052
        return self.__class__ is other.__class__
3053
3054
    def __ne__(self, other):
3055
        return not (self == other)
3056
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3057
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3058
    @symbol_versioning.deprecated_method(
3059
        symbol_versioning.deprecated_in((2, 4, 0)))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3060
    def get_default_format(klass):
3061
        """Return the current default format."""
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3062
        return format_registry.get_default()
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3063
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
3064
    def get_format_string(self):
3065
        """Return the ASCII format string that identifies this format."""
3066
        raise NotImplementedError(self.get_format_string)
3067
1624.3.19 by Olaf Conradi
New call get_format_description to give a user-friendly description of a
3068
    def get_format_description(self):
3069
        """Return the short description for this format."""
3070
        raise NotImplementedError(self.get_format_description)
3071
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3072
    def is_supported(self):
3073
        """Is this format supported?
3074
3075
        Supported formats can be initialized and opened.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
3076
        Unsupported formats may not support initialization or committing or
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3077
        some other features depending on the reason for not being supported.
3078
        """
3079
        return True
3080
3907.2.1 by Ian Clatworthy
WorkingTreeFormat5 supporting content filtering and views
3081
    def supports_content_filtering(self):
3082
        """True if this format supports content filtering."""
3083
        return False
3084
3586.1.4 by Ian Clatworthy
first cut at tree-level view tests
3085
    def supports_views(self):
3086
        """True if this format supports stored views."""
3087
        return False
3088
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3089
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3090
    @symbol_versioning.deprecated_method(
3091
        symbol_versioning.deprecated_in((2, 4, 0)))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3092
    def register_format(klass, format):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3093
        format_registry.register(format)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3094
3095
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3096
    @symbol_versioning.deprecated_method(
3097
        symbol_versioning.deprecated_in((2, 4, 0)))
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3098
    def register_extra_format(klass, format):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3099
        format_registry.register_extra(format)
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3100
3101
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3102
    @symbol_versioning.deprecated_method(
3103
        symbol_versioning.deprecated_in((2, 4, 0)))
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3104
    def unregister_extra_format(klass, format):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3105
        format_registry.unregister_extra(format)
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3106
3107
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3108
    @symbol_versioning.deprecated_method(
3109
        symbol_versioning.deprecated_in((2, 4, 0)))
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3110
    def get_formats(klass):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3111
        return format_registry._get_all()
5642.2.3 by Jelmer Vernooij
Add WorkingTreeFormat.register_extra_format and friends.
3112
3113
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3114
    @symbol_versioning.deprecated_method(
3115
        symbol_versioning.deprecated_in((2, 4, 0)))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3116
    def set_default_format(klass, format):
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3117
        format_registry.set_default(format)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3118
3119
    @classmethod
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3120
    @symbol_versioning.deprecated_method(
3121
        symbol_versioning.deprecated_in((2, 4, 0)))
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3122
    def unregister_format(klass, format):
5662.3.3 by Jelmer Vernooij
add tests
3123
        format_registry.remove(format)
1534.4.46 by Robert Collins
Nearly complete .bzr/checkout splitout.
3124
1534.4.45 by Robert Collins
Start WorkingTree -> .bzr/checkout transition
3125
5662.3.1 by Jelmer Vernooij
Add WorkingTreeFormatRegistry.
3126
format_registry.register_lazy("Bazaar Working Tree Format 4 (bzr 0.15)\n",
3127
    "bzrlib.workingtree_4", "WorkingTreeFormat4")
3128
format_registry.register_lazy("Bazaar Working Tree Format 5 (bzr 1.11)\n",
3129
    "bzrlib.workingtree_4", "WorkingTreeFormat5")
3130
format_registry.register_lazy("Bazaar Working Tree Format 6 (bzr 1.14)\n",
3131
    "bzrlib.workingtree_4", "WorkingTreeFormat6")
5816.5.1 by Jelmer Vernooij
Move WorkingTree3 to bzrlib.workingtree_3.
3132
format_registry.register_lazy("Bazaar-NG Working Tree format 3",
3133
    "bzrlib.workingtree_3", "WorkingTreeFormat3")
5816.2.1 by Jelmer Vernooij
Allow lazily setting default for working trees.
3134
format_registry.set_default_key("Bazaar Working Tree Format 6 (bzr 1.14)\n")