bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
4325.3.1
by Johan Walles
 Don't reinvent osutils.minimum_path_selection().  | 
1  | 
# Copyright (C) 2005, 2006, 2007, 2008, 2009 Canonical Ltd
 | 
| 
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.  | 
2  | 
#
 | 
3  | 
# This program is free software; you can redistribute it and/or modify
 | 
|
4  | 
# it under the terms of the GNU General Public License as published by
 | 
|
5  | 
# the Free Software Foundation; either version 2 of the License, or
 | 
|
6  | 
# (at your option) any later version.
 | 
|
7  | 
#
 | 
|
8  | 
# This program is distributed in the hope that it will be useful,
 | 
|
9  | 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|
10  | 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|
11  | 
# GNU General Public License for more details.
 | 
|
12  | 
#
 | 
|
13  | 
# You should have received a copy of the GNU General Public License
 | 
|
14  | 
# along with this program; if not, write to the Free Software
 | 
|
| 
4183.7.1
by Sabin Iacob
 update FSF mailing address  | 
15  | 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
| 
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.  | 
16  | 
|
17  | 
"""WorkingTree4 format and implementation.
 | 
|
18  | 
||
19  | 
WorkingTree4 provides the dirstate based working tree logic.
 | 
|
20  | 
||
21  | 
To get a WorkingTree, call bzrdir.open_workingtree() or
 | 
|
22  | 
WorkingTree.open(dir).
 | 
|
23  | 
"""
 | 
|
24  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
25  | 
from cStringIO import StringIO  | 
| 
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.  | 
26  | 
import os  | 
| 
2255.2.138
by John Arbash Meinel
 implement several new WorkingTree.move() tests  | 
27  | 
import sys  | 
| 
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.  | 
28  | 
|
29  | 
from bzrlib.lazy_import import lazy_import  | 
|
30  | 
lazy_import(globals(), """  | 
|
31  | 
import errno
 | 
|
32  | 
import stat
 | 
|
33  | 
||
34  | 
import bzrlib
 | 
|
35  | 
from bzrlib import (
 | 
|
36  | 
    bzrdir,
 | 
|
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
37  | 
    cache_utf8,
 | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
38  | 
    debug,
 | 
| 
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.  | 
39  | 
    dirstate,
 | 
40  | 
    errors,
 | 
|
41  | 
    generate_ids,
 | 
|
42  | 
    osutils,
 | 
|
| 
2598.5.2
by Aaron Bentley
 Got all tests passing with Branch returning 'null:' for null revision  | 
43  | 
    revision as _mod_revision,
 | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
44  | 
    revisiontree,
 | 
| 
2745.1.2
by Robert Collins
 Ensure mutter_callsite is not directly called on a lazy_load object, to make the stacklevel parameter work correctly.  | 
45  | 
    trace,
 | 
| 
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.  | 
46  | 
    transform,
 | 
| 
3586.2.13
by Ian Clatworthy
 fix wt5 to use views, correcting an earlier merge  | 
47  | 
    views,
 | 
| 
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.  | 
48  | 
    )
 | 
49  | 
import bzrlib.branch
 | 
|
50  | 
import bzrlib.ui
 | 
|
51  | 
""")  | 
|
52  | 
||
53  | 
from bzrlib.decorators import needs_read_lock, needs_write_lock  | 
|
| 
3368.2.53
by Ian Clatworthy
 sha1 calculation done by workingtree layer now  | 
54  | 
from bzrlib.filters import filtered_input_file, internal_size_sha_file_byname  | 
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
55  | 
from bzrlib.inventory import Inventory, ROOT_ID, entry_factory  | 
| 
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.  | 
56  | 
import bzrlib.mutabletree  | 
57  | 
from bzrlib.mutabletree import needs_tree_write_lock  | 
|
58  | 
from bzrlib.osutils import (  | 
|
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
59  | 
file_kind,  | 
| 
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.  | 
60  | 
isdir,  | 
61  | 
pathjoin,  | 
|
62  | 
realpath,  | 
|
63  | 
safe_unicode,  | 
|
64  | 
    )
 | 
|
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
65  | 
from bzrlib.trace import mutter  | 
| 
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.  | 
66  | 
from bzrlib.transport.local import LocalTransport  | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
67  | 
from bzrlib.tree import InterTree  | 
| 
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.  | 
68  | 
from bzrlib.tree import Tree  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
69  | 
from bzrlib.workingtree import WorkingTree, WorkingTree3, WorkingTreeFormat3  | 
| 
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.  | 
70  | 
|
71  | 
||
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
72  | 
class DirStateWorkingTree(WorkingTree3):  | 
| 
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.  | 
73  | 
def __init__(self, basedir,  | 
74  | 
branch,  | 
|
75  | 
_control_files=None,  | 
|
76  | 
_format=None,  | 
|
77  | 
_bzrdir=None):  | 
|
78  | 
"""Construct a WorkingTree for basedir.  | 
|
79  | 
||
80  | 
        If the branch is not supplied, it is opened automatically.
 | 
|
81  | 
        If the branch is supplied, it must be the branch for this basedir.
 | 
|
82  | 
        (branch.base is not cross checked, because for remote branches that
 | 
|
83  | 
        would be meaningless).
 | 
|
84  | 
        """
 | 
|
85  | 
self._format = _format  | 
|
86  | 
self.bzrdir = _bzrdir  | 
|
87  | 
basedir = safe_unicode(basedir)  | 
|
88  | 
mutter("opening working tree %r", basedir)  | 
|
89  | 
self._branch = branch  | 
|
90  | 
self.basedir = realpath(basedir)  | 
|
91  | 
        # if branch is at our basedir and is a format 6 or less
 | 
|
92  | 
        # assume all other formats have their own control files.
 | 
|
93  | 
self._control_files = _control_files  | 
|
| 
3407.2.1
by Martin Pool
 Deprecate LockableFiles.get  | 
94  | 
self._transport = self._control_files._transport  | 
| 
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.  | 
95  | 
self._dirty = None  | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
96  | 
        #-------------
 | 
97  | 
        # during a read or write lock these objects are set, and are
 | 
|
98  | 
        # None the rest of the time.
 | 
|
| 
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.  | 
99  | 
self._dirstate = None  | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
100  | 
self._inventory = None  | 
101  | 
        #-------------
 | 
|
| 
2974.2.2
by John Arbash Meinel
 Only one test failed, because it was incorrectly succeeding.  | 
102  | 
self._setup_directory_is_tree_reference()  | 
| 
3034.4.3
by Aaron Bentley
 Add case-sensitivity handling to WorkingTree  | 
103  | 
self._detect_case_handling()  | 
| 
3398.1.24
by Ian Clatworthy
 make iter_search_rules a tree method  | 
104  | 
self._rules_searcher = None  | 
| 
3586.1.4
by Ian Clatworthy
 first cut at tree-level view tests  | 
105  | 
self.views = self._make_views()  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
106  | 
        #--- allow tests to select the dirstate iter_changes implementation
 | 
107  | 
self._iter_changes = dirstate._process_entry  | 
|
| 
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.  | 
108  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
109  | 
    @needs_tree_write_lock
 | 
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
110  | 
def _add(self, files, ids, kinds):  | 
111  | 
"""See MutableTree._add."""  | 
|
112  | 
state = self.current_dirstate()  | 
|
113  | 
for f, file_id, kind in zip(files, ids, kinds):  | 
|
| 
2255.2.14
by Robert Collins
 Dirstate: fix adding of directories to setup the next directories block, and test representation of symlinks. Also fix iter_rows to not reset the dirty bit.  | 
114  | 
f = f.strip('/')  | 
| 
2255.7.74
by Robert Collins
 Test adding of roots to trees, it was broken on WorkingTree4.  | 
115  | 
if self.path2id(f):  | 
116  | 
                # special case tree root handling.
 | 
|
117  | 
if f == '' and self.path2id(f) == ROOT_ID:  | 
|
118  | 
state.set_path_id('', generate_ids.gen_file_id(f))  | 
|
119  | 
                continue
 | 
|
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
120  | 
if file_id is None:  | 
| 
2255.2.20
by Robert Collins
 Bypass irrelevant basis_inventory tests for dirstate.  | 
121  | 
file_id = generate_ids.gen_file_id(f)  | 
| 
2255.2.43
by Robert Collins
 WorkingTree4.add must not require a file to exist to add it when kind etc is given.  | 
122  | 
            # deliberately add the file with no cached stat or sha1
 | 
123  | 
            # - on the first access it will be gathered, and we can
 | 
|
124  | 
            # always change this once tests are all passing.
 | 
|
125  | 
state.add(f, file_id, kind, None, '')  | 
|
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
126  | 
self._make_dirty(reset_inventory=True)  | 
127  | 
||
128  | 
def _make_dirty(self, reset_inventory):  | 
|
129  | 
"""Make the tree state dirty.  | 
|
130  | 
||
131  | 
        :param reset_inventory: True if the cached inventory should be removed
 | 
|
132  | 
            (presuming there is one).
 | 
|
133  | 
        """
 | 
|
| 
2255.2.16
by Robert Collins
 Implement WorkingTreeFormat4._write_inventory for better compatability with existing code, letting more test_test_trees pass, now up to test_tree_with_subdirs_and_all_content_types.  | 
134  | 
self._dirty = True  | 
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
135  | 
if reset_inventory and self._inventory is not None:  | 
136  | 
self._inventory = None  | 
|
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
137  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
138  | 
    @needs_tree_write_lock
 | 
139  | 
def add_reference(self, sub_tree):  | 
|
140  | 
        # use standard implementation, which calls back to self._add
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
141  | 
        #
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
142  | 
        # So we don't store the reference_revision in the working dirstate,
 | 
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
143  | 
        # it's just recorded at the moment of commit.
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
144  | 
self._add_reference(sub_tree)  | 
145  | 
||
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
146  | 
def break_lock(self):  | 
147  | 
"""Break a lock if one is present from another instance.  | 
|
148  | 
||
149  | 
        Uses the ui factory to ask for confirmation if the lock may be from
 | 
|
150  | 
        an active process.
 | 
|
151  | 
||
152  | 
        This will probe the repository for its lock as well.
 | 
|
153  | 
        """
 | 
|
154  | 
        # if the dirstate is locked by an active process, reject the break lock
 | 
|
155  | 
        # call.
 | 
|
156  | 
try:  | 
|
157  | 
if self._dirstate is None:  | 
|
158  | 
clear = True  | 
|
159  | 
else:  | 
|
160  | 
clear = False  | 
|
161  | 
state = self._current_dirstate()  | 
|
162  | 
if state._lock_token is not None:  | 
|
163  | 
                # we already have it locked. sheese, cant break our own lock.
 | 
|
164  | 
raise errors.LockActive(self.basedir)  | 
|
165  | 
else:  | 
|
166  | 
try:  | 
|
167  | 
                    # try for a write lock - need permission to get one anyhow
 | 
|
168  | 
                    # to break locks.
 | 
|
169  | 
state.lock_write()  | 
|
170  | 
except errors.LockContention:  | 
|
171  | 
                    # oslocks fail when a process is still live: fail.
 | 
|
172  | 
                    # TODO: get the locked lockdir info and give to the user to
 | 
|
173  | 
                    # assist in debugging.
 | 
|
174  | 
raise errors.LockActive(self.basedir)  | 
|
175  | 
else:  | 
|
176  | 
state.unlock()  | 
|
177  | 
finally:  | 
|
178  | 
if clear:  | 
|
179  | 
self._dirstate = None  | 
|
180  | 
self._control_files.break_lock()  | 
|
181  | 
self.branch.break_lock()  | 
|
182  | 
||
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
183  | 
def _comparison_data(self, entry, path):  | 
184  | 
kind, executable, stat_value = \  | 
|
185  | 
WorkingTree3._comparison_data(self, entry, path)  | 
|
| 
2255.2.205
by Martin Pool
 factor out WorkingTree4._directory_is_tree_reference  | 
186  | 
        # it looks like a plain directory, but it's really a reference -- see
 | 
187  | 
        # also kind()
 | 
|
| 
4100.2.4
by Aaron Bentley
 More support for not autodetecting tree refs  | 
188  | 
if (self._repo_supports_tree_reference and kind == 'directory'  | 
189  | 
and entry is not None and entry.kind == 'tree-reference'):  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
190  | 
kind = 'tree-reference'  | 
191  | 
return kind, executable, stat_value  | 
|
192  | 
||
| 
2255.7.74
by Robert Collins
 Test adding of roots to trees, it was broken on WorkingTree4.  | 
193  | 
    @needs_write_lock
 | 
194  | 
def commit(self, message=None, revprops=None, *args, **kwargs):  | 
|
195  | 
        # mark the tree as dirty post commit - commit
 | 
|
196  | 
        # can change the current versioned list by doing deletes.
 | 
|
197  | 
result = WorkingTree3.commit(self, message, revprops, *args, **kwargs)  | 
|
198  | 
self._make_dirty(reset_inventory=True)  | 
|
199  | 
return result  | 
|
200  | 
||
| 
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.  | 
201  | 
def current_dirstate(self):  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
202  | 
"""Return the current dirstate object.  | 
| 
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.  | 
203  | 
|
204  | 
        This is not part of the tree interface and only exposed for ease of
 | 
|
205  | 
        testing.
 | 
|
206  | 
||
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
207  | 
        :raises errors.NotWriteLocked: when not in a lock.
 | 
| 
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.  | 
208  | 
        """
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
209  | 
self._must_be_locked()  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
210  | 
return self._current_dirstate()  | 
211  | 
||
212  | 
def _current_dirstate(self):  | 
|
213  | 
"""Internal function that does not check lock status.  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
214  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
215  | 
        This is needed for break_lock which also needs the dirstate.
 | 
216  | 
        """
 | 
|
| 
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.  | 
217  | 
if self._dirstate is not None:  | 
218  | 
return self._dirstate  | 
|
219  | 
local_path = self.bzrdir.get_workingtree_transport(None  | 
|
220  | 
).local_abspath('dirstate')  | 
|
| 
3368.2.4
by Ian Clatworthy
 make content filter lookup a tree responsibility  | 
221  | 
self._dirstate = dirstate.DirState.on_file(local_path,  | 
| 
3368.2.52
by Ian Clatworthy
 merge bzr.dev r4164  | 
222  | 
self._sha1_provider())  | 
| 
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.  | 
223  | 
return self._dirstate  | 
224  | 
||
| 
3368.2.52
by Ian Clatworthy
 merge bzr.dev r4164  | 
225  | 
def _sha1_provider(self):  | 
226  | 
"""A function that returns a SHA1Provider suitable for this tree.  | 
|
227  | 
||
228  | 
        :return: None if content filtering is not supported by this tree.
 | 
|
229  | 
          Otherwise, a SHA1Provider is returned that sha's the canonical
 | 
|
230  | 
          form of files, i.e. after read filters are applied.
 | 
|
231  | 
        """
 | 
|
| 
3368.2.53
by Ian Clatworthy
 sha1 calculation done by workingtree layer now  | 
232  | 
if self.supports_content_filtering():  | 
233  | 
return ContentFilterAwareSHA1Provider(self)  | 
|
234  | 
else:  | 
|
235  | 
return None  | 
|
| 
3368.2.52
by Ian Clatworthy
 merge bzr.dev r4164  | 
236  | 
|
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
237  | 
def filter_unversioned_files(self, paths):  | 
| 
2255.7.62
by Robert Collins
 Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.  | 
238  | 
"""Filter out paths that are versioned.  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
239  | 
|
240  | 
        :return: set of paths.
 | 
|
241  | 
        """
 | 
|
242  | 
        # TODO: make a generic multi-bisect routine roughly that should list
 | 
|
243  | 
        # the paths, then process one half at a time recursively, and feed the
 | 
|
244  | 
        # results of each bisect in further still
 | 
|
245  | 
paths = sorted(paths)  | 
|
246  | 
result = set()  | 
|
| 
2255.2.176
by Martin Pool
 Merge dirstate and some small cleanups  | 
247  | 
state = self.current_dirstate()  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
248  | 
        # TODO we want a paths_to_dirblocks helper I think
 | 
249  | 
for path in paths:  | 
|
250  | 
dirname, basename = os.path.split(path.encode('utf8'))  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
251  | 
_, _, _, path_is_versioned = state._get_block_entry_index(  | 
252  | 
dirname, basename, 0)  | 
|
| 
2255.7.62
by Robert Collins
 Update the Tree.filter_unversioned_files docstring to reflect what the existing implementations actually do, and change the WorkingTree4 implementation to match a newly created test for it.  | 
253  | 
if not path_is_versioned:  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
254  | 
result.add(path)  | 
255  | 
return result  | 
|
256  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
257  | 
def flush(self):  | 
258  | 
"""Write all cached data to disk."""  | 
|
| 
2255.2.39
by Robert Collins
 WorkingTree4: flush can only be used during write locks.  | 
259  | 
if self._control_files._lock_mode != 'w':  | 
260  | 
raise errors.NotWriteLocked(self)  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
261  | 
self.current_dirstate().save()  | 
262  | 
self._inventory = None  | 
|
263  | 
self._dirty = False  | 
|
264  | 
||
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
265  | 
    @needs_tree_write_lock
 | 
266  | 
def _gather_kinds(self, files, kinds):  | 
|
267  | 
"""See MutableTree._gather_kinds."""  | 
|
268  | 
for pos, f in enumerate(files):  | 
|
269  | 
if kinds[pos] is None:  | 
|
270  | 
kinds[pos] = self._kind(f)  | 
|
271  | 
||
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
272  | 
def _generate_inventory(self):  | 
273  | 
"""Create and set self.inventory from the dirstate object.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
274  | 
|
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
275  | 
        This is relatively expensive: we have to walk the entire dirstate.
 | 
276  | 
        Ideally we would not, and can deprecate this function.
 | 
|
277  | 
        """
 | 
|
| 
2255.2.82
by Robert Collins
 various notes about find_ids_across_trees  | 
278  | 
        #: uncomment to trap on inventory requests.
 | 
279  | 
        # import pdb;pdb.set_trace()
 | 
|
| 
2255.2.75
by Robert Collins
 Correct generation of revisiontree inventories to handle out of order parents.  | 
