/brz/remove-bazaar

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