/brz/remove-bazaar

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