bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 
2255.7.83
by John Arbash Meinel
 Update some obvious copyright headers to include 2007.  | 
1  | 
# Copyright (C) 2005, 2006, 2007 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
 | 
|
15  | 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | 
|
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  | 
from bisect import bisect_left
 | 
|
32  | 
import collections
 | 
|
33  | 
from copy import deepcopy
 | 
|
34  | 
import errno
 | 
|
35  | 
import itertools
 | 
|
36  | 
import operator
 | 
|
37  | 
import stat
 | 
|
38  | 
from time import time
 | 
|
39  | 
import warnings
 | 
|
40  | 
||
41  | 
import bzrlib
 | 
|
42  | 
from bzrlib import (
 | 
|
43  | 
    bzrdir,
 | 
|
| 
2255.2.114
by John Arbash Meinel
 _get_inventory: 2.09 => 1.93s by tweaking some of the inner _generate_inventory loops  | 
44  | 
    cache_utf8,
 | 
| 
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.  | 
45  | 
    conflicts as _mod_conflicts,
 | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
46  | 
    debug,
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
47  | 
    delta,
 | 
| 
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  | 
    dirstate,
 | 
49  | 
    errors,
 | 
|
50  | 
    generate_ids,
 | 
|
51  | 
    globbing,
 | 
|
52  | 
    ignores,
 | 
|
53  | 
    merge,
 | 
|
54  | 
    osutils,
 | 
|
| 
2598.5.2
by Aaron Bentley
 Got all tests passing with Branch returning 'null:' for null revision  | 
55  | 
    revision as _mod_revision,
 | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
56  | 
    revisiontree,
 | 
| 
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.  | 
57  | 
    textui,
 | 
| 
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.  | 
58  | 
    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.  | 
59  | 
    transform,
 | 
60  | 
    urlutils,
 | 
|
61  | 
    xml5,
 | 
|
62  | 
    xml6,
 | 
|
63  | 
    )
 | 
|
64  | 
import bzrlib.branch
 | 
|
65  | 
from bzrlib.transport import get_transport
 | 
|
66  | 
import bzrlib.ui
 | 
|
67  | 
""")  | 
|
68  | 
||
69  | 
from bzrlib import symbol_versioning  | 
|
70  | 
from bzrlib.decorators import needs_read_lock, needs_write_lock  | 
|
| 
2255.2.74
by Robert Collins
 Minor performance optimisation in _generate_inventory by avoiding normalisation checks and just using a factory to create the inventory entries.  | 
71  | 
from bzrlib.inventory import InventoryEntry, 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.  | 
72  | 
from bzrlib.lockable_files import LockableFiles, TransportLock  | 
73  | 
from bzrlib.lockdir import LockDir  | 
|
74  | 
import bzrlib.mutabletree  | 
|
75  | 
from bzrlib.mutabletree import needs_tree_write_lock  | 
|
76  | 
from bzrlib.osutils import (  | 
|
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
77  | 
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.  | 
78  | 
isdir,  | 
79  | 
normpath,  | 
|
80  | 
pathjoin,  | 
|
81  | 
rand_chars,  | 
|
82  | 
realpath,  | 
|
83  | 
safe_unicode,  | 
|
84  | 
splitpath,  | 
|
85  | 
    )
 | 
|
86  | 
from bzrlib.trace import mutter, note  | 
|
87  | 
from bzrlib.transport.local import LocalTransport  | 
|
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
88  | 
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.  | 
89  | 
from bzrlib.progress import DummyProgress, ProgressPhase  | 
90  | 
from bzrlib.revision import NULL_REVISION, CURRENT_REVISION  | 
|
91  | 
from bzrlib.rio import RioReader, rio_file, Stanza  | 
|
92  | 
from bzrlib.symbol_versioning import (deprecated_passed,  | 
|
93  | 
deprecated_method,  | 
|
94  | 
deprecated_function,  | 
|
95  | 
DEPRECATED_PARAMETER,  | 
|
96  | 
        )
 | 
|
97  | 
from bzrlib.tree import Tree  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
98  | 
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.  | 
99  | 
|
100  | 
||
| 
2363.1.1
by John Arbash Meinel
 Catch Windows ERROR_DIRECTORY when doing os.listdir('file')  | 
101  | 
# This is the Windows equivalent of ENOTDIR
 | 
102  | 
# It is defined in pywin32.winerror, but we don't want a strong dependency for
 | 
|
103  | 
# just an error code.
 | 
|
| 
2408.1.5
by Alexander Belchenko
 John's patch for WT4 on Windows+Python2.4  | 
104  | 
ERROR_PATH_NOT_FOUND = 3  | 
| 
2363.1.1
by John Arbash Meinel
 Catch Windows ERROR_DIRECTORY when doing os.listdir('file')  | 
105  | 
ERROR_DIRECTORY = 267  | 
106  | 
||
107  | 
||
| 
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  | 
class WorkingTree4(WorkingTree3):  | 
109  | 
"""This is the Format 4 working tree.  | 
|
110  | 
||
111  | 
    This differs from WorkingTree3 by:
 | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
112  | 
     - Having a consolidated internal dirstate, stored in a
 | 
113  | 
       randomly-accessible sorted file on disk.
 | 
|
114  | 
     - Not having a regular inventory attribute.  One can be synthesized 
 | 
|
115  | 
       on demand but this is expensive and should be avoided.
 | 
|
| 
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.  | 
116  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
117  | 
    This is new in bzr 0.15.
 | 
| 
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.  | 
118  | 
    """
 | 
119  | 
||
120  | 
def __init__(self, basedir,  | 
|
121  | 
branch,  | 
|
122  | 
_control_files=None,  | 
|
123  | 
_format=None,  | 
|
124  | 
_bzrdir=None):  | 
|
125  | 
"""Construct a WorkingTree for basedir.  | 
|
126  | 
||
127  | 
        If the branch is not supplied, it is opened automatically.
 | 
|
128  | 
        If the branch is supplied, it must be the branch for this basedir.
 | 
|
129  | 
        (branch.base is not cross checked, because for remote branches that
 | 
|
130  | 
        would be meaningless).
 | 
|
131  | 
        """
 | 
|
132  | 
self._format = _format  | 
|
133  | 
self.bzrdir = _bzrdir  | 
|
134  | 
assert isinstance(basedir, basestring), \  | 
|
135  | 
"base directory %r is not a string" % basedir  | 
|
136  | 
basedir = safe_unicode(basedir)  | 
|
137  | 
mutter("opening working tree %r", basedir)  | 
|
138  | 
self._branch = branch  | 
|
139  | 
assert isinstance(self.branch, bzrlib.branch.Branch), \  | 
|
140  | 
"branch %r is not a Branch" % self.branch  | 
|
141  | 
self.basedir = realpath(basedir)  | 
|
142  | 
        # if branch is at our basedir and is a format 6 or less
 | 
|
143  | 
        # assume all other formats have their own control files.
 | 
|
144  | 
assert isinstance(_control_files, LockableFiles), \  | 
|
145  | 
"_control_files must be a LockableFiles, not %r" % _control_files  | 
|
146  | 
self._control_files = _control_files  | 
|
147  | 
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.  | 
148  | 
        #-------------
 | 
149  | 
        # during a read or write lock these objects are set, and are
 | 
|
150  | 
        # 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.  | 
151  | 
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.  | 
152  | 
self._inventory = None  | 
153  | 
        #-------------
 | 
|
| 
2974.2.2
by John Arbash Meinel
 Only one test failed, because it was incorrectly succeeding.  | 
154  | 
self._setup_directory_is_tree_reference()  | 
| 
3034.4.3
by Aaron Bentley
 Add case-sensitivity handling to WorkingTree  | 
155  | 
self._detect_case_handling()  | 
| 
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.  | 
156  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
157  | 
    @needs_tree_write_lock
 | 
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
158  | 
def _add(self, files, ids, kinds):  | 
159  | 
"""See MutableTree._add."""  | 
|
160  | 
state = self.current_dirstate()  | 
|
161  | 
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.  | 
162  | 
f = f.strip('/')  | 
| 
2255.7.74
by Robert Collins
 Test adding of roots to trees, it was broken on WorkingTree4.  | 
163  | 
if self.path2id(f):  | 
164  | 
                # special case tree root handling.
 | 
|
165  | 
if f == '' and self.path2id(f) == ROOT_ID:  | 
|
166  | 
state.set_path_id('', generate_ids.gen_file_id(f))  | 
|
167  | 
                continue
 | 
|
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
168  | 
if file_id is None:  | 
| 
2255.2.20
by Robert Collins
 Bypass irrelevant basis_inventory tests for dirstate.  | 
169  | 
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.  | 
170  | 
            # deliberately add the file with no cached stat or sha1
 | 
171  | 
            # - on the first access it will be gathered, and we can
 | 
|
172  | 
            # always change this once tests are all passing.
 | 
|
173  | 
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.  | 
174  | 
self._make_dirty(reset_inventory=True)  | 
175  | 
||
176  | 
def _make_dirty(self, reset_inventory):  | 
|
177  | 
"""Make the tree state dirty.  | 
|
178  | 
||
179  | 
        :param reset_inventory: True if the cached inventory should be removed
 | 
|
180  | 
            (presuming there is one).
 | 
|
181  | 
        """
 | 
|
| 
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.  | 
182  | 
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.  | 
183  | 
if reset_inventory and self._inventory is not None:  | 
184  | 
self._inventory = None  | 
|
| 
2255.2.12
by Robert Collins
 Partial implementation of WorkingTree4._add.  | 
185  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
186  | 
    @needs_tree_write_lock
 | 
187  | 
def add_reference(self, sub_tree):  | 
|
188  | 
        # use standard implementation, which calls back to self._add
 | 
|
189  | 
        # 
 | 
|
190  | 
        # So we don't store the reference_revision in the working dirstate,
 | 
|
191  | 
        # it's just recorded at the moment of commit. 
 | 
|
192  | 
self._add_reference(sub_tree)  | 
|
193  | 
||
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
194  | 
def break_lock(self):  | 
195  | 
"""Break a lock if one is present from another instance.  | 
|
196  | 
||
197  | 
        Uses the ui factory to ask for confirmation if the lock may be from
 | 
|
198  | 
        an active process.
 | 
|
199  | 
||
200  | 
        This will probe the repository for its lock as well.
 | 
|
201  | 
        """
 | 
|
202  | 
        # if the dirstate is locked by an active process, reject the break lock
 | 
|
203  | 
        # call.
 | 
|
204  | 
try:  | 
|
205  | 
if self._dirstate is None:  | 
|
206  | 
clear = True  | 
|
207  | 
else:  | 
|
208  | 
clear = False  | 
|
209  | 
state = self._current_dirstate()  | 
|
210  | 
if state._lock_token is not None:  | 
|
211  | 
                # we already have it locked. sheese, cant break our own lock.
 | 
|
212  | 
raise errors.LockActive(self.basedir)  | 
|
213  | 
else:  | 
|
214  | 
try:  | 
|
215  | 
                    # try for a write lock - need permission to get one anyhow
 | 
|
216  | 
                    # to break locks.
 | 
|
217  | 
state.lock_write()  | 
|
218  | 
except errors.LockContention:  | 
|
219  | 
                    # oslocks fail when a process is still live: fail.
 | 
|
220  | 
                    # TODO: get the locked lockdir info and give to the user to
 | 
|
221  | 
                    # assist in debugging.
 | 
|
222  | 
raise errors.LockActive(self.basedir)  | 
|
223  | 
else:  | 
|
224  | 
state.unlock()  | 
|
225  | 
finally:  | 
|
226  | 
if clear:  | 
|
227  | 
self._dirstate = None  | 
|
228  | 
self._control_files.break_lock()  | 
|
229  | 
self.branch.break_lock()  | 
|
230  | 
||
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
231  | 
def _comparison_data(self, entry, path):  | 
232  | 
kind, executable, stat_value = \  | 
|
233  | 
WorkingTree3._comparison_data(self, entry, path)  | 
|
| 
2255.2.205
by Martin Pool
 factor out WorkingTree4._directory_is_tree_reference  | 
234  | 
        # it looks like a plain directory, but it's really a reference -- see
 | 
235  | 
        # also kind()
 | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
236  | 
if (self._repo_supports_tree_reference and  | 
237  | 
kind == 'directory' and  | 
|
238  | 
self._directory_is_tree_reference(path)):  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
239  | 
kind = 'tree-reference'  | 
240  | 
return kind, executable, stat_value  | 
|
241  | 
||
| 
2255.7.74
by Robert Collins
 Test adding of roots to trees, it was broken on WorkingTree4.  | 
242  | 
    @needs_write_lock
 | 
243  | 
def commit(self, message=None, revprops=None, *args, **kwargs):  | 
|
244  | 
        # mark the tree as dirty post commit - commit
 | 
|
245  | 
        # can change the current versioned list by doing deletes.
 | 
|
246  | 
result = WorkingTree3.commit(self, message, revprops, *args, **kwargs)  | 
|
247  | 
self._make_dirty(reset_inventory=True)  | 
|
248  | 
return result  | 
|
249  | 
||
| 
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.  | 
250  | 
def current_dirstate(self):  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
251  | 
"""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.  | 
252  | 
|
253  | 
        This is not part of the tree interface and only exposed for ease of
 | 
|
254  | 
        testing.
 | 
|
255  | 
||
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
256  | 
        :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.  | 
257  | 
        """
 | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
258  | 
self._must_be_locked()  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
259  | 
return self._current_dirstate()  | 
260  | 
||
261  | 
def _current_dirstate(self):  | 
|
262  | 
"""Internal function that does not check lock status.  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
263  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
264  | 
        This is needed for break_lock which also needs the dirstate.
 | 
265  | 
        """
 | 
|
| 
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.  | 
266  | 
if self._dirstate is not None:  | 
267  | 
return self._dirstate  | 
|
268  | 
local_path = self.bzrdir.get_workingtree_transport(None  | 
|
269  | 
).local_abspath('dirstate')  | 
|
270  | 
self._dirstate = dirstate.DirState.on_file(local_path)  | 
|
271  | 
return self._dirstate  | 
|
272  | 
||
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
273  | 
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.  | 
274  | 
"""Filter out paths that are versioned.  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
275  | 
|
276  | 
        :return: set of paths.
 | 
|
277  | 
        """
 | 
|
278  | 
        # TODO: make a generic multi-bisect routine roughly that should list
 | 
|
279  | 
        # the paths, then process one half at a time recursively, and feed the
 | 
|
280  | 
        # results of each bisect in further still
 | 
|
281  | 
paths = sorted(paths)  | 
|
282  | 
result = set()  | 
|
| 
2255.2.176
by Martin Pool
 Merge dirstate and some small cleanups  | 
283  | 
state = self.current_dirstate()  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
284  | 
        # TODO we want a paths_to_dirblocks helper I think
 | 
285  | 
for path in paths:  | 
|
286  | 
dirname, basename = os.path.split(path.encode('utf8'))  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
287  | 
_, _, _, path_is_versioned = state._get_block_entry_index(  | 
288  | 
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.  | 
289  | 
if not path_is_versioned:  | 
| 
2255.2.81
by Robert Collins
 WorkingTree4: Implement filter_unversioned_files to use dirstate bisection.  | 
290  | 
result.add(path)  | 
291  | 
return result  | 
|
292  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
293  | 
def flush(self):  | 
294  | 
"""Write all cached data to disk."""  | 
|
| 
2255.2.39
by Robert Collins
 WorkingTree4: flush can only be used during write locks.  | 
295  | 
if self._control_files._lock_mode != 'w':  | 
296  | 
raise errors.NotWriteLocked(self)  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
297  | 
self.current_dirstate().save()  | 
298  | 
self._inventory = None  | 
|
299  | 
self._dirty = False  | 
|
300  | 
||
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
301  | 
    @needs_tree_write_lock
 | 
302  | 
def _gather_kinds(self, files, kinds):  | 
|
303  | 
"""See MutableTree._gather_kinds."""  | 
|
304  | 
for pos, f in enumerate(files):  | 
|
305  | 
if kinds[pos] is None:  | 
|
306  | 
kinds[pos] = self._kind(f)  | 
|
307  | 
||
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
308  | 
def _generate_inventory(self):  | 
309  | 
"""Create and set self.inventory from the dirstate object.  | 
|
310  | 
        
 | 
|
311  | 
        This is relatively expensive: we have to walk the entire dirstate.
 | 
|
312  | 
        Ideally we would not, and can deprecate this function.
 | 
|
313  | 
        """
 | 
|
| 
2255.2.82
by Robert Collins
 various notes about find_ids_across_trees  | 
314  | 
        #: uncomment to trap on inventory requests.
 | 
315  | 
        # import pdb;pdb.set_trace()
 | 
|
| 
2255.2.75
by Robert Collins
 Correct generation of revisiontree inventories to handle out of order parents.  | 
316  | 
state = self.current_dirstate()  | 
317  | 
state._read_dirblocks_if_needed()  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
318  | 
root_key, current_entry = self._get_entry(path='')  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
319  | 
current_id = root_key[2]  | 
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
320  | 
assert current_entry[0][0] == 'd' # directory  | 
| 
2255.2.75
by Robert Collins
 Correct generation of revisiontree inventories to handle out of order parents.  | 
321  | 
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  | 
322  | 
        # Turn some things into local variables
 | 
323  | 
minikind_to_kind = dirstate.DirState._minikind_to_kind  | 
|
324  | 
factory = entry_factory  | 
|
325  | 
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()  | 
326  | 
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.  | 
327  | 
        # we could do this straight out of the dirstate; it might be fast
 | 
328  | 
        # 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()  | 
329  | 
parent_ies = {'' : inv.root}  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
330  | 
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.  | 
331  | 
dirname = block[0]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
332  | 
try:  | 
| 
2255.8.4
by John Arbash Meinel
 Rather than using split hunks, implement a bisect_dirblocks  | 
333  | 
parent_ie = parent_ies[dirname]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
334  | 
except KeyError:  | 
335  | 
                # all the paths in this block are not versioned in this tree
 | 
|
336  | 
                continue
 | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
337  | 
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  | 
338  | 
minikind, link_or_sha1, size, executable, stat = entry[0]  | 
339  | 
if minikind in ('a', 'r'): # absent, relocated  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
340  | 
                    # a parent tree only entry
 | 
341  | 
                    continue
 | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
342  | 
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  | 
343  | 
name_unicode = utf8_decode(name)[0]  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
344  | 
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  | 
345  | 
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()  | 
346  | 
inv_entry = factory[kind](file_id, name_unicode,  | 
347  | 
parent_ie.file_id)  | 
|
| 
2255.2.77
by Robert Collins
 Tune working inventory generation more: walk the blocks, skipping deleted rows.  | 
348  | 
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.  | 
349  | 
                    # This is only needed on win32, where this is the only way
 | 
350  | 
                    # we know the executable bit.
 | 
|
351  | 
inv_entry.executable = executable  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
352  | 
                    # 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.  | 
353  | 
                    #inv_entry.text_size = size
 | 
354  | 
                    #inv_entry.text_sha1 = sha1
 | 
|
| 
2255.2.77
by Robert Collins
 Tune working inventory generation more: walk the blocks, skipping deleted rows.  | 
355  | 
elif kind == 'directory':  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
356  | 
                    # 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()  | 
357  | 
parent_ies[(dirname + '/' + name).strip('/')] = inv_entry  | 
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
358  | 
elif kind == 'tree-reference':  | 
| 
2348.1.1
by Martin Pool
 (marienz) fixes for error committing merge with symlinks in dirstate  | 
359  | 
assert self._repo_supports_tree_reference, \  | 
360  | 
"repository of %r " \  | 
|
361  | 
                        "doesn't support tree references " \
 | 
|
362  | 
"required by entry %r" \  | 
|
363  | 
% (self, name)  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
364  | 
inv_entry.reference_revision = link_or_sha1 or None  | 
| 
2338.4.5
by Marien Zwart
 Make an assert actually assert something.  | 
365  | 
elif kind != 'symlink':  | 
| 
2348.1.1
by Martin Pool
 (marienz) fixes for error committing merge with symlinks in dirstate  | 
366  | 
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()  | 
367  | 
                # These checks cost us around 40ms on a 55k entry tree
 | 
| 
2255.7.15
by John Arbash Meinel
 Try to create an intertree test that exposes the walkdir vs dirstate mismatch. No luck yet.  | 
368  | 
assert file_id not in inv_byid, ('file_id %s already in'  | 
369  | 
' inventory as %s' % (file_id, inv_byid[file_id]))  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
370  | 
assert name_unicode not in parent_ie.children  | 
371  | 
inv_byid[file_id] = inv_entry  | 
|
372  | 
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.  | 
373  | 
self._inventory = inv  | 
374  | 
||
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
375  | 
def _get_entry(self, file_id=None, path=None):  | 
376  | 
"""Get the dirstate row for file_id or path.  | 
|
377  | 
||
378  | 
        If either file_id or path is supplied, it is used as the key to lookup.
 | 