280  | 
state = self.current_dirstate()  | 
281  | 
state._read_dirblocks_if_needed()  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
282  | 
root_key, current_entry = self._get_entry(path='')  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
283  | 
current_id = root_key[2]  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
284  | 
if not (current_entry[0][0] == 'd'): # directory  | 
285  | 
raise AssertionError(current_entry)  | 
|
| 
2255.2.75
by Robert Collins
 Correct generation of revisiontree inventories to handle out of order parents.  | 
286  | 
inv = Inventory(root_id=current_id)  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
287  | 
        # Turn some things into local variables
 | 
288  | 
minikind_to_kind = dirstate.DirState._minikind_to_kind  | 
|
289  | 
factory = entry_factory  | 
|
290  | 
utf8_decode = cache_utf8._utf8_decode  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
291  | 
inv_byid = inv._byid  | 
| 
2255.2.73
by Robert Collins
 50% speedup in the dirstate->inventory conversion logic by caching the parent ids as we walk the tree. Some further work would be to maintain a stack of parents as we know we visit depth first.  | 
292  | 
        # we could do this straight out of the dirstate; it might be fast
 | 
293  | 
        # and should be profiled - RBC 20070216
 | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
294  | 
parent_ies = {'' : inv.root}  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
295  | 
for block in state._dirblocks[1:]: # skip the root  | 
| 
2255.2.77
by Robert Collins
 Tune working inventory generation more: walk the blocks, skipping deleted rows.  | 
296  | 
dirname = block[0]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
297  | 
try:  | 
| 
2255.8.4
by John Arbash Meinel
 Rather than using split hunks, implement a bisect_dirblocks  | 
298  | 
parent_ie = parent_ies[dirname]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
299  | 
except KeyError:  | 
300  | 
                # all the paths in this block are not versioned in this tree
 | 
|
301  | 
                continue
 | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
302  | 
for key, entry in block[1]:  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
303  | 
minikind, link_or_sha1, size, executable, stat = entry[0]  | 
304  | 
if minikind in ('a', 'r'): # absent, relocated  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
305  | 
                    # a parent tree only entry
 | 
306  | 
                    continue
 | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
307  | 
name = key[1]  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
308  | 
name_unicode = utf8_decode(name)[0]  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
309  | 
file_id = key[2]  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
310  | 
kind = minikind_to_kind[minikind]  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
311  | 
inv_entry = factory[kind](file_id, name_unicode,  | 
312  | 
parent_ie.file_id)  | 
|
| 
2255.2.77
by Robert Collins
 Tune working inventory generation more: walk the blocks, skipping deleted rows.  | 
313  | 
if kind == 'file':  | 
| 
2325.3.4
by John Arbash Meinel
 Rather than setting the executable bit for every file, properly create the working inventory to include it.  | 
314  | 
                    # This is only needed on win32, where this is the only way
 | 
315  | 
                    # we know the executable bit.
 | 
|
316  | 
inv_entry.executable = executable  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
317  | 
                    # not strictly needed: working tree
 | 
| 
2325.3.4
by John Arbash Meinel
 Rather than setting the executable bit for every file, properly create the working inventory to include it.  | 
318  | 
                    #inv_entry.text_size = size
 | 
319  | 
                    #inv_entry.text_sha1 = sha1
 | 
|
| 
2255.2.77
by Robert Collins
 Tune working inventory generation more: walk the blocks, skipping deleted rows.  | 
320  | 
elif kind == 'directory':  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
321  | 
                    # add this entry to the parent map.
 | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
322  | 
parent_ies[(dirname + '/' + name).strip('/')] = inv_entry  | 
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
323  | 
elif kind == 'tree-reference':  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
324  | 
if not self._repo_supports_tree_reference:  | 
| 
4183.5.2
by Robert Collins
 Support tree-reference in record_iter_changes.  | 
325  | 
raise errors.UnsupportedOperation(  | 
326  | 
self._generate_inventory,  | 
|
327  | 
self.branch.repository)  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
328  | 
inv_entry.reference_revision = link_or_sha1 or None  | 
| 
2338.4.5
by Marien Zwart
 Make an assert actually assert something.  | 
329  | 
elif kind != 'symlink':  | 
| 
2348.1.1
by Martin Pool
 (marienz) fixes for error committing merge with symlinks in dirstate  | 
330  | 
raise AssertionError("unknown kind %r" % kind)  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
331  | 
                # These checks cost us around 40ms on a 55k entry tree
 | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
332  | 
if file_id in inv_byid:  | 
333  | 
raise AssertionError('file_id %s already in'  | 
|
334  | 
' inventory as %s' % (file_id, inv_byid[file_id]))  | 
|
335  | 
if name_unicode in parent_ie.children:  | 
|
336  | 
raise AssertionError('name %r already in parent'  | 
|
337  | 
% (name_unicode,))  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
338  | 
inv_byid[file_id] = inv_entry  | 
339  | 
parent_ie.children[name_unicode] = inv_entry  | 
|
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
340  | 
self._inventory = inv  | 
341  | 
||
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
342  | 
def _get_entry(self, file_id=None, path=None):  | 
343  | 
"""Get the dirstate row for file_id or path.  | 
|
344  | 
||
345  | 
        If either file_id or path is supplied, it is used as the key to lookup.
 | 
|
346  | 
        If both are supplied, the fastest lookup is used, and an error is
 | 
|
347  | 
        raised if they do not both point at the same row.
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
348  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
349  | 
        :param file_id: An optional unicode file_id to be looked up.
 | 
350  | 
        :param path: An optional unicode path to be looked up.
 | 
|
351  | 
        :return: The dirstate row tuple for path/file_id, or (None, None)
 | 
|
352  | 
        """
 | 
|
353  | 
if file_id is None and path is None:  | 
|
354  | 
raise errors.BzrError('must supply file_id or path')  | 
|
355  | 
state = self.current_dirstate()  | 
|
356  | 
if path is not None:  | 
|
357  | 
path = path.encode('utf8')  | 
|
358  | 
return state._get_entry(0, fileid_utf8=file_id, path_utf8=path)  | 
|
359  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
360  | 
def get_file_sha1(self, file_id, path=None, stat_value=None):  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
361  | 
        # check file id is valid unconditionally.
 | 
| 
2255.10.1
by John Arbash Meinel
 Update WorkingTree4 so that it doesn't use a HashCache,  | 
362  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
| 
1551.15.56
by Aaron Bentley
 Raise NoSuchId when get_file_sha1 is invoked with a baed file id  | 
363  | 
if entry[0] is None:  | 
364  | 
raise errors.NoSuchId(self, file_id)  | 
|
| 
2255.2.73
by Robert Collins
 50% speedup in the dirstate->inventory conversion logic by caching the parent ids as we walk the tree. Some further work would be to maintain a stack of parents as we know we visit depth first.  | 
365  | 
if path is None:  | 
| 
2255.10.1
by John Arbash Meinel
 Update WorkingTree4 so that it doesn't use a HashCache,  | 
366  | 
path = pathjoin(entry[0][0], entry[0][1]).decode('utf8')  | 
367  | 
||
368  | 
file_abspath = self.abspath(path)  | 
|
369  | 
state = self.current_dirstate()  | 
|
| 
2485.3.3
by John Arbash Meinel
 Avoid extra work in inner 'DirState.update_entry' code.  | 
370  | 
if stat_value is None:  | 
| 
2499.3.1
by Aaron Bentley
 Fix Workingtree4.get_file_sha1 on missing files  | 
371  | 
try:  | 
372  | 
stat_value = os.lstat(file_abspath)  | 
|
373  | 
except OSError, e:  | 
|
374  | 
if e.errno == errno.ENOENT:  | 
|
375  | 
return None  | 
|
376  | 
else:  | 
|
377  | 
                    raise
 | 
|
| 
3696.4.1
by Robert Collins
 Refactor to allow a pluggable dirstate update_entry with interface tests.  | 
378  | 
link_or_sha1 = dirstate.update_entry(state, entry, file_abspath,  | 
379  | 
stat_value=stat_value)  | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
380  | 
if entry[1][0][0] == 'f':  | 
| 
3709.4.1
by Robert Collins
 Sha files for the stat cache more lazily rather than on first-examination, allowing less overall sha calculations to occur.  | 
381  | 
if link_or_sha1 is None:  | 
382  | 
file_obj, statvalue = self.get_file_with_stat(file_id, path)  | 
|
383  | 
try:  | 
|
384  | 
sha1 = osutils.sha_file(file_obj)  | 
|
385  | 
finally:  | 
|
386  | 
file_obj.close()  | 
|
387  | 
self._observed_sha1(file_id, path, (sha1, statvalue))  | 
|
388  | 
return sha1  | 
|
389  | 
else:  | 
|
390  | 
return link_or_sha1  | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
391  | 
return None  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
392  | 
|
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
393  | 
def _get_inventory(self):  | 
394  | 
"""Get the inventory for the tree. This is only valid within a lock."""  | 
|
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
395  | 
if 'evil' in debug.debug_flags:  | 
| 
2745.1.2
by Robert Collins
 Ensure mutter_callsite is not directly called on a lazy_load object, to make the stacklevel parameter work correctly.  | 
396  | 
trace.mutter_callsite(2,  | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
397  | 
"accessing .inventory forces a size of tree translation.")  | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
398  | 
if self._inventory is not None:  | 
399  | 
return self._inventory  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
400  | 
self._must_be_locked()  | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
401  | 
self._generate_inventory()  | 
402  | 
return self._inventory  | 
|
403  | 
||
404  | 
inventory = property(_get_inventory,  | 
|
405  | 
doc="Inventory of this Tree")  | 
|
406  | 
||
407  | 
    @needs_read_lock
 | 
|
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
408  | 
def get_parent_ids(self):  | 
409  | 
"""See Tree.get_parent_ids.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
410  | 
|
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
411  | 
        This implementation requests the ids list from the dirstate file.
 | 
412  | 
        """
 | 
|
413  | 
return self.current_dirstate().get_parent_ids()  | 
|
414  | 
||
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
415  | 
def get_reference_revision(self, file_id, path=None):  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
416  | 
        # referenced tree's revision is whatever's currently there
 | 
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
417  | 
return self.get_nested_tree(file_id, path).last_revision()  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
418  | 
|
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
419  | 
def get_nested_tree(self, file_id, path=None):  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
420  | 
if path is None:  | 
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
421  | 
path = self.id2path(file_id)  | 
422  | 
        # else: check file_id is at path?
 | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
423  | 
return WorkingTree.open(self.abspath(path))  | 
424  | 
||
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
425  | 
    @needs_read_lock
 | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
426  | 
def get_root_id(self):  | 
427  | 
"""Return the id of this trees root"""  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
428  | 
return self._get_entry(path='')[0][2]  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
429  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
430  | 
def has_id(self, file_id):  | 
431  | 
state = self.current_dirstate()  | 
|
| 
2255.2.92
by James Westby
 Make the WorkingTree4 has_id use the new _get_entry rather than _get_row.  | 
432  | 
row, parents = self._get_entry(file_id=file_id)  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
433  | 
if row is None:  | 
434  | 
return False  | 
|
435  | 
return osutils.lexists(pathjoin(  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
436  | 
self.basedir, row[0].decode('utf8'), row[1].decode('utf8')))  | 
437  | 
||
| 
4544.2.1
by Robert Collins
 Add interface enforcement for the behaviour of iter_changes with missing subtrees with explicit paths - the whole subtree is returned.  | 
438  | 
def has_or_had_id(self, file_id):  | 
439  | 
state = self.current_dirstate()  | 
|
440  | 
row, parents = self._get_entry(file_id=file_id)  | 
|
441  | 
return row is not None  | 
|
442  | 
||
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
443  | 
    @needs_read_lock
 | 
| 
2255.2.144
by John Arbash Meinel
 Simplify update_minimal a bit more, by making id_index a  | 
444  | 
def id2path(self, file_id):  | 
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
445  | 
        "Convert a file-id to a path."
 | 
| 
2255.2.144
by John Arbash Meinel
 Simplify update_minimal a bit more, by making id_index a  | 
446  | 
state = self.current_dirstate()  | 
| 
2255.2.147
by John Arbash Meinel
 Move fast id => path lookups down into DirState  | 
447  | 
entry = self._get_entry(file_id=file_id)  | 
448  | 
if entry == (None, None):  | 
|
| 
2255.11.5
by Martin Pool
 Tree.id2path should raise NoSuchId, not return None.  | 
449  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
| 
2255.2.147
by John Arbash Meinel
 Move fast id => path lookups down into DirState  | 
450  | 
path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
451  | 
return path_utf8.decode('utf8')  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
452  | 
|
| 
2911.5.4
by John Arbash Meinel
 Switch around to properly look up the executable bit in the basis.  | 
453  | 
def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):  | 
454  | 
entry = self._get_entry(path=path)  | 
|
455  | 
if entry == (None, None):  | 
|
456  | 
return False # Missing entries are not executable  | 
|
457  | 
return entry[1][0][3] # Executable?  | 
|
458  | 
||
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
459  | 
if not osutils.supports_executable():  | 
460  | 
def is_executable(self, file_id, path=None):  | 
|
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
461  | 
"""Test if a file is executable or not.  | 
462  | 
||
463  | 
            Note: The caller is expected to take a read-lock before calling this.
 | 
|
464  | 
            """
 | 
|
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
465  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
466  | 
if entry == (None, None):  | 
|
467  | 
return False  | 
|
468  | 
return entry[1][0][3]  | 
|
| 
2911.5.4
by John Arbash Meinel
 Switch around to properly look up the executable bit in the basis.  | 
469  | 
|
470  | 
_is_executable_from_path_and_stat = \  | 
|
471  | 
            _is_executable_from_path_and_stat_from_basis
 | 
|
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
472  | 
else:  | 
473  | 
def is_executable(self, file_id, path=None):  | 
|
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
474  | 
"""Test if a file is executable or not.  | 
475  | 
||
476  | 
            Note: The caller is expected to take a read-lock before calling this.
 | 
|
477  | 
            """
 | 
|
| 
3146.4.5
by Aaron Bentley
 Require a read lock in POSIX is_exectuable implementations, matching win32  | 
478  | 
self._must_be_locked()  | 
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
479  | 
if not path:  | 
480  | 
path = self.id2path(file_id)  | 
|
481  | 
mode = os.lstat(self.abspath(path)).st_mode  | 
|
482  | 
return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)  | 
|
483  | 
||
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
484  | 
def all_file_ids(self):  | 
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
485  | 
"""See Tree.iter_all_file_ids"""  | 
486  | 
self._must_be_locked()  | 
|
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
487  | 
result = set()  | 
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
488  | 
for key, tree_details in self.current_dirstate()._iter_entries():  | 
489  | 
if tree_details[0][0] in ('a', 'r'): # relocated  | 
|
490  | 
                continue
 | 
|
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
491  | 
result.add(key[2])  | 
492  | 
return result  | 
|
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
493  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
494  | 
    @needs_read_lock
 | 
495  | 
def __iter__(self):  | 
|
496  | 
"""Iterate through file_ids for this tree.  | 
|
497  | 
||
498  | 
        file_ids are in a WorkingTree if they are in the working inventory
 | 
|
499  | 
        and the working file exists.
 | 
|
500  | 
        """
 | 
|
501  | 
result = []  | 
|
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
502  | 
for key, tree_details in self.current_dirstate()._iter_entries():  | 
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
503  | 
if tree_details[0][0] in ('a', 'r'): # absent, relocated  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
504  | 
                # not relevant to the working tree
 | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
505  | 
                continue
 | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
506  | 
path = pathjoin(self.basedir, key[0].decode('utf8'), key[1].decode('utf8'))  | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
507  | 
if osutils.lexists(path):  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
508  | 
result.append(key[2])  | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
509  | 
return iter(result)  | 
510  | 
||
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
511  | 
def iter_references(self):  | 
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
512  | 
if not self._repo_supports_tree_reference:  | 
513  | 
            # When the repo doesn't support references, we will have nothing to
 | 
|
514  | 
            # return
 | 
|
515  | 
            return
 | 
|
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
516  | 
for key, tree_details in self.current_dirstate()._iter_entries():  | 
517  | 
if tree_details[0][0] in ('a', 'r'): # absent, relocated  | 
|
518  | 
                # not relevant to the working tree
 | 
|
519  | 
                continue
 | 
|
520  | 
if not key[1]:  | 
|
521  | 
                # the root is not a reference.
 | 
|
522  | 
                continue
 | 
|
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
523  | 
relpath = pathjoin(key[0].decode('utf8'), key[1].decode('utf8'))  | 
| 
2255.2.229
by Robert Collins
 Fix remaining test failures.  | 
524  | 
try:  | 
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
525  | 
if self._kind(relpath) == 'tree-reference':  | 
526  | 
yield relpath, key[2]  | 
|
| 
2255.2.229
by Robert Collins
 Fix remaining test failures.  | 
527  | 
except errors.NoSuchFile:  | 
528  | 
                # path is missing on disk.
 | 
|
529  | 
                continue
 | 
|
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
530  | 
|
| 
3709.3.2
by Robert Collins
 Race-free stat-fingerprint updating during commit via a new method get_file_with_stat.  | 
531  | 
def _observed_sha1(self, file_id, path, (sha1, statvalue)):  | 
| 
3709.3.1
by Robert Collins
 First cut - make it work - at updating the tree stat cache during commit.  | 
532  | 
"""See MutableTree._observed_sha1."""  | 
533  | 
state = self.current_dirstate()  | 
|
534  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
|
535  | 
state._observed_sha1(entry, sha1, statvalue)  | 
|
536  | 
||
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
537  | 
def kind(self, file_id):  | 
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
538  | 
"""Return the kind of a file.  | 
539  | 
||
540  | 
        This is always the actual kind that's on disk, regardless of what it
 | 
|
541  | 
        was added as.
 | 
|
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
542  | 
|
543  | 
        Note: The caller is expected to take a read-lock before calling this.
 | 
|
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
544  | 
        """
 | 
545  | 
relpath = self.id2path(file_id)  | 
|
| 
3376.2.11
by Martin Pool
 Compare to None using is/is not not ==  | 
546  | 
if relpath is None:  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
547  | 
raise AssertionError(  | 
548  | 
"path for id {%s} is None!" % file_id)  | 
|
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
549  | 
return self._kind(relpath)  | 
550  | 
||
551  | 
def _kind(self, relpath):  | 
|
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
552  | 
abspath = self.abspath(relpath)  | 
553  | 
kind = file_kind(abspath)  | 
|
| 
4100.2.1
by Aaron Bentley
 Disable autodetection of tree references  | 