|
379  | 
        If both are supplied, the fastest lookup is used, and an error is
 | 
|
380  | 
        raised if they do not both point at the same row.
 | 
|
381  | 
        
 | 
|
382  | 
        :param file_id: An optional unicode file_id to be looked up.
 | 
|
383  | 
        :param path: An optional unicode path to be looked up.
 | 
|
384  | 
        :return: The dirstate row tuple for path/file_id, or (None, None)
 | 
|
385  | 
        """
 | 
|
386  | 
if file_id is None and path is None:  | 
|
387  | 
raise errors.BzrError('must supply file_id or path')  | 
|
388  | 
state = self.current_dirstate()  | 
|
389  | 
if path is not None:  | 
|
390  | 
path = path.encode('utf8')  | 
|
391  | 
return state._get_entry(0, fileid_utf8=file_id, path_utf8=path)  | 
|
392  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
393  | 
def get_file_sha1(self, file_id, path=None, stat_value=None):  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
394  | 
        # check file id is valid unconditionally.
 | 
| 
2255.10.1
by John Arbash Meinel
 Update WorkingTree4 so that it doesn't use a HashCache,  | 
395  | 
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  | 
396  | 
if entry[0] is None:  | 
397  | 
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.  | 
398  | 
if path is None:  | 
| 
2255.10.1
by John Arbash Meinel
 Update WorkingTree4 so that it doesn't use a HashCache,  | 
399  | 
path = pathjoin(entry[0][0], entry[0][1]).decode('utf8')  | 
400  | 
||
401  | 
file_abspath = self.abspath(path)  | 
|
402  | 
state = self.current_dirstate()  | 
|
| 
2485.3.3
by John Arbash Meinel
 Avoid extra work in inner 'DirState.update_entry' code.  | 
403  | 
if stat_value is None:  | 
| 
2499.3.1
by Aaron Bentley
 Fix Workingtree4.get_file_sha1 on missing files  | 
404  | 
try:  | 
405  | 
stat_value = os.lstat(file_abspath)  | 
|
406  | 
except OSError, e:  | 
|
407  | 
if e.errno == errno.ENOENT:  | 
|
408  | 
return None  | 
|
409  | 
else:  | 
|
410  | 
                    raise
 | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
411  | 
link_or_sha1 = state.update_entry(entry, file_abspath,  | 
412  | 
stat_value=stat_value)  | 
|
413  | 
if entry[1][0][0] == 'f':  | 
|
414  | 
return link_or_sha1  | 
|
415  | 
return None  | 
|
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
416  | 
|
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
417  | 
def _get_inventory(self):  | 
418  | 
"""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.  | 
419  | 
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.  | 
420  | 
trace.mutter_callsite(2,  | 
| 
2745.1.1
by Robert Collins
 Add a number of -Devil checkpoints.  | 
421  | 
"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.  | 
422  | 
if self._inventory is not None:  | 
423  | 
return self._inventory  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
424  | 
self._must_be_locked()  | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
425  | 
self._generate_inventory()  | 
426  | 
return self._inventory  | 
|
427  | 
||
428  | 
inventory = property(_get_inventory,  | 
|
429  | 
doc="Inventory of this Tree")  | 
|
430  | 
||
431  | 
    @needs_read_lock
 | 
|
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
432  | 
def get_parent_ids(self):  | 
433  | 
"""See Tree.get_parent_ids.  | 
|
434  | 
        
 | 
|
435  | 
        This implementation requests the ids list from the dirstate file.
 | 
|
436  | 
        """
 | 
|
437  | 
return self.current_dirstate().get_parent_ids()  | 
|
438  | 
||
| 
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.  | 
439  | 
def get_reference_revision(self, file_id, path=None):  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
440  | 
        # 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.  | 
441  | 
return self.get_nested_tree(file_id, path).last_revision()  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
442  | 
|
| 
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.  | 
443  | 
def get_nested_tree(self, file_id, path=None):  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
444  | 
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.  | 
445  | 
path = self.id2path(file_id)  | 
446  | 
        # else: check file_id is at path?
 | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
447  | 
return WorkingTree.open(self.abspath(path))  | 
448  | 
||
| 
2255.2.34
by Robert Collins
 Fix WorkingTree4 parent_ids logic to use the dirstate to answer parent ids list queries.  | 
449  | 
    @needs_read_lock
 | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
450  | 
def get_root_id(self):  | 
451  | 
"""Return the id of this trees root"""  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
452  | 
return self._get_entry(path='')[0][2]  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
453  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
454  | 
def has_id(self, file_id):  | 
455  | 
state = self.current_dirstate()  | 
|
| 
2255.2.92
by James Westby
 Make the WorkingTree4 has_id use the new _get_entry rather than _get_row.  | 
456  | 
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.  | 
457  | 
if row is None:  | 
458  | 
return False  | 
|
459  | 
return osutils.lexists(pathjoin(  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
460  | 
self.basedir, row[0].decode('utf8'), row[1].decode('utf8')))  | 
461  | 
||
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
462  | 
    @needs_read_lock
 | 
| 
2255.2.144
by John Arbash Meinel
 Simplify update_minimal a bit more, by making id_index a  | 
463  | 
def id2path(self, file_id):  | 
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
464  | 
        "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  | 
465  | 
state = self.current_dirstate()  | 
| 
2255.2.147
by John Arbash Meinel
 Move fast id => path lookups down into DirState  | 
466  | 
entry = self._get_entry(file_id=file_id)  | 
467  | 
if entry == (None, None):  | 
|
| 
2255.11.5
by Martin Pool
 Tree.id2path should raise NoSuchId, not return None.  | 
468  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
| 
2255.2.147
by John Arbash Meinel
 Move fast id => path lookups down into DirState  | 
469  | 
path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
470  | 
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.  | 
471  | 
|
| 
2911.5.4
by John Arbash Meinel
 Switch around to properly look up the executable bit in the basis.  | 
472  | 
def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):  | 
473  | 
entry = self._get_entry(path=path)  | 
|
474  | 
if entry == (None, None):  | 
|
475  | 
return False # Missing entries are not executable  | 
|
476  | 
return entry[1][0][3] # Executable?  | 
|
477  | 
||
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
478  | 
if not osutils.supports_executable():  | 
479  | 
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  | 
480  | 
"""Test if a file is executable or not.  | 
481  | 
||
482  | 
            Note: The caller is expected to take a read-lock before calling this.
 | 
|
483  | 
            """
 | 
|
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
484  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
485  | 
if entry == (None, None):  | 
|
486  | 
return False  | 
|
487  | 
return entry[1][0][3]  | 
|
| 
2911.5.4
by John Arbash Meinel
 Switch around to properly look up the executable bit in the basis.  | 
488  | 
|
489  | 
_is_executable_from_path_and_stat = \  | 
|
490  | 
            _is_executable_from_path_and_stat_from_basis
 | 
|
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
491  | 
else:  | 
492  | 
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  | 
493  | 
"""Test if a file is executable or not.  | 
494  | 
||
495  | 
            Note: The caller is expected to take a read-lock before calling this.
 | 
|
496  | 
            """
 | 
|
| 
3146.4.5
by Aaron Bentley
 Require a read lock in POSIX is_exectuable implementations, matching win32  | 
497  | 
self._must_be_locked()  | 
| 
2325.3.2
by John Arbash Meinel
 Implement is_executable for WorkingTree4 and win32  | 
498  | 
if not path:  | 
499  | 
path = self.id2path(file_id)  | 
|
500  | 
mode = os.lstat(self.abspath(path)).st_mode  | 
|
501  | 
return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)  | 
|
502  | 
||
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
503  | 
def all_file_ids(self):  | 
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
504  | 
"""See Tree.iter_all_file_ids"""  | 
505  | 
self._must_be_locked()  | 
|
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
506  | 
result = set()  | 
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
507  | 
for key, tree_details in self.current_dirstate()._iter_entries():  | 
508  | 
if tree_details[0][0] in ('a', 'r'): # relocated  | 
|
509  | 
                continue
 | 
|
| 
3146.8.16
by Aaron Bentley
 Updates from review  | 
510  | 
result.add(key[2])  | 
511  | 
return result  | 
|
| 
3146.8.2
by Aaron Bentley
 Introduce iter_all_file_ids, to avoid hitting Inventory for this case  | 
512  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
513  | 
    @needs_read_lock
 | 
514  | 
def __iter__(self):  | 
|
515  | 
"""Iterate through file_ids for this tree.  | 
|
516  | 
||
517  | 
        file_ids are in a WorkingTree if they are in the working inventory
 | 
|
518  | 
        and the working file exists.
 | 
|
519  | 
        """
 | 
|
520  | 
result = []  | 
|
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
521  | 
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  | 
522  | 
if tree_details[0][0] in ('a', 'r'): # absent, relocated  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
523  | 
                # 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.  | 
524  | 
                continue
 | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
525  | 
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.  | 
526  | 
if osutils.lexists(path):  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
527  | 
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.  | 
528  | 
return iter(result)  | 
529  | 
||
| 
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  | 
def iter_references(self):  | 
531  | 
for key, tree_details in self.current_dirstate()._iter_entries():  | 
|
532  | 
if tree_details[0][0] in ('a', 'r'): # absent, relocated  | 
|
533  | 
                # not relevant to the working tree
 | 
|
534  | 
                continue
 | 
|
535  | 
if not key[1]:  | 
|
536  | 
                # the root is not a reference.
 | 
|
537  | 
                continue
 | 
|
538  | 
path = pathjoin(self.basedir, key[0].decode('utf8'), key[1].decode('utf8'))  | 
|
| 
2255.2.229
by Robert Collins
 Fix remaining test failures.  | 
539  | 
try:  | 
540  | 
if self._kind(path) == 'tree-reference':  | 
|
541  | 
yield path, key[2]  | 
|
542  | 
except errors.NoSuchFile:  | 
|
543  | 
                # path is missing on disk.
 | 
|
544  | 
                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.  | 
545  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
546  | 
def kind(self, file_id):  | 
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
547  | 
"""Return the kind of a file.  | 
548  | 
||
549  | 
        This is always the actual kind that's on disk, regardless of what it
 | 
|
550  | 
        was added as.
 | 
|
| 
2511.1.3
by Ian Clatworthy
 remove implicit read locks for kind() and is_executable() in wt4  | 
551  | 
|
552  | 
        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  | 
553  | 
        """
 | 
554  | 
relpath = self.id2path(file_id)  | 
|
555  | 
assert relpath != None, \  | 
|
556  | 
"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.  | 
557  | 
return self._kind(relpath)  | 
558  | 
||
559  | 
def _kind(self, relpath):  | 
|
| 
2255.2.202
by Martin Pool
 WorkingTree_4.kind should report tree-references if they're  | 
560  | 
abspath = self.abspath(relpath)  | 
561  | 
kind = file_kind(abspath)  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
562  | 
if (self._repo_supports_tree_reference and  | 
563  | 
kind == 'directory' and  | 
|
564  | 
self._directory_is_tree_reference(relpath)):  | 
|
| 
2255.2.205
by Martin Pool
 factor out WorkingTree4._directory_is_tree_reference  | 
565  | 
kind = 'tree-reference'  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
566  | 
return kind  | 
567  | 
||
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
568  | 
    @needs_read_lock
 | 
569  | 
def _last_revision(self):  | 
|
570  | 
"""See Mutable.last_revision."""  | 
|
571  | 
parent_ids = self.current_dirstate().get_parent_ids()  | 
|
572  | 
if parent_ids:  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
573  | 
return parent_ids[0]  | 
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
574  | 
else:  | 
| 
2598.5.10
by Aaron Bentley
 Return NULL_REVISION instead of None for the null revision  | 
575  | 
return _mod_revision.NULL_REVISION  | 
| 
2255.2.21
by Robert Collins
 Add WorkingTree4._last_revision, making workingtree_implementations.test_changes_from pass.  | 
576  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
577  | 
def lock_read(self):  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
578  | 
"""See Branch.lock_read, and WorkingTree.unlock."""  | 
579  | 
self.branch.lock_read()  | 
|
580  | 
try:  | 
|
581  | 
self._control_files.lock_read()  | 
|
582  | 
try:  | 
|
583  | 
state = self.current_dirstate()  | 
|
584  | 
if not state._lock_token:  | 
|
585  | 
state.lock_read()  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
586  | 
                # set our support for tree references from the repository in
 | 
587  | 
                # use.
 | 
|
588  | 
self._repo_supports_tree_reference = getattr(  | 
|
| 
2323.5.16
by Martin Pool
 rename support_tree_reference to supports_  | 
589  | 
self.branch.repository._format, "supports_tree_reference",  | 
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
590  | 
False)  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
591  | 
except:  | 
592  | 
self._control_files.unlock()  | 
|
593  | 
                raise
 | 
|
594  | 
except:  | 
|
595  | 
self.branch.unlock()  | 
|
596  | 
            raise
 | 
|
597  | 
||
598  | 
def _lock_self_write(self):  | 
|
599  | 
"""This should be called after the branch is locked."""  | 
|
600  | 
try:  | 
|
601  | 
self._control_files.lock_write()  | 
|
602  | 
try:  | 
|
603  | 
state = self.current_dirstate()  | 
|
604  | 
if not state._lock_token:  | 
|
605  | 
state.lock_write()  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
606  | 
                # set our support for tree references from the repository in
 | 
607  | 
                # use.
 | 
|
608  | 
self._repo_supports_tree_reference = getattr(  | 
|
| 
2323.5.16
by Martin Pool
 rename support_tree_reference to supports_  | 
609  | 
self.branch.repository._format, "supports_tree_reference",  | 
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
610  | 
False)  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
611  | 
except:  | 
612  | 
self._control_files.unlock()  | 
|
613  | 
                raise
 | 
|
614  | 
except:  | 
|
615  | 
self.branch.unlock()  | 
|
616  | 
            raise
 | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
617  | 
|
618  | 
def lock_tree_write(self):  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
619  | 
"""See MutableTree.lock_tree_write, and WorkingTree.unlock."""  | 
620  | 
self.branch.lock_read()  | 
|
621  | 
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  | 
622  | 
|
623  | 
def lock_write(self):  | 
|
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
624  | 
"""See MutableTree.lock_write, and WorkingTree.unlock."""  | 
625  | 
self.branch.lock_write()  | 
|
626  | 
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  | 
627  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
628  | 
    @needs_tree_write_lock
 | 
| 
2255.2.137
by John Arbash Meinel
 Move the WorkingTree.move() tests into their own module  | 