554  | 
if (self._repo_supports_tree_reference and kind == 'directory'):  | 
555  | 
entry = self._get_entry(path=relpath)  | 
|
556  | 
if entry[1] is not None:  | 
|
| 
4100.2.4
by Aaron Bentley
 More support for not autodetecting tree refs  | 
557  | 
if entry[1][0][0] == 't':  | 
| 
4100.2.1
by Aaron Bentley
 Disable autodetection of tree references  | 
558  | 
kind = 'tree-reference'  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
559  | 
return kind  | 
560  | 
||
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
561  | 
    @needs_read_lock
 | 
562  | 
def _last_revision(self):  | 
|
563  | 
"""See Mutable.last_revision."""  | 
|
564  | 
parent_ids = self.current_dirstate().get_parent_ids()  | 
|
565  | 
if parent_ids:  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
566  | 
return parent_ids[0]  | 
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
567  | 
else:  | 
| 
2598.5.10
by Aaron Bentley
 Return NULL_REVISION instead of None for the null revision  | 
568  | 
return _mod_revision.NULL_REVISION  | 
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
569  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
570  | 
def lock_read(self):  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
571  | 
"""See Branch.lock_read, and WorkingTree.unlock."""  | 
572  | 
self.branch.lock_read()  | 
|
573  | 
try:  | 
|
574  | 
self._control_files.lock_read()  | 
|
575  | 
try:  | 
|
576  | 
state = self.current_dirstate()  | 
|
577  | 
if not state._lock_token:  | 
|
578  | 
state.lock_read()  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
579  | 
                # set our support for tree references from the repository in
 | 
580  | 
                # use.
 | 
|
581  | 
self._repo_supports_tree_reference = getattr(  | 
|
| 
2323.5.16
by Martin Pool
 rename support_tree_reference to supports_  | 
582  | 
self.branch.repository._format, "supports_tree_reference",  | 
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
583  | 
False)  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
584  | 
except:  | 
585  | 
self._control_files.unlock()  | 
|
586  | 
                raise
 | 
|
587  | 
except:  | 
|
588  | 
self.branch.unlock()  | 
|
589  | 
            raise
 | 
|
590  | 
||
591  | 
def _lock_self_write(self):  | 
|
592  | 
"""This should be called after the branch is locked."""  | 
|
593  | 
try:  | 
|
594  | 
self._control_files.lock_write()  | 
|
595  | 
try:  | 
|
596  | 
state = self.current_dirstate()  | 
|
597  | 
if not state._lock_token:  | 
|
598  | 
state.lock_write()  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
599  | 
                # set our support for tree references from the repository in
 | 
600  | 
                # use.
 | 
|
601  | 
self._repo_supports_tree_reference = getattr(  | 
|
| 
2323.5.16
by Martin Pool
 rename support_tree_reference to supports_  | 
602  | 
self.branch.repository._format, "supports_tree_reference",  | 
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
603  | 
False)  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
604  | 
except:  | 
605  | 
self._control_files.unlock()  | 
|
606  | 
                raise
 | 
|
607  | 
except:  | 
|
608  | 
self.branch.unlock()  | 
|
609  | 
            raise
 | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
610  | 
|
611  | 
def lock_tree_write(self):  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
612  | 
"""See MutableTree.lock_tree_write, and WorkingTree.unlock."""  | 
613  | 
self.branch.lock_read()  | 
|
614  | 
self._lock_self_write()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
615  | 
|
616  | 
def lock_write(self):  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
617  | 
"""See MutableTree.lock_write, and WorkingTree.unlock."""  | 
618  | 
self.branch.lock_write()  | 
|
619  | 
self._lock_self_write()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
620  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
621  | 
    @needs_tree_write_lock
 | 
| 
2255.2.137
by John Arbash Meinel
 Move the WorkingTree.move() tests into their own module  | 
622  | 
def move(self, from_paths, to_dir, after=False):  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
623  | 
"""See WorkingTree.move()."""  | 
| 
2255.7.46
by Robert Collins
 Fix WorkingTree4.move to return the moved paths, and update the tree implementation tests for move to check them.  | 
624  | 
result = []  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
625  | 
if not from_paths:  | 
| 
2255.7.46
by Robert Collins
 Fix WorkingTree4.move to return the moved paths, and update the tree implementation tests for move to check them.  | 
626  | 
return result  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
627  | 
state = self.current_dirstate()  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
628  | 
if isinstance(from_paths, basestring):  | 
629  | 
raise ValueError()  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
630  | 
to_dir_utf8 = to_dir.encode('utf8')  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
631  | 
to_entry_dirname, to_basename = os.path.split(to_dir_utf8)  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
632  | 
id_index = state._get_id_index()  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
633  | 
        # check destination directory
 | 
634  | 
        # get the details for it
 | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
635  | 
to_entry_block_index, to_entry_entry_index, dir_present, entry_present = \  | 
636  | 
state._get_block_entry_index(to_entry_dirname, to_basename, 0)  | 
|
637  | 
if not entry_present:  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
638  | 
raise errors.BzrMoveFailedError('', to_dir,  | 
| 
2255.7.71
by Robert Collins
 Fix blackbox test_mv usage of inventory, and the errors raised by workingtree4.move - though that should be made into a workingtree conformance test.  | 
639  | 
errors.NotVersionedError(to_dir))  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
640  | 
to_entry = state._dirblocks[to_entry_block_index][1][to_entry_entry_index]  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
641  | 
        # get a handle on the block itself.
 | 
642  | 
to_block_index = state._ensure_block(  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
643  | 
to_entry_block_index, to_entry_entry_index, to_dir_utf8)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
644  | 
to_block = state._dirblocks[to_block_index]  | 
645  | 
to_abs = self.abspath(to_dir)  | 
|
646  | 
if not isdir(to_abs):  | 
|
647  | 
raise errors.BzrMoveFailedError('',to_dir,  | 
|
648  | 
errors.NotADirectory(to_abs))  | 
|
649  | 
||
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
650  | 
if to_entry[1][0][0] != 'd':  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
651  | 
raise errors.BzrMoveFailedError('',to_dir,  | 
652  | 
errors.NotADirectory(to_abs))  | 
|
653  | 
||
654  | 
if self._inventory is not None:  | 
|
655  | 
update_inventory = True  | 
|
656  | 
inv = self.inventory  | 
|
| 
3201.2.1
by Lukáš Lalinský
 Make 'mv a b' work for already renamed directories, like it does for files  | 
657  | 
to_dir_id = to_entry[0][2]  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
658  | 
to_dir_ie = inv[to_dir_id]  | 
659  | 
else:  | 
|
660  | 
update_inventory = False  | 
|
661  | 
||
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
662  | 
rollbacks = []  | 
663  | 
def move_one(old_entry, from_path_utf8, minikind, executable,  | 
|
664  | 
fingerprint, packed_stat, size,  | 
|
665  | 
to_block, to_key, to_path_utf8):  | 
|
666  | 
state._make_absent(old_entry)  | 
|
667  | 
from_key = old_entry[0]  | 
|
668  | 
rollbacks.append(  | 
|
669  | 
lambda:state.update_minimal(from_key,  | 
|
670  | 
minikind,  | 
|
671  | 
executable=executable,  | 
|
672  | 
fingerprint=fingerprint,  | 
|
673  | 
packed_stat=packed_stat,  | 
|
674  | 
size=size,  | 
|
675  | 
path_utf8=from_path_utf8))  | 
|
676  | 
state.update_minimal(to_key,  | 
|
677  | 
minikind,  | 
|
678  | 
executable=executable,  | 
|
679  | 
fingerprint=fingerprint,  | 
|
680  | 
packed_stat=packed_stat,  | 
|
681  | 
size=size,  | 
|
682  | 
path_utf8=to_path_utf8)  | 
|
683  | 
added_entry_index, _ = state._find_entry_index(to_key, to_block[1])  | 
|
684  | 
new_entry = to_block[1][added_entry_index]  | 
|
685  | 
rollbacks.append(lambda:state._make_absent(new_entry))  | 
|
686  | 
||
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
687  | 
for from_rel in from_paths:  | 
688  | 
            # from_rel is 'pathinroot/foo/bar'
 | 
|
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
689  | 
from_rel_utf8 = from_rel.encode('utf8')  | 
690  | 
from_dirname, from_tail = osutils.split(from_rel)  | 
|
691  | 
from_dirname, from_tail_utf8 = osutils.split(from_rel_utf8)  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
692  | 
from_entry = self._get_entry(path=from_rel)  | 
693  | 
if from_entry == (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
694  | 
raise errors.BzrMoveFailedError(from_rel,to_dir,  | 
| 
4498.4.2
by Vincent Ladeuil
 Turn test_non_ascii.py test_mv errors into failures.  | 
695  | 
errors.NotVersionedError(path=from_rel))  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
696  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
697  | 
from_id = from_entry[0][2]  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
698  | 
to_rel = pathjoin(to_dir, from_tail)  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
699  | 
to_rel_utf8 = pathjoin(to_dir_utf8, from_tail_utf8)  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
700  | 
item_to_entry = self._get_entry(path=to_rel)  | 
701  | 
if item_to_entry != (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
702  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
703  | 
"Target is already versioned.")  | 
|
704  | 
||
705  | 
if from_rel == to_rel:  | 
|
706  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
|
707  | 
"Source and target are identical.")  | 
|
708  | 
||
709  | 
from_missing = not self.has_filename(from_rel)  | 
|
710  | 
to_missing = not self.has_filename(to_rel)  | 
|
711  | 
if after:  | 
|
712  | 
move_file = False  | 
|
713  | 
else:  | 
|
714  | 
move_file = True  | 
|
715  | 
if to_missing:  | 
|
716  | 
if not move_file:  | 
|
717  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
|
718  | 
errors.NoSuchFile(path=to_rel,  | 
|
719  | 
extra="New file has not been created yet"))  | 
|
720  | 
elif from_missing:  | 
|
721  | 
                    # neither path exists
 | 
|
722  | 
raise errors.BzrRenameFailedError(from_rel, to_rel,  | 
|
723  | 
errors.PathsDoNotExist(paths=(from_rel, to_rel)))  | 
|
724  | 
else:  | 
|
725  | 
if from_missing: # implicitly just update our path mapping  | 
|
726  | 
move_file = False  | 
|
| 
2255.2.139
by John Arbash Meinel
 test cases for moving after a file has already been moved.  | 
727  | 
elif not after:  | 
| 
2967.3.6
by Daniel Watkins
 Extracted the string from every use of RenameFailedFilesExist to RenameFailedFilesExist itself.  | 
728  | 
raise errors.RenameFailedFilesExist(from_rel, to_rel)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
729  | 
|
730  | 
rollbacks = []  | 
|
731  | 
def rollback_rename():  | 
|
732  | 
"""A single rename has failed, roll it back."""  | 
|
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
733  | 
                # roll back everything, even if we encounter trouble doing one
 | 
734  | 
                # of them.
 | 
|
735  | 
                #
 | 
|
736  | 
                # TODO: at least log the other exceptions rather than just
 | 
|
737  | 
                # losing them mbp 20070307
 | 
|
| 
2255.2.138
by John Arbash Meinel
 implement several new WorkingTree.move() tests  | 
738  | 
exc_info = None  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
739  | 
for rollback in reversed(rollbacks):  | 
740  | 
try:  | 
|
741  | 
rollback()  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
742  | 
except Exception, e:  | 
| 
2255.2.138
by John Arbash Meinel
 implement several new WorkingTree.move() tests  | 
743  | 
exc_info = sys.exc_info()  | 
744  | 
if exc_info:  | 
|
745  | 
raise exc_info[0], exc_info[1], exc_info[2]  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
746  | 
|
747  | 
            # perform the disk move first - its the most likely failure point.
 | 
|
| 
2255.2.139
by John Arbash Meinel
 test cases for moving after a file has already been moved.  | 
748  | 
if move_file:  | 
749  | 
from_rel_abs = self.abspath(from_rel)  | 
|
750  | 
to_rel_abs = self.abspath(to_rel)  | 
|
751  | 
try:  | 
|
752  | 
osutils.rename(from_rel_abs, to_rel_abs)  | 
|
753  | 
except OSError, e:  | 
|
754  | 
raise errors.BzrMoveFailedError(from_rel, to_rel, e[1])  | 
|
| 
2255.2.140
by John Arbash Meinel
 Update tests to ensure basis tree is not modified  | 
755  | 
rollbacks.append(lambda: osutils.rename(to_rel_abs, from_rel_abs))  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
756  | 
try:  | 
757  | 
                # perform the rename in the inventory next if needed: its easy
 | 
|
758  | 
                # to rollback
 | 
|
759  | 
if update_inventory:  | 
|
760  | 
                    # rename the entry
 | 
|
761  | 
from_entry = inv[from_id]  | 
|
762  | 
current_parent = from_entry.parent_id  | 
|
763  | 
inv.rename(from_id, to_dir_id, from_tail)  | 
|
764  | 
rollbacks.append(  | 
|
765  | 
lambda: inv.rename(from_id, current_parent, from_tail))  | 
|
766  | 
                # finally do the rename in the dirstate, which is a little
 | 
|
767  | 
                # tricky to rollback, but least likely to need it.
 | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
768  | 
old_block_index, old_entry_index, dir_present, file_present = \  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
769  | 
state._get_block_entry_index(from_dirname, from_tail_utf8, 0)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
770  | 
old_block = state._dirblocks[old_block_index][1]  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
771  | 
old_entry = old_block[old_entry_index]  | 
772  | 
from_key, old_entry_details = old_entry  | 
|
773  | 
cur_details = old_entry_details[0]  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
774  | 
                # remove the old row
 | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
775  | 
to_key = ((to_block[0],) + from_key[1:3])  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
776  | 
minikind = cur_details[0]  | 
777  | 
move_one(old_entry, from_path_utf8=from_rel_utf8,  | 
|
778  | 
minikind=minikind,  | 
|
779  | 
executable=cur_details[3],  | 
|
780  | 
fingerprint=cur_details[1],  | 
|
781  | 
packed_stat=cur_details[4],  | 
|
782  | 
size=cur_details[2],  | 
|
783  | 
to_block=to_block,  | 
|
784  | 
to_key=to_key,  | 
|
785  | 
to_path_utf8=to_rel_utf8)  | 
|
786  | 
||
787  | 
if minikind == 'd':  | 
|
788  | 
def update_dirblock(from_dir, to_key, to_dir_utf8):  | 
|
| 
2438.1.5
by John Arbash Meinel
 Fix the bug by not iterating over the same list we are modifying.  | 
789  | 
"""Recursively update all entries in this dirblock."""  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
790  | 
if from_dir == '':  | 
791  | 
raise AssertionError("renaming root not supported")  | 
|
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
792  | 
from_key = (from_dir, '')  | 
793  | 
from_block_idx, present = \  | 
|
794  | 
state._find_block_index_from_key(from_key)  | 
|
795  | 
if not present:  | 
|
796  | 
                            # This is the old record, if it isn't present, then
 | 
|
797  | 
                            # there is theoretically nothing to update.
 | 
|
798  | 
                            # (Unless it isn't present because of lazy loading,
 | 
|
799  | 
                            # but we don't do that yet)
 | 
|
800  | 
                            return
 | 
|
801  | 
from_block = state._dirblocks[from_block_idx]  | 
|
802  | 
to_block_index, to_entry_index, _, _ = \  | 
|
803  | 
state._get_block_entry_index(to_key[0], to_key[1], 0)  | 
|
804  | 
to_block_index = state._ensure_block(  | 
|
805  | 
to_block_index, to_entry_index, to_dir_utf8)  | 
|
806  | 
to_block = state._dirblocks[to_block_index]  | 
|
| 
2438.1.5
by John Arbash Meinel
 Fix the bug by not iterating over the same list we are modifying.  | 
807  | 
|
808  | 
                        # Grab a copy since move_one may update the list.
 | 
|
809  | 
for entry in from_block[1][:]:  | 
|
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
810  | 
if not (entry[0][0] == from_dir):  | 
811  | 
raise AssertionError()  | 
|
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
812  | 
cur_details = entry[1][0]  | 
813  | 
to_key = (to_dir_utf8, entry[0][1], entry[0][2])  | 
|
814  | 
from_path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
|
815  | 
to_path_utf8 = osutils.pathjoin(to_dir_utf8, entry[0][1])  | 
|
816  | 
minikind = cur_details[0]  | 
|
| 
2438.1.10
by John Arbash Meinel
 Make WT4.move() properly handle moving a directory with a renamed child.  | 
817  | 
if minikind in 'ar':  | 
| 
2438.1.8
by John Arbash Meinel
 Fix the case when renaming a directory with deleted children.  | 
818  | 
                                # Deleted children of a renamed directory
 | 
819  | 
                                # Do not need to be updated.
 | 
|
| 
2438.1.10
by John Arbash Meinel
 Make WT4.move() properly handle moving a directory with a renamed child.  | 
820  | 
                                # Children that have been renamed out of this
 | 
821  | 
                                # directory should also not be updated
 | 
|
| 
2438.1.8
by John Arbash Meinel
 Fix the case when renaming a directory with deleted children.  | 
822  | 
                                continue
 | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
823  | 
move_one(entry, from_path_utf8=from_path_utf8,  | 
824  | 
minikind=minikind,  | 
|
825  | 
executable=cur_details[3],  | 
|
826  | 
fingerprint=cur_details[1],  | 
|
827  | 
packed_stat=cur_details[4],  | 
|
828  | 
size=cur_details[2],  | 
|
829  | 
to_block=to_block,  | 
|
830  | 
to_key=to_key,  | 
|
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
831  | 
to_path_utf8=to_path_utf8)  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
832  | 
if minikind == 'd':  | 
833  | 
                                # We need to move all the children of this
 | 
|
834  | 
                                # entry
 | 
|
835  | 
update_dirblock(from_path_utf8, to_key,  | 
|
836  | 
to_path_utf8)  | 
|
837  | 
update_dirblock(from_rel_utf8, to_key, to_rel_utf8)  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
838  | 
except:  | 
839  | 
rollback_rename()  | 
|
840  | 
                raise
 | 
|
| 
2255.7.46
by Robert Collins
 Fix WorkingTree4.move to return the moved paths, and update the tree implementation tests for move to check them.  | 
841  | 
result.append((from_rel, to_rel))  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
842  | 
state._dirblock_state = dirstate.DirState.IN_MEMORY_MODIFIED  | 
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
843  | 
self._make_dirty(reset_inventory=False)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
844  | 
|
| 
2255.7.46
by Robert Collins
 Fix WorkingTree4.move to return the moved paths, and update the tree implementation tests for move to check them.  | 
845  | 
return result  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
846  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
847  | 
def _must_be_locked(self):  | 
848  | 
if not self._control_files._lock_count:  | 
|
849  | 
raise errors.ObjectNotLocked(self)  | 
|
850  | 
||
| 
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.  | 
851  | 
def _new_tree(self):  | 
852  | 
"""Initialize the state in this tree to be a new tree."""  | 
|
853  | 
self._dirty = True  | 
|
854  | 
||
855  | 
    @needs_read_lock
 | 
|
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
856  | 
def path2id(self, path):  | 
857  | 
"""Return the id for path in this tree."""  | 
|
| 
2255.7.56
by Robert Collins
 Document behaviour of tree.path2id("path/").  | 
858  | 
path = path.strip('/')  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
859  | 
entry = self._get_entry(path=path)  | 
860  | 
if entry == (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
861  | 
return None  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
862  | 
return entry[0][2]  | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
863  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
864  | 
def paths2ids(self, paths, trees=[], require_versioned=True):  | 
865  | 
"""See Tree.paths2ids().  | 
|
| 
2255.7.24
by John Arbash Meinel
 Rework cmd_inventory so that it uses paths2ids and locks the trees for read.  | 
866  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
867  | 
        This specialisation fast-paths the case where all the trees are in the
 | 
868  | 
        dirstate.
 | 
|
869  | 
        """
 | 
|
870  | 
if paths is None:  | 
|
871  | 
return None  | 
|
872  | 
parents = self.get_parent_ids()  | 
|
873  | 
for tree in trees:  | 
|
874  | 
if not (isinstance(tree, DirStateRevisionTree) and tree._revision_id in  | 
|
875  | 
parents):  | 
|
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
876  | 
return super(DirStateWorkingTree, self).paths2ids(paths,  | 
877  | 
trees, require_versioned)  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
878  | 
search_indexes = [0] + [1 + parents.index(tree._revision_id) for tree in trees]  | 
879  | 
        # -- make all paths utf8 --
 | 
|
880  | 
paths_utf8 = set()  | 
|
881  | 
for path in paths:  | 
|
882  | 
paths_utf8.add(path.encode('utf8'))  | 
|
883  | 
paths = paths_utf8  | 
|
884  | 
        # -- paths is now a utf8 path set --
 | 
|
885  | 
        # -- get the state object and prepare it.
 | 
|
886  | 
state = self.current_dirstate()  | 
|
| 
2255.2.133
by John Arbash Meinel
 Implement _paths2ids using bisect recursive rather than loading  | 
887  | 
if False and (state._dirblock_state == dirstate.DirState.NOT_IN_MEMORY  | 
888  | 
and '' not in paths):  | 
|
889  | 
paths2ids = self._paths2ids_using_bisect  | 
|
890  | 
else:  | 
|
891  | 
paths2ids = self._paths2ids_in_memory  | 
|
892  | 
return paths2ids(paths, search_indexes,  | 
|
893  | 
require_versioned=require_versioned)  | 
|
894  | 
||
895  | 
def _paths2ids_in_memory(self, paths, search_indexes,  | 
|
896  | 
require_versioned=True):  | 
|
897  | 
state = self.current_dirstate()  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
898  | 
state._read_dirblocks_if_needed()  | 
899  | 
def _entries_for_path(path):  | 
|
900  | 
"""Return a list with all the entries that match path for all ids.  | 
|
901  | 
            """
 | 
|
902  | 
dirname, basename = os.path.split(path)  | 
|
903  | 
key = (dirname, basename, '')  | 
|
904  | 
block_index, present = state._find_block_index_from_key(key)  | 
|
905  | 
if not present:  | 
|
906  | 
                # the block which should contain path is absent.
 | 
|
907  | 
return []  | 
|
908  | 
result = []  | 
|
909  | 
block = state._dirblocks[block_index][1]  | 
|
910  | 
entry_index, _ = state._find_entry_index(key, block)  | 
|
911  | 
            # we may need to look at multiple entries at this path: walk while the paths match.
 | 
|
912  | 
while (entry_index < len(block) and  | 
|
913  | 
block[entry_index][0][0:2] == key[0:2]):  | 
|
914  | 
result.append(block[entry_index])  | 
|
915  | 
entry_index += 1  | 
|
916  | 
return result  | 
|
917  | 
if require_versioned:  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
918  | 
            # -- check all supplied paths are versioned in a search tree. --
 | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
919  | 
all_versioned = True  | 
920  | 
for path in paths:  | 
|
921  | 
path_entries = _entries_for_path(path)  | 
|
922  | 
if not path_entries:  | 
|
923  | 
                    # this specified path is not present at all: error
 | 
|
924  | 
all_versioned = False  | 
|
925  | 
                    break
 | 
|
926  | 
found_versioned = False  | 
|
927  | 
                # for each id at this path
 | 
|
928  | 
for entry in path_entries:  | 
|
929  | 
                    # for each tree.
 | 
|
930  | 
for index in search_indexes:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
931  | 
if entry[1][index][0] != 'a': # absent  | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
932  | 
found_versioned = True  | 
933  | 
                            # all good: found a versioned cell
 | 
|
934  | 
                            break
 | 
|
935  | 
if not found_versioned:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
936  | 
                    # none of the indexes was not 'absent' at all ids for this
 | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
937  | 
                    # path.
 | 
938  | 
all_versioned = False  | 
|
939  | 
                    break
 | 
|
940  | 
if not all_versioned:  | 
|
941  | 
raise errors.PathsNotVersionedError(paths)  | 
|
942  | 
        # -- remove redundancy in supplied paths to prevent over-scanning --
 | 
|
| 
2825.7.1
by Robert Collins
 * Partial commits are now approximately 40% faster by walking over the  | 
943  | 
search_paths = osutils.minimum_path_selection(paths)  | 
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
944  | 
        # sketch:
 | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
945  | 
        # for all search_indexs in each path at or under each element of
 | 
946  | 
        # search_paths, if the detail is relocated: add the id, and add the
 | 
|
947  | 
        # relocated path as one to search if its not searched already. If the
 | 
|
948  | 
        # detail is not relocated, add the id.
 | 
|
949  | 
searched_paths = set()  | 
|
950  | 
found_ids = set()  | 
|
951  | 
def _process_entry(entry):  | 
|
952  | 
"""Look at search_indexes within entry.  | 
|
953  | 
||
954  | 
            If a specific tree's details are relocated, add the relocation
 | 
|
955  | 
            target to search_paths if not searched already. If it is absent, do
 | 
|
956  | 
            nothing. Otherwise add the id to found_ids.
 | 
|
957  | 
            """
 | 
|
958  | 
for index in search_indexes:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
959  | 
if entry[1][index][0] == 'r': # relocated  | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
960  | 
if not osutils.is_inside_any(searched_paths, entry[1][index][1]):  | 
961  | 
search_paths.add(entry[1][index][1])  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
962  | 
elif entry[1][index][0] != 'a': # absent  | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
963  | 
found_ids.add(entry[0][2])  | 
964  | 
while search_paths:  | 
|
965  | 
current_root = search_paths.pop()  | 
|
966  | 
searched_paths.add(current_root)  | 
|
967  | 
            # process the entries for this containing directory: the rest will be
 | 
|
968  | 
            # found by their parents recursively.
 | 
|
969  | 
root_entries = _entries_for_path(current_root)  | 
|
970  | 
if not root_entries:  | 
|
971  | 
                # this specified path is not present at all, skip it.
 | 
|
972  | 
                continue
 | 
|
973  | 
for entry in root_entries:  | 
|
974  | 
_process_entry(entry)  | 
|
975  | 
initial_key = (current_root, '', '')  | 
|
976  | 
block_index, _ = state._find_block_index_from_key(initial_key)  | 
|
977  | 
while (block_index < len(state._dirblocks) and  | 
|
978  | 
osutils.is_inside(current_root, state._dirblocks[block_index][0])):  | 
|
979  | 
for entry in state._dirblocks[block_index][1]:  | 
|
980  | 
_process_entry(entry)  | 
|
981  | 
block_index += 1  | 
|
982  | 
return found_ids  | 
|
983  | 
||
| 
2255.2.133
by John Arbash Meinel
 Implement _paths2ids using bisect recursive rather than loading  | 
984  | 
def _paths2ids_using_bisect(self, paths, search_indexes,  | 
985  | 
require_versioned=True):  | 
|
986  | 
state = self.current_dirstate()  | 
|
987  | 
found_ids = set()  | 
|
988  | 
||
989  | 
split_paths = sorted(osutils.split(p) for p in paths)  | 
|
990  | 
found = state._bisect_recursive(split_paths)  | 
|
991  | 
||
992  | 
if require_versioned:  | 
|
993  | 
found_dir_names = set(dir_name_id[:2] for dir_name_id in found)  | 
|
994  | 
for dir_name in split_paths:  | 
|
995  | 
if dir_name not in found_dir_names:  | 
|
996  | 
raise errors.PathsNotVersionedError(paths)  | 
|
997  | 
||
998  | 
for dir_name_id, trees_info in found.iteritems():  | 
|
999  | 
for index in search_indexes:  | 
|
1000  | 
if trees_info[index][0] not in ('r', 'a'):  | 
|
1001  | 
found_ids.add(dir_name_id[2])  | 
|
1002  | 
return found_ids  | 
|
1003  | 
||
| 
2255.2.45
by Robert Collins
 Dirstate - fix revision_tree() behaviour to match the interface contract.  | 
1004  | 
def read_working_inventory(self):  | 
1005  | 
"""Read the working inventory.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1006  | 
|
| 
2255.2.45
by Robert Collins
 Dirstate - fix revision_tree() behaviour to match the interface contract.  | 
1007  | 
        This is a meaningless operation for dirstate, but we obey it anyhow.
 | 
1008  | 
        """
 | 
|
1009  | 
return self.inventory  | 
|
1010  | 
||
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
1011  | 
    @needs_read_lock
 | 
| 
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.  | 
1012  | 
def revision_tree(self, revision_id):  | 
1013  | 
"""See Tree.revision_tree.  | 
|
1014  | 
||
1015  | 
        WorkingTree4 supplies revision_trees for any basis tree.
 | 
|
1016  | 
        """
 | 
|
1017  | 
dirstate = self.current_dirstate()  | 
|
1018  | 
parent_ids = dirstate.get_parent_ids()  | 
|
1019  | 
if revision_id not in parent_ids:  | 
|
1020  | 
raise errors.NoSuchRevisionInTree(self, revision_id)  | 
|
| 
2255.2.45
by Robert Collins
 Dirstate - fix revision_tree() behaviour to match the interface contract.  | 
1021  | 
if revision_id in dirstate.get_ghosts():  | 
1022  | 
raise errors.NoSuchRevisionInTree(self, revision_id)  | 
|
| 
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.  | 
1023  | 
return DirStateRevisionTree(dirstate, revision_id,  | 
1024  | 
self.branch.repository)  | 
|
1025  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1026  | 
    @needs_tree_write_lock
 | 
| 
2255.2.37
by Robert Collins
 Get TestExecutable.test_06_pull working on DirState: fix cloning and the set_last_revision api on WorkingTree4.  | 
1027  | 
def set_last_revision(self, new_revision):  | 
1028  | 
"""Change the last revision in the working tree."""  | 
|
1029  | 
parents = self.get_parent_ids()  | 
|
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
1030  | 
if new_revision in (_mod_revision.NULL_REVISION, None):  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1031  | 
if len(parents) >= 2:  | 
1032  | 
raise AssertionError(  | 
|
1033  | 
                    "setting the last parent to none with a pending merge is "
 | 
|
1034  | 
"unsupported.")  | 
|
| 
2255.2.37
by Robert Collins
 Get TestExecutable.test_06_pull working on DirState: fix cloning and the set_last_revision api on WorkingTree4.  | 
1035  | 
self.set_parent_ids([])  | 
1036  | 
else:  | 
|
| 
2255.2.56
by Robert Collins
 Dirstate: bring set_last_revision into line with the tested API.  | 
1037  | 
self.set_parent_ids([new_revision] + parents[1:],  | 
1038  | 
allow_leftmost_as_ghost=True)  | 
|
| 
2255.2.37
by Robert Collins
 Get TestExecutable.test_06_pull working on DirState: fix cloning and the set_last_revision api on WorkingTree4.  | 
1039  | 
|
1040  | 
    @needs_tree_write_lock
 | 
|
| 
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.  | 
1041  | 
def set_parent_ids(self, revision_ids, allow_leftmost_as_ghost=False):  | 
1042  | 
"""Set the parent ids to revision_ids.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1043  | 
|
| 
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.  | 
1044  | 
        See also set_parent_trees. This api will try to retrieve the tree data
 | 
1045  | 
        for each element of revision_ids from the trees repository. If you have
 | 
|
1046  | 
        tree data already available, it is more efficient to use
 | 
|
1047  | 
        set_parent_trees rather than set_parent_ids. set_parent_ids is however
 | 
|
1048  | 
        an easier API to use.
 | 
|
1049  | 
||
1050  | 
        :param revision_ids: The revision_ids to set as the parent ids of this
 | 
|
1051  | 
            working tree. Any of these may be ghosts.
 | 
|
1052  | 
        """
 | 
|
1053  | 
trees = []  | 
|
1054  | 
for revision_id in revision_ids:  | 
|
1055  | 
try:  | 
|
1056  | 
revtree = self.branch.repository.revision_tree(revision_id)  | 
|
| 
2255.2.24
by John Arbash Meinel
 When adding ghosts revision_tree() raises RevisionNotPresent because of Knit, not NoSuchRevision  | 
1057  | 
                # TODO: jam 20070213 KnitVersionedFile raises
 | 
1058  | 
                #       RevisionNotPresent rather than NoSuchRevision if a
 | 
|
1059  | 
                #       given revision_id is not present. Should Repository be
 | 
|
1060  | 
                #       catching it and re-raising NoSuchRevision?
 | 
|
1061  | 
except (errors.NoSuchRevision, errors.RevisionNotPresent):  | 
|
| 
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.  | 
1062  | 
revtree = None  | 
1063  | 
trees.append((revision_id, revtree))  | 
|
1064  | 
self.set_parent_trees(trees,  | 
|
1065  | 
allow_leftmost_as_ghost=allow_leftmost_as_ghost)  | 
|
1066  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1067  | 
    @needs_tree_write_lock
 | 
| 
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.  | 
1068  | 
def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):  | 
1069  | 
"""Set the parents of the working tree.  | 
|
1070  | 
||
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1071  | 
        :param parents_list: A list of (revision_id, tree) tuples.
 | 
| 
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.  | 
1072  | 
            If tree is None, then that element is treated as an unreachable
 | 
1073  | 
            parent tree - i.e. a ghost.
 | 
|
1074  | 
        """
 | 
|
1075  | 
dirstate = self.current_dirstate()  | 
|
1076  | 
if len(parents_list) > 0:  | 
|
1077  | 
if not allow_leftmost_as_ghost and parents_list[0][1] is None:  | 
|
| 
2255.2.42
by Robert Collins
 Fix WorkingTree4.set_parent_trees.  | 
1078  | 
raise errors.GhostRevisionUnusableHere(parents_list[0][0])  | 
| 
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.  | 
1079  | 
real_trees = []  | 
1080  | 
ghosts = []  | 
|
| 
3462.1.2
by John Arbash Meinel
 Change WT.set_parent_(ids/trees) to filter out ancestors.  | 
1081  | 
|
1082  | 
parent_ids = [rev_id for rev_id, tree in parents_list]  | 
|
1083  | 
graph = self.branch.repository.get_graph()  | 
|
1084  | 
heads = graph.heads(parent_ids)  | 
|
1085  | 
accepted_revisions = set()  | 
|
1086  | 
||
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1087  | 
        # convert absent trees to the null tree, which we convert back to
 | 
| 
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.  | 
1088  | 
        # missing on access.
 | 
1089  | 
for rev_id, tree in parents_list:  | 
|
| 
3462.1.2
by John Arbash Meinel
 Change WT.set_parent_(ids/trees) to filter out ancestors.  | 
1090  | 
if len(accepted_revisions) > 0:  | 
1091  | 
                # we always accept the first tree
 | 
|
1092  | 
if rev_id in accepted_revisions or rev_id not in heads:  | 
|
1093  | 
                    # We have already included either this tree, or its
 | 
|
1094  | 
                    # descendent, so we skip it.
 | 
|
1095  | 
                    continue
 | 
|
| 
2598.5.2
by Aaron Bentley
 Got all tests passing with Branch returning 'null:' for null revision  | 
1096  | 
_mod_revision.check_not_reserved_id(rev_id)  | 
| 
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.  | 
1097  | 
if tree is not None:  | 
1098  | 
real_trees.append((rev_id, tree))  | 
|
1099  | 
else:  | 
|
1100  | 
real_trees.append((rev_id,  | 
|
| 
3668.5.1
by Jelmer Vernooij
 Use NULL_REVISION rather than None for Repository.revision_tree().  | 
1101  | 
self.branch.repository.revision_tree(  | 
1102  | 
_mod_revision.NULL_REVISION)))  | 
|
| 
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.  | 
1103  | 
ghosts.append(rev_id)  | 
| 
3462.1.2
by John Arbash Meinel
 Change WT.set_parent_(ids/trees) to filter out ancestors.  | 
1104  | 
accepted_revisions.add(rev_id)  | 
| 
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.  | 
1105  | 
dirstate.set_parent_trees(real_trees, ghosts=ghosts)  | 
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
1106  | 
self._make_dirty(reset_inventory=False)  | 
| 
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.  | 
1107  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
1108  | 
def _set_root_id(self, file_id):  | 
1109  | 
"""See WorkingTree.set_root_id."""  | 
|
| 
2255.2.37
by Robert Collins
 Get TestExecutable.test_06_pull working on DirState: fix cloning and the set_last_revision api on WorkingTree4.  | 