629  | 
def move(self, from_paths, to_dir, after=False):  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
630  | 
"""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.  | 
631  | 
result = []  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
632  | 
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.  | 
633  | 
return result  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
634  | 
|
635  | 
state = self.current_dirstate()  | 
|
636  | 
||
637  | 
assert not isinstance(from_paths, basestring)  | 
|
638  | 
to_dir_utf8 = to_dir.encode('utf8')  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
639  | 
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  | 
640  | 
id_index = state._get_id_index()  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
641  | 
        # check destination directory
 | 
642  | 
        # get the details for it
 | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
643  | 
to_entry_block_index, to_entry_entry_index, dir_present, entry_present = \  | 
644  | 
state._get_block_entry_index(to_entry_dirname, to_basename, 0)  | 
|
645  | 
if not entry_present:  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
646  | 
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.  | 
647  | 
errors.NotVersionedError(to_dir))  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
648  | 
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.  | 
649  | 
        # get a handle on the block itself.
 | 
650  | 
to_block_index = state._ensure_block(  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
651  | 
to_entry_block_index, to_entry_entry_index, to_dir_utf8)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
652  | 
to_block = state._dirblocks[to_block_index]  | 
653  | 
to_abs = self.abspath(to_dir)  | 
|
654  | 
if not isdir(to_abs):  | 
|
655  | 
raise errors.BzrMoveFailedError('',to_dir,  | 
|
656  | 
errors.NotADirectory(to_abs))  | 
|
657  | 
||
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
658  | 
if to_entry[1][0][0] != 'd':  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
659  | 
raise errors.BzrMoveFailedError('',to_dir,  | 
660  | 
errors.NotADirectory(to_abs))  | 
|
661  | 
||
662  | 
if self._inventory is not None:  | 
|
663  | 
update_inventory = True  | 
|
664  | 
inv = self.inventory  | 
|
| 
3201.2.1
by Lukáš Lalinský
 Make 'mv a b' work for already renamed directories, like it does for files  | 
665  | 
to_dir_id = to_entry[0][2]  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
666  | 
to_dir_ie = inv[to_dir_id]  | 
667  | 
else:  | 
|
668  | 
update_inventory = False  | 
|
669  | 
||
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
670  | 
rollbacks = []  | 
671  | 
def move_one(old_entry, from_path_utf8, minikind, executable,  | 
|
672  | 
fingerprint, packed_stat, size,  | 
|
673  | 
to_block, to_key, to_path_utf8):  | 
|
674  | 
state._make_absent(old_entry)  | 
|
675  | 
from_key = old_entry[0]  | 
|
676  | 
rollbacks.append(  | 
|
677  | 
lambda:state.update_minimal(from_key,  | 
|
678  | 
minikind,  | 
|
679  | 
executable=executable,  | 
|
680  | 
fingerprint=fingerprint,  | 
|
681  | 
packed_stat=packed_stat,  | 
|
682  | 
size=size,  | 
|
683  | 
path_utf8=from_path_utf8))  | 
|
684  | 
state.update_minimal(to_key,  | 
|
685  | 
minikind,  | 
|
686  | 
executable=executable,  | 
|
687  | 
fingerprint=fingerprint,  | 
|
688  | 
packed_stat=packed_stat,  | 
|
689  | 
size=size,  | 
|
690  | 
path_utf8=to_path_utf8)  | 
|
691  | 
added_entry_index, _ = state._find_entry_index(to_key, to_block[1])  | 
|
692  | 
new_entry = to_block[1][added_entry_index]  | 
|
693  | 
rollbacks.append(lambda:state._make_absent(new_entry))  | 
|
694  | 
||
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
695  | 
for from_rel in from_paths:  | 
696  | 
            # from_rel is 'pathinroot/foo/bar'
 | 
|
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
697  | 
from_rel_utf8 = from_rel.encode('utf8')  | 
698  | 
from_dirname, from_tail = osutils.split(from_rel)  | 
|
699  | 
from_dirname, from_tail_utf8 = osutils.split(from_rel_utf8)  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
700  | 
from_entry = self._get_entry(path=from_rel)  | 
701  | 
if from_entry == (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
702  | 
raise errors.BzrMoveFailedError(from_rel,to_dir,  | 
703  | 
errors.NotVersionedError(path=str(from_rel)))  | 
|
704  | 
||
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
705  | 
from_id = from_entry[0][2]  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
706  | 
to_rel = pathjoin(to_dir, from_tail)  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
707  | 
to_rel_utf8 = pathjoin(to_dir_utf8, from_tail_utf8)  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
708  | 
item_to_entry = self._get_entry(path=to_rel)  | 
709  | 
if item_to_entry != (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
710  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
711  | 
"Target is already versioned.")  | 
|
712  | 
||
713  | 
if from_rel == to_rel:  | 
|
714  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
|
715  | 
"Source and target are identical.")  | 
|
716  | 
||
717  | 
from_missing = not self.has_filename(from_rel)  | 
|
718  | 
to_missing = not self.has_filename(to_rel)  | 
|
719  | 
if after:  | 
|
720  | 
move_file = False  | 
|
721  | 
else:  | 
|
722  | 
move_file = True  | 
|
723  | 
if to_missing:  | 
|
724  | 
if not move_file:  | 
|
725  | 
raise errors.BzrMoveFailedError(from_rel, to_rel,  | 
|
726  | 
errors.NoSuchFile(path=to_rel,  | 
|
727  | 
extra="New file has not been created yet"))  | 
|
728  | 
elif from_missing:  | 
|
729  | 
                    # neither path exists
 | 
|
730  | 
raise errors.BzrRenameFailedError(from_rel, to_rel,  | 
|
731  | 
errors.PathsDoNotExist(paths=(from_rel, to_rel)))  | 
|
732  | 
else:  | 
|
733  | 
if from_missing: # implicitly just update our path mapping  | 
|
734  | 
move_file = False  | 
|
| 
2255.2.139
by John Arbash Meinel
 test cases for moving after a file has already been moved.  | 
735  | 
elif not after:  | 
| 
2967.3.6
by Daniel Watkins
 Extracted the string from every use of RenameFailedFilesExist to RenameFailedFilesExist itself.  | 
736  | 
raise errors.RenameFailedFilesExist(from_rel, to_rel)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
737  | 
|
738  | 
rollbacks = []  | 
|
739  | 
def rollback_rename():  | 
|
740  | 
"""A single rename has failed, roll it back."""  | 
|
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
741  | 
                # roll back everything, even if we encounter trouble doing one
 | 
742  | 
                # of them.
 | 
|
743  | 
                #
 | 
|
744  | 
                # TODO: at least log the other exceptions rather than just
 | 
|
745  | 
                # losing them mbp 20070307
 | 
|
| 
2255.2.138
by John Arbash Meinel
 implement several new WorkingTree.move() tests  | 
746  | 
exc_info = None  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
747  | 
for rollback in reversed(rollbacks):  | 
748  | 
try:  | 
|
749  | 
rollback()  | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
750  | 
except Exception, e:  | 
| 
2255.2.138
by John Arbash Meinel
 implement several new WorkingTree.move() tests  | 
751  | 
exc_info = sys.exc_info()  | 
752  | 
if exc_info:  | 
|
753  | 
raise exc_info[0], exc_info[1], exc_info[2]  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
754  | 
|
755  | 
            # 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.  | 
756  | 
if move_file:  | 
757  | 
from_rel_abs = self.abspath(from_rel)  | 
|
758  | 
to_rel_abs = self.abspath(to_rel)  | 
|
759  | 
try:  | 
|
760  | 
osutils.rename(from_rel_abs, to_rel_abs)  | 
|
761  | 
except OSError, e:  | 
|
762  | 
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  | 
763  | 
rollbacks.append(lambda: osutils.rename(to_rel_abs, from_rel_abs))  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
764  | 
try:  | 
765  | 
                # perform the rename in the inventory next if needed: its easy
 | 
|
766  | 
                # to rollback
 | 
|
767  | 
if update_inventory:  | 
|
768  | 
                    # rename the entry
 | 
|
769  | 
from_entry = inv[from_id]  | 
|
770  | 
current_parent = from_entry.parent_id  | 
|
771  | 
inv.rename(from_id, to_dir_id, from_tail)  | 
|
772  | 
rollbacks.append(  | 
|
773  | 
lambda: inv.rename(from_id, current_parent, from_tail))  | 
|
774  | 
                # finally do the rename in the dirstate, which is a little
 | 
|
775  | 
                # tricky to rollback, but least likely to need it.
 | 
|
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
776  | 
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  | 
777  | 
state._get_block_entry_index(from_dirname, from_tail_utf8, 0)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
778  | 
old_block = state._dirblocks[old_block_index][1]  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
779  | 
old_entry = old_block[old_entry_index]  | 
780  | 
from_key, old_entry_details = old_entry  | 
|
781  | 
cur_details = old_entry_details[0]  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
782  | 
                # remove the old row
 | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
783  | 
to_key = ((to_block[0],) + from_key[1:3])  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
784  | 
minikind = cur_details[0]  | 
785  | 
move_one(old_entry, from_path_utf8=from_rel_utf8,  | 
|
786  | 
minikind=minikind,  | 
|
787  | 
executable=cur_details[3],  | 
|
788  | 
fingerprint=cur_details[1],  | 
|
789  | 
packed_stat=cur_details[4],  | 
|
790  | 
size=cur_details[2],  | 
|
791  | 
to_block=to_block,  | 
|
792  | 
to_key=to_key,  | 
|
793  | 
to_path_utf8=to_rel_utf8)  | 
|
794  | 
||
795  | 
if minikind == 'd':  | 
|
796  | 
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.  | 
797  | 
"""Recursively update all entries in this dirblock."""  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
798  | 
assert from_dir != '', "renaming root not supported"  | 
799  | 
from_key = (from_dir, '')  | 
|
800  | 
from_block_idx, present = \  | 
|
801  | 
state._find_block_index_from_key(from_key)  | 
|
802  | 
if not present:  | 
|
803  | 
                            # This is the old record, if it isn't present, then
 | 
|
804  | 
                            # there is theoretically nothing to update.
 | 
|
805  | 
                            # (Unless it isn't present because of lazy loading,
 | 
|
806  | 
                            # but we don't do that yet)
 | 
|
807  | 
                            return
 | 
|
808  | 
from_block = state._dirblocks[from_block_idx]  | 
|
809  | 
to_block_index, to_entry_index, _, _ = \  | 
|
810  | 
state._get_block_entry_index(to_key[0], to_key[1], 0)  | 
|
811  | 
to_block_index = state._ensure_block(  | 
|
812  | 
to_block_index, to_entry_index, to_dir_utf8)  | 
|
813  | 
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.  | 
814  | 
|
815  | 
                        # Grab a copy since move_one may update the list.
 | 
|
816  | 
for entry in from_block[1][:]:  | 
|
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
817  | 
assert entry[0][0] == from_dir  | 
818  | 
cur_details = entry[1][0]  | 
|
819  | 
to_key = (to_dir_utf8, entry[0][1], entry[0][2])  | 
|
820  | 
from_path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
|
821  | 
to_path_utf8 = osutils.pathjoin(to_dir_utf8, entry[0][1])  | 
|
822  | 
minikind = cur_details[0]  | 
|
| 
2438.1.10
by John Arbash Meinel
 Make WT4.move() properly handle moving a directory with a renamed child.  | 
823  | 
if minikind in 'ar':  | 
| 
2438.1.8
by John Arbash Meinel
 Fix the case when renaming a directory with deleted children.  | 
824  | 
                                # Deleted children of a renamed directory
 | 
825  | 
                                # 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.  | 
826  | 
                                # Children that have been renamed out of this
 | 
827  | 
                                # directory should also not be updated
 | 
|
| 
2438.1.8
by John Arbash Meinel
 Fix the case when renaming a directory with deleted children.  | 
828  | 
                                continue
 | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
829  | 
move_one(entry, from_path_utf8=from_path_utf8,  | 
830  | 
minikind=minikind,  | 
|
831  | 
executable=cur_details[3],  | 
|
832  | 
fingerprint=cur_details[1],  | 
|
833  | 
packed_stat=cur_details[4],  | 
|
834  | 
size=cur_details[2],  | 
|
835  | 
to_block=to_block,  | 
|
836  | 
to_key=to_key,  | 
|
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
837  | 
to_path_utf8=to_path_utf8)  | 
| 
2255.2.146
by John Arbash Meinel
 Implement move_directory by factoring out move_one  | 
838  | 
if minikind == 'd':  | 
839  | 
                                # We need to move all the children of this
 | 
|
840  | 
                                # entry
 | 
|
841  | 
update_dirblock(from_path_utf8, to_key,  | 
|
842  | 
to_path_utf8)  | 
|
843  | 
update_dirblock(from_rel_utf8, to_key, to_rel_utf8)  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
844  | 
except:  | 
845  | 
rollback_rename()  | 
|
846  | 
                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.  | 
847  | 
result.append((from_rel, to_rel))  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
848  | 
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.  | 
849  | 
self._make_dirty(reset_inventory=False)  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
850  | 
|
| 
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.  | 
851  | 
return result  | 
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
852  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
853  | 
def _must_be_locked(self):  | 
854  | 
if not self._control_files._lock_count:  | 
|
855  | 
raise errors.ObjectNotLocked(self)  | 
|
856  | 
||
| 
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.  | 
857  | 
def _new_tree(self):  | 
858  | 
"""Initialize the state in this tree to be a new tree."""  | 
|
859  | 
self._dirty = True  | 
|
860  | 
||
861  | 
    @needs_read_lock
 | 
|
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
862  | 
def path2id(self, path):  | 
863  | 
"""Return the id for path in this tree."""  | 
|
| 
2255.7.56
by Robert Collins
 Document behaviour of tree.path2id("path/").  | 
864  | 
path = path.strip('/')  | 
| 
2255.2.88
by Robert Collins
 Significant steps back to operation.  | 
865  | 
entry = self._get_entry(path=path)  | 
866  | 
if entry == (None, None):  | 
|
| 
2255.2.59
by Robert Collins
 All WorkingTree4 and dirstate tests passing.  | 
867  | 
return None  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
868  | 
return entry[0][2]  | 
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
869  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
870  | 
def paths2ids(self, paths, trees=[], require_versioned=True):  | 
871  | 
"""See Tree.paths2ids().  | 
|
| 
2255.7.24
by John Arbash Meinel
 Rework cmd_inventory so that it uses paths2ids and locks the trees for read.  | 
872  | 
|
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
873  | 
        This specialisation fast-paths the case where all the trees are in the
 | 
874  | 
        dirstate.
 | 
|
875  | 
        """
 | 
|
876  | 
if paths is None:  | 
|
877  | 
return None  | 
|
878  | 
parents = self.get_parent_ids()  | 
|
879  | 
for tree in trees:  | 
|
880  | 
if not (isinstance(tree, DirStateRevisionTree) and tree._revision_id in  | 
|
881  | 
parents):  | 
|
882  | 
return super(WorkingTree4, self).paths2ids(paths, trees, require_versioned)  | 
|
883  | 
search_indexes = [0] + [1 + parents.index(tree._revision_id) for tree in trees]  | 
|
884  | 
        # -- make all paths utf8 --
 | 
|
885  | 
paths_utf8 = set()  | 
|
886  | 
for path in paths:  | 
|
887  | 
paths_utf8.add(path.encode('utf8'))  | 
|
888  | 
paths = paths_utf8  | 
|
889  | 
        # -- paths is now a utf8 path set --
 | 
|
890  | 
        # -- get the state object and prepare it.
 | 
|
891  | 
state = self.current_dirstate()  | 
|
| 
2255.2.133
by John Arbash Meinel
 Implement _paths2ids using bisect recursive rather than loading  | 
892  | 
if False and (state._dirblock_state == dirstate.DirState.NOT_IN_MEMORY  | 
893  | 
and '' not in paths):  | 
|
894  | 
paths2ids = self._paths2ids_using_bisect  | 
|
895  | 
else:  | 
|
896  | 
paths2ids = self._paths2ids_in_memory  | 
|
897  | 
return paths2ids(paths, search_indexes,  | 
|
898  | 
require_versioned=require_versioned)  | 
|
899  | 
||
900  | 
def _paths2ids_in_memory(self, paths, search_indexes,  | 
|
901  | 
require_versioned=True):  | 
|
902  | 
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.  | 
903  | 
state._read_dirblocks_if_needed()  | 
904  | 
def _entries_for_path(path):  | 
|
905  | 
"""Return a list with all the entries that match path for all ids.  | 
|
906  | 
            """
 | 
|
907  | 
dirname, basename = os.path.split(path)  | 
|
908  | 
key = (dirname, basename, '')  | 
|
909  | 
block_index, present = state._find_block_index_from_key(key)  | 
|
910  | 
if not present:  | 
|
911  | 
                # the block which should contain path is absent.
 | 
|
912  | 
return []  | 
|
913  | 
result = []  | 
|
914  | 
block = state._dirblocks[block_index][1]  | 
|
915  | 
entry_index, _ = state._find_entry_index(key, block)  | 
|
916  | 
            # we may need to look at multiple entries at this path: walk while the paths match.
 | 
|
917  | 
while (entry_index < len(block) and  | 
|
918  | 
block[entry_index][0][0:2] == key[0:2]):  | 
|
919  | 
result.append(block[entry_index])  | 
|
920  | 
entry_index += 1  | 
|
921  | 
return result  | 
|
922  | 
if require_versioned:  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
923  | 
            # -- 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.  | 
924  | 
all_versioned = True  | 
925  | 
for path in paths:  | 
|
926  | 
path_entries = _entries_for_path(path)  | 
|
927  | 
if not path_entries:  | 
|
928  | 
                    # this specified path is not present at all: error
 | 
|
929  | 
all_versioned = False  | 
|
930  | 
                    break
 | 
|
931  | 
found_versioned = False  | 
|
932  | 
                # for each id at this path
 | 
|
933  | 
for entry in path_entries:  | 
|
934  | 
                    # for each tree.
 | 
|
935  | 
for index in search_indexes:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
936  | 
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.  | 
937  | 
found_versioned = True  | 
938  | 
                            # all good: found a versioned cell
 | 
|
939  | 
                            break
 | 
|
940  | 
if not found_versioned:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
941  | 
                    # 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.  | 
942  | 
                    # path.
 | 
943  | 
all_versioned = False  | 
|
944  | 
                    break
 | 
|
945  | 
if not all_versioned:  | 
|
946  | 
raise errors.PathsNotVersionedError(paths)  | 
|
947  | 
        # -- 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  | 
948  | 
search_paths = osutils.minimum_path_selection(paths)  | 
| 
2255.2.104
by Robert Collins
 Add WorkingTree4.paths2ids which is inventory-usage free if the trees being examined are in the dirstate.  | 
949  | 
        # sketch: 
 | 
950  | 
        # for all search_indexs in each path at or under each element of
 | 
|
951  | 
        # search_paths, if the detail is relocated: add the id, and add the
 | 
|
952  | 
        # relocated path as one to search if its not searched already. If the
 | 
|
953  | 
        # detail is not relocated, add the id.
 | 
|
954  | 
searched_paths = set()  | 
|
955  | 
found_ids = set()  | 
|
956  | 
def _process_entry(entry):  | 
|
957  | 
"""Look at search_indexes within entry.  | 
|
958  | 
||
959  | 
            If a specific tree's details are relocated, add the relocation
 | 
|
960  | 
            target to search_paths if not searched already. If it is absent, do
 | 
|
961  | 
            nothing. Otherwise add the id to found_ids.
 | 
|
962  | 
            """
 | 
|
963  | 
for index in search_indexes:  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
964  | 
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.  | 
965  | 
if not osutils.is_inside_any(searched_paths, entry[1][index][1]):  | 
966  | 
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  | 
967  | 
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.  | 
968  | 
found_ids.add(entry[0][2])  | 
969  | 
while search_paths:  | 
|
970  | 
current_root = search_paths.pop()  | 
|
971  | 
searched_paths.add(current_root)  | 
|
972  | 
            # process the entries for this containing directory: the rest will be
 | 
|
973  | 
            # found by their parents recursively.
 | 
|
974  | 
root_entries = _entries_for_path(current_root)  | 
|
975  | 
if not root_entries:  | 
|
976  | 
                # this specified path is not present at all, skip it.
 | 
|
977  | 
                continue
 | 
|
978  | 
for entry in root_entries:  | 
|
979  | 
_process_entry(entry)  | 
|
980  | 
initial_key = (current_root, '', '')  | 
|
981  | 
block_index, _ = state._find_block_index_from_key(initial_key)  | 
|
982  | 
while (block_index < len(state._dirblocks) and  | 
|
983  | 
osutils.is_inside(current_root, state._dirblocks[block_index][0])):  | 
|
984  | 
for entry in state._dirblocks[block_index][1]:  | 
|
985  | 
_process_entry(entry)  | 
|
986  | 
block_index += 1  | 
|
987  | 
return found_ids  | 
|
988  | 
||
| 
2255.2.133
by John Arbash Meinel
 Implement _paths2ids using bisect recursive rather than loading  | 
989  | 
def _paths2ids_using_bisect(self, paths, search_indexes,  | 
990  | 
require_versioned=True):  | 
|
991  | 
state = self.current_dirstate()  | 
|
992  | 
found_ids = set()  | 
|
993  | 
||
994  | 
split_paths = sorted(osutils.split(p) for p in paths)  | 
|
995  | 
found = state._bisect_recursive(split_paths)  | 
|
996  | 
||
997  | 
if require_versioned:  | 
|
998  | 
found_dir_names = set(dir_name_id[:2] for dir_name_id in found)  | 
|
999  | 
for dir_name in split_paths:  | 
|
1000  | 
if dir_name not in found_dir_names:  | 
|
1001  | 
raise errors.PathsNotVersionedError(paths)  | 
|
1002  | 
||
1003  | 
for dir_name_id, trees_info in found.iteritems():  | 
|
1004  | 
for index in search_indexes:  | 
|
1005  | 
if trees_info[index][0] not in ('r', 'a'):  | 
|
1006  | 
found_ids.add(dir_name_id[2])  | 
|
1007  | 
return found_ids  | 
|
1008  | 
||
| 
2255.2.45
by Robert Collins
 Dirstate - fix revision_tree() behaviour to match the interface contract.  | 
1009  | 
def read_working_inventory(self):  | 
1010  | 
"""Read the working inventory.  | 
|
1011  | 
        
 | 
|
1012  | 
        This is a meaningless operation for dirstate, but we obey it anyhow.
 | 
|
1013  | 
        """
 | 
|
1014  | 
return self.inventory  | 
|
1015  | 
||
| 
2255.2.17
by Robert Collins
 tweaks - finishes off all the test_test_trees tests for dirstate.  | 
1016  | 
    @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.  | 
1017  | 
def revision_tree(self, revision_id):  | 
1018  | 
"""See Tree.revision_tree.  | 
|
1019  | 
||
1020  | 
        WorkingTree4 supplies revision_trees for any basis tree.
 | 
|
1021  | 
        """
 | 
|
1022  | 
dirstate = self.current_dirstate()  | 
|
1023  | 
parent_ids = dirstate.get_parent_ids()  | 
|
1024  | 
if revision_id not in parent_ids:  | 
|
1025  | 
raise errors.NoSuchRevisionInTree(self, revision_id)  | 
|
| 
2255.2.45
by Robert Collins
 Dirstate - fix revision_tree() behaviour to match the interface contract.  | 
1026  | 
if revision_id in dirstate.get_ghosts():  | 
1027  | 
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.  | 
1028  | 
return DirStateRevisionTree(dirstate, revision_id,  | 
1029  | 
self.branch.repository)  | 
|
1030  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1031  | 
    @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.  | 
1032  | 
def set_last_revision(self, new_revision):  | 
1033  | 
"""Change the last revision in the working tree."""  | 
|
1034  | 
parents = self.get_parent_ids()  | 
|
1035  | 
if new_revision in (NULL_REVISION, None):  | 
|
| 
2255.2.56
by Robert Collins
 Dirstate: bring set_last_revision into line with the tested API.  | 
1036  | 
assert len(parents) < 2, (  | 
| 
2255.2.37
by Robert Collins
 Get TestExecutable.test_06_pull working on DirState: fix cloning and the set_last_revision api on WorkingTree4.  | 
1037  | 
                "setting the last parent to none with a pending merge is "
 | 
1038  | 
"unsupported.")  | 
|
1039  | 
self.set_parent_ids([])  | 
|
1040  | 
else:  | 
|
| 
2255.2.56
by Robert Collins
 Dirstate: bring set_last_revision into line with the tested API.  | 
1041  | 
self.set_parent_ids([new_revision] + parents[1:],  | 
1042  | 
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.  | 
1043  | 
|
1044  | 
    @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.  | 
1045  | 
def set_parent_ids(self, revision_ids, allow_leftmost_as_ghost=False):  | 
1046  | 
"""Set the parent ids to revision_ids.  | 
|
1047  | 
        
 | 
|
1048  | 
        See also set_parent_trees. This api will try to retrieve the tree data
 | 
|
1049  | 
        for each element of revision_ids from the trees repository. If you have
 | 
|
1050  | 
        tree data already available, it is more efficient to use
 | 
|
1051  | 
        set_parent_trees rather than set_parent_ids. set_parent_ids is however
 | 
|
1052  | 
        an easier API to use.
 | 
|
1053  | 
||
1054  | 
        :param revision_ids: The revision_ids to set as the parent ids of this
 | 
|
1055  | 
            working tree. Any of these may be ghosts.
 | 
|
1056  | 
        """
 | 
|
1057  | 
trees = []  | 
|
1058  | 
for revision_id in revision_ids:  | 
|
1059  | 
try:  | 
|
1060  | 
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  | 
1061  | 
                # TODO: jam 20070213 KnitVersionedFile raises
 | 
1062  | 
                #       RevisionNotPresent rather than NoSuchRevision if a
 | 
|
1063  | 
                #       given revision_id is not present. Should Repository be
 | 
|
1064  | 
                #       catching it and re-raising NoSuchRevision?
 | 
|
1065  | 
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.  | 
1066  | 
revtree = None  | 
1067  | 
trees.append((revision_id, revtree))  | 
|
1068  | 
self.set_parent_trees(trees,  | 
|
1069  | 
allow_leftmost_as_ghost=allow_leftmost_as_ghost)  | 
|
1070  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1071  | 
    @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.  | 
1072  | 
def set_parent_trees(self, parents_list, allow_leftmost_as_ghost=False):  | 
1073  | 
"""Set the parents of the working tree.  | 
|
1074  | 
||
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1075  | 
        :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.  | 