1110  | 
state = self.current_dirstate()  | 
1111  | 
state.set_path_id('', file_id)  | 
|
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
1112  | 
if state._dirblock_state == dirstate.DirState.IN_MEMORY_MODIFIED:  | 
1113  | 
self._make_dirty(reset_inventory=True)  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
1114  | 
|
| 
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.  | 
1115  | 
def _sha_from_stat(self, path, stat_result):  | 
1116  | 
"""Get a sha digest from the tree's stat cache.  | 
|
1117  | 
||
1118  | 
        The default implementation assumes no stat cache is present.
 | 
|
1119  | 
||
1120  | 
        :param path: The path.
 | 
|
1121  | 
        :param stat_result: The stat result being looked up.
 | 
|
1122  | 
        """
 | 
|
| 
2929.1.1
by Robert Collins
 Use a dict to access stat cache information from dirstate.  | 
1123  | 
return self.current_dirstate().sha1_from_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.  | 
1124  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
1125  | 
    @needs_read_lock
 | 
1126  | 
def supports_tree_reference(self):  | 
|
1127  | 
return self._repo_supports_tree_reference  | 
|
1128  | 
||
| 
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.  | 
1129  | 
def unlock(self):  | 
1130  | 
"""Unlock in format 4 trees needs to write the entire dirstate."""  | 
|
| 
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.  | 
1131  | 
        # do non-implementation specific cleanup
 | 
1132  | 
self._cleanup()  | 
|
1133  | 
||
| 
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.  | 
1134  | 
if self._control_files._lock_count == 1:  | 
1135  | 
            # eventually we should do signature checking during read locks for
 | 
|
1136  | 
            # dirstate updates.
 | 
|
1137  | 
if self._control_files._lock_mode == 'w':  | 
|
1138  | 
if self._dirty:  | 
|
1139  | 
self.flush()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1140  | 
if self._dirstate is not None:  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
1141  | 
                # This is a no-op if there are no modifications.
 | 
1142  | 
self._dirstate.save()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1143  | 
self._dirstate.unlock()  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
1144  | 
            # TODO: jam 20070301 We shouldn't have to wipe the dirstate at this
 | 
1145  | 
            #       point. Instead, it could check if the header has been
 | 
|
1146  | 
            #       modified when it is locked, and if not, it can hang on to
 | 
|
1147  | 
            #       the data it has in memory.
 | 
|
| 
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.  | 
1148  | 
self._dirstate = None  | 
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
1149  | 
self._inventory = None  | 
| 
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.  | 
1150  | 
        # reverse order of locking.
 | 
1151  | 
try:  | 
|
1152  | 
return self._control_files.unlock()  | 
|
1153  | 
finally:  | 
|
1154  | 
self.branch.unlock()  | 
|
1155  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1156  | 
    @needs_tree_write_lock
 | 
1157  | 
def unversion(self, file_ids):  | 
|
1158  | 
"""Remove the file ids in file_ids from the current versioned set.  | 
|
1159  | 
||
1160  | 
        When a file_id is unversioned, all of its children are automatically
 | 
|
1161  | 
        unversioned.
 | 
|
1162  | 
||
1163  | 
        :param file_ids: The file ids to stop versioning.
 | 
|
1164  | 
        :raises: NoSuchId if any fileid is not currently versioned.
 | 
|
1165  | 
        """
 | 
|
1166  | 
if not file_ids:  | 
|
1167  | 
            return
 | 
|
1168  | 
state = self.current_dirstate()  | 
|
1169  | 
state._read_dirblocks_if_needed()  | 
|
| 
2858.2.1
by Martin Pool
 Remove most calls to safe_file_id and safe_revision_id.  | 
1170  | 
ids_to_unversion = set(file_ids)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1171  | 
paths_to_unversion = set()  | 
1172  | 
        # sketch:
 | 
|
1173  | 
        # check if the root is to be unversioned, if so, assert for now.
 | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1174  | 
        # walk the state marking unversioned things as absent.
 | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1175  | 
        # if there are any un-unversioned ids at the end, raise
 | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1176  | 
for key, details in state._dirblocks[0][1]:  | 
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1177  | 
if (details[0][0] not in ('a', 'r') and # absent or relocated  | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1178  | 
key[2] in ids_to_unversion):  | 
1179  | 
                # I haven't written the code to unversion / yet - it should be
 | 
|
1180  | 
                # supported.
 | 
|
1181  | 
raise errors.BzrError('Unversioning the / is not currently supported')  | 
|
1182  | 
block_index = 0  | 
|
1183  | 
while block_index < len(state._dirblocks):  | 
|
1184  | 
            # process one directory at a time.
 | 
|
1185  | 
block = state._dirblocks[block_index]  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1186  | 
            # first check: is the path one to remove - it or its children
 | 
1187  | 
delete_block = False  | 
|
1188  | 
for path in paths_to_unversion:  | 
|
1189  | 
if (block[0].startswith(path) and  | 
|
1190  | 
(len(block[0]) == len(path) or  | 
|
1191  | 
block[0][len(path)] == '/')):  | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1192  | 
                    # this entire block should be deleted - its the block for a
 | 
1193  | 
                    # path to unversion; or the child of one
 | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1194  | 
delete_block = True  | 
1195  | 
                    break
 | 
|
1196  | 
            # TODO: trim paths_to_unversion as we pass by paths
 | 
|
1197  | 
if delete_block:  | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1198  | 
                # this block is to be deleted: process it.
 | 
1199  | 
                # TODO: we can special case the no-parents case and
 | 
|
1200  | 
                # just forget the whole block.
 | 
|
1201  | 
entry_index = 0  | 
|
1202  | 
while entry_index < len(block[1]):  | 
|
| 
2363.2.3
by John Arbash Meinel
 Just check if the entry is absent before calling _make_absent.  | 
1203  | 
entry = block[1][entry_index]  | 
| 
4536.2.1
by Robert Collins
 Fix WorkingTree4.unversion when unversioning the parents of files that were renamed from a basis tree. (Robert Collins, bug 187207)  | 
1204  | 
if entry[1][0][0] in 'ar':  | 
1205  | 
                        # don't remove absent or renamed entries
 | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1206  | 
entry_index += 1  | 
| 
4536.2.1
by Robert Collins
 Fix WorkingTree4.unversion when unversioning the parents of files that were renamed from a basis tree. (Robert Collins, bug 187207)  | 
1207  | 
else:  | 
1208  | 
                        # Mark this file id as having been removed
 | 
|
1209  | 
ids_to_unversion.discard(entry[0][2])  | 
|
1210  | 
if not state._make_absent(entry):  | 
|
1211  | 
                            # The block has not shrunk.
 | 
|
1212  | 
entry_index += 1  | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1213  | 
                # go to the next block. (At the moment we dont delete empty
 | 
1214  | 
                # dirblocks)
 | 
|
1215  | 
block_index += 1  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1216  | 
                continue
 | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1217  | 
entry_index = 0  | 
1218  | 
while entry_index < len(block[1]):  | 
|
1219  | 
entry = block[1][entry_index]  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1220  | 
if (entry[1][0][0] in ('a', 'r') or # absent, relocated  | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1221  | 
                    # ^ some parent row.
 | 
1222  | 
entry[0][2] not in ids_to_unversion):  | 
|
1223  | 
                    # ^ not an id to unversion
 | 
|
1224  | 
entry_index += 1  | 
|
1225  | 
                    continue
 | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1226  | 
if entry[1][0][0] == 'd':  | 
| 
2255.7.41
by John Arbash Meinel
 WorkingTree.unversion() should not raise if unversioning a child and a parent.  | 
1227  | 
paths_to_unversion.add(pathjoin(entry[0][0], entry[0][1]))  | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1228  | 
if not state._make_absent(entry):  | 
1229  | 
entry_index += 1  | 
|
1230  | 
                # we have unversioned this id
 | 
|
1231  | 
ids_to_unversion.remove(entry[0][2])  | 
|
1232  | 
block_index += 1  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1233  | 
if ids_to_unversion:  | 
1234  | 
raise errors.NoSuchId(self, iter(ids_to_unversion).next())  | 
|
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
1235  | 
self._make_dirty(reset_inventory=False)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1236  | 
        # have to change the legacy inventory too.
 | 
1237  | 
if self._inventory is not None:  | 
|
1238  | 
for file_id in file_ids:  | 
|
| 
2255.2.33
by Robert Collins
 Correct thunko in refactoring a few commits back.  | 
1239  | 
self._inventory.remove_recursive_id(file_id)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1240  | 
|
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1241  | 
    @needs_tree_write_lock
 | 
| 
3146.8.12
by Aaron Bentley
 Add a flush to rename_one  | 
1242  | 
def rename_one(self, from_rel, to_rel, after=False):  | 
1243  | 
"""See WorkingTree.rename_one"""  | 
|
1244  | 
self.flush()  | 
|
1245  | 
WorkingTree.rename_one(self, from_rel, to_rel, after)  | 
|
1246  | 
||
1247  | 
    @needs_tree_write_lock
 | 
|
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1248  | 
def apply_inventory_delta(self, changes):  | 
1249  | 
"""See MutableTree.apply_inventory_delta"""  | 
|
| 
3146.8.11
by Aaron Bentley
 Fix dirstate/inventory dance, mark dirstate modified and in memory  | 
1250  | 
state = self.current_dirstate()  | 
| 
3146.8.15
by Aaron Bentley
 Cleanup and docs  | 
1251  | 
state.update_by_delta(changes)  | 
| 
3146.8.11
by Aaron Bentley
 Fix dirstate/inventory dance, mark dirstate modified and in memory  | 
1252  | 
self._make_dirty(reset_inventory=True)  | 
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1253  | 
|
| 
2929.2.1
by Robert Collins
 * Commit updates the state of the working tree via a delta rather than  | 
1254  | 
def update_basis_by_delta(self, new_revid, delta):  | 
1255  | 
"""See MutableTree.update_basis_by_delta."""  | 
|
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1256  | 
if self.last_revision() == new_revid:  | 
1257  | 
raise AssertionError()  | 
|
| 
2929.2.1
by Robert Collins
 * Commit updates the state of the working tree via a delta rather than  | 
1258  | 
self.current_dirstate().update_basis_by_delta(delta, new_revid)  | 
1259  | 
||
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
1260  | 
    @needs_read_lock
 | 
1261  | 
def _validate(self):  | 
|
1262  | 
self._dirstate._validate()  | 
|
1263  | 
||
| 
2255.2.16
by Robert Collins
 Implement WorkingTreeFormat4._write_inventory for better compatability with existing code, letting more test_test_trees pass, now up to test_tree_with_subdirs_and_all_content_types.  | 
1264  | 
    @needs_tree_write_lock
 | 
1265  | 
def _write_inventory(self, inv):  | 
|
1266  | 
"""Write inventory as the current inventory."""  | 
|
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1267  | 
if self._dirty:  | 
1268  | 
raise AssertionError("attempting to write an inventory when the "  | 
|
1269  | 
"dirstate is dirty will lose pending changes")  | 
|
| 
2255.2.16
by Robert Collins
 Implement WorkingTreeFormat4._write_inventory for better compatability with existing code, letting more test_test_trees pass, now up to test_tree_with_subdirs_and_all_content_types.  | 
1270  | 
self.current_dirstate().set_state_from_inventory(inv)  | 
| 
2255.7.67
by Robert Collins
 Fix test_inv - make setting WorkingTree4._dirty use a helper to reduce code duplication, and reset the inventory when we dont manually update it, if it exists.  | 
1271  | 
self._make_dirty(reset_inventory=False)  | 
1272  | 
if self._inventory is not None:  | 
|
1273  | 
self._inventory = inv  | 
|
| 
2255.2.16
by Robert Collins
 Implement WorkingTreeFormat4._write_inventory for better compatability with existing code, letting more test_test_trees pass, now up to test_tree_with_subdirs_and_all_content_types.  | 
1274  | 
self.flush()  | 
1275  | 
||
| 
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.  | 
1276  | 
|
| 
3368.2.53
by Ian Clatworthy
 sha1 calculation done by workingtree layer now  | 
1277  | 
class ContentFilterAwareSHA1Provider(dirstate.SHA1Provider):  | 
1278  | 
||
1279  | 
def __init__(self, tree):  | 
|
1280  | 
self.tree = tree  | 
|
1281  | 
||
1282  | 
def sha1(self, abspath):  | 
|
| 
4241.14.2
by Vincent Ladeuil
 Fixed as per John's review feedback.  | 
1283  | 
"""See dirstate.SHA1Provider.sha1()."""  | 
| 
4241.14.1
by Vincent Ladeuil
 Fix bug #355454 by casting to unicode.  | 
1284  | 
filters = self.tree._content_filter_stack(  | 
1285  | 
self.tree.relpath(osutils.safe_unicode(abspath)))  | 
|
| 
3368.2.53
by Ian Clatworthy
 sha1 calculation done by workingtree layer now  | 
1286  | 
return internal_size_sha_file_byname(abspath, filters)[1]  | 
1287  | 
||
1288  | 
def stat_and_sha1(self, abspath):  | 
|
| 
4241.14.2
by Vincent Ladeuil
 Fixed as per John's review feedback.  | 
1289  | 
"""See dirstate.SHA1Provider.stat_and_sha1()."""  | 
| 
4241.14.1
by Vincent Ladeuil
 Fix bug #355454 by casting to unicode.  | 
1290  | 
filters = self.tree._content_filter_stack(  | 
1291  | 
self.tree.relpath(osutils.safe_unicode(abspath)))  | 
|
| 
3368.2.53
by Ian Clatworthy
 sha1 calculation done by workingtree layer now  | 
1292  | 
file_obj = file(abspath, 'rb', 65000)  | 
1293  | 
try:  | 
|
1294  | 
statvalue = os.fstat(file_obj.fileno())  | 
|
1295  | 
if filters:  | 
|
1296  | 
file_obj = filtered_input_file(file_obj, filters)  | 
|
1297  | 
sha1 = osutils.size_sha_file(file_obj)[1]  | 
|
1298  | 
finally:  | 
|
1299  | 
file_obj.close()  | 
|
1300  | 
return statvalue, sha1  | 
|
1301  | 
||
1302  | 
||
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1303  | 
class WorkingTree4(DirStateWorkingTree):  | 
1304  | 
"""This is the Format 4 working tree.  | 
|
1305  | 
||
1306  | 
    This differs from WorkingTree3 by:
 | 
|
1307  | 
     - Having a consolidated internal dirstate, stored in a
 | 
|
1308  | 
       randomly-accessible sorted file on disk.
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1309  | 
     - Not having a regular inventory attribute.  One can be synthesized
 | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1310  | 
       on demand but this is expensive and should be avoided.
 | 
1311  | 
||
1312  | 
    This is new in bzr 0.15.
 | 
|
1313  | 
    """
 | 
|
1314  | 
||
1315  | 
||
1316  | 
class WorkingTree5(DirStateWorkingTree):  | 
|
1317  | 
"""This is the Format 5 working tree.  | 
|
1318  | 
||
1319  | 
    This differs from WorkingTree4 by:
 | 
|
1320  | 
     - Supporting content filtering.
 | 
|
| 
4210.4.2
by Ian Clatworthy
 split filtered views support out into WorkingTreeFormat6  | 
1321  | 
|
1322  | 
    This is new in bzr 1.11.
 | 
|
1323  | 
    """
 | 
|
1324  | 
||
1325  | 
||
1326  | 
class WorkingTree6(DirStateWorkingTree):  | 
|
1327  | 
"""This is the Format 6 working tree.  | 
|
1328  | 
||
1329  | 
    This differs from WorkingTree5 by:
 | 
|
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1330  | 
     - Supporting a current view that may mask the set of files in a tree
 | 
1331  | 
       impacted by most user operations.
 | 
|
1332  | 
||
| 
4210.4.2
by Ian Clatworthy
 split filtered views support out into WorkingTreeFormat6  | 
1333  | 
    This is new in bzr 1.14.
 | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1334  | 
    """
 | 
1335  | 
||
| 
3586.2.13
by Ian Clatworthy
 fix wt5 to use views, correcting an earlier merge  | 
1336  | 
def _make_views(self):  | 
1337  | 
return views.PathBasedViews(self)  | 
|
1338  | 
||
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1339  | 
|
1340  | 
class DirStateWorkingTreeFormat(WorkingTreeFormat3):  | 
|
| 
3123.5.2
by Aaron Bentley
 Allow checkout --files_from  | 
1341  | 
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  | 
1342  | 
accelerator_tree=None, hardlink=False):  | 
| 
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.  | 
1343  | 
"""See WorkingTreeFormat.initialize().  | 
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1344  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1345  | 
        :param revision_id: allows creating a working tree at a different
 | 
| 
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.  | 
1346  | 
        revision than the branch is at.
 | 
| 
3123.5.17
by Aaron Bentley
 Update docs  | 
1347  | 
        :param accelerator_tree: A tree which can be used for retrieving file
 | 
1348  | 
            contents more quickly than the revision tree, i.e. a workingtree.
 | 
|
1349  | 
            The revision tree will be used for cases where accelerator_tree's
 | 
|
1350  | 
            content is different.
 | 
|
| 
3136.1.3
by Aaron Bentley
 Implement hard-link support for branch and checkout  | 
1351  | 
        :param hardlink: If true, hard-link files from accelerator_tree,
 | 
1352  | 
            where possible.
 | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1353  | 
|
| 
1551.15.6
by Aaron Bentley
 Use ROOT_ID when the repository supports old clients (Bug #107168)  | 
1354  | 
        These trees get an initial random root id, if their repository supports
 | 
1355  | 
        rich root data, TREE_ROOT otherwise.
 | 
|
| 
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.  | 
1356  | 
        """
 | 
1357  | 
if not isinstance(a_bzrdir.transport, LocalTransport):  | 
|
1358  | 
raise errors.NotLocalUrl(a_bzrdir.transport.base)  | 
|
1359  | 
transport = a_bzrdir.get_workingtree_transport(self)  | 
|
1360  | 
control_files = self._open_control_files(a_bzrdir)  | 
|
1361  | 
control_files.create_lock()  | 
|
1362  | 
control_files.lock_write()  | 
|
| 
3407.2.5
by Martin Pool
 Deprecate LockableFiles.put_utf8  | 