1076  | 
            If tree is None, then that element is treated as an unreachable
 | 
1077  | 
            parent tree - i.e. a ghost.
 | 
|
1078  | 
        """
 | 
|
1079  | 
dirstate = self.current_dirstate()  | 
|
1080  | 
if len(parents_list) > 0:  | 
|
1081  | 
if not allow_leftmost_as_ghost and parents_list[0][1] is None:  | 
|
| 
2255.2.42
by Robert Collins
 Fix WorkingTree4.set_parent_trees.  | 
1082  | 
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.  | 
1083  | 
real_trees = []  | 
1084  | 
ghosts = []  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1085  | 
        # 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.  | 
1086  | 
        # missing on access.
 | 
1087  | 
for rev_id, tree in parents_list:  | 
|
| 
2598.5.2
by Aaron Bentley
 Got all tests passing with Branch returning 'null:' for null revision  | 
1088  | 
_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.  | 
1089  | 
if tree is not None:  | 
1090  | 
real_trees.append((rev_id, tree))  | 
|
1091  | 
else:  | 
|
1092  | 
real_trees.append((rev_id,  | 
|
1093  | 
self.branch.repository.revision_tree(None)))  | 
|
1094  | 
ghosts.append(rev_id)  | 
|
1095  | 
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.  | 
1096  | 
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.  | 
1097  | 
|
| 
2255.2.15
by Robert Collins
 Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.  | 
1098  | 
def _set_root_id(self, file_id):  | 
1099  | 
"""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.  | 
1100  | 
state = self.current_dirstate()  | 
1101  | 
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.  | 
1102  | 
if state._dirblock_state == dirstate.DirState.IN_MEMORY_MODIFIED:  | 
1103  | 
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.  | 
1104  | 
|
| 
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.  | 
1105  | 
def _sha_from_stat(self, path, stat_result):  | 
1106  | 
"""Get a sha digest from the tree's stat cache.  | 
|
1107  | 
||
1108  | 
        The default implementation assumes no stat cache is present.
 | 
|
1109  | 
||
1110  | 
        :param path: The path.
 | 
|
1111  | 
        :param stat_result: The stat result being looked up.
 | 
|
1112  | 
        """
 | 
|
| 
2929.1.1
by Robert Collins
 Use a dict to access stat cache information from dirstate.  | 
1113  | 
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.  | 
1114  | 
|
| 
2255.2.232
by Robert Collins
 Make WorkingTree4 report support for references based on the repositories capabilities.  | 
1115  | 
    @needs_read_lock
 | 
1116  | 
def supports_tree_reference(self):  | 
|
1117  | 
return self._repo_supports_tree_reference  | 
|
1118  | 
||
| 
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.  | 
1119  | 
def unlock(self):  | 
1120  | 
"""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.  | 
1121  | 
        # do non-implementation specific cleanup
 | 
1122  | 
self._cleanup()  | 
|
1123  | 
||
| 
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.  | 
1124  | 
if self._control_files._lock_count == 1:  | 
1125  | 
            # eventually we should do signature checking during read locks for
 | 
|
1126  | 
            # dirstate updates.
 | 
|
1127  | 
if self._control_files._lock_mode == 'w':  | 
|
1128  | 
if self._dirty:  | 
|
1129  | 
self.flush()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1130  | 
if self._dirstate is not None:  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
1131  | 
                # This is a no-op if there are no modifications.
 | 
1132  | 
self._dirstate.save()  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1133  | 
self._dirstate.unlock()  | 
| 
2255.10.2
by John Arbash Meinel
 Update to dirstate locking.  | 
1134  | 
            # TODO: jam 20070301 We shouldn't have to wipe the dirstate at this
 | 
1135  | 
            #       point. Instead, it could check if the header has been
 | 
|
1136  | 
            #       modified when it is locked, and if not, it can hang on to
 | 
|
1137  | 
            #       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.  | 
1138  | 
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.  | 
1139  | 
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.  | 
1140  | 
        # reverse order of locking.
 | 
1141  | 
try:  | 
|
1142  | 
return self._control_files.unlock()  | 
|
1143  | 
finally:  | 
|
1144  | 
self.branch.unlock()  | 
|
1145  | 
||
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1146  | 
    @needs_tree_write_lock
 | 
1147  | 
def unversion(self, file_ids):  | 
|
1148  | 
"""Remove the file ids in file_ids from the current versioned set.  | 
|
1149  | 
||
1150  | 
        When a file_id is unversioned, all of its children are automatically
 | 
|
1151  | 
        unversioned.
 | 
|
1152  | 
||
1153  | 
        :param file_ids: The file ids to stop versioning.
 | 
|
1154  | 
        :raises: NoSuchId if any fileid is not currently versioned.
 | 
|
1155  | 
        """
 | 
|
1156  | 
if not file_ids:  | 
|
1157  | 
            return
 | 
|
1158  | 
state = self.current_dirstate()  | 
|
1159  | 
state._read_dirblocks_if_needed()  | 
|
| 
2858.2.1
by Martin Pool
 Remove most calls to safe_file_id and safe_revision_id.  | 
1160  | 
ids_to_unversion = set(file_ids)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1161  | 
paths_to_unversion = set()  | 
1162  | 
        # sketch:
 | 
|
1163  | 
        # 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.  | 
1164  | 
        # walk the state marking unversioned things as absent.
 | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1165  | 
        # if there are any un-unversioned ids at the end, raise
 | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1166  | 
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  | 
1167  | 
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.  | 
1168  | 
key[2] in ids_to_unversion):  | 
1169  | 
                # I haven't written the code to unversion / yet - it should be
 | 
|
1170  | 
                # supported.
 | 
|
1171  | 
raise errors.BzrError('Unversioning the / is not currently supported')  | 
|
1172  | 
block_index = 0  | 
|
1173  | 
while block_index < len(state._dirblocks):  | 
|
1174  | 
            # process one directory at a time.
 | 
|
1175  | 
block = state._dirblocks[block_index]  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1176  | 
            # first check: is the path one to remove - it or its children
 | 
1177  | 
delete_block = False  | 
|
1178  | 
for path in paths_to_unversion:  | 
|
1179  | 
if (block[0].startswith(path) and  | 
|
1180  | 
(len(block[0]) == len(path) or  | 
|
1181  | 
block[0][len(path)] == '/')):  | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1182  | 
                    # this entire block should be deleted - its the block for a
 | 
1183  | 
                    # path to unversion; or the child of one
 | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1184  | 
delete_block = True  | 
1185  | 
                    break
 | 
|
1186  | 
            # TODO: trim paths_to_unversion as we pass by paths
 | 
|
1187  | 
if delete_block:  | 
|
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1188  | 
                # this block is to be deleted: process it.
 | 
1189  | 
                # TODO: we can special case the no-parents case and
 | 
|
1190  | 
                # just forget the whole block.
 | 
|
1191  | 
entry_index = 0  | 
|
1192  | 
while entry_index < len(block[1]):  | 
|
| 
2255.7.41
by John Arbash Meinel
 WorkingTree.unversion() should not raise if unversioning a child and a parent.  | 
1193  | 
                    # Mark this file id as having been removed
 | 
| 
2363.2.3
by John Arbash Meinel
 Just check if the entry is absent before calling _make_absent.  | 
1194  | 
entry = block[1][entry_index]  | 
1195  | 
ids_to_unversion.discard(entry[0][2])  | 
|
| 
2922.2.4
by John Arbash Meinel
 Fix bug #114615 by teaching unversion() to not touch renamed entries.  | 
1196  | 
if (entry[1][0][0] in 'ar' # don't remove absent or renamed  | 
1197  | 
                                               # entries
 | 
|
| 
2363.2.3
by John Arbash Meinel
 Just check if the entry is absent before calling _make_absent.  | 
1198  | 
or not state._make_absent(entry)):  | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1199  | 
entry_index += 1  | 
1200  | 
                # go to the next block. (At the moment we dont delete empty
 | 
|
1201  | 
                # dirblocks)
 | 
|
1202  | 
block_index += 1  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1203  | 
                continue
 | 
| 
2255.2.93
by Robert Collins
 Dirstate - update WorkingTree4.unversion to the new layout, other tests still borked.  | 
1204  | 
entry_index = 0  | 
1205  | 
while entry_index < len(block[1]):  | 
|
1206  | 
entry = block[1][entry_index]  | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1207  | 
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.  | 
1208  | 
                    # ^ some parent row.
 | 
1209  | 
entry[0][2] not in ids_to_unversion):  | 
|
1210  | 
                    # ^ not an id to unversion
 | 
|
1211  | 
entry_index += 1  | 
|
1212  | 
                    continue
 | 
|
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1213  | 
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.  | 
1214  | 
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.  | 
1215  | 
if not state._make_absent(entry):  | 
1216  | 
entry_index += 1  | 
|
1217  | 
                # we have unversioned this id
 | 
|
1218  | 
ids_to_unversion.remove(entry[0][2])  | 
|
1219  | 
block_index += 1  | 
|
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1220  | 
if ids_to_unversion:  | 
1221  | 
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.  | 
1222  | 
self._make_dirty(reset_inventory=False)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1223  | 
        # have to change the legacy inventory too.
 | 
1224  | 
if self._inventory is not None:  | 
|
1225  | 
for file_id in file_ids:  | 
|
| 
2255.2.33
by Robert Collins
 Correct thunko in refactoring a few commits back.  | 
1226  | 
self._inventory.remove_recursive_id(file_id)  | 
| 
2255.2.22
by Robert Collins
 Dirstate: implement WorkingTree4.unversion, letting some test_commit tests pass.  | 
1227  | 
|
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1228  | 
    @needs_tree_write_lock
 | 
| 
3146.8.12
by Aaron Bentley
 Add a flush to rename_one  | 
1229  | 
def rename_one(self, from_rel, to_rel, after=False):  | 
1230  | 
"""See WorkingTree.rename_one"""  | 
|
1231  | 
self.flush()  | 
|
1232  | 
WorkingTree.rename_one(self, from_rel, to_rel, after)  | 
|
1233  | 
||
1234  | 
    @needs_tree_write_lock
 | 
|
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1235  | 
def apply_inventory_delta(self, changes):  | 
1236  | 
"""See MutableTree.apply_inventory_delta"""  | 
|
| 
3146.8.11
by Aaron Bentley
 Fix dirstate/inventory dance, mark dirstate modified and in memory  | 
1237  | 
state = self.current_dirstate()  | 
| 
3146.8.15
by Aaron Bentley
 Cleanup and docs  | 
1238  | 
state.update_by_delta(changes)  | 
| 
3146.8.11
by Aaron Bentley
 Fix dirstate/inventory dance, mark dirstate modified and in memory  | 
1239  | 
self._make_dirty(reset_inventory=True)  | 
| 
3146.8.5
by Aaron Bentley
 Get apply_inventory_delta kinda working, but not children  | 
1240  | 
|
| 
2929.2.1
by Robert Collins
 * Commit updates the state of the working tree via a delta rather than  | 
1241  | 
def update_basis_by_delta(self, new_revid, delta):  | 
1242  | 
"""See MutableTree.update_basis_by_delta."""  | 
|
1243  | 
assert self.last_revision() != new_revid  | 
|
1244  | 
self.current_dirstate().update_basis_by_delta(delta, new_revid)  | 
|
1245  | 
||
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
1246  | 
    @needs_read_lock
 | 
1247  | 
def _validate(self):  | 
|
1248  | 
self._dirstate._validate()  | 
|
1249  | 
||
| 
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.  | 
1250  | 
    @needs_tree_write_lock
 | 
1251  | 
def _write_inventory(self, inv):  | 
|
1252  | 
"""Write inventory as the current inventory."""  | 
|
| 
2929.2.1
by Robert Collins
 * Commit updates the state of the working tree via a delta rather than  | 
1253  | 
assert not self._dirty, ("attempting to write an inventory when the "  | 
1254  | 
"dirstate is dirty will cause data loss")  | 
|
| 
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.  | 
1255  | 
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.  | 
1256  | 
self._make_dirty(reset_inventory=False)  | 
1257  | 
if self._inventory is not None:  | 
|
1258  | 
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.  | 
1259  | 
self.flush()  | 
1260  | 
||
| 
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.  | 
1261  | 
|
1262  | 
class WorkingTreeFormat4(WorkingTreeFormat3):  | 
|
1263  | 
"""The first consolidated dirstate working tree format.  | 
|
1264  | 
||
1265  | 
    This format:
 | 
|
1266  | 
        - exists within a metadir controlling .bzr
 | 
|
1267  | 
        - includes an explicit version marker for the workingtree control
 | 
|
1268  | 
          files, separate from the BzrDir format
 | 
|
1269  | 
        - modifies the hash cache format
 | 
|
| 
2255.2.230
by Robert Collins
 Update tree format signatures to mention introducing bzr version.  | 
1270  | 
        - is new in bzr 0.15
 | 
| 
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.  | 
1271  | 
        - uses a LockDir to guard access to it.
 | 
1272  | 
    """
 | 
|
1273  | 
||
| 
2323.6.4
by Martin Pool
 BzrDir._check_supported now also takes care of recommending upgrades, which  | 
1274  | 
upgrade_recommended = False  | 
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  | 
def get_format_string(self):  | 
1277  | 
"""See WorkingTreeFormat.get_format_string()."""  | 
|
| 
2255.2.230
by Robert Collins
 Update tree format signatures to mention introducing bzr version.  | 
1278  | 
return "Bazaar Working Tree Format 4 (bzr 0.15)\n"  | 
| 
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.  | 
1279  | 
|
1280  | 
def get_format_description(self):  | 
|
1281  | 
"""See WorkingTreeFormat.get_format_description()."""  | 
|
1282  | 
return "Working tree format 4"  | 
|
1283  | 
||
| 
3123.5.2
by Aaron Bentley
 Allow checkout --files_from  | 
1284  | 
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  | 
1285  | 
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.  | 
1286  | 
"""See WorkingTreeFormat.initialize().  | 
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1287  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1288  | 
        :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.  | 
1289  | 
        revision than the branch is at.
 | 
| 
3123.5.17
by Aaron Bentley
 Update docs  | 
1290  | 
        :param accelerator_tree: A tree which can be used for retrieving file
 | 
1291  | 
            contents more quickly than the revision tree, i.e. a workingtree.
 | 
|
1292  | 
            The revision tree will be used for cases where accelerator_tree's
 | 
|
1293  | 
            content is different.
 | 
|
| 
3136.1.3
by Aaron Bentley
 Implement hard-link support for branch and checkout  | 
1294  | 
        :param hardlink: If true, hard-link files from accelerator_tree,
 | 
1295  | 
            where possible.
 | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1296  | 