1363  | 
transport.put_bytes('format', self.get_format_string(),  | 
| 
3407.2.18
by Martin Pool
 BzrDir takes responsibility for default file/dir modes  | 
1364  | 
mode=a_bzrdir._get_file_mode())  | 
| 
2955.5.3
by Vincent Ladeuil
 Fix second unwanted connection by providing the right branch to create_checkout.  | 
1365  | 
if from_branch is not None:  | 
1366  | 
branch = from_branch  | 
|
1367  | 
else:  | 
|
1368  | 
branch = a_bzrdir.open_branch()  | 
|
| 
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.  | 
1369  | 
if revision_id is None:  | 
1370  | 
revision_id = branch.last_revision()  | 
|
1371  | 
local_path = transport.local_abspath('dirstate')  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1372  | 
        # write out new dirstate (must exist when we create the tree)
 | 
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1373  | 
state = dirstate.DirState.initialize(local_path)  | 
1374  | 
state.unlock()  | 
|
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
1375  | 
del state  | 
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1376  | 
wt = self._tree_class(a_bzrdir.root_transport.local_abspath('.'),  | 
| 
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.  | 
1377  | 
branch,  | 
1378  | 
_format=self,  | 
|
1379  | 
_bzrdir=a_bzrdir,  | 
|
1380  | 
_control_files=control_files)  | 
|
1381  | 
wt._new_tree()  | 
|
| 
2255.7.42
by Robert Collins
 WorkingTree4 only needs a tree write lock during initialize, not a deep write lock.  | 
1382  | 
wt.lock_tree_write()  | 
| 
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.  | 
1383  | 
try:  | 
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1384  | 
self._init_custom_control_files(wt)  | 
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
1385  | 
if revision_id in (None, _mod_revision.NULL_REVISION):  | 
| 
1551.15.6
by Aaron Bentley
 Use ROOT_ID when the repository supports old clients (Bug #107168)  | 
1386  | 
if branch.repository.supports_rich_root():  | 
1387  | 
wt._set_root_id(generate_ids.gen_root_id())  | 
|
1388  | 
else:  | 
|
1389  | 
wt._set_root_id(ROOT_ID)  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1390  | 
wt.flush()  | 
| 
3123.5.14
by Aaron Bentley
 Avoid Repository.revision_tree in common-case branching  | 
1391  | 
basis = None  | 
1392  | 
            # frequently, we will get here due to branching.  The accelerator
 | 
|
1393  | 
            # tree will be the tree from the branch, so the desired basis
 | 
|
1394  | 
            # tree will often be a parent of the accelerator tree.
 | 
|
1395  | 
if accelerator_tree is not None:  | 
|
1396  | 
try:  | 
|
1397  | 
basis = accelerator_tree.revision_tree(revision_id)  | 
|
1398  | 
except errors.NoSuchRevision:  | 
|
1399  | 
                    pass
 | 
|
1400  | 
if basis is None:  | 
|
1401  | 
basis = branch.repository.revision_tree(revision_id)  | 
|
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
1402  | 
if revision_id == _mod_revision.NULL_REVISION:  | 
| 
3123.5.14
by Aaron Bentley
 Avoid Repository.revision_tree in common-case branching  | 
1403  | 
parents_list = []  | 
1404  | 
else:  | 
|
1405  | 
parents_list = [(revision_id, basis)]  | 
|
1406  | 
basis.lock_read()  | 
|
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1407  | 
try:  | 
1408  | 
wt.set_parent_trees(parents_list, allow_leftmost_as_ghost=True)  | 
|
| 
2255.2.177
by Martin Pool
 merge dirstate sorting fix, add more validation tests  | 
1409  | 
wt.flush()  | 
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1410  | 
                # if the basis has a root id we have to use that; otherwise we
 | 
1411  | 
                # use a new random one
 | 
|
1412  | 
basis_root_id = basis.get_root_id()  | 
|
1413  | 
if basis_root_id is not None:  | 
|
1414  | 
wt._set_root_id(basis_root_id)  | 
|
1415  | 
wt.flush()  | 
|
| 
4377.1.1
by Ian Clatworthy
 speed up branch-in-a-shared-repo for development6-rich-root format  | 
1416  | 
                # If content filtering is supported, do not use the accelerator
 | 
1417  | 
                # tree - the cost of transforming the content both ways and
 | 
|
1418  | 
                # checking for changed content can outweight the gains it gives.
 | 
|
1419  | 
                # Note: do NOT move this logic up higher - using the basis from
 | 
|
1420  | 
                # the accelerator tree is still desirable because that can save
 | 
|
1421  | 
                # a minute or more of processing on large trees!
 | 
|
| 
4393.3.1
by Ian Clatworthy
 fix status & commit issue reported by Frits Jalvingh  | 
1422  | 
                # The original tree may not have the same content filters
 | 
1423  | 
                # applied so we can't safely build the inventory delta from
 | 
|
1424  | 
                # the source tree.
 | 
|
| 
4377.1.1
by Ian Clatworthy
 speed up branch-in-a-shared-repo for development6-rich-root format  | 
1425  | 
if wt.supports_content_filtering():  | 
| 
4580.4.6
by Martin Pool
 Only give the warning about hardlinking if it was actually requested!  | 
1426  | 
if hardlink:  | 
1427  | 
                        # see https://bugs.edge.launchpad.net/bzr/+bug/408193
 | 
|
1428  | 
trace.warning("hardlinking working copy files is not currently "  | 
|
1429  | 
"supported in %r" % (wt,))  | 
|
| 
4377.1.1
by Ian Clatworthy
 speed up branch-in-a-shared-repo for development6-rich-root format  | 
1430  | 
accelerator_tree = None  | 
| 
4393.3.1
by Ian Clatworthy
 fix status & commit issue reported by Frits Jalvingh  | 
1431  | 
delta_from_tree = False  | 
1432  | 
else:  | 
|
1433  | 
delta_from_tree = True  | 
|
| 
3453.2.6
by Aaron Bentley
 Rename mutate_tree to delta_from_tree, add comment  | 
1434  | 
                # delta_from_tree is safe even for DirStateRevisionTrees,
 | 
1435  | 
                # because wt4.apply_inventory_delta does not mutate the input
 | 
|
1436  | 
                # inventory entries.
 | 
|
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1437  | 
transform.build_tree(basis, wt, accelerator_tree,  | 
| 
4393.3.1
by Ian Clatworthy
 fix status & commit issue reported by Frits Jalvingh  | 
1438  | 
hardlink=hardlink,  | 
1439  | 
delta_from_tree=delta_from_tree)  | 
|
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1440  | 
finally:  | 
1441  | 
basis.unlock()  | 
|
| 
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.  | 
1442  | 
finally:  | 
1443  | 
control_files.unlock()  | 
|
1444  | 
wt.unlock()  | 
|
1445  | 
return wt  | 
|
1446  | 
||
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1447  | 
def _init_custom_control_files(self, wt):  | 
1448  | 
"""Subclasses with custom control files should override this method.  | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1449  | 
|
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1450  | 
        The working tree and control files are locked for writing when this
 | 
1451  | 
        method is called.
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1452  | 
|
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1453  | 
        :param wt: the WorkingTree object
 | 
1454  | 
        """
 | 
|
1455  | 
||
| 
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.  | 
1456  | 
def _open(self, a_bzrdir, control_files):  | 
1457  | 
"""Open the tree itself.  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1458  | 
|
| 
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.  | 
1459  | 
        :param a_bzrdir: the dir for the tree.
 | 
1460  | 
        :param control_files: the control files for the tree.
 | 
|
1461  | 
        """
 | 
|
| 
3588.2.1
by Ian Clatworthy
 make it easier to subclass WorkingTreeFormat4  | 
1462  | 
return self._tree_class(a_bzrdir.root_transport.local_abspath('.'),  | 
| 
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.  | 
1463  | 
branch=a_bzrdir.open_branch(),  | 
1464  | 
_format=self,  | 
|
1465  | 
_bzrdir=a_bzrdir,  | 
|
1466  | 
_control_files=control_files)  | 
|
1467  | 
||
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1468  | 
def __get_matchingbzrdir(self):  | 
| 
4241.1.1
by Ian Clatworthy
 tree code cleanups from brisbane-core  | 
1469  | 
return self._get_matchingbzrdir()  | 
1470  | 
||
1471  | 
def _get_matchingbzrdir(self):  | 
|
1472  | 
"""Overrideable method to get a bzrdir for testing."""  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1473  | 
        # please test against something that will let us do tree references
 | 
1474  | 
return bzrdir.format_registry.make_bzrdir(  | 
|
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
1475  | 
'dirstate-with-subtree')  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1476  | 
|
1477  | 
_matchingbzrdir = property(__get_matchingbzrdir)  | 
|
1478  | 
||
| 
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.  | 
1479  | 
|
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1480  | 
class WorkingTreeFormat4(DirStateWorkingTreeFormat):  | 
1481  | 
"""The first consolidated dirstate working tree format.  | 
|
1482  | 
||
1483  | 
    This format:
 | 
|
1484  | 
        - exists within a metadir controlling .bzr
 | 
|
1485  | 
        - includes an explicit version marker for the workingtree control
 | 
|
1486  | 
          files, separate from the BzrDir format
 | 
|
1487  | 
        - modifies the hash cache format
 | 
|
1488  | 
        - is new in bzr 0.15
 | 
|
1489  | 
        - uses a LockDir to guard access to it.
 | 
|
1490  | 
    """
 | 
|
1491  | 
||
1492  | 
upgrade_recommended = False  | 
|
1493  | 
||
1494  | 
_tree_class = WorkingTree4  | 
|
1495  | 
||
1496  | 
def get_format_string(self):  | 
|
1497  | 
"""See WorkingTreeFormat.get_format_string()."""  | 
|
1498  | 
return "Bazaar Working Tree Format 4 (bzr 0.15)\n"  | 
|
1499  | 
||
1500  | 
def get_format_description(self):  | 
|
1501  | 
"""See WorkingTreeFormat.get_format_description()."""  | 
|
1502  | 
return "Working tree format 4"  | 
|
1503  | 
||
1504  | 
||
1505  | 
class WorkingTreeFormat5(DirStateWorkingTreeFormat):  | 
|
| 
4210.4.2
by Ian Clatworthy
 split filtered views support out into WorkingTreeFormat6  | 
1506  | 
"""WorkingTree format supporting content filtering.  | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1507  | 
    """
 | 
1508  | 
||
1509  | 
upgrade_recommended = False  | 
|
1510  | 
||
1511  | 
_tree_class = WorkingTree5  | 
|
1512  | 
||
1513  | 
def get_format_string(self):  | 
|
1514  | 
"""See WorkingTreeFormat.get_format_string()."""  | 
|
1515  | 
return "Bazaar Working Tree Format 5 (bzr 1.11)\n"  | 
|
1516  | 
||
1517  | 
def get_format_description(self):  | 
|
1518  | 
"""See WorkingTreeFormat.get_format_description()."""  | 
|
1519  | 
return "Working tree format 5"  | 
|
1520  | 
||
| 
4210.4.2
by Ian Clatworthy
 split filtered views support out into WorkingTreeFormat6  | 
1521  | 
def supports_content_filtering(self):  | 
1522  | 
return True  | 
|
1523  | 
||
1524  | 
||
1525  | 
class WorkingTreeFormat6(DirStateWorkingTreeFormat):  | 
|
1526  | 
"""WorkingTree format supporting views.  | 
|
1527  | 
    """
 | 
|
1528  | 
||
1529  | 
upgrade_recommended = False  | 
|
1530  | 
||
1531  | 
_tree_class = WorkingTree6  | 
|
1532  | 
||
1533  | 
def get_format_string(self):  | 
|
1534  | 
"""See WorkingTreeFormat.get_format_string()."""  | 
|
1535  | 
return "Bazaar Working Tree Format 6 (bzr 1.14)\n"  | 
|
1536  | 
||
1537  | 
def get_format_description(self):  | 
|
1538  | 
"""See WorkingTreeFormat.get_format_description()."""  | 
|
1539  | 
return "Working tree format 6"  | 
|
1540  | 
||
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
1541  | 
def _init_custom_control_files(self, wt):  | 
1542  | 
"""Subclasses with custom control files should override this method."""  | 
|
1543  | 
wt._transport.put_bytes('views', '', mode=wt.bzrdir._get_file_mode())  | 
|
1544  | 
||
1545  | 
def supports_content_filtering(self):  | 
|
1546  | 
return True  | 
|
1547  | 
||
1548  | 
def supports_views(self):  | 
|
1549  | 
return True  | 
|
1550  | 
||
1551  | 
||
| 
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.  | 
1552  | 
class DirStateRevisionTree(Tree):  | 
1553  | 
"""A revision tree pulling the inventory from a dirstate."""  | 
|
1554  | 
||
1555  | 
def __init__(self, dirstate, revision_id, repository):  | 
|
1556  | 
self._dirstate = dirstate  | 
|
| 
2858.2.1
by Martin Pool
 Remove most calls to safe_file_id and safe_revision_id.  | 
1557  | 
self._revision_id = revision_id  | 
| 
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.  | 
1558  | 
self._repository = repository  | 
1559  | 
self._inventory = None  | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1560  | 
self._locked = 0  | 
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1561  | 
self._dirstate_locked = False  | 
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
1562  | 
self._repo_supports_tree_reference = getattr(  | 
1563  | 
repository._format, "supports_tree_reference",  | 
|
1564  | 
False)  | 
|
| 
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.  | 
1565  | 
|
| 
2255.2.184
by Martin Pool
 Fixes for some comparison tests; repr of DirStateRevisionTree  | 
1566  | 
def __repr__(self):  | 
1567  | 
return "<%s of %s in %s>" % \  | 
|
1568  | 
(self.__class__.__name__, self._revision_id, self._dirstate)  | 
|
1569  | 
||
| 
1551.15.46
by Aaron Bentley
 Move plan merge to tree  | 
1570  | 
def annotate_iter(self, file_id,  | 
1571  | 
default_revision=_mod_revision.CURRENT_REVISION):  | 
|
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1572  | 
"""See Tree.annotate_iter"""  | 
| 
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.  | 
1573  | 
text_key = (file_id, self.inventory[file_id].revision)  | 
1574  | 
annotations = self._repository.texts.annotate(text_key)  | 
|
| 
3350.6.10
by Martin Pool
 VersionedFiles review cleanups  | 
1575  | 
return [(key[-1], line) for (key, line) in annotations]  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1576  | 
|
| 
1551.15.46
by Aaron Bentley
 Move plan merge to tree  | 
1577  | 
def _get_ancestors(self, default_revision):  | 
1578  | 
return set(self._repository.get_ancestry(self._revision_id,  | 
|
1579  | 
topo_sorted=False))  | 
|
| 
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.  | 
1580  | 
def _comparison_data(self, entry, path):  | 
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1581  | 
"""See Tree._comparison_data."""  | 
| 
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.  | 
1582  | 
if entry is None:  | 
1583  | 
return None, False, None  | 
|
1584  | 
        # trust the entry as RevisionTree does, but this may not be
 | 
|
1585  | 
        # sensible: the entry might not have come from us?
 | 
|
1586  | 
return entry.kind, entry.executable, None  | 
|
1587  | 
||
| 
2255.2.10
by Robert Collins
 Now all tests matching dirstate pass - added generation of inventories for parent trees.  | 
1588  | 
def _file_size(self, entry, stat_value):  | 
1589  | 
return entry.text_size  | 
|
1590  | 
||
| 
2255.2.78
by Robert Collins
 Really finish the prior commit.  | 
1591  | 
def filter_unversioned_files(self, paths):  | 
1592  | 
"""Filter out paths that are not versioned.  | 
|
1593  | 
||
1594  | 
        :return: set of paths.
 | 
|
1595  | 
        """
 | 
|
1596  | 
pred = self.has_filename  | 
|
1597  | 
return set((p for p in paths if not pred(p)))  | 
|
1598  | 
||
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1599  | 
def get_root_id(self):  | 
1600  | 
return self.path2id('')  | 
|
1601  | 
||
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1602  | 
def id2path(self, file_id):  | 
1603  | 
        "Convert a file-id to a path."
 | 
|
1604  | 
entry = self._get_entry(file_id=file_id)  | 
|
1605  | 
if entry == (None, None):  | 
|
1606  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
|
1607  | 
path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
|
1608  | 
return path_utf8.decode('utf8')  | 
|
1609  | 
||
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
1610  | 
def iter_references(self):  | 
1611  | 
if not self._repo_supports_tree_reference:  | 
|
1612  | 
            # When the repo doesn't support references, we will have nothing to
 | 
|
1613  | 
            # return
 | 
|
1614  | 
return iter([])  | 
|
1615  | 
        # Otherwise, fall back to the default implementation
 | 
|
1616  | 
return super(DirStateRevisionTree, self).iter_references()  | 
|
1617  | 
||
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1618  | 
def _get_parent_index(self):  | 
1619  | 
"""Return the index in the dirstate referenced by this tree."""  | 
|
1620  | 
return self._dirstate.get_parent_ids().index(self._revision_id) + 1  | 
|
1621  | 
||
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1622  | 
def _get_entry(self, file_id=None, path=None):  | 
1623  | 
"""Get the dirstate row for file_id or path.  | 
|
1624  | 
||
1625  | 
        If either file_id or path is supplied, it is used as the key to lookup.
 | 
|
1626  | 
        If both are supplied, the fastest lookup is used, and an error is
 | 
|
1627  | 
        raised if they do not both point at the same row.
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1628  | 
|
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1629  | 
        :param file_id: An optional unicode file_id to be looked up.
 | 
1630  | 
        :param path: An optional unicode path to be looked up.
 | 
|
1631  | 
        :return: The dirstate row tuple for path/file_id, or (None, None)
 | 
|
1632  | 
        """
 | 
|
1633  | 
if file_id is None and path is None:  | 
|
1634  | 
raise errors.BzrError('must supply file_id or path')  | 
|
1635  | 
if path is not None:  | 
|
1636  | 
path = path.encode('utf8')  | 
|
| 
4377.3.4
by Ian Clatworthy
 back out tree-level cache of dirstate entries as agreed during review  | 
1637  | 
parent_index = self._get_parent_index()  | 
1638  | 
return self._dirstate._get_entry(parent_index, fileid_utf8=file_id, path_utf8=path)  | 
|
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1639  | 
|
| 
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.  | 
1640  | 
def _generate_inventory(self):  | 
1641  | 
"""Create and set self.inventory from the dirstate object.  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1642  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1643  | 
        (So this is only called the first time the inventory is requested for
 | 
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1644  | 
        this tree; it then remains in memory until it's out of date.)
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1645  | 
|
| 
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.  | 
1646  | 
        This is relatively expensive: we have to walk the entire dirstate.
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1647  | 
        """
 | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1648  | 
if not self._locked:  | 
1649  | 
raise AssertionError(  | 
|
1650  | 
                'cannot generate inventory of an unlocked '
 | 
|
1651  | 
'dirstate revision tree')  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1652  | 
        # separate call for profiling - makes it clear where the costs are.
 | 
1653  | 
self._dirstate._read_dirblocks_if_needed()  | 
|
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1654  | 
if self._revision_id not in self._dirstate.get_parent_ids():  | 
1655  | 
raise AssertionError(  | 
|
1656  | 
'parent %s has disappeared from %s' % (  | 
|
1657  | 
self._revision_id, self._dirstate.get_parent_ids()))  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1658  | 
parent_index = self._dirstate.get_parent_ids().index(self._revision_id) + 1  | 
1659  | 
        # This is identical now to the WorkingTree _generate_inventory except
 | 
|
1660  | 
        # for the tree index use.
 | 
|
1661  | 
root_key, current_entry = self._dirstate._get_entry(parent_index, path_utf8='')  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1662  | 
current_id = root_key[2]  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1663  | 
if current_entry[parent_index][0] != 'd':  | 
1664  | 
raise AssertionError()  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1665  | 
inv = Inventory(root_id=current_id, revision_id=self._revision_id)  | 
1666  | 
inv.root.revision = current_entry[parent_index][4]  | 
|
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
1667  | 
        # Turn some things into local variables
 | 
1668  | 
minikind_to_kind = dirstate.DirState._minikind_to_kind  | 
|
1669  | 
factory = entry_factory  | 
|
1670  | 
utf8_decode = cache_utf8._utf8_decode  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1671  | 
inv_byid = inv._byid  | 
| 
2255.2.73
by Robert Collins
 50% speedup in the dirstate->inventory conversion logic by caching the parent ids as we walk the tree. Some further work would be to maintain a stack of parents as we know we visit depth first.  | 
1672  | 
        # we could do this straight out of the dirstate; it might be fast
 | 
1673  | 
        # and should be profiled - RBC 20070216
 | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1674  | 
parent_ies = {'' : inv.root}  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1675  | 
for block in self._dirstate._dirblocks[1:]: #skip root  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1676  | 
dirname = block[0]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1677  | 
try:  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1678  | 
parent_ie = parent_ies[dirname]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1679  | 
except KeyError:  | 
1680  | 
                # all the paths in this block are not versioned in this tree
 | 
|
1681  | 
                continue
 | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1682  | 
for key, entry in block[1]:  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1683  | 
minikind, fingerprint, size, executable, revid = entry[parent_index]  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
1684  | 
if minikind in ('a', 'r'): # absent, relocated  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1685  | 
                    # not this tree
 | 
1686  | 
                    continue
 | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1687  | 
name = key[1]  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
1688  | 
name_unicode = utf8_decode(name)[0]  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1689  | 
file_id = key[2]  | 
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
1690  | 
kind = minikind_to_kind[minikind]  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1691  | 
inv_entry = factory[kind](file_id, name_unicode,  | 
1692  | 
parent_ie.file_id)  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1693  | 
inv_entry.revision = revid  | 
1694  | 
if kind == 'file':  | 
|
1695  | 
inv_entry.executable = executable  | 
|
1696  | 
inv_entry.text_size = size  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1697  | 
inv_entry.text_sha1 = fingerprint  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1698  | 
elif kind == 'directory':  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1699  | 
parent_ies[(dirname + '/' + name).strip('/')] = inv_entry  | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1700  | 
elif kind == 'symlink':  | 
1701  | 
inv_entry.executable = False  | 
|
| 
2338.4.1
by Marien Zwart
 Fix committing merges in a dirstate tree with a symlink.  | 
1702  | 
inv_entry.text_size = None  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1703  | 
inv_entry.symlink_target = utf8_decode(fingerprint)[0]  | 
1704  | 
elif kind == 'tree-reference':  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
1705  | 
inv_entry.reference_revision = fingerprint or None  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1706  | 
else:  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1707  | 
raise AssertionError("cannot convert entry %r into an InventoryEntry"  | 
1708  | 
% entry)  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1709  | 
                # These checks cost us around 40ms on a 55k entry tree
 | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
1710  | 
if file_id in inv_byid:  | 
1711  | 
raise AssertionError('file_id %s already in'  | 
|
1712  | 
' inventory as %s' % (file_id, inv_byid[file_id]))  | 
|
1713  | 
if name_unicode in parent_ie.children:  | 
|
1714  | 
raise AssertionError('name %r already in parent'  | 
|
1715  | 
% (name_unicode,))  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1716  | 
inv_byid[file_id] = inv_entry  | 
1717  | 
parent_ie.children[name_unicode] = inv_entry  | 
|
| 
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.  | 
1718  | 
self._inventory = inv  | 
1719  | 
||
| 
2255.7.36
by John Arbash Meinel
 All trees should implement get_file_mtime()  | 
1720  | 
def get_file_mtime(self, file_id, path=None):  | 
1721  | 
"""Return the modification time for this record.  | 
|
1722  | 
||
1723  | 
        We return the timestamp of the last-changed revision.
 | 
|
1724  | 
        """
 | 
|
1725  | 
        # Make sure the file exists
 | 
|
1726  | 
entry = self._get_entry(file_id, path=path)  | 
|
1727  | 
if entry == (None, None): # do we raise?  | 
|
1728  | 
return None  | 
|
1729  | 
parent_index = self._get_parent_index()  | 
|
1730  | 
last_changed_revision = entry[1][parent_index][4]  | 
|
1731  | 
return self._repository.get_revision(last_changed_revision).timestamp  | 
|
1732  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1733  | 
def get_file_sha1(self, file_id, path=None, stat_value=None):  | 
| 
2255.10.1
by John Arbash Meinel
 Update WorkingTree4 so that it doesn't use a HashCache,  | 
1734  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
1735  | 
parent_index = self._get_parent_index()  | 
|
1736  | 
parent_details = entry[1][parent_index]  | 
|
1737  | 
if parent_details[0] == 'f':  | 
|
1738  | 
return parent_details[1]  | 
|
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1739  | 
return None  | 
1740  | 
||
| 
2743.3.3
by Ian Clatworthy
 Skip path lookup for tree.get_file() when we already know the path  | 
1741  | 
def get_file(self, file_id, path=None):  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1742  | 
return StringIO(self.get_file_text(file_id))  | 
1743  | 
||
1744  | 
def get_file_size(self, file_id):  | 
|
| 
3363.3.4
by Aaron Bentley
 Add get_file_size to Tree interface  | 
1745  | 
"""See Tree.get_file_size"""  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1746  | 
return self.inventory[file_id].text_size  | 
1747  | 
||
| 
3774.1.1
by Aaron Bentley
 Test Tree.get_file_text() and supply default implementation.  | 
1748  | 
def get_file_text(self, file_id, path=None):  | 
| 
4202.1.1
by John Arbash Meinel
 Update Repository.iter_files_bytes() to return an iterable of bytestrings.  | 
1749  | 
_, content = list(self.iter_files_bytes([(file_id, None)]))[0]  | 
1750  | 
return ''.join(content)  | 
|
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1751  | 
|
| 
2255.2.226
by Robert Collins
 Get merge_nested finally working: change nested tree iterators to take file_ids, and ensure the right branch is connected to in the merge logic. May not be suitable for shared repositories yet.  | 
1752  | 
def get_reference_revision(self, file_id, path=None):  | 
1753  | 
return self.inventory[file_id].reference_revision  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
1754  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1755  | 
def iter_files_bytes(self, desired_files):  | 
1756  | 
"""See Tree.iter_files_bytes.  | 
|
| 
2708.1.4
by Aaron Bentley
 RevisionTree and DirStateRevisionTree use Repository.extract_files_bytes  | 
1757  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1758  | 
        This version is implemented on top of Repository.iter_files_bytes"""
 | 
| 
2708.1.6
by Aaron Bentley
 Turn extract_files_bytes into an iterator  | 
1759  | 
parent_index = self._get_parent_index()  | 
| 
2708.1.11
by Aaron Bentley
 Test and tweak error handling  | 
1760  | 
repo_desired_files = []  | 
1761  | 
for file_id, identifier in desired_files:  | 
|
1762  | 
entry = self._get_entry(file_id)  | 
|
1763  | 
if entry == (None, None):  | 
|
1764  | 
raise errors.NoSuchId(self, file_id)  | 
|
1765  | 
repo_desired_files.append((file_id, entry[1][parent_index][4],  | 
|
1766  | 
identifier))  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1767  | 
return self._repository.iter_files_bytes(repo_desired_files)  | 
| 
2708.1.4
by Aaron Bentley
 RevisionTree and DirStateRevisionTree use Repository.extract_files_bytes  | 
1768  | 
|
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1769  | 
def get_symlink_target(self, file_id):  | 
1770  | 
entry = self._get_entry(file_id=file_id)  | 
|
1771  | 
parent_index = self._get_parent_index()  | 
|
1772  | 
if entry[1][parent_index][0] != 'l':  | 
|
1773  | 
return None  | 
|
1774  | 
else:  | 
|
| 
4216.3.1
by Robert Collins
 Fix Tree.get_symlink_target to decode from the disk encoding to get a unicode encoded string.  | 
1775  | 
target = entry[1][parent_index][1]  | 
1776  | 
target = target.decode('utf8')  | 
|
1777  | 
return target  | 
|
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1778  | 
|
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1779  | 
def get_revision_id(self):  | 
1780  | 
"""Return the revision id for this tree."""  | 
|
1781  | 
return self._revision_id  | 
|
1782  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1783  | 
def _get_inventory(self):  | 
1784  | 
if self._inventory is not None:  | 
|
1785  | 
return self._inventory  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1786  | 
self._must_be_locked()  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1787  | 
self._generate_inventory()  | 
1788  | 
return self._inventory  | 
|
1789  | 
||
1790  | 
inventory = property(_get_inventory,  | 
|
1791  | 
doc="Inventory of this Tree")  | 
|
1792  | 
||
| 
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.  | 
1793  | 
def get_parent_ids(self):  | 
1794  | 
"""The parents of a tree in the dirstate are not cached."""  | 
|
1795  | 
return self._repository.get_revision(self._revision_id).parent_ids  | 
|
1796  | 
||
| 
2255.2.30
by Robert Collins
 Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.  | 
1797  | 
def has_filename(self, filename):  | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
1798  | 
return bool(self.path2id(filename))  | 
| 
2255.2.30
by Robert Collins
 Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.  | 
1799  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1800  | 
def kind(self, file_id):  | 
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1801  | 
entry = self._get_entry(file_id=file_id)[1]  | 
| 
3376.2.11
by Martin Pool
 Compare to None using is/is not not ==  | 
1802  | 
if entry is None:  | 
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1803  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
1804  | 
return dirstate.DirState._minikind_to_kind[entry[1][0]]  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1805  | 
|
| 
3146.8.4
by Aaron Bentley
 Eliminate direct use of inventory from transform application  | 
1806  | 
def stored_kind(self, file_id):  | 
1807  | 
"""See Tree.stored_kind"""  | 
|
1808  | 
return self.kind(file_id)  | 
|
1809  | 
||
| 
2776.1.7
by Robert Collins
 * New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a  | 
1810  | 
def path_content_summary(self, path):  | 
1811  | 
"""See Tree.path_content_summary."""  | 
|
1812  | 
id = self.inventory.path2id(path)  | 
|
1813  | 
if id is None:  | 
|
1814  | 
return ('missing', None, None, None)  | 
|
1815  | 
entry = self._inventory[id]  | 
|
1816  | 
kind = entry.kind  | 
|
1817  | 
if kind == 'file':  | 
|
1818  | 
return (kind, entry.text_size, entry.executable, entry.text_sha1)  | 
|
1819  | 
elif kind == 'symlink':  | 
|
1820  | 
return (kind, None, None, entry.symlink_target)  | 
|
1821  | 
else:  | 
|
1822  | 
return (kind, None, None, None)  | 
|
1823  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1824  | 
def is_executable(self, file_id, path=None):  | 
1825  | 
ie = self.inventory[file_id]  | 
|
1826  | 
if ie.kind != "file":  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1827  | 
return None  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1828  | 
return ie.executable  | 
1829  | 
||
| 
4370.5.2
by Ian Clatworthy
 extend list_files() with from_dir and recursive parameters  | 
1830  | 
def list_files(self, include_root=False, from_dir=None, recursive=True):  | 
| 
2255.2.71
by John Arbash Meinel
 Add a test for list_files, and implement it for DirStateRevisionTree  | 
1831  | 
        # We use a standard implementation, because DirStateRevisionTree is
 | 
1832  | 
        # dealing with one of the parents of the current state
 | 
|
1833  | 
inv = self._get_inventory()  | 
|
| 
4370.5.2
by Ian Clatworthy
 extend list_files() with from_dir and recursive parameters  | 
1834  | 
if from_dir is None:  | 
1835  | 
from_dir_id = None  | 
|
1836  | 
else:  | 
|
1837  | 
from_dir_id = inv.path2id(from_dir)  | 
|
| 
4370.5.3
by Ian Clatworthy
 handle unversioned directories  | 
1838  | 
if from_dir_id is None:  | 
1839  | 
                # Directory not versioned
 | 
|
1840  | 
                return
 | 
|
| 
4370.5.2
by Ian Clatworthy
 extend list_files() with from_dir and recursive parameters  | 
1841  | 
entries = inv.iter_entries(from_dir=from_dir_id, recursive=recursive)  | 
1842  | 
if inv.root is not None and not include_root and from_dir is None:  | 
|
| 
2255.2.71
by John Arbash Meinel
 Add a test for list_files, and implement it for DirStateRevisionTree  | 
1843  | 
entries.next()  | 
1844  | 
for path, entry in entries:  | 
|
1845  | 
yield path, 'V', entry.kind, entry.file_id, entry  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1846  | 
|
| 
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.  | 
1847  | 
def lock_read(self):  | 
1848  | 
"""Lock the tree for a set of operations."""  | 
|
| 
2255.2.79
by Robert Collins
 Take out repository locks from Dirstate revision trees, to improve file text access performance.  | 
1849  | 
if not self._locked:  | 
1850  | 
self._repository.lock_read()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1851  | 
if self._dirstate._lock_token is None:  | 
1852  | 
self._dirstate.lock_read()  | 
|
1853  | 
self._dirstate_locked = True  | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1854  | 
self._locked += 1  | 
| 
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.  | 
1855  | 
|
| 
2255.2.183
by Martin Pool
 add missing _must_be_locked and a better message  | 
1856  | 
def _must_be_locked(self):  | 
1857  | 
if not self._locked:  | 
|
1858  | 
raise errors.ObjectNotLocked(self)  | 
|
1859  | 
||
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1860  | 
    @needs_read_lock
 | 
| 
2255.2.65
by John Arbash Meinel
 override path2id because it should be optimized anyway  | 
1861  | 
def path2id(self, path):  | 
1862  | 
"""Return the id for path in this tree."""  | 
|
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1863  | 
        # lookup by path: faster than splitting and walking the ivnentory.
 | 
1864  | 
entry = self._get_entry(path=path)  | 
|
1865  | 
if entry == (None, None):  | 
|
1866  | 
return None  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1867  | 
return entry[0][2]  | 
| 
2255.2.65
by John Arbash Meinel
 override path2id because it should be optimized anyway  | 
1868  | 
|
| 
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.  | 
1869  | 
def unlock(self):  | 
1870  | 
"""Unlock, freeing any cache memory used during the lock."""  | 
|
1871  | 
        # outside of a lock, the inventory is suspect: release it.
 | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1872  | 
self._locked -=1  | 
1873  | 
if not self._locked:  | 
|
1874  | 
self._inventory = None  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1875  | 
self._locked = 0  | 
1876  | 
if self._dirstate_locked:  | 
|
1877  | 
self._dirstate.unlock()  | 
|
1878  | 
self._dirstate_locked = False  | 
|
| 
2255.2.79
by Robert Collins
 Take out repository locks from Dirstate revision trees, to improve file text access performance.  | 
1879  | 
self._repository.unlock()  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1880  | 
|
| 
3504.2.1
by John Arbash Meinel
 Shortcut iter_references when we know references aren't supported.  | 
1881  | 
    @needs_read_lock
 | 
1882  | 
def supports_tree_reference(self):  | 
|
1883  | 
return self._repo_supports_tree_reference  | 
|
1884  | 
||
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1885  | 
def walkdirs(self, prefix=""):  | 
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
1886  | 
        # TODO: jam 20070215 This is the lazy way by using the RevisionTree
 | 
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1887  | 
        # implementation based on an inventory.
 | 
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
1888  | 
        # This should be cleaned up to use the much faster Dirstate code
 | 
1889  | 
        # So for now, we just build up the parent inventory, and extract
 | 
|
1890  | 
        # it the same way RevisionTree does.
 | 
|
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1891  | 
_directory = 'directory'  | 
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1892  | 
inv = self._get_inventory()  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1893  | 
top_id = inv.path2id(prefix)  | 
1894  | 
if top_id is None:  | 
|
1895  | 
pending = []  | 
|
1896  | 
else:  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1897  | 
pending = [(prefix, top_id)]  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1898  | 
while pending:  | 
1899  | 
dirblock = []  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1900  | 
relpath, file_id = pending.pop()  | 
1901  | 
            # 0 - relpath, 1- file-id
 | 
|
1902  | 
if relpath:  | 
|
1903  | 
relroot = relpath + '/'  | 
|
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1904  | 
else:  | 
1905  | 
relroot = ""  | 
|
1906  | 
            # FIXME: stash the node in pending
 | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1907  | 
entry = inv[file_id]  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1908  | 
for name, child in entry.sorted_children():  | 
1909  | 
toppath = relroot + name  | 
|
1910  | 
dirblock.append((toppath, name, child.kind, None,  | 
|
1911  | 
child.file_id, child.kind  | 
|
1912  | 
                    ))
 | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1913  | 
yield (relpath, entry.file_id), dirblock  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1914  | 
            # push the user specified dirs from dirblock
 | 
1915  | 
for dir in reversed(dirblock):  | 
|
1916  | 
if dir[2] == _directory:  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1917  | 
pending.append((dir[0], dir[4]))  | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1918  | 
|
1919  | 
||
1920  | 
class InterDirStateTree(InterTree):  | 
|
| 
2255.13.3
by Martin Pool
 Comments and better assertions in InterDirStateTree  | 
1921  | 
"""Fast path optimiser for changes_from with dirstate trees.  | 
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
1922  | 
|
1923  | 
    This is used only when both trees are in the dirstate working file, and
 | 
|
1924  | 
    the source is any parent within the dirstate, and the destination is
 | 
|
| 
2255.13.3
by Martin Pool
 Comments and better assertions in InterDirStateTree  | 
1925  | 
    the current working tree of the same dirstate.
 | 
1926  | 
    """
 | 
|
1927  | 
    # this could be generalized to allow comparisons between any trees in the
 | 
|
1928  | 
    # dirstate, and possibly between trees stored in different dirstates.
 | 
|
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1929  | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1930  | 
def __init__(self, source, target):  | 
1931  | 
super(InterDirStateTree, self).__init__(source, target)  | 
|
1932  | 
if not InterDirStateTree.is_compatible(source, target):  | 
|
1933  | 
raise Exception, "invalid source %r and target %r" % (source, target)  | 
|
1934  | 
||
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1935  | 
    @staticmethod
 | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1936  | 
def make_source_parent_tree(source, target):  | 
1937  | 
"""Change the source tree into a parent of the target."""  | 
|
1938  | 
revid = source.commit('record tree')  | 
|
1939  | 
target.branch.repository.fetch(source.branch.repository, revid)  | 
|
1940  | 
target.set_parent_ids([revid])  | 
|
1941  | 
return target.basis_tree(), target  | 
|
| 
2255.7.25
by John Arbash Meinel
 Shave off 200+ ms of 'time bzr status' in lp tree  | 
1942  | 
|
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1943  | 
    @classmethod
 | 
| 
3696.4.15
by Robert Collins
 Merge bzr.dev.  | 
1944  | 
def make_source_parent_tree_python_dirstate(klass, test_case, source, target):  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1945  | 
result = klass.make_source_parent_tree(source, target)  | 
1946  | 
result[1]._iter_changes = dirstate.ProcessEntryPython  | 
|
1947  | 
return result  | 
|
1948  | 
||
1949  | 
    @classmethod
 | 
|
| 
3696.4.15
by Robert Collins
 Merge bzr.dev.  | 
1950  | 
def make_source_parent_tree_compiled_dirstate(klass, test_case, source, target):  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1951  | 
from bzrlib.tests.test__dirstate_helpers import \  | 
1952  | 
            CompiledDirstateHelpersFeature
 | 
|
1953  | 
if not CompiledDirstateHelpersFeature.available():  | 
|
1954  | 
from bzrlib.tests import UnavailableFeature  | 
|
1955  | 
raise UnavailableFeature(CompiledDirstateHelpersFeature)  | 
|
| 
4459.2.1
by Vincent Ladeuil
 Use a consistent scheme for naming pyrex source files.  | 
1956  | 
from bzrlib._dirstate_helpers_pyx import ProcessEntryC  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1957  | 
result = klass.make_source_parent_tree(source, target)  | 
1958  | 
result[1]._iter_changes = ProcessEntryC  | 
|
1959  | 
return result  | 
|
1960  | 
||
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1961  | 
_matching_from_tree_format = WorkingTreeFormat4()  | 
1962  | 
_matching_to_tree_format = WorkingTreeFormat4()  | 
|
| 
3363.14.11
by Aaron Bentley
 Fix intertree tests with dirstate  | 
1963  | 
|
1964  | 
    @classmethod
 | 
|
1965  | 
def _test_mutable_trees_to_test_trees(klass, test_case, source, target):  | 
|
| 
3696.4.15
by Robert Collins
 Merge bzr.dev.  | 
1966  | 
        # This method shouldn't be called, because we have python and C
 | 
1967  | 
        # specific flavours.
 | 
|
1968  | 
raise NotImplementedError  | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1969  | 
|
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1970  | 
def iter_changes(self, include_unchanged=False,  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1971  | 
specific_files=None, pb=None, extra_trees=[],  | 
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
1972  | 
require_versioned=True, want_unversioned=False):  | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1973  | 
"""Return the changes from source to target.  | 
1974  | 
||
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1975  | 
        :return: An iterator that yields tuples. See InterTree.iter_changes
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1976  | 
            for details.
 | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1977  | 
        :param specific_files: An optional list of file paths to restrict the
 | 
1978  | 
            comparison to. When mapping filenames to ids, all matches in all
 | 
|
1979  | 
            trees (including optional extra_trees) are used, and all children of
 | 
|
1980  | 
            matched directories are included.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1981  | 
        :param include_unchanged: An optional boolean requesting the inclusion of
 | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1982  | 
            unchanged entries in the result.
 | 
1983  | 
        :param extra_trees: An optional list of additional trees to use when
 | 
|
1984  | 
            mapping the contents of specific_files (paths) to file_ids.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1985  | 
        :param require_versioned: If True, all files in specific_files must be
 | 
1986  | 
            versioned in one of source, target, extra_trees or
 | 
|
1987  | 
            PathsNotVersionedError is raised.
 | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
1988  | 
        :param want_unversioned: Should unversioned files be returned in the
 | 
1989  | 
            output. An unversioned file is defined as one with (False, False)
 | 
|
1990  | 
            for the versioned pair.
 | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1991  | 
        """
 | 
1992  | 
        # NB: show_status depends on being able to pass in non-versioned files
 | 
|
1993  | 
        # and report them as unknown
 | 
|
| 
2255.2.155
by Martin Pool
 Better assertion message from InterDirStateTree._iter_changes  | 
1994  | 
        # TODO: handle extra trees in the dirstate.
 | 
| 
2974.2.1
by John Arbash Meinel
 Re-enable the fast path for the no-parent commit case.  | 
1995  | 
if (extra_trees or specific_files == []):  | 
| 
2255.2.155
by Martin Pool
 Better assertion message from InterDirStateTree._iter_changes  | 
1996  | 
            # we can't fast-path these cases (yet)
 | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1997  | 
return super(InterDirStateTree, self).iter_changes(  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1998  | 
include_unchanged, specific_files, pb, extra_trees,  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
1999  | 
require_versioned, want_unversioned=want_unversioned)  | 
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
2000  | 
parent_ids = self.target.get_parent_ids()  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
2001  | 
if not (self.source._revision_id in parent_ids  | 
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
2002  | 
or self.source._revision_id == _mod_revision.NULL_REVISION):  | 
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
2003  | 
raise AssertionError(  | 
2004  | 
"revision {%s} is not stored in {%s}, but %s "  | 
|
2005  | 
                "can only be used for trees stored in the dirstate"
 | 
|
2006  | 
% (self.source._revision_id, self.target, self.iter_changes))  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2007  | 
target_index = 0  | 
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
2008  | 
if self.source._revision_id == _mod_revision.NULL_REVISION:  | 
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
2009  | 
source_index = None  | 
2010  | 
indices = (target_index,)  | 
|
2011  | 
else:  | 
|
| 
3376.2.4
by Martin Pool
 Remove every assert statement from bzrlib!  | 
2012  | 
if not (self.source._revision_id in parent_ids):  | 
2013  | 
raise AssertionError(  | 
|
2014  | 
"Failure: source._revision_id: %s not in target.parent_ids(%s)" % (  | 
|
2015  | 
self.source._revision_id, parent_ids))  | 
|
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
2016  | 
source_index = 1 + parent_ids.index(self.source._revision_id)  | 
| 
2974.2.1
by John Arbash Meinel
 Re-enable the fast path for the no-parent commit case.  | 
2017  | 
indices = (source_index, target_index)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2018  | 
        # -- make all specific_files utf8 --
 | 
2019  | 
if specific_files:  | 
|
2020  | 
specific_files_utf8 = set()  | 
|
2021  | 
for path in specific_files:  | 
|
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
2022  | 
                # Note, if there are many specific files, using cache_utf8
 | 
2023  | 
                # would be good here.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2024  | 
specific_files_utf8.add(path.encode('utf8'))  | 
2025  | 
specific_files = specific_files_utf8  | 
|
2026  | 
else:  | 
|
2027  | 
specific_files = set([''])  | 
|
2028  | 
        # -- specific_files is now a utf8 path set --
 | 
|
| 
4325.3.1
by Johan Walles
 Don't reinvent osutils.minimum_path_selection().  | 
2029  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2030  | 
        # -- get the state object and prepare it.
 | 
2031  | 
state = self.target.current_dirstate()  | 
|
2032  | 
state._read_dirblocks_if_needed()  | 
|
2033  | 
if require_versioned:  | 
|
2034  | 
            # -- check all supplied paths are versioned in a search tree. --
 | 
|
| 
4475.1.1
by Benoît Pierre
 Improve "Path(s) are not versioned" error reporting for some commands.  | 
2035  | 
not_versioned = []  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2036  | 
for path in specific_files:  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
2037  | 
path_entries = state._entries_for_path(path)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2038  | 
if not path_entries:  | 
2039  | 
                    # this specified path is not present at all: error
 | 
|
| 
4475.1.1
by Benoît Pierre
 Improve "Path(s) are not versioned" error reporting for some commands.  | 
2040  | 
not_versioned.append(path)  | 
2041  | 
                    continue
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2042  | 
found_versioned = False  | 
2043  | 
                # for each id at this path
 | 
|
2044  | 
for entry in path_entries:  | 
|
2045  | 
                    # for each tree.
 | 
|
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
2046  | 
for index in indices:  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2047  | 
if entry[1][index][0] != 'a': # absent  | 
2048  | 
found_versioned = True  | 
|
2049  | 
                            # all good: found a versioned cell
 | 
|
2050  | 
                            break
 | 
|
2051  | 
if not found_versioned:  | 
|
2052  | 
                    # none of the indexes was not 'absent' at all ids for this
 | 
|
2053  | 
                    # path.
 | 
|
| 
4475.1.1
by Benoît Pierre
 Improve "Path(s) are not versioned" error reporting for some commands.  | 
2054  | 
not_versioned.append(path)  | 
2055  | 
if len(not_versioned) > 0:  | 
|
2056  | 
raise errors.PathsNotVersionedError(not_versioned)  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2057  | 
        # -- remove redundancy in supplied specific_files to prevent over-scanning --
 | 
| 
4325.3.1
by Johan Walles
 Don't reinvent osutils.minimum_path_selection().  | 
2058  | 
search_specific_files = osutils.minimum_path_selection(specific_files)  | 
| 
3696.4.10
by Robert Collins
 Basic first cut of full-pyrex iter_changes.  | 
2059  | 
|
2060  | 
use_filesystem_for_exec = (sys.platform != 'win32')  | 
|
2061  | 
iter_changes = self.target._iter_changes(include_unchanged,  | 
|
2062  | 
use_filesystem_for_exec, search_specific_files, state,  | 
|
2063  | 
source_index, target_index, want_unversioned, self.target)  | 
|
2064  | 
return iter_changes.iter_changes()  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2065  | 
|
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2066  | 
    @staticmethod
 | 
2067  | 
def is_compatible(source, target):  | 
|
2068  | 
        # the target must be a dirstate working tree
 | 
|
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
2069  | 
if not isinstance(target, DirStateWorkingTree):  | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2070  | 
return False  | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
2071  | 
        # the source must be a revtree or dirstate rev tree.
 | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2072  | 
if not isinstance(source,  | 
2073  | 
(revisiontree.RevisionTree, DirStateRevisionTree)):  | 
|
2074  | 
return False  | 
|
2075  | 
        # the source revid must be in the target dirstate
 | 
|
| 
4496.3.16
by Andrew Bennetts
 Remove lots of unused imports.  | 
2076  | 
if not (source._revision_id == _mod_revision.NULL_REVISION or  | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2077  | 
source._revision_id in target.get_parent_ids()):  | 
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
2078  | 
            # TODO: what about ghosts? it may well need to
 | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2079  | 
            # check for them explicitly.
 | 
2080  | 
return False  | 
|
2081  | 
return True  | 
|
2082  | 
||
2083  | 
InterTree.register_optimiser(InterDirStateTree)  | 
|
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2084  | 
|
2085  | 
||
2086  | 
class Converter3to4(object):  | 
|
2087  | 
"""Perform an in-place upgrade of format 3 to format 4 trees."""  | 
|
2088  | 
||
2089  | 
def __init__(self):  | 
|
2090  | 
self.target_format = WorkingTreeFormat4()  | 
|
2091  | 
||
2092  | 
def convert(self, tree):  | 
|
2093  | 
        # lock the control files not the tree, so that we dont get tree
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
2094  | 
        # on-unlock behaviours, and so that noone else diddles with the
 | 
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2095  | 
        # tree during upgrade.
 | 
2096  | 
tree._control_files.lock_write()  | 
|
2097  | 
try:  | 
|
| 
2334.1.3
by John Arbash Meinel
 When upgrading, we can't assume that WorkingTree._inventory is valid, because that is now  | 
2098  | 
tree.read_working_inventory()  | 
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2099  | 
self.create_dirstate_data(tree)  | 
2100  | 
self.update_format(tree)  | 
|
2101  | 
self.remove_xml_files(tree)  | 
|
2102  | 
finally:  | 
|
2103  | 
tree._control_files.unlock()  | 
|
2104  | 
||
2105  | 
def create_dirstate_data(self, tree):  | 
|
2106  | 
"""Create the dirstate based data for tree."""  | 
|
2107  | 
local_path = tree.bzrdir.get_workingtree_transport(None  | 
|
2108  | 
).local_abspath('dirstate')  | 
|
2109  | 
state = dirstate.DirState.from_tree(tree, local_path)  | 
|
2110  | 
state.save()  | 
|
2111  | 
state.unlock()  | 
|
2112  | 
||
2113  | 
def remove_xml_files(self, tree):  | 
|
2114  | 
"""Remove the oldformat 3 data."""  | 
|
2115  | 
transport = tree.bzrdir.get_workingtree_transport(None)  | 
|
2116  | 
for path in ['basis-inventory-cache', 'inventory', 'last-revision',  | 
|
2117  | 
'pending-merges', 'stat-cache']:  | 
|
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
2118  | 
try:  | 
2119  | 
transport.delete(path)  | 
|
2120  | 
except errors.NoSuchFile:  | 
|
2121  | 
                # some files are optional - just deal.
 | 
|
2122  | 
                pass
 | 
|
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2123  | 
|
2124  | 
def update_format(self, tree):  | 
|
2125  | 
"""Change the format marker."""  | 
|
| 
3407.2.14
by Martin Pool
 Remove more cases of getting transport via control_files  | 
2126  | 
tree._transport.put_bytes('format',  | 
| 
3407.2.5
by Martin Pool
 Deprecate LockableFiles.put_utf8  | 
2127  | 
self.target_format.get_format_string(),  | 
| 
3407.2.18
by Martin Pool
 BzrDir takes responsibility for default file/dir modes  | 
2128  | 
mode=tree.bzrdir._get_file_mode())  | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
2129  | 
|
2130  | 
||
2131  | 
class Converter4to5(object):  | 
|
2132  | 
"""Perform an in-place upgrade of format 4 to format 5 trees."""  | 
|
2133  | 
||
2134  | 
def __init__(self):  | 
|
2135  | 
self.target_format = WorkingTreeFormat5()  | 
|
2136  | 
||
2137  | 
def convert(self, tree):  | 
|
2138  | 
        # lock the control files not the tree, so that we don't get tree
 | 
|
| 
3943.8.1
by Marius Kruger
 remove all trailing whitespace from bzr source  | 
2139  | 
        # on-unlock behaviours, and so that no-one else diddles with the
 | 
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
2140  | 
        # tree during upgrade.
 | 
2141  | 
tree._control_files.lock_write()  | 
|
2142  | 
try:  | 
|
| 
4210.4.2
by Ian Clatworthy
 split filtered views support out into WorkingTreeFormat6  | 
2143  | 
self.update_format(tree)  | 
2144  | 
finally:  | 
|
2145  | 
tree._control_files.unlock()  | 
|
2146  | 
||
2147  | 
def update_format(self, tree):  | 
|
2148  | 
"""Change the format marker."""  | 
|
2149  | 
tree._transport.put_bytes('format',  | 
|
2150  | 
self.target_format.get_format_string(),  | 
|
2151  | 
mode=tree.bzrdir._get_file_mode())  | 
|
2152  | 
||
2153  | 
||
2154  | 
class Converter4or5to6(object):  | 
|
2155  | 
"""Perform an in-place upgrade of format 4 or 5 to format 6 trees."""  | 
|
2156  | 
||
2157  | 
def __init__(self):  | 
|
2158  | 
self.target_format = WorkingTreeFormat6()  | 
|
2159  | 
||
2160  | 
def convert(self, tree):  | 
|
2161  | 
        # lock the control files not the tree, so that we don't get tree
 | 
|
2162  | 
        # on-unlock behaviours, and so that no-one else diddles with the
 | 
|
2163  | 
        # tree during upgrade.
 | 
|
2164  | 
tree._control_files.lock_write()  | 
|
2165  | 
try:  | 
|
| 
3907.2.3
by Ian Clatworthy
 DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced  | 
2166  | 
self.init_custom_control_files(tree)  | 
2167  | 
self.update_format(tree)  | 
|
2168  | 
finally:  | 
|
2169  | 
tree._control_files.unlock()  | 
|
2170  | 
||
2171  | 
def init_custom_control_files(self, tree):  | 
|
2172  | 
"""Initialize custom control files."""  | 
|
2173  | 
tree._transport.put_bytes('views', '',  | 
|
2174  | 
mode=tree.bzrdir._get_file_mode())  | 
|
2175  | 
||
2176  | 
def update_format(self, tree):  | 
|
2177  | 
"""Change the format marker."""  | 
|
2178  | 
tree._transport.put_bytes('format',  | 
|
2179  | 
self.target_format.get_format_string(),  | 
|
2180  | 
mode=tree.bzrdir._get_file_mode())  |