|
| 
1551.15.6
by Aaron Bentley
 Use ROOT_ID when the repository supports old clients (Bug #107168)  | 
1297  | 
        These trees get an initial random root id, if their repository supports
 | 
1298  | 
        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.  | 
1299  | 
        """
 | 
1300  | 
if not isinstance(a_bzrdir.transport, LocalTransport):  | 
|
1301  | 
raise errors.NotLocalUrl(a_bzrdir.transport.base)  | 
|
1302  | 
transport = a_bzrdir.get_workingtree_transport(self)  | 
|
1303  | 
control_files = self._open_control_files(a_bzrdir)  | 
|
1304  | 
control_files.create_lock()  | 
|
1305  | 
control_files.lock_write()  | 
|
1306  | 
control_files.put_utf8('format', self.get_format_string())  | 
|
| 
2955.5.3
by Vincent Ladeuil
 Fix second unwanted connection by providing the right branch to create_checkout.  | 
1307  | 
if from_branch is not None:  | 
1308  | 
branch = from_branch  | 
|
1309  | 
else:  | 
|
1310  | 
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.  | 
1311  | 
if revision_id is None:  | 
1312  | 
revision_id = branch.last_revision()  | 
|
1313  | 
local_path = transport.local_abspath('dirstate')  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1314  | 
        # 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  | 
1315  | 
state = dirstate.DirState.initialize(local_path)  | 
1316  | 
state.unlock()  | 
|
| 
2371.2.1
by John Arbash Meinel
 Update DirState._validate() to detect rename errors.  | 
1317  | 
del state  | 
| 
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.  | 
1318  | 
wt = WorkingTree4(a_bzrdir.root_transport.local_abspath('.'),  | 
1319  | 
branch,  | 
|
1320  | 
_format=self,  | 
|
1321  | 
_bzrdir=a_bzrdir,  | 
|
1322  | 
_control_files=control_files)  | 
|
1323  | 
wt._new_tree()  | 
|
| 
2255.7.42
by Robert Collins
 WorkingTree4 only needs a tree write lock during initialize, not a deep write lock.  | 
1324  | 
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.  | 
1325  | 
try:  | 
| 
2255.2.167
by Martin Pool
 Change WorkingTree4.initialize to only get a random root id if not based on a revisiontree  | 
1326  | 
if revision_id in (None, NULL_REVISION):  | 
| 
1551.15.6
by Aaron Bentley
 Use ROOT_ID when the repository supports old clients (Bug #107168)  | 
1327  | 
if branch.repository.supports_rich_root():  | 
1328  | 
wt._set_root_id(generate_ids.gen_root_id())  | 
|
1329  | 
else:  | 
|
1330  | 
wt._set_root_id(ROOT_ID)  | 
|
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1331  | 
wt.flush()  | 
| 
3123.5.14
by Aaron Bentley
 Avoid Repository.revision_tree in common-case branching  | 
1332  | 
basis = None  | 
1333  | 
            # frequently, we will get here due to branching.  The accelerator
 | 
|
1334  | 
            # tree will be the tree from the branch, so the desired basis
 | 
|
1335  | 
            # tree will often be a parent of the accelerator tree.
 | 
|
1336  | 
if accelerator_tree is not None:  | 
|
1337  | 
try:  | 
|
1338  | 
basis = accelerator_tree.revision_tree(revision_id)  | 
|
1339  | 
except errors.NoSuchRevision:  | 
|
1340  | 
                    pass
 | 
|
1341  | 
if basis is None:  | 
|
1342  | 
basis = branch.repository.revision_tree(revision_id)  | 
|
1343  | 
if revision_id == NULL_REVISION:  | 
|
1344  | 
parents_list = []  | 
|
1345  | 
else:  | 
|
1346  | 
parents_list = [(revision_id, basis)]  | 
|
1347  | 
basis.lock_read()  | 
|
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1348  | 
try:  | 
1349  | 
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  | 
1350  | 
wt.flush()  | 
| 
3136.1.10
by Aaron Bentley
 Clean error if filesystem does not support hard-links  | 
1351  | 
                # if the basis has a root id we have to use that; otherwise we
 | 
1352  | 
                # use a new random one
 | 
|
1353  | 
basis_root_id = basis.get_root_id()  | 
|
1354  | 
if basis_root_id is not None:  | 
|
1355  | 
wt._set_root_id(basis_root_id)  | 
|
1356  | 
wt.flush()  | 
|
1357  | 
transform.build_tree(basis, wt, accelerator_tree,  | 
|
1358  | 
hardlink=hardlink)  | 
|
1359  | 
finally:  | 
|
1360  | 
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.  | 
1361  | 
finally:  | 
1362  | 
control_files.unlock()  | 
|
1363  | 
wt.unlock()  | 
|
1364  | 
return wt  | 
|
1365  | 
||
1366  | 
def _open(self, a_bzrdir, control_files):  | 
|
1367  | 
"""Open the tree itself.  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1368  | 
|
| 
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  | 
        :param a_bzrdir: the dir for the tree.
 | 
1370  | 
        :param control_files: the control files for the tree.
 | 
|
1371  | 
        """
 | 
|
1372  | 
return WorkingTree4(a_bzrdir.root_transport.local_abspath('.'),  | 
|
1373  | 
branch=a_bzrdir.open_branch(),  | 
|
1374  | 
_format=self,  | 
|
1375  | 
_bzrdir=a_bzrdir,  | 
|
1376  | 
_control_files=control_files)  | 
|
1377  | 
||
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1378  | 
def __get_matchingbzrdir(self):  | 
1379  | 
        # please test against something that will let us do tree references
 | 
|
1380  | 
return bzrdir.format_registry.make_bzrdir(  | 
|
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
1381  | 
'dirstate-with-subtree')  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1382  | 
|
1383  | 
_matchingbzrdir = property(__get_matchingbzrdir)  | 
|
1384  | 
||
| 
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.  | 
1385  | 
|
1386  | 
class DirStateRevisionTree(Tree):  | 
|
1387  | 
"""A revision tree pulling the inventory from a dirstate."""  | 
|
1388  | 
||
1389  | 
def __init__(self, dirstate, revision_id, repository):  | 
|
1390  | 
self._dirstate = dirstate  | 
|
| 
2858.2.1
by Martin Pool
 Remove most calls to safe_file_id and safe_revision_id.  | 
1391  | 
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.  | 
1392  | 
self._repository = repository  | 
1393  | 
self._inventory = None  | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1394  | 
self._locked = 0  | 
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1395  | 
self._dirstate_locked = 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.  | 
1396  | 
|
| 
2255.2.184
by Martin Pool
 Fixes for some comparison tests; repr of DirStateRevisionTree  | 
1397  | 
def __repr__(self):  | 
1398  | 
return "<%s of %s in %s>" % \  | 
|
1399  | 
(self.__class__.__name__, self._revision_id, self._dirstate)  | 
|
1400  | 
||
| 
1551.15.46
by Aaron Bentley
 Move plan merge to tree  | 
1401  | 
def annotate_iter(self, file_id,  | 
1402  | 
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  | 
1403  | 
"""See Tree.annotate_iter"""  | 
| 
1551.15.50
by Aaron Bentley
 Deprecate RevisionTree.get_weave  | 
1404  | 
w = self._get_weave(file_id)  | 
| 
3316.2.13
by Robert Collins
 * ``VersionedFile.annotate_iter`` is deprecated. While in principal this  | 
1405  | 
return w.annotate(self.inventory[file_id].revision)  | 
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1406  | 
|
| 
1551.15.46
by Aaron Bentley
 Move plan merge to tree  | 
1407  | 
def _get_ancestors(self, default_revision):  | 
1408  | 
return set(self._repository.get_ancestry(self._revision_id,  | 
|
1409  | 
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.  | 
1410  | 
def _comparison_data(self, entry, path):  | 
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1411  | 
"""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.  | 
1412  | 
if entry is None:  | 
1413  | 
return None, False, None  | 
|
1414  | 
        # trust the entry as RevisionTree does, but this may not be
 | 
|
1415  | 
        # sensible: the entry might not have come from us?
 | 
|
1416  | 
return entry.kind, entry.executable, None  | 
|
1417  | 
||
| 
2255.2.10
by Robert Collins
 Now all tests matching dirstate pass - added generation of inventories for parent trees.  | 
1418  | 
def _file_size(self, entry, stat_value):  | 
1419  | 
return entry.text_size  | 
|
1420  | 
||
| 
2255.2.78
by Robert Collins
 Really finish the prior commit.  | 
1421  | 
def filter_unversioned_files(self, paths):  | 
1422  | 
"""Filter out paths that are not versioned.  | 
|
1423  | 
||
1424  | 
        :return: set of paths.
 | 
|
1425  | 
        """
 | 
|
1426  | 
pred = self.has_filename  | 
|
1427  | 
return set((p for p in paths if not pred(p)))  | 
|
1428  | 
||
| 
2255.2.166
by Martin Pool
 (broken) Add Tree.get_root_id() & test  | 
1429  | 
def get_root_id(self):  | 
1430  | 
return self.path2id('')  | 
|
1431  | 
||
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1432  | 
def id2path(self, file_id):  | 
1433  | 
        "Convert a file-id to a path."
 | 
|
1434  | 
entry = self._get_entry(file_id=file_id)  | 
|
1435  | 
if entry == (None, None):  | 
|
1436  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
|
1437  | 
path_utf8 = osutils.pathjoin(entry[0][0], entry[0][1])  | 
|
1438  | 
return path_utf8.decode('utf8')  | 
|
1439  | 
||
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1440  | 
def _get_parent_index(self):  | 
1441  | 
"""Return the index in the dirstate referenced by this tree."""  | 
|
1442  | 
return self._dirstate.get_parent_ids().index(self._revision_id) + 1  | 
|
1443  | 
||
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1444  | 
def _get_entry(self, file_id=None, path=None):  | 
1445  | 
"""Get the dirstate row for file_id or path.  | 
|
1446  | 
||
1447  | 
        If either file_id or path is supplied, it is used as the key to lookup.
 | 
|
1448  | 
        If both are supplied, the fastest lookup is used, and an error is
 | 
|
1449  | 
        raised if they do not both point at the same row.
 | 
|
1450  | 
        
 | 
|
1451  | 
        :param file_id: An optional unicode file_id to be looked up.
 | 
|
1452  | 
        :param path: An optional unicode path to be looked up.
 | 
|
1453  | 
        :return: The dirstate row tuple for path/file_id, or (None, None)
 | 
|
1454  | 
        """
 | 
|
1455  | 
if file_id is None and path is None:  | 
|
1456  | 
raise errors.BzrError('must supply file_id or path')  | 
|
1457  | 
if path is not None:  | 
|
1458  | 
path = path.encode('utf8')  | 
|
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1459  | 
parent_index = self._get_parent_index()  | 
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1460  | 
return self._dirstate._get_entry(parent_index, fileid_utf8=file_id, path_utf8=path)  | 
1461  | 
||
| 
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.  | 
1462  | 
def _generate_inventory(self):  | 
1463  | 
"""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.  | 
1464  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1465  | 
        (So this is only called the first time the inventory is requested for
 | 
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1466  | 
        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  | 
1467  | 
|
| 
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.  | 
1468  | 
        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  | 
1469  | 
        """
 | 
| 
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.  | 
1470  | 
assert self._locked, 'cannot generate inventory of an unlocked '\  | 
1471  | 
            'dirstate revision tree'
 | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1472  | 
        # separate call for profiling - makes it clear where the costs are.
 | 
1473  | 
self._dirstate._read_dirblocks_if_needed()  | 
|
| 
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.  | 
1474  | 
assert self._revision_id in self._dirstate.get_parent_ids(), \  | 
1475  | 
'parent %s has disappeared from %s' % (  | 
|
1476  | 
self._revision_id, self._dirstate.get_parent_ids())  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1477  | 
parent_index = self._dirstate.get_parent_ids().index(self._revision_id) + 1  | 
1478  | 
        # This is identical now to the WorkingTree _generate_inventory except
 | 
|
1479  | 
        # for the tree index use.
 | 
|
1480  | 
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.  | 
1481  | 
current_id = root_key[2]  | 
| 
2255.2.113
by John Arbash Meinel
 545ms, 600ms: Switch memory model from storing kind to using minikind  | 
1482  | 
assert current_entry[parent_index][0] == 'd'  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1483  | 
inv = Inventory(root_id=current_id, revision_id=self._revision_id)  | 
1484  | 
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  | 
1485  | 
        # Turn some things into local variables
 | 
1486  | 
minikind_to_kind = dirstate.DirState._minikind_to_kind  | 
|
1487  | 
factory = entry_factory  | 
|
1488  | 
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()  | 
1489  | 
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.  | 
1490  | 
        # we could do this straight out of the dirstate; it might be fast
 | 
1491  | 
        # 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()  | 
1492  | 
parent_ies = {'' : inv.root}  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1493  | 
for block in self._dirstate._dirblocks[1:]: #skip root  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1494  | 
dirname = block[0]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1495  | 
try:  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1496  | 
parent_ie = parent_ies[dirname]  | 
| 
2255.2.96
by Robert Collins
 Restore dirstate to all tests passing condition.  | 
1497  | 
except KeyError:  | 
1498  | 
                # all the paths in this block are not versioned in this tree
 | 
|
1499  | 
                continue
 | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1500  | 
for key, entry in block[1]:  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1501  | 
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  | 
1502  | 
if minikind in ('a', 'r'): # absent, relocated  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1503  | 
                    # not this tree
 | 
1504  | 
                    continue
 | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1505  | 
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  | 
1506  | 
name_unicode = utf8_decode(name)[0]  | 
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1507  | 
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  | 
1508  | 
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()  | 
1509  | 
inv_entry = factory[kind](file_id, name_unicode,  | 
1510  | 
parent_ie.file_id)  | 
|
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1511  | 
inv_entry.revision = revid  | 
1512  | 
if kind == 'file':  | 
|
1513  | 
inv_entry.executable = executable  | 
|
1514  | 
inv_entry.text_size = size  | 
|
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1515  | 
inv_entry.text_sha1 = fingerprint  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1516  | 
elif kind == 'directory':  | 
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1517  | 
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.  | 
1518  | 
elif kind == 'symlink':  | 
1519  | 
inv_entry.executable = False  | 
|
| 
2338.4.1
by Marien Zwart
 Fix committing merges in a dirstate tree with a symlink.  | 
1520  | 
inv_entry.text_size = None  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1521  | 
inv_entry.symlink_target = utf8_decode(fingerprint)[0]  | 
1522  | 
elif kind == 'tree-reference':  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
1523  | 
inv_entry.reference_revision = fingerprint or None  | 
| 
2255.2.87
by Robert Collins
 core dirstate tests passing with new structure.  | 
1524  | 
else:  | 
| 
2255.2.158
by Martin Pool
 Most of the integration of dirstate and subtree  | 
1525  | 
raise AssertionError("cannot convert entry %r into an InventoryEntry"  | 
1526  | 
% entry)  | 
|
| 
2255.2.115
by John Arbash Meinel
 _get_inventory 1.75s: Directly update the inventory state rather than using inv.add()  | 
1527  | 
                # These checks cost us around 40ms on a 55k entry tree
 | 
1528  | 
assert file_id not in inv_byid  | 
|
1529  | 
assert name_unicode not in parent_ie.children  | 
|
1530  | 
inv_byid[file_id] = inv_entry  | 
|
1531  | 
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.  | 
1532  | 
self._inventory = inv  | 
1533  | 
||
| 
2255.7.36
by John Arbash Meinel
 All trees should implement get_file_mtime()  | 
1534  | 
def get_file_mtime(self, file_id, path=None):  | 
1535  | 
"""Return the modification time for this record.  | 
|
1536  | 
||
1537  | 
        We return the timestamp of the last-changed revision.
 | 
|
1538  | 
        """
 | 
|
1539  | 
        # Make sure the file exists
 | 
|
1540  | 
entry = self._get_entry(file_id, path=path)  | 
|
1541  | 
if entry == (None, None): # do we raise?  | 
|
1542  | 
return None  | 
|
1543  | 
parent_index = self._get_parent_index()  | 
|
1544  | 
last_changed_revision = entry[1][parent_index][4]  | 
|
1545  | 
return self._repository.get_revision(last_changed_revision).timestamp  | 
|
1546  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1547  | 
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,  | 
1548  | 
entry = self._get_entry(file_id=file_id, path=path)  | 
1549  | 
parent_index = self._get_parent_index()  | 
|
1550  | 
parent_details = entry[1][parent_index]  | 
|
1551  | 
if parent_details[0] == 'f':  | 
|
1552  | 
return parent_details[1]  | 
|
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1553  | 
return None  | 
1554  | 
||
| 
1551.15.50
by Aaron Bentley
 Deprecate RevisionTree.get_weave  | 
1555  | 
def _get_weave(self, file_id):  | 
| 
2590.2.11
by Aaron Bentley
 Aggressively cache trees, use dirstate. re-mplement _add_parent.  | 
1556  | 
return self._repository.weave_store.get_weave(file_id,  | 
1557  | 
self._repository.get_transaction())  | 
|
1558  | 
||
| 
2743.3.3
by Ian Clatworthy
 Skip path lookup for tree.get_file() when we already know the path  | 
1559  | 
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.  | 
1560  | 
return StringIO(self.get_file_text(file_id))  | 
1561  | 
||
1562  | 
def get_file_lines(self, file_id):  | 
|
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1563  | 
entry = self._get_entry(file_id=file_id)[1]  | 
1564  | 
if entry == None:  | 
|
1565  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
|
1566  | 
return self._get_weave(file_id).get_lines(entry[1][4])  | 
|
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1567  | 
|
1568  | 
def get_file_size(self, file_id):  | 
|
| 
3363.3.4
by Aaron Bentley
 Add get_file_size to Tree interface  | 
1569  | 
"""See Tree.get_file_size"""  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1570  | 
return self.inventory[file_id].text_size  | 
1571  | 
||
1572  | 
def get_file_text(self, file_id):  | 
|
1573  | 
return ''.join(self.get_file_lines(file_id))  | 
|
1574  | 
||
| 
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.  | 
1575  | 
def get_reference_revision(self, file_id, path=None):  | 
1576  | 
return self.inventory[file_id].reference_revision  | 
|
| 
2255.2.218
by Robert Collins
 Make the nested tree commit smoke test be more rigourous.  | 
1577  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1578  | 
def iter_files_bytes(self, desired_files):  | 
1579  | 
"""See Tree.iter_files_bytes.  | 
|
| 
2708.1.4
by Aaron Bentley
 RevisionTree and DirStateRevisionTree use Repository.extract_files_bytes  | 
1580  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1581  | 
        This version is implemented on top of Repository.iter_files_bytes"""
 | 
| 
2708.1.6
by Aaron Bentley
 Turn extract_files_bytes into an iterator  | 
1582  | 
parent_index = self._get_parent_index()  | 
| 
2708.1.11
by Aaron Bentley
 Test and tweak error handling  | 
1583  | 
repo_desired_files = []  | 
1584  | 
for file_id, identifier in desired_files:  | 
|
1585  | 
entry = self._get_entry(file_id)  | 
|
1586  | 
if entry == (None, None):  | 
|
1587  | 
raise errors.NoSuchId(self, file_id)  | 
|
1588  | 
repo_desired_files.append((file_id, entry[1][parent_index][4],  | 
|
1589  | 
identifier))  | 
|
| 
2708.1.7
by Aaron Bentley
 Rename extract_files_bytes to iter_files_bytes  | 
1590  | 
return self._repository.iter_files_bytes(repo_desired_files)  | 
| 
2708.1.4
by Aaron Bentley
 RevisionTree and DirStateRevisionTree use Repository.extract_files_bytes  | 
1591  | 
|
| 
2255.2.134
by John Arbash Meinel
 Add a tree-test for get_symlink_target  | 
1592  | 
def get_symlink_target(self, file_id):  | 
1593  | 
entry = self._get_entry(file_id=file_id)  | 
|
1594  | 
parent_index = self._get_parent_index()  | 
|
1595  | 
if entry[1][parent_index][0] != 'l':  | 
|
1596  | 
return None  | 
|
1597  | 
else:  | 
|
1598  | 
            # At present, none of the tree implementations supports non-ascii
 | 
|
1599  | 
            # symlink targets. So we will just assume that the dirstate path is
 | 
|
1600  | 
            # correct.
 | 
|
1601  | 
return entry[1][parent_index][1]  | 
|
1602  | 
||
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1603  | 
def get_revision_id(self):  | 
1604  | 
"""Return the revision id for this tree."""  | 
|
1605  | 
return self._revision_id  | 
|
1606  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1607  | 
def _get_inventory(self):  | 
1608  | 
if self._inventory is not None:  | 
|
1609  | 
return self._inventory  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1610  | 
self._must_be_locked()  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1611  | 
self._generate_inventory()  | 
1612  | 
return self._inventory  | 
|
1613  | 
||
1614  | 
inventory = property(_get_inventory,  | 
|
1615  | 
doc="Inventory of this Tree")  | 
|
1616  | 
||
| 
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.  | 
1617  | 
def get_parent_ids(self):  | 
1618  | 
"""The parents of a tree in the dirstate are not cached."""  | 
|
1619  | 
return self._repository.get_revision(self._revision_id).parent_ids  | 
|
1620  | 
||
| 
2255.2.30
by Robert Collins
 Some workingtree_implementations/test_workingtree.py test work - add DirStateRevisionTree.has_filename, locks around appropriate calls in tests.  | 
1621  | 
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.  | 
1622  | 
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.  | 
1623  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1624  | 
def kind(self, file_id):  | 
| 
3016.1.1
by Aaron Bentley
 Update DirStateRevisionTree to avoid using inventory  | 
1625  | 
entry = self._get_entry(file_id=file_id)[1]  | 
1626  | 
if entry == None:  | 
|
1627  | 
raise errors.NoSuchId(tree=self, file_id=file_id)  | 
|
1628  | 
return dirstate.DirState._minikind_to_kind[entry[1][0]]  | 
|
| 
2255.2.182
by Martin Pool
 merge dirstate and trunk  | 
1629  | 
|
| 
3146.8.4
by Aaron Bentley
 Eliminate direct use of inventory from transform application  | 
1630  | 
def stored_kind(self, file_id):  | 
1631  | 
"""See Tree.stored_kind"""  | 
|
1632  | 
return self.kind(file_id)  | 
|
1633  | 
||
| 
2776.1.7
by Robert Collins
 * New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a  | 
1634  | 
def path_content_summary(self, path):  | 
1635  | 
"""See Tree.path_content_summary."""  | 
|
1636  | 
id = self.inventory.path2id(path)  | 
|
1637  | 
if id is None:  | 
|
1638  | 
return ('missing', None, None, None)  | 
|
1639  | 
entry = self._inventory[id]  | 
|
1640  | 
kind = entry.kind  | 
|
1641  | 
if kind == 'file':  | 
|
1642  | 
return (kind, entry.text_size, entry.executable, entry.text_sha1)  | 
|
1643  | 
elif kind == 'symlink':  | 
|
1644  | 
return (kind, None, None, entry.symlink_target)  | 
|
1645  | 
else:  | 
|
1646  | 
return (kind, None, None, None)  | 
|
1647  | 
||
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1648  | 
def is_executable(self, file_id, path=None):  | 
1649  | 
ie = self.inventory[file_id]  | 
|
1650  | 
if ie.kind != "file":  | 
|
| 
2255.2.84
by John Arbash Meinel
 Remove now-unecessary encode/decode calls for revision ids.  | 
1651  | 
return None  | 
| 
2255.2.31
by Robert Collins
 Work in progress to make merge_inner work with dirstate trees.  | 
1652  | 
return ie.executable  | 
1653  | 
||
| 
2255.2.71
by John Arbash Meinel
 Add a test for list_files, and implement it for DirStateRevisionTree  | 
1654  | 
def list_files(self, include_root=False):  | 
1655  | 
        # We use a standard implementation, because DirStateRevisionTree is
 | 
|
1656  | 
        # dealing with one of the parents of the current state
 | 
|
1657  | 
inv = self._get_inventory()  | 
|
1658  | 
entries = inv.iter_entries()  | 
|
1659  | 
if self.inventory.root is not None and not include_root:  | 
|
1660  | 
entries.next()  | 
|
1661  | 
for path, entry in entries:  | 
|
1662  | 
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.  | 
1663  | 
|
| 
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.  | 
1664  | 
def lock_read(self):  | 
1665  | 
"""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.  | 
1666  | 
if not self._locked:  | 
1667  | 
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  | 
1668  | 
if self._dirstate._lock_token is None:  | 
1669  | 
self._dirstate.lock_read()  | 
|
1670  | 
self._dirstate_locked = True  | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1671  | 
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.  | 
1672  | 
|
| 
2255.2.183
by Martin Pool
 add missing _must_be_locked and a better message  | 
1673  | 
def _must_be_locked(self):  | 
1674  | 
if not self._locked:  | 
|
1675  | 
raise errors.ObjectNotLocked(self)  | 
|
1676  | 
||
| 
2255.2.98
by Robert Collins
 Perform path2id lookups in dirstate revision trees from the dirstate index without requiring an inventory.  | 
1677  | 
    @needs_read_lock
 | 
| 
2255.2.65
by John Arbash Meinel
 override path2id because it should be optimized anyway  | 
1678  | 
def path2id(self, path):  | 
1679  | 
"""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.  | 
1680  | 
        # lookup by path: faster than splitting and walking the ivnentory.
 | 
1681  | 
entry = self._get_entry(path=path)  | 
|
1682  | 
if entry == (None, None):  | 
|
1683  | 
return None  | 
|
| 
2255.2.107
by John Arbash Meinel
 (working), fix dirstate to use utf8 file ids.  | 
1684  | 
return entry[0][2]  | 
| 
2255.2.65
by John Arbash Meinel
 override path2id because it should be optimized anyway  | 
1685  | 
|
| 
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.  | 
1686  | 
def unlock(self):  | 
1687  | 
"""Unlock, freeing any cache memory used during the lock."""  | 
|
1688  | 
        # outside of a lock, the inventory is suspect: release it.
 | 
|
| 
2255.2.38
by Robert Collins
 Fix WorkingTree4.pull to work.  | 
1689  | 
self._locked -=1  | 
1690  | 
if not self._locked:  | 
|
1691  | 
self._inventory = None  | 
|
| 
2255.5.2
by John Arbash Meinel
 (broken) lock and unlock the DirState object when locking and unlocking the Tree itself  | 
1692  | 
self._locked = 0  | 
1693  | 
if self._dirstate_locked:  | 
|
1694  | 
self._dirstate.unlock()  | 
|
1695  | 
self._dirstate_locked = False  | 
|
| 
2255.2.79
by Robert Collins
 Take out repository locks from Dirstate revision trees, to improve file text access performance.  | 
1696  | 
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  | 
1697  | 
|
1698  | 
def walkdirs(self, prefix=""):  | 
|
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
1699  | 
        # TODO: jam 20070215 This is the lazy way by using the RevisionTree
 | 
1700  | 
        # implementation based on an inventory.  
 | 
|
1701  | 
        # This should be cleaned up to use the much faster Dirstate code
 | 
|
1702  | 
        # So for now, we just build up the parent inventory, and extract
 | 
|
1703  | 
        # 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  | 
1704  | 
_directory = 'directory'  | 
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1705  | 
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  | 
1706  | 
top_id = inv.path2id(prefix)  | 
1707  | 
if top_id is None:  | 
|
1708  | 
pending = []  | 
|
1709  | 
else:  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1710  | 
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  | 
1711  | 
while pending:  | 
1712  | 
dirblock = []  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1713  | 
relpath, file_id = pending.pop()  | 
1714  | 
            # 0 - relpath, 1- file-id
 | 
|
1715  | 
if relpath:  | 
|
1716  | 
relroot = relpath + '/'  | 
|
| 
2255.2.69
by John Arbash Meinel
 Implement annotate_iter, get_revision_id, and walkdirs so that all tree_implementations now pass  | 
1717  | 
else:  | 
1718  | 
relroot = ""  | 
|
1719  | 
            # FIXME: stash the node in pending
 | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1720  | 
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  | 
1721  | 
for name, child in entry.sorted_children():  | 
1722  | 
toppath = relroot + name  | 
|
1723  | 
dirblock.append((toppath, name, child.kind, None,  | 
|
1724  | 
child.file_id, child.kind  | 
|
1725  | 
                    ))
 | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1726  | 
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  | 
1727  | 
            # push the user specified dirs from dirblock
 | 
1728  | 
for dir in reversed(dirblock):  | 
|
1729  | 
if dir[2] == _directory:  | 
|
| 
2255.2.70
by John Arbash Meinel
 Minor improvements to DirStateRevisionTree.walkdirs()  | 
1730  | 
pending.append((dir[0], dir[4]))  | 
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1731  | 
|
1732  | 
||
1733  | 
class InterDirStateTree(InterTree):  | 
|
| 
2255.13.3
by Martin Pool
 Comments and better assertions in InterDirStateTree  | 
1734  | 
"""Fast path optimiser for changes_from with dirstate trees.  | 
1735  | 
    
 | 
|
1736  | 
    This is used only when both trees are in the dirstate working file, and 
 | 
|
1737  | 
    the source is any parent within the dirstate, and the destination is 
 | 
|
1738  | 
    the current working tree of the same dirstate.
 | 
|
1739  | 
    """
 | 
|
1740  | 
    # this could be generalized to allow comparisons between any trees in the
 | 
|
1741  | 
    # dirstate, and possibly between trees stored in different dirstates.
 | 
|
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1742  | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1743  | 
def __init__(self, source, target):  | 
1744  | 
super(InterDirStateTree, self).__init__(source, target)  | 
|
1745  | 
if not InterDirStateTree.is_compatible(source, target):  | 
|
1746  | 
raise Exception, "invalid source %r and target %r" % (source, target)  | 
|
1747  | 
||
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1748  | 
    @staticmethod
 | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1749  | 
def make_source_parent_tree(source, target):  | 
1750  | 
"""Change the source tree into a parent of the target."""  | 
|
1751  | 
revid = source.commit('record tree')  | 
|
1752  | 
target.branch.repository.fetch(source.branch.repository, revid)  | 
|
1753  | 
target.set_parent_ids([revid])  | 
|
1754  | 
return target.basis_tree(), target  | 
|
| 
2255.7.25
by John Arbash Meinel
 Shave off 200+ ms of 'time bzr status' in lp tree  | 
1755  | 
|
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
1756  | 
_matching_from_tree_format = WorkingTreeFormat4()  | 
1757  | 
_matching_to_tree_format = WorkingTreeFormat4()  | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1758  | 
_test_mutable_trees_to_test_trees = make_source_parent_tree  | 
1759  | 
||
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1760  | 
def iter_changes(self, include_unchanged=False,  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1761  | 
specific_files=None, pb=None, extra_trees=[],  | 
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
1762  | 
require_versioned=True, want_unversioned=False):  | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1763  | 
"""Return the changes from source to target.  | 
1764  | 
||
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1765  | 
        :return: An iterator that yields tuples. See InterTree.iter_changes
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1766  | 
            for details.
 | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1767  | 
        :param specific_files: An optional list of file paths to restrict the
 | 
1768  | 
            comparison to. When mapping filenames to ids, all matches in all
 | 
|
1769  | 
            trees (including optional extra_trees) are used, and all children of
 | 
|
1770  | 
            matched directories are included.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1771  | 
        :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.  | 
1772  | 
            unchanged entries in the result.
 | 
1773  | 
        :param extra_trees: An optional list of additional trees to use when
 | 
|
1774  | 
            mapping the contents of specific_files (paths) to file_ids.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1775  | 
        :param require_versioned: If True, all files in specific_files must be
 | 
1776  | 
            versioned in one of source, target, extra_trees or
 | 
|
1777  | 
            PathsNotVersionedError is raised.
 | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
1778  | 
        :param want_unversioned: Should unversioned files be returned in the
 | 
1779  | 
            output. An unversioned file is defined as one with (False, False)
 | 
|
1780  | 
            for the versioned pair.
 | 
|
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1781  | 
        """
 | 
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
1782  | 
utf8_decode = cache_utf8._utf8_decode  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1783  | 
_minikind_to_kind = dirstate.DirState._minikind_to_kind  | 
| 
2474.1.44
by John Arbash Meinel
 Use cmp_by_dirs in _iter_changes, it saves a bit of time.  | 
1784  | 
cmp_by_dirs = dirstate.cmp_by_dirs  | 
| 
2255.2.122
by Robert Collins
 Alter intertree implementation tests to let dirstate inter-trees be correctly parameterised.  | 
1785  | 
        # NB: show_status depends on being able to pass in non-versioned files
 | 
1786  | 
        # and report them as unknown
 | 
|
| 
2255.2.155
by Martin Pool
 Better assertion message from InterDirStateTree._iter_changes  | 
1787  | 
        # 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.  | 
1788  | 
if (extra_trees or specific_files == []):  | 
| 
2255.2.155
by Martin Pool
 Better assertion message from InterDirStateTree._iter_changes  | 
1789  | 
            # we can't fast-path these cases (yet)
 | 
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1790  | 
for f in super(InterDirStateTree, self).iter_changes(  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1791  | 
include_unchanged, specific_files, pb, extra_trees,  | 
| 
2255.2.204
by Robert Collins
 Fix info and status again.  | 
1792  | 
require_versioned, want_unversioned=want_unversioned):  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1793  | 
yield f  | 
1794  | 
            return
 | 
|
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
1795  | 
parent_ids = self.target.get_parent_ids()  | 
| 
2974.2.1
by John Arbash Meinel
 Re-enable the fast path for the no-parent commit case.  | 
1796  | 
assert (self.source._revision_id in parent_ids  | 
1797  | 
or self.source._revision_id == NULL_REVISION), \  | 
|
| 
2255.2.154
by Martin Pool
 Better assertion message from InterDirStateTree._iter_changes  | 
1798  | 
"revision {%s} is not stored in {%s}, but %s " \  | 
1799  | 
                "can only be used for trees stored in the dirstate" \
 | 
|
| 
3254.1.1
by Aaron Bentley
 Make Tree.iter_changes a public method  | 
1800  | 
% (self.source._revision_id, self.target, self.iter_changes)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1801  | 
target_index = 0  | 
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
1802  | 
if self.source._revision_id == NULL_REVISION:  | 
1803  | 
source_index = None  | 
|
1804  | 
indices = (target_index,)  | 
|
1805  | 
else:  | 
|
1806  | 
assert (self.source._revision_id in parent_ids), \  | 
|
1807  | 
"Failure: source._revision_id: %s not in target.parent_ids(%s)" % (  | 
|
1808  | 
self.source._revision_id, parent_ids)  | 
|
1809  | 
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.  | 
1810  | 
indices = (source_index, target_index)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1811  | 
        # -- make all specific_files utf8 --
 | 
1812  | 
if specific_files:  | 
|
1813  | 
specific_files_utf8 = set()  | 
|
1814  | 
for path in specific_files:  | 
|
1815  | 
specific_files_utf8.add(path.encode('utf8'))  | 
|
1816  | 
specific_files = specific_files_utf8  | 
|
1817  | 
else:  | 
|
1818  | 
specific_files = set([''])  | 
|
1819  | 
        # -- specific_files is now a utf8 path set --
 | 
|
1820  | 
        # -- get the state object and prepare it.
 | 
|
1821  | 
state = self.target.current_dirstate()  | 
|
1822  | 
state._read_dirblocks_if_needed()  | 
|
1823  | 
def _entries_for_path(path):  | 
|
1824  | 
"""Return a list with all the entries that match path for all ids.  | 
|
1825  | 
            """
 | 
|
1826  | 
dirname, basename = os.path.split(path)  | 
|
1827  | 
key = (dirname, basename, '')  | 
|
1828  | 
block_index, present = state._find_block_index_from_key(key)  | 
|
1829  | 
if not present:  | 
|
1830  | 
                # the block which should contain path is absent.
 | 
|
1831  | 
return []  | 
|
1832  | 
result = []  | 
|
1833  | 
block = state._dirblocks[block_index][1]  | 
|
1834  | 
entry_index, _ = state._find_entry_index(key, block)  | 
|
1835  | 
            # we may need to look at multiple entries at this path: walk while the specific_files match.
 | 
|
1836  | 
while (entry_index < len(block) and  | 
|
1837  | 
block[entry_index][0][0:2] == key[0:2]):  | 
|
1838  | 
result.append(block[entry_index])  | 
|
1839  | 
entry_index += 1  | 
|
1840  | 
return result  | 
|
1841  | 
if require_versioned:  | 
|
1842  | 
            # -- check all supplied paths are versioned in a search tree. --
 | 
|
1843  | 
all_versioned = True  | 
|
1844  | 
for path in specific_files:  | 
|
1845  | 
path_entries = _entries_for_path(path)  | 
|
1846  | 
if not path_entries:  | 
|
1847  | 
                    # this specified path is not present at all: error
 | 
|
1848  | 
all_versioned = False  | 
|
1849  | 
                    break
 | 
|
1850  | 
found_versioned = False  | 
|
1851  | 
                # for each id at this path
 | 
|
1852  | 
for entry in path_entries:  | 
|
1853  | 
                    # for each tree.
 | 
|
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
1854  | 
for index in indices:  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1855  | 
if entry[1][index][0] != 'a': # absent  | 
1856  | 
found_versioned = True  | 
|
1857  | 
                            # all good: found a versioned cell
 | 
|
1858  | 
                            break
 | 
|
1859  | 
if not found_versioned:  | 
|
1860  | 
                    # none of the indexes was not 'absent' at all ids for this
 | 
|
1861  | 
                    # path.
 | 
|
1862  | 
all_versioned = False  | 
|
1863  | 
                    break
 | 
|
1864  | 
if not all_versioned:  | 
|
| 
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.  | 
1865  | 
raise errors.PathsNotVersionedError(specific_files)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1866  | 
        # -- remove redundancy in supplied specific_files to prevent over-scanning --
 | 
1867  | 
search_specific_files = set()  | 
|
1868  | 
for path in specific_files:  | 
|
1869  | 
other_specific_files = specific_files.difference(set([path]))  | 
|
1870  | 
if not osutils.is_inside_any(other_specific_files, path):  | 
|
1871  | 
                # this is a top level path, we must check it.
 | 
|
1872  | 
search_specific_files.add(path)  | 
|
1873  | 
        # sketch: 
 | 
|
1874  | 
        # compare source_index and target_index at or under each element of search_specific_files.
 | 
|
1875  | 
        # follow the following comparison table. Note that we only want to do diff operations when
 | 
|
1876  | 
        # the target is fdl because thats when the walkdirs logic will have exposed the pathinfo 
 | 
|
1877  | 
        # for the target.
 | 
|
1878  | 
        # cases:
 | 
|
1879  | 
        # 
 | 
|
1880  | 
        # Source | Target | disk | action
 | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1881  | 
        #   r    | fdlt   |      | add source to search, add id path move and perform
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1882  | 
        #        |        |      | diff check on source-target
 | 
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1883  | 
        #   r    | fdlt   |  a   | dangling file that was present in the basis. 
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1884  | 
        #        |        |      | ???
 | 
1885  | 
        #   r    |  a     |      | add source to search
 | 
|
1886  | 
        #   r    |  a     |  a   | 
 | 
|
1887  | 
        #   r    |  r     |      | this path is present in a non-examined tree, skip.
 | 
|
1888  | 
        #   r    |  r     |  a   | this path is present in a non-examined tree, skip.
 | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1889  | 
        #   a    | fdlt   |      | add new id
 | 
1890  | 
        #   a    | fdlt   |  a   | dangling locally added file, skip
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1891  | 
        #   a    |  a     |      | not present in either tree, skip
 | 
1892  | 
        #   a    |  a     |  a   | not present in any tree, skip
 | 
|
1893  | 
        #   a    |  r     |      | not present in either tree at this path, skip as it
 | 
|
1894  | 
        #        |        |      | may not be selected by the users list of paths.
 | 
|
1895  | 
        #   a    |  r     |  a   | not present in either tree at this path, skip as it
 | 
|
1896  | 
        #        |        |      | may not be selected by the users list of paths.
 | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1897  | 
        #  fdlt  | fdlt   |      | content in both: diff them
 | 
1898  | 
        #  fdlt  | fdlt   |  a   | deleted locally, but not unversioned - show as deleted ?
 | 
|
1899  | 
        #  fdlt  |  a     |      | unversioned: output deleted id for now
 | 
|
1900  | 
        #  fdlt  |  a     |  a   | unversioned and deleted: output deleted id
 | 
|
1901  | 
        #  fdlt  |  r     |      | relocated in this tree, so add target to search.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1902  | 
        #        |        |      | Dont diff, we will see an r,fd; pair when we reach
 | 
1903  | 
        #        |        |      | this id at the other path.
 | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1904  | 
        #  fdlt  |  r     |  a   | relocated in this tree, so add target to search.
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1905  | 
        #        |        |      | Dont diff, we will see an r,fd; pair when we reach
 | 
1906  | 
        #        |        |      | this id at the other path.
 | 
|
1907  | 
||
1908  | 
        # for all search_indexs in each path at or under each element of
 | 
|
1909  | 
        # search_specific_files, if the detail is relocated: add the id, and add the
 | 
|
1910  | 
        # relocated path as one to search if its not searched already. If the
 | 
|
1911  | 
        # detail is not relocated, add the id.
 | 
|
1912  | 
searched_specific_files = set()  | 
|
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
1913  | 
NULL_PARENT_DETAILS = dirstate.DirState.NULL_PARENT_DETAILS  | 
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
1914  | 
        # Using a list so that we can access the values and change them in
 | 
1915  | 
        # nested scope. Each one is [path, file_id, entry]
 | 
|
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
1916  | 
last_source_parent = [None, None]  | 
1917  | 
last_target_parent = [None, None]  | 
|
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
1918  | 
|
| 
2255.2.192
by John Arbash Meinel
 Add support for executable bit under win32  | 
1919  | 
use_filesystem_for_exec = (sys.platform != 'win32')  | 
1920  | 
||
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
1921  | 
        # Just a sentry, so that _process_entry can say that this
 | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
1922  | 
        # record is handled, but isn't interesting to process (unchanged)
 | 
1923  | 
uninteresting = object()  | 
|
1924  | 
||
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
1925  | 
|
1926  | 
old_dirname_to_file_id = {}  | 
|
1927  | 
new_dirname_to_file_id = {}  | 
|
1928  | 
        # TODO: jam 20070516 - Avoid the _get_entry lookup overhead by
 | 
|
1929  | 
        #       keeping a cache of directories that we have seen.
 | 
|
1930  | 
||
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1931  | 
def _process_entry(entry, path_info):  | 
1932  | 
"""Compare an entry and real disk to generate delta information.  | 
|
1933  | 
||
1934  | 
            :param path_info: top_relpath, basename, kind, lstat, abspath for
 | 
|
1935  | 
                the path of entry. If None, then the path is considered absent.
 | 
|
1936  | 
                (Perhaps we should pass in a concrete entry for this ?)
 | 
|
| 
2255.7.80
by John Arbash Meinel
 Don't decode the path entry until we've actually decided to return the tuple.  | 
1937  | 
                Basename is returned as a utf8 string because we expect this
 | 
1938  | 
                tuple will be ignored, and don't want to take the time to
 | 
|
1939  | 
                decode.
 | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
1940  | 
            :return: None if these don't match
 | 
1941  | 
                     A tuple of information about the change, or
 | 
|
1942  | 
                     the object 'uninteresting' if these match, but are
 | 
|
1943  | 
                     basically identical.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1944  | 
            """
 | 
| 
2255.7.1
by John Arbash Meinel
 _iter_changes should return Unicode paths.  | 
1945  | 
if source_index is None:  | 
1946  | 
source_details = NULL_PARENT_DETAILS  | 
|
1947  | 
else:  | 
|
1948  | 
source_details = entry[1][source_index]  | 
|
| 
2255.10.4
by John Arbash Meinel
 do not update_entry from disk if it is supposed to be absent or renamed  | 
1949  | 
target_details = entry[1][target_index]  | 
1950  | 
target_minikind = target_details[0]  | 
|
| 
2255.13.3
by Martin Pool
 Comments and better assertions in InterDirStateTree  | 
1951  | 
if path_info is not None and target_minikind in 'fdlt':  | 
| 
2255.10.4
by John Arbash Meinel
 do not update_entry from disk if it is supposed to be absent or renamed  | 
1952  | 
assert target_index == 0  | 
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
1953  | 
link_or_sha1 = state.update_entry(entry, abspath=path_info[4],  | 
1954  | 
stat_value=path_info[3])  | 
|
| 
2255.10.4
by John Arbash Meinel
 do not update_entry from disk if it is supposed to be absent or renamed  | 
1955  | 
                # The entry may have been modified by update_entry
 | 
1956  | 
target_details = entry[1][target_index]  | 
|
1957  | 
target_minikind = target_details[0]  | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
1958  | 
else:  | 
1959  | 
link_or_sha1 = None  | 
|
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
1960  | 
file_id = entry[0][2]  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1961  | 
source_minikind = source_details[0]  | 
| 
2255.2.191
by Martin Pool
 additional fix for subtree comparison  | 
1962  | 
if source_minikind in 'fdltr' and target_minikind in 'fdlt':  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1963  | 
                # claimed content in both: diff
 | 
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1964  | 
                #   r    | fdlt   |      | add source to search, add id path move and perform
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1965  | 
                #        |        |      | diff check on source-target
 | 
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
1966  | 
                #   r    | fdlt   |  a   | dangling file that was present in the basis.
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1967  | 
                #        |        |      | ???
 | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1968  | 
if source_minikind in 'r':  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1969  | 
                    # add the source to the search path to find any children it
 | 
1970  | 
                    # has.  TODO ? : only add if it is a container ?
 | 
|
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1971  | 
if not osutils.is_inside_any(searched_specific_files,  | 
1972  | 
source_details[1]):  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1973  | 
search_specific_files.add(source_details[1])  | 
1974  | 
                    # generate the old path; this is needed for stating later
 | 
|
1975  | 
                    # as well.
 | 
|
1976  | 
old_path = source_details[1]  | 
|
1977  | 
old_dirname, old_basename = os.path.split(old_path)  | 
|
| 
2255.7.41
by John Arbash Meinel
 WorkingTree.unversion() should not raise if unversioning a child and a parent.  | 
1978  | 
path = pathjoin(entry[0][0], entry[0][1])  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1979  | 
old_entry = state._get_entry(source_index,  | 
1980  | 
path_utf8=old_path)  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1981  | 
                    # update the source details variable to be the real
 | 
1982  | 
                    # location.
 | 
|
| 
3207.2.1
by jameinel
 Add a test that _iter_changes raises a clearer error when we encounter an invalid rename.  | 
1983  | 
if old_entry == (None, None):  | 
| 
3221.1.3
by Martin Pool
 Review cleanups for CorruptDirstate: use the path everywhere rather than the object, and use more standard phrasing.  | 
1984  | 
raise errors.CorruptDirstate(state._filename,  | 
| 
3207.2.1
by jameinel
 Add a test that _iter_changes raises a clearer error when we encounter an invalid rename.  | 
1985  | 
"entry '%s/%s' is considered renamed from %r"  | 
1986  | 
" but source does not exist\n"  | 
|
1987  | 
"entry: %s" % (entry[0][0], entry[0][1], old_path, entry))  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1988  | 
source_details = old_entry[1][source_index]  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
1989  | 
source_minikind = source_details[0]  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1990  | 
else:  | 
| 
2255.7.21
by John Arbash Meinel
 Get iter_changes working again, by fixing set_parent_trees to  | 
1991  | 
old_dirname = entry[0][0]  | 
1992  | 
old_basename = entry[0][1]  | 
|
| 
2485.3.12
by John Arbash Meinel
 Delay joining the path until we are actually going to be using it.  | 
1993  | 
old_path = path = None  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1994  | 
if path_info is None:  | 
1995  | 
                    # the file is missing on disk, show as removed.
 | 
|
| 
2255.7.4
by Robert Collins
 Test InterTree._iter_changes with missing (absent but versioned) files.  | 
1996  | 
content_change = True  | 
1997  | 
target_kind = None  | 
|
1998  | 
target_exec = False  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
1999  | 
else:  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2000  | 
                    # source and target are both versioned and disk file is present.
 | 
| 
2255.7.4
by Robert Collins
 Test InterTree._iter_changes with missing (absent but versioned) files.  | 
2001  | 
target_kind = path_info[2]  | 
| 
2255.7.21
by John Arbash Meinel
 Get iter_changes working again, by fixing set_parent_trees to  | 
2002  | 
if target_kind == 'directory':  | 
| 
2485.3.12
by John Arbash Meinel
 Delay joining the path until we are actually going to be using it.  | 
2003  | 
if path is None:  | 
2004  | 
old_path = path = pathjoin(old_dirname, old_basename)  | 
|
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
2005  | 
new_dirname_to_file_id[path] = file_id  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
2006  | 
if source_minikind != 'd':  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2007  | 
content_change = True  | 
2008  | 
else:  | 
|
2009  | 
                            # directories have no fingerprint
 | 
|
2010  | 
content_change = False  | 
|
| 
2255.7.4
by Robert Collins
 Test InterTree._iter_changes with missing (absent but versioned) files.  | 
2011  | 
target_exec = False  | 
| 
2255.7.21
by John Arbash Meinel
 Get iter_changes working again, by fixing set_parent_trees to  | 
2012  | 
elif target_kind == 'file':  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
2013  | 
if source_minikind != 'f':  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2014  | 
content_change = True  | 
2015  | 
else:  | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
2016  | 
                            # We could check the size, but we already have the
 | 
2017  | 
                            # sha1 hash.
 | 
|
2018  | 
content_change = (link_or_sha1 != source_details[1])  | 
|
| 
2255.10.5
by John Arbash Meinel
 Fix a small bug when we have a symlink that does not need to be re-read.  | 
2019  | 
                        # Target details is updated at update_entry time
 | 
| 
2255.2.192
by John Arbash Meinel
 Add support for executable bit under win32  | 
2020  | 
if use_filesystem_for_exec:  | 
2021  | 
                            # We don't need S_ISREG here, because we are sure
 | 
|
2022  | 
                            # we are dealing with a file.
 | 
|
2023  | 
target_exec = bool(stat.S_IEXEC & path_info[3].st_mode)  | 
|
2024  | 
else:  | 
|
2025  | 
target_exec = target_details[3]  | 
|
| 
2255.7.21
by John Arbash Meinel
 Get iter_changes working again, by fixing set_parent_trees to  | 
2026  | 
elif target_kind == 'symlink':  | 
| 
2255.7.31
by John Arbash Meinel
 Minor cleanup.  | 
2027  | 
if source_minikind != 'l':  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2028  | 
content_change = True  | 
2029  | 
else:  | 
|
| 
2255.10.3
by John Arbash Meinel
 (broken) Change get_sha1_for_entry into update_entry  | 
2030  | 
content_change = (link_or_sha1 != source_details[1])  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2031  | 
target_exec = False  | 
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
2032  | 
elif target_kind == 'tree-reference':  | 
2033  | 
if source_minikind != 't':  | 
|
2034  | 
content_change = True  | 
|
2035  | 
else:  | 
|
2036  | 
content_change = False  | 
|
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2037  | 
target_exec = False  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2038  | 
else:  | 
| 
2255.7.3
by Robert Collins
 Add tests for _iter_changes with symlinks, disabled until unversioned file support is added, as that affects the test expected value.  | 
2039  | 
raise Exception, "unknown kind %s" % path_info[2]  | 
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
2040  | 
if source_minikind == 'd':  | 
| 
2485.3.12
by John Arbash Meinel
 Delay joining the path until we are actually going to be using it.  | 
2041  | 
if path is None:  | 
2042  | 
old_path = path = pathjoin(old_dirname, old_basename)  | 
|
2043  | 
old_dirname_to_file_id[old_path] = file_id  | 
|
| 
2255.7.4
by Robert Collins
 Test InterTree._iter_changes with missing (absent but versioned) files.  | 
2044  | 
                # parent id is the entry for the path in the target tree
 | 
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
2045  | 
if old_dirname == last_source_parent[0]:  | 
2046  | 
source_parent_id = last_source_parent[1]  | 
|
2047  | 
else:  | 
|
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
2048  | 
try:  | 
2049  | 
source_parent_id = old_dirname_to_file_id[old_dirname]  | 
|
2050  | 
except KeyError:  | 
|
2051  | 
source_parent_entry = state._get_entry(source_index,  | 
|
2052  | 
path_utf8=old_dirname)  | 
|
2053  | 
source_parent_id = source_parent_entry[0][2]  | 
|
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
2054  | 
if source_parent_id == entry[0][2]:  | 
2055  | 
                        # This is the root, so the parent is None
 | 
|
2056  | 
source_parent_id = None  | 
|
| 
2255.7.30
by John Arbash Meinel
 Don't cache the parent entry for root, since it is different than all other entries.  | 
2057  | 
else:  | 
2058  | 
last_source_parent[0] = old_dirname  | 
|
2059  | 
last_source_parent[1] = source_parent_id  | 
|
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
2060  | 
new_dirname = entry[0][0]  | 
2061  | 
if new_dirname == last_target_parent[0]:  | 
|
2062  | 
target_parent_id = last_target_parent[1]  | 
|
2063  | 
else:  | 
|
| 
2485.3.8
by John Arbash Meinel
 Keep track of directories that you have seen.  | 
2064  | 
try:  | 
2065  | 
target_parent_id = new_dirname_to_file_id[new_dirname]  | 
|
2066  | 
except KeyError:  | 
|
2067  | 
                        # TODO: We don't always need to do the lookup, because the
 | 
|
2068  | 
                        #       parent entry will be the same as the source entry.
 | 
|
2069  | 
target_parent_entry = state._get_entry(target_index,  | 
|
2070  | 
path_utf8=new_dirname)  | 
|
2071  | 
assert target_parent_entry != (None, None), (  | 
|
2072  | 
"Could not find target parent in wt: %s\nparent of: %s"  | 
|
2073  | 
% (new_dirname, entry))  | 
|
2074  | 
target_parent_id = target_parent_entry[0][2]  | 
|
| 
2255.7.25
by John Arbash Meinel
 Shave off 200+ ms of 'time bzr status' in lp tree  | 
2075  | 
if target_parent_id == entry[0][2]:  | 
2076  | 
                        # This is the root, so the parent is None
 | 
|
2077  | 
target_parent_id = None  | 
|
| 
2255.7.30
by John Arbash Meinel
 Don't cache the parent entry for root, since it is different than all other entries.  | 
2078  | 
else:  | 
2079  | 
last_target_parent[0] = new_dirname  | 
|
2080  | 
last_target_parent[1] = target_parent_id  | 
|
| 
2255.7.29
by John Arbash Meinel
 approx 300ms of 'time bzr status' in lp tree by caching last parent info  | 
2081  | 
|
| 
2255.7.4
by Robert Collins
 Test InterTree._iter_changes with missing (absent but versioned) files.  | 
2082  | 
source_exec = source_details[3]  | 
| 
2485.3.4
by John Arbash Meinel
 Change _process_entry to detect when we don't care about something.  | 
2083  | 
if (include_unchanged  | 
2084  | 
or content_change  | 
|
2085  | 
or source_parent_id != target_parent_id  | 
|
2086  | 
or old_basename != entry[0][1]  | 
|
2087  | 
or source_exec != target_exec  | 
|
2088  | 
                    ):
 | 
|
| 
2485.3.12
by John Arbash Meinel
 Delay joining the path until we are actually going to be using it.  | 
2089  | 
if old_path is None:  | 
2090  | 
old_path = path = pathjoin(old_dirname, old_basename)  | 
|
2091  | 
old_path_u = utf8_decode(old_path)[0]  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2092  | 
path_u = old_path_u  | 
2093  | 
else:  | 
|
| 
2485.3.12
by John Arbash Meinel
 Delay joining the path until we are actually going to be using it.  | 
2094  | 
old_path_u = utf8_decode(old_path)[0]  | 
2095  | 
if old_path == path:  | 
|
2096  | 
path_u = old_path_u  | 
|
2097  | 
else:  | 
|
2098  | 
path_u = utf8_decode(path)[0]  | 
|
| 
2485.3.6
by John Arbash Meinel
 Delay calling pathjoin() until we've figured out we're going to use it  | 
2099  | 
source_kind = _minikind_to_kind[source_minikind]  | 
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2100  | 
return (entry[0][2],  | 
2101  | 
(old_path_u, path_u),  | 
|
2102  | 
content_change,  | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2103  | 
(True, True),  | 
2104  | 
(source_parent_id, target_parent_id),  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2105  | 
(utf8_decode(old_basename)[0], utf8_decode(entry[0][1])[0]),  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2106  | 
(source_kind, target_kind),  | 
2107  | 
(source_exec, target_exec))  | 
|
| 
2485.3.4
by John Arbash Meinel
 Change _process_entry to detect when we don't care about something.  | 
2108  | 
else:  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2109  | 
return uninteresting  | 
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
2110  | 
elif source_minikind in 'a' and target_minikind in 'fdlt':  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2111  | 
                # looks like a new file
 | 
2112  | 
if path_info is not None:  | 
|
| 
2255.7.41
by John Arbash Meinel
 WorkingTree.unversion() should not raise if unversioning a child and a parent.  | 
2113  | 
path = pathjoin(entry[0][0], entry[0][1])  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2114  | 
                    # parent id is the entry for the path in the target tree
 | 
2115  | 
                    # TODO: these are the same for an entire directory: cache em.
 | 
|
| 
2255.10.5
by John Arbash Meinel
 Fix a small bug when we have a symlink that does not need to be re-read.  | 
2116  | 
parent_id = state._get_entry(target_index,  | 
2117  | 
path_utf8=entry[0][0])[0][2]  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2118  | 
if parent_id == entry[0][2]:  | 
2119  | 
parent_id = None  | 
|
| 
2255.2.192
by John Arbash Meinel
 Add support for executable bit under win32  | 
2120  | 
if use_filesystem_for_exec:  | 
2121  | 
                        # We need S_ISREG here, because we aren't sure if this
 | 
|
2122  | 
                        # is a file or not.
 | 
|
2123  | 
target_exec = bool(  | 
|
2124  | 
stat.S_ISREG(path_info[3].st_mode)  | 
|
2125  | 
and stat.S_IEXEC & path_info[3].st_mode)  | 
|
2126  | 
else:  | 
|
2127  | 
target_exec = target_details[3]  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2128  | 
return (entry[0][2],  | 
2129  | 
(None, utf8_decode(path)[0]),  | 
|
2130  | 
True,  | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2131  | 
(False, True),  | 
2132  | 
(None, parent_id),  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2133  | 
(None, utf8_decode(entry[0][1])[0]),  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2134  | 
(None, path_info[2]),  | 
2135  | 
(None, target_exec))  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2136  | 
else:  | 
2137  | 
                    # but its not on disk: we deliberately treat this as just
 | 
|
2138  | 
                    # never-present. (Why ?! - RBC 20070224)
 | 
|
2139  | 
                    pass
 | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
2140  | 
elif source_minikind in 'fdlt' and target_minikind in 'a':  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2141  | 
                # unversioned, possibly, or possibly not deleted: we dont care.
 | 
2142  | 
                # if its still on disk, *and* theres no other entry at this
 | 
|
2143  | 
                # path [we dont know this in this routine at the moment -
 | 
|
2144  | 
                # perhaps we should change this - then it would be an unknown.
 | 
|
| 
2255.7.41
by John Arbash Meinel
 WorkingTree.unversion() should not raise if unversioning a child and a parent.  | 
2145  | 
old_path = pathjoin(entry[0][0], entry[0][1])  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2146  | 
                # parent id is the entry for the path in the target tree
 | 
2147  | 
parent_id = state._get_entry(source_index, path_utf8=entry[0][0])[0][2]  | 
|
2148  | 
if parent_id == entry[0][2]:  | 
|
2149  | 
parent_id = None  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2150  | 
return (entry[0][2],  | 
2151  | 
(utf8_decode(old_path)[0], None),  | 
|
2152  | 
True,  | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2153  | 
(True, False),  | 
2154  | 
(parent_id, None),  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2155  | 
(utf8_decode(entry[0][1])[0], None),  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2156  | 
(_minikind_to_kind[source_minikind], None),  | 
2157  | 
(source_details[3], None))  | 
|
| 
2255.2.189
by Martin Pool
 Add and fix up basic comparison of subtrees.  | 
2158  | 
elif source_minikind in 'fdlt' and target_minikind in 'r':  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2159  | 
                # a rename; could be a true rename, or a rename inherited from
 | 
2160  | 
                # a renamed parent. TODO: handle this efficiently. Its not
 | 
|
2161  | 
                # common case to rename dirs though, so a correct but slow
 | 
|
2162  | 
                # implementation will do.
 | 
|
2163  | 
if not osutils.is_inside_any(searched_specific_files, target_details[1]):  | 
|
2164  | 
search_specific_files.add(target_details[1])  | 
|
| 
1551.10.31
by Aaron Bentley
 Fix WorkingTree4._iter_changes with pending merges and deleted files  | 
2165  | 
elif source_minikind in 'ra' and target_minikind in 'ra':  | 
| 
2255.7.45
by Robert Collins
 Handle the source and target paths both being relocated from another path in the tree - this is possible with a pending merge.  | 
2166  | 
                # neither of the selected trees contain this file,
 | 
2167  | 
                # so skip over it. This is not currently directly tested, but
 | 
|
2168  | 
                # is indirectly via test_too_much.TestCommands.test_conflicts.
 | 
|
2169  | 
                pass
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2170  | 
else:  | 
| 
2255.13.3
by Martin Pool
 Comments and better assertions in InterDirStateTree  | 
2171  | 
raise AssertionError("don't know how to compare "  | 
2172  | 
"source_minikind=%r, target_minikind=%r"  | 
|
2173  | 
% (source_minikind, target_minikind))  | 
|
2174  | 
                ## import pdb;pdb.set_trace()
 | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2175  | 
return None  | 
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2176  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2177  | 
while search_specific_files:  | 
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
2178  | 
            # TODO: the pending list should be lexically sorted?  the
 | 
2179  | 
            # interface doesn't require it.
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2180  | 
current_root = search_specific_files.pop()  | 
| 
2360.1.2
by John Arbash Meinel
 Add an overzealous test, for Unicode support of _iter_changes.  | 
2181  | 
current_root_unicode = current_root.decode('utf8')  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2182  | 
searched_specific_files.add(current_root)  | 
2183  | 
            # process the entries for this containing directory: the rest will be
 | 
|
2184  | 
            # found by their parents recursively.
 | 
|
2185  | 
root_entries = _entries_for_path(current_root)  | 
|
| 
2360.1.2
by John Arbash Meinel
 Add an overzealous test, for Unicode support of _iter_changes.  | 
2186  | 
root_abspath = self.target.abspath(current_root_unicode)  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2187  | 
try:  | 
2188  | 
root_stat = os.lstat(root_abspath)  | 
|
2189  | 
except OSError, e:  | 
|
2190  | 
if e.errno == errno.ENOENT:  | 
|
| 
2255.2.151
by Robert Collins
 Handle specific_files natively for WorkingTreeFormat4._iter_changes.  | 
2191  | 
                    # the path does not exist: let _process_entry know that.
 | 
2192  | 
root_dir_info = None  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2193  | 
else:  | 
2194  | 
                    # some other random error: hand it up.
 | 
|
2195  | 
                    raise
 | 
|
| 
2255.2.151
by Robert Collins
 Handle specific_files natively for WorkingTreeFormat4._iter_changes.  | 
2196  | 
else:  | 
2197  | 
root_dir_info = ('', current_root,  | 
|
2198  | 
osutils.file_kind_from_stat_mode(root_stat.st_mode), root_stat,  | 
|
2199  | 
root_abspath)  | 
|
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2200  | 
if root_dir_info[2] == 'directory':  | 
| 
2255.2.215
by Robert Collins
 Hook directory-tree-reference detection into dirstate _iter_changes.  | 
2201  | 
if self.target._directory_is_tree_reference(  | 
2202  | 
current_root.decode('utf8')):  | 
|
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2203  | 
root_dir_info = root_dir_info[:2] + \  | 
2204  | 
('tree-reference',) + root_dir_info[3:]  | 
|
2205  | 
||
| 
2255.2.151
by Robert Collins
 Handle specific_files natively for WorkingTreeFormat4._iter_changes.  | 
2206  | 
if not root_entries and not root_dir_info:  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2207  | 
                # this specified path is not present at all, skip it.
 | 
2208  | 
                continue
 | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2209  | 
path_handled = False  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2210  | 
for entry in root_entries:  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2211  | 
result = _process_entry(entry, root_dir_info)  | 
2212  | 
if result is not None:  | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2213  | 
path_handled = True  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2214  | 
if result is not uninteresting:  | 
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2215  | 
yield result  | 
| 
2360.1.2
by John Arbash Meinel
 Add an overzealous test, for Unicode support of _iter_changes.  | 
2216  | 
if want_unversioned and not path_handled and root_dir_info:  | 
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2217  | 
new_executable = bool(  | 
2218  | 
stat.S_ISREG(root_dir_info[3].st_mode)  | 
|
2219  | 
and stat.S_IEXEC & root_dir_info[3].st_mode)  | 
|
| 
2360.1.6
by John Arbash Meinel
 Change utf8_decode_with_None to return what we care about.  | 
2220  | 
yield (None,  | 
2221  | 
(None, current_root_unicode),  | 
|
2222  | 
True,  | 
|
2223  | 
(False, False),  | 
|
2224  | 
(None, None),  | 
|
2225  | 
(None, splitpath(current_root_unicode)[-1]),  | 
|
2226  | 
(None, root_dir_info[2]),  | 
|
2227  | 
(None, new_executable)  | 
|
2228  | 
                      )
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2229  | 
initial_key = (current_root, '', '')  | 
2230  | 
block_index, _ = state._find_block_index_from_key(initial_key)  | 
|
2231  | 
if block_index == 0:  | 
|
2232  | 
                # we have processed the total root already, but because the
 | 
|
| 
2255.7.21
by John Arbash Meinel
 Get iter_changes working again, by fixing set_parent_trees to  | 
2233  | 
                # initial key matched it we should skip it here.
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2234  | 
block_index +=1  | 
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2235  | 
if root_dir_info and root_dir_info[2] == 'tree-reference':  | 
2236  | 
current_dir_info = None  | 
|
2237  | 
else:  | 
|
2238  | 
dir_iterator = osutils._walkdirs_utf8(root_abspath, prefix=current_root)  | 
|
2239  | 
try:  | 
|
2240  | 
current_dir_info = dir_iterator.next()  | 
|
| 
2363.1.2
by John Arbash Meinel
 Clean up the error.  | 
2241  | 
except OSError, e:  | 
| 
2363.1.4
by John Arbash Meinel
 Handle ERROR_DIRECTORY for python 2.5  | 
2242  | 
                    # on win32, python2.4 has e.errno == ERROR_DIRECTORY, but
 | 
2243  | 
                    # python 2.5 has e.errno == EINVAL,
 | 
|
2244  | 
                    #            and e.winerror == ERROR_DIRECTORY
 | 
|
2245  | 
e_winerror = getattr(e, 'winerror', None)  | 
|
| 
2408.1.5
by Alexander Belchenko
 John's patch for WT4 on Windows+Python2.4  | 
2246  | 
win_errors = (ERROR_DIRECTORY, ERROR_PATH_NOT_FOUND)  | 
| 
2363.1.4
by John Arbash Meinel
 Handle ERROR_DIRECTORY for python 2.5  | 
2247  | 
                    # there may be directories in the inventory even though
 | 
2248  | 
                    # this path is not a file on disk: so mark it as end of
 | 
|
2249  | 
                    # iterator
 | 
|
2250  | 
if e.errno in (errno.ENOENT, errno.ENOTDIR, errno.EINVAL):  | 
|
2251  | 
current_dir_info = None  | 
|
2252  | 
elif (sys.platform == 'win32'  | 
|
| 
2408.1.5
by Alexander Belchenko
 John's patch for WT4 on Windows+Python2.4  | 
2253  | 
and (e.errno in win_errors  | 
2254  | 
or e_winerror in win_errors)):  | 
|
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2255  | 
current_dir_info = None  | 
2256  | 
else:  | 
|
2257  | 
                        raise
 | 
|
| 
2255.2.151
by Robert Collins
 Handle specific_files natively for WorkingTreeFormat4._iter_changes.  | 
2258  | 
else:  | 
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2259  | 
if current_dir_info[0][0] == '':  | 
2260  | 
                        # remove .bzr from iteration
 | 
|
2261  | 
bzr_index = bisect_left(current_dir_info[1], ('.bzr',))  | 
|
2262  | 
assert current_dir_info[1][bzr_index][0] == '.bzr'  | 
|
2263  | 
del current_dir_info[1][bzr_index]  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2264  | 
            # walk until both the directory listing and the versioned metadata
 | 
| 
2255.2.236
by Martin Pool
 Review cleanups: mostly updating or removing todo comments.  | 
2265  | 
            # are exhausted. 
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2266  | 
if (block_index < len(state._dirblocks) and  | 
2267  | 
osutils.is_inside(current_root, state._dirblocks[block_index][0])):  | 
|
2268  | 
current_block = state._dirblocks[block_index]  | 
|
2269  | 
else:  | 
|
2270  | 
current_block = None  | 
|
2271  | 
while (current_dir_info is not None or  | 
|
| 
2255.7.35
by John Arbash Meinel
 Handle the case when a directory has been removed, and isn't the last entry.  | 
2272  | 
current_block is not None):  | 
2273  | 
if (current_dir_info and current_block  | 
|
2274  | 
and current_dir_info[0][0] != current_block[0]):  | 
|
| 
2474.1.44
by John Arbash Meinel
 Use cmp_by_dirs in _iter_changes, it saves a bit of time.  | 
2275  | 
if cmp_by_dirs(current_dir_info[0][0], current_block[0]) < 0:  | 
| 
2255.7.35
by John Arbash Meinel
 Handle the case when a directory has been removed, and isn't the last entry.  | 
2276  | 
                        # filesystem data refers to paths not covered by the dirblock.
 | 
| 
2255.7.6
by Robert Collins
 Test for iterating changes past empty directories.  | 
2277  | 
                        # this has two possibilities:
 | 
2278  | 
                        # A) it is versioned but empty, so there is no block for it
 | 
|
2279  | 
                        # B) it is not versioned.
 | 
|
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2280  | 
|
2281  | 
                        # if (A) then we need to recurse into it to check for
 | 
|
2282  | 
                        # new unknown files or directories.
 | 
|
2283  | 
                        # if (B) then we should ignore it, because we don't
 | 
|
2284  | 
                        # recurse into unknown directories.
 | 
|
| 
2466.4.3
by John Arbash Meinel
 Fix bug #110399 by changing _iter_changes to never descend into unknown directories.  | 
2285  | 
path_index = 0  | 
2286  | 
while path_index < len(current_dir_info[1]):  | 
|
2287  | 
current_path_info = current_dir_info[1][path_index]  | 
|
2288  | 
if want_unversioned:  | 
|
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2289  | 
if current_path_info[2] == 'directory':  | 
2290  | 
if self.target._directory_is_tree_reference(  | 
|
2291  | 
current_path_info[0].decode('utf8')):  | 
|
2292  | 
current_path_info = current_path_info[:2] + \  | 
|
2293  | 
('tree-reference',) + current_path_info[3:]  | 
|
2294  | 
new_executable = bool(  | 
|
2295  | 
stat.S_ISREG(current_path_info[3].st_mode)  | 
|
2296  | 
and stat.S_IEXEC & current_path_info[3].st_mode)  | 
|
2297  | 
yield (None,  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2298  | 
(None, utf8_decode(current_path_info[0])[0]),  | 
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2299  | 
True,  | 
2300  | 
(False, False),  | 
|
2301  | 
(None, None),  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2302  | 
(None, utf8_decode(current_path_info[1])[0]),  | 
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2303  | 
(None, current_path_info[2]),  | 
2304  | 
(None, new_executable))  | 
|
| 
2466.4.3
by John Arbash Meinel
 Fix bug #110399 by changing _iter_changes to never descend into unknown directories.  | 
2305  | 
                                # dont descend into this unversioned path if it is
 | 
2306  | 
                                # a dir
 | 
|
2307  | 
if current_path_info[2] in ('directory',  | 
|
2308  | 
'tree-reference'):  | 
|
2309  | 
del current_dir_info[1][path_index]  | 
|
2310  | 
path_index -= 1  | 
|
2311  | 
path_index += 1  | 
|
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2312  | 
|
2313  | 
                        # This dir info has been handled, go to the next
 | 
|
| 
2255.7.6
by Robert Collins
 Test for iterating changes past empty directories.  | 
2314  | 
try:  | 
2315  | 
current_dir_info = dir_iterator.next()  | 
|
2316  | 
except StopIteration:  | 
|
2317  | 
current_dir_info = None  | 
|
| 
2255.7.35
by John Arbash Meinel
 Handle the case when a directory has been removed, and isn't the last entry.  | 
2318  | 
else:  | 
2319  | 
                        # We have a dirblock entry for this location, but there
 | 
|
2320  | 
                        # is no filesystem path for this. This is most likely
 | 
|
2321  | 
                        # because a directory was removed from the disk.
 | 
|
2322  | 
                        # We don't have to report the missing directory,
 | 
|
2323  | 
                        # because that should have already been handled, but we
 | 
|
2324  | 
                        # need to handle all of the files that are contained
 | 
|
2325  | 
                        # within.
 | 
|
2326  | 
for current_entry in current_block[1]:  | 
|
2327  | 
                            # entry referring to file not present on disk.
 | 
|
2328  | 
                            # advance the entry only, after processing.
 | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2329  | 
result = _process_entry(current_entry, None)  | 
2330  | 
if result is not None:  | 
|
2331  | 
if result is not uninteresting:  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2332  | 
yield result  | 
| 
2255.7.35
by John Arbash Meinel
 Handle the case when a directory has been removed, and isn't the last entry.  | 
2333  | 
block_index +=1  | 
2334  | 
if (block_index < len(state._dirblocks) and  | 
|
2335  | 
osutils.is_inside(current_root,  | 
|
2336  | 
state._dirblocks[block_index][0])):  | 
|
2337  | 
current_block = state._dirblocks[block_index]  | 
|
2338  | 
else:  | 
|
2339  | 
current_block = None  | 
|
| 
2255.7.7
by Robert Collins
 continue iteration at the right point for InterDirStateTree._iter_changes.  | 
2340  | 
                    continue
 | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2341  | 
entry_index = 0  | 
2342  | 
if current_block and entry_index < len(current_block[1]):  | 
|
2343  | 
current_entry = current_block[1][entry_index]  | 
|
2344  | 
else:  | 
|
2345  | 
current_entry = None  | 
|
2346  | 
advance_entry = True  | 
|
2347  | 
path_index = 0  | 
|
2348  | 
if current_dir_info and path_index < len(current_dir_info[1]):  | 
|
2349  | 
current_path_info = current_dir_info[1][path_index]  | 
|
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2350  | 
if current_path_info[2] == 'directory':  | 
2351  | 
if self.target._directory_is_tree_reference(  | 
|
| 
2255.2.215
by Robert Collins
 Hook directory-tree-reference detection into dirstate _iter_changes.  | 
2352  | 
current_path_info[0].decode('utf8')):  | 
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2353  | 
current_path_info = current_path_info[:2] + \  | 
2354  | 
('tree-reference',) + current_path_info[3:]  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2355  | 
else:  | 
2356  | 
current_path_info = None  | 
|
2357  | 
advance_path = True  | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2358  | 
path_handled = False  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2359  | 
while (current_entry is not None or  | 
2360  | 
current_path_info is not None):  | 
|
2361  | 
if current_entry is None:  | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2362  | 
                        # the check for path_handled when the path is adnvaced
 | 
2363  | 
                        # will yield this path if needed.
 | 
|
2364  | 
                        pass
 | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2365  | 
elif current_path_info is None:  | 
2366  | 
                        # no path is fine: the per entry code will handle it.
 | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2367  | 
result = _process_entry(current_entry, current_path_info)  | 
2368  | 
if result is not None:  | 
|
2369  | 
if result is not uninteresting:  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2370  | 
yield result  | 
| 
2472.3.2
by John Arbash Meinel
 Now that finding a file on disk which doesn't match  | 
2371  | 
elif (current_entry[0][1] != current_path_info[1]  | 
2372  | 
or current_entry[1][target_index][0] in 'ar'):  | 
|
2373  | 
                        # The current path on disk doesn't match the dirblock
 | 
|
2374  | 
                        # record. Either the dirblock is marked as absent, or
 | 
|
2375  | 
                        # the file on disk is not present at all in the
 | 
|
2376  | 
                        # dirblock. Either way, report about the dirblock
 | 
|
2377  | 
                        # entry, and let other code handle the filesystem one.
 | 
|
| 
2598.2.1
by John Arbash Meinel
 Update WT4._iter_changes to not split the basename, since it will  | 
2378  | 
|
2379  | 
                        # Compare the basename for these files to determine
 | 
|
2380  | 
                        # which comes first
 | 
|
2381  | 
if current_path_info[1] < current_entry[0][1]:  | 
|
| 
2255.7.34
by John Arbash Meinel
 Clean up test_bad_files, and fix a bug in _iter_changes when  | 
2382  | 
                            # extra file on disk: pass for now, but only
 | 
2383  | 
                            # increment the path, not the entry
 | 
|
2384  | 
advance_entry = False  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2385  | 
else:  | 
2386  | 
                            # entry referring to file not present on disk.
 | 
|
2387  | 
                            # advance the entry only, after processing.
 | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2388  | 
result = _process_entry(current_entry, None)  | 
2389  | 
if result is not None:  | 
|
2390  | 
if result is not uninteresting:  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2391  | 
yield result  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2392  | 
advance_path = False  | 
2393  | 
else:  | 
|
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2394  | 
result = _process_entry(current_entry, current_path_info)  | 
2395  | 
if result is not None:  | 
|
| 
2465.1.2
by John Arbash Meinel
 Alternate fix for 'absent' entries.  | 
2396  | 
path_handled = True  | 
| 
2485.3.5
by John Arbash Meinel
 switching to a single returned object from _process_entry is not faster  | 
2397  | 
if result is not uninteresting:  | 
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2398  | 
yield result  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2399  | 
if advance_entry and current_entry is not None:  | 
2400  | 
entry_index += 1  | 
|
2401  | 
if entry_index < len(current_block[1]):  | 
|
2402  | 
current_entry = current_block[1][entry_index]  | 
|
2403  | 
else:  | 
|
2404  | 
current_entry = None  | 
|
2405  | 
else:  | 
|
2406  | 
advance_entry = True # reset the advance flaga  | 
|
2407  | 
if advance_path and current_path_info is not None:  | 
|
| 
2255.7.87
by Robert Collins
 Dont walk unversioned directories in _iter_changes.  | 
2408  | 
if not path_handled:  | 
2409  | 
                            # unversioned in all regards
 | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2410  | 
if want_unversioned:  | 
| 
2255.7.87
by Robert Collins
 Dont walk unversioned directories in _iter_changes.  | 
2411  | 
new_executable = bool(  | 
2412  | 
stat.S_ISREG(current_path_info[3].st_mode)  | 
|
2413  | 
and stat.S_IEXEC & current_path_info[3].st_mode)  | 
|
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2414  | 
yield (None,  | 
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2415  | 
(None, utf8_decode(current_path_info[0])[0]),  | 
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2416  | 
True,  | 
2417  | 
(False, False),  | 
|
2418  | 
(None, None),  | 
|
| 
2485.3.9
by John Arbash Meinel
 Now that we know when tuples will be yielded  | 
2419  | 
(None, utf8_decode(current_path_info[1])[0]),  | 
| 
2402.2.2
by John Arbash Meinel
 Fix _iter_changes to properly handle versioned (but empty) directories  | 
2420  | 
(None, current_path_info[2]),  | 
2421  | 
(None, new_executable))  | 
|
| 
2255.7.87
by Robert Collins
 Dont walk unversioned directories in _iter_changes.  | 
2422  | 
                            # dont descend into this unversioned path if it is
 | 
2423  | 
                            # a dir
 | 
|
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2424  | 
if current_path_info[2] in ('directory'):  | 
| 
2255.7.87
by Robert Collins
 Dont walk unversioned directories in _iter_changes.  | 
2425  | 
del current_dir_info[1][path_index]  | 
2426  | 
path_index -= 1  | 
|
| 
2323.4.2
by Robert Collins
 Fix the behaviour of dirstate optimised iter_changes recursing its disk iterator into subtrees inappropriately.  | 
2427  | 
                        # dont descend the disk iterator into any tree 
 | 
2428  | 
                        # paths.
 | 
|
2429  | 
if current_path_info[2] == 'tree-reference':  | 
|
2430  | 
del current_dir_info[1][path_index]  | 
|
2431  | 
path_index -= 1  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2432  | 
path_index += 1  | 
2433  | 
if path_index < len(current_dir_info[1]):  | 
|
2434  | 
current_path_info = current_dir_info[1][path_index]  | 
|
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2435  | 
if current_path_info[2] == 'directory':  | 
2436  | 
if self.target._directory_is_tree_reference(  | 
|
| 
2255.2.215
by Robert Collins
 Hook directory-tree-reference detection into dirstate _iter_changes.  | 
2437  | 
current_path_info[0].decode('utf8')):  | 
| 
2255.2.214
by Robert Collins
 Get _iter_changes on dirstate passing the subtree tests.  | 
2438  | 
current_path_info = current_path_info[:2] + \  | 
2439  | 
('tree-reference',) + current_path_info[3:]  | 
|
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2440  | 
else:  | 
2441  | 
current_path_info = None  | 
|
| 
2255.7.85
by Robert Collins
 Teach _iter_changes to gather unversioned path details upon request.  | 
2442  | 
path_handled = False  | 
| 
2255.2.149
by Robert Collins
 Crufty but existing _iter_changes implementation for WorkingTreeFormat4.  | 
2443  | 
else:  | 
2444  | 
advance_path = True # reset the advance flagg.  | 
|
2445  | 
if current_block is not None:  | 
|
2446  | 
block_index += 1  | 
|
2447  | 
if (block_index < len(state._dirblocks) and  | 
|
2448  | 
osutils.is_inside(current_root, state._dirblocks[block_index][0])):  | 
|
2449  | 
current_block = state._dirblocks[block_index]  | 
|
2450  | 
else:  | 
|
2451  | 
current_block = None  | 
|
2452  | 
if current_dir_info is not None:  | 
|
2453  | 
try:  | 
|
2454  | 
current_dir_info = dir_iterator.next()  | 
|
2455  | 
except StopIteration:  | 
|
2456  | 
current_dir_info = None  | 
|
2457  | 
||
| 
2255.2.117
by Robert Collins
 Add an InterDirStateTree InterTree optimiser.  | 
2458  | 
|
2459  | 
    @staticmethod
 | 
|
2460  | 
def is_compatible(source, target):  | 
|
2461  | 
        # the target must be a dirstate working tree
 | 
|
2462  | 
if not isinstance(target, WorkingTree4):  | 
|
2463  | 
return False  | 
|
2464  | 
        # the source must be a revtreee or dirstate rev tree.
 | 
|
2465  | 
if not isinstance(source,  | 
|
2466  | 
(revisiontree.RevisionTree, DirStateRevisionTree)):  | 
|
2467  | 
return False  | 
|
2468  | 
        # the source revid must be in the target dirstate
 | 
|
2469  | 
if not (source._revision_id == NULL_REVISION or  | 
|
2470  | 
source._revision_id in target.get_parent_ids()):  | 
|
2471  | 
            # TODO: what about ghosts? it may well need to 
 | 
|
2472  | 
            # check for them explicitly.
 | 
|
2473  | 
return False  | 
|
2474  | 
return True  | 
|
2475  | 
||
2476  | 
InterTree.register_optimiser(InterDirStateTree)  | 
|
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2477  | 
|
2478  | 
||
2479  | 
class Converter3to4(object):  | 
|
2480  | 
"""Perform an in-place upgrade of format 3 to format 4 trees."""  | 
|
2481  | 
||
2482  | 
def __init__(self):  | 
|
2483  | 
self.target_format = WorkingTreeFormat4()  | 
|
2484  | 
||
2485  | 
def convert(self, tree):  | 
|
2486  | 
        # lock the control files not the tree, so that we dont get tree
 | 
|
2487  | 
        # on-unlock behaviours, and so that noone else diddles with the 
 | 
|
2488  | 
        # tree during upgrade.
 | 
|
2489  | 
tree._control_files.lock_write()  | 
|
2490  | 
try:  | 
|
| 
2334.1.3
by John Arbash Meinel
 When upgrading, we can't assume that WorkingTree._inventory is valid, because that is now  | 
2491  | 
tree.read_working_inventory()  | 
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2492  | 
self.create_dirstate_data(tree)  | 
2493  | 
self.update_format(tree)  | 
|
2494  | 
self.remove_xml_files(tree)  | 
|
2495  | 
finally:  | 
|
2496  | 
tree._control_files.unlock()  | 
|
2497  | 
||
2498  | 
def create_dirstate_data(self, tree):  | 
|
2499  | 
"""Create the dirstate based data for tree."""  | 
|
2500  | 
local_path = tree.bzrdir.get_workingtree_transport(None  | 
|
2501  | 
).local_abspath('dirstate')  | 
|
2502  | 
state = dirstate.DirState.from_tree(tree, local_path)  | 
|
2503  | 
state.save()  | 
|
2504  | 
state.unlock()  | 
|
2505  | 
||
2506  | 
def remove_xml_files(self, tree):  | 
|
2507  | 
"""Remove the oldformat 3 data."""  | 
|
2508  | 
transport = tree.bzrdir.get_workingtree_transport(None)  | 
|
2509  | 
for path in ['basis-inventory-cache', 'inventory', 'last-revision',  | 
|
2510  | 
'pending-merges', 'stat-cache']:  | 
|
| 
2255.2.194
by Robert Collins
 [BROKEN] Many updates to stop using experimental formats in tests.  | 
2511  | 
try:  | 
2512  | 
transport.delete(path)  | 
|
2513  | 
except errors.NoSuchFile:  | 
|
2514  | 
                # some files are optional - just deal.
 | 
|
2515  | 
                pass
 | 
|
| 
2255.12.1
by Robert Collins
 Implement upgrade for working trees.  | 
2516  | 
|
2517  | 
def update_format(self, tree):  | 
|
2518  | 
"""Change the format marker."""  | 
|
2519  | 
tree._control_files.put_utf8('format',  | 
|
2520  | 
self.target_format.get_format_string())  |