29
29
from bzrlib.lazy_import import lazy_import
30
30
lazy_import(globals(), """
31
from bisect import bisect_left
33
from copy import deepcopy
42
35
from bzrlib import (
45
conflicts as _mod_conflicts,
55
43
revision as _mod_revision,
65
49
import bzrlib.branch
66
from bzrlib.transport import get_transport
70
from bzrlib import symbol_versioning
71
53
from bzrlib.decorators import needs_read_lock, needs_write_lock
72
54
from bzrlib.filters import filtered_input_file, internal_size_sha_file_byname
73
from bzrlib.inventory import InventoryEntry, Inventory, ROOT_ID, entry_factory
55
from bzrlib.inventory import Inventory, ROOT_ID, entry_factory
74
56
import bzrlib.mutabletree
75
57
from bzrlib.mutabletree import needs_tree_write_lock
76
58
from bzrlib.osutils import (
86
from bzrlib.trace import mutter, note
65
from bzrlib.trace import mutter
87
66
from bzrlib.transport.local import LocalTransport
88
67
from bzrlib.tree import InterTree
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,
97
68
from bzrlib.tree import Tree
98
69
from bzrlib.workingtree import WorkingTree, WorkingTree3, WorkingTreeFormat3
716
687
from_entry = self._get_entry(path=from_rel)
717
688
if from_entry == (None, None):
718
689
raise errors.BzrMoveFailedError(from_rel,to_dir,
719
errors.NotVersionedError(path=str(from_rel)))
690
errors.NotVersionedError(path=from_rel))
721
692
from_id = from_entry[0][2]
722
693
to_rel = pathjoin(to_dir, from_tail)
1051
1022
def set_last_revision(self, new_revision):
1052
1023
"""Change the last revision in the working tree."""
1053
1024
parents = self.get_parent_ids()
1054
if new_revision in (NULL_REVISION, None):
1025
if new_revision in (_mod_revision.NULL_REVISION, None):
1055
1026
if len(parents) >= 2:
1056
1027
raise AssertionError(
1057
1028
"setting the last parent to none with a pending merge is "
1403
1374
wt.lock_tree_write()
1405
1376
self._init_custom_control_files(wt)
1406
if revision_id in (None, NULL_REVISION):
1377
if revision_id in (None, _mod_revision.NULL_REVISION):
1407
1378
if branch.repository.supports_rich_root():
1408
1379
wt._set_root_id(generate_ids.gen_root_id())
1421
1392
if basis is None:
1422
1393
basis = branch.repository.revision_tree(revision_id)
1423
if revision_id == NULL_REVISION:
1394
if revision_id == _mod_revision.NULL_REVISION:
1424
1395
parents_list = []
1426
1397
parents_list = [(revision_id, basis)]
1845
1816
return ie.executable
1847
def list_files(self, include_root=False):
1818
def list_files(self, include_root=False, from_dir=None, recursive=True):
1848
1819
# We use a standard implementation, because DirStateRevisionTree is
1849
1820
# dealing with one of the parents of the current state
1850
1821
inv = self._get_inventory()
1851
entries = inv.iter_entries()
1852
if self.inventory.root is not None and not include_root:
1822
if from_dir is None:
1825
from_dir_id = inv.path2id(from_dir)
1826
if from_dir_id is None:
1827
# Directory not versioned
1829
entries = inv.iter_entries(from_dir=from_dir_id, recursive=recursive)
1830
if inv.root is not None and not include_root and from_dir is None:
1854
1832
for path, entry in entries:
1855
1833
yield path, 'V', entry.kind, entry.file_id, entry
1963
1941
if not CompiledDirstateHelpersFeature.available():
1964
1942
from bzrlib.tests import UnavailableFeature
1965
1943
raise UnavailableFeature(CompiledDirstateHelpersFeature)
1966
from bzrlib._dirstate_helpers_c import ProcessEntryC
1944
from bzrlib._dirstate_helpers_pyx import ProcessEntryC
1967
1945
result = klass.make_source_parent_tree(source, target)
1968
1946
result[1]._iter_changes = ProcessEntryC
2009
1987
require_versioned, want_unversioned=want_unversioned)
2010
1988
parent_ids = self.target.get_parent_ids()
2011
1989
if not (self.source._revision_id in parent_ids
2012
or self.source._revision_id == NULL_REVISION):
1990
or self.source._revision_id == _mod_revision.NULL_REVISION):
2013
1991
raise AssertionError(
2014
1992
"revision {%s} is not stored in {%s}, but %s "
2015
1993
"can only be used for trees stored in the dirstate"
2016
1994
% (self.source._revision_id, self.target, self.iter_changes))
2017
1995
target_index = 0
2018
if self.source._revision_id == NULL_REVISION:
1996
if self.source._revision_id == _mod_revision.NULL_REVISION:
2019
1997
source_index = None
2020
1998
indices = (target_index,)
2042
2020
state._read_dirblocks_if_needed()
2043
2021
if require_versioned:
2044
2022
# -- check all supplied paths are versioned in a search tree. --
2045
all_versioned = True
2046
2024
for path in specific_files:
2047
2025
path_entries = state._entries_for_path(path)
2048
2026
if not path_entries:
2049
2027
# this specified path is not present at all: error
2050
all_versioned = False
2028
not_versioned.append(path)
2052
2030
found_versioned = False
2053
2031
# for each id at this path
2054
2032
for entry in path_entries:
2061
2039
if not found_versioned:
2062
2040
# none of the indexes was not 'absent' at all ids for this
2064
all_versioned = False
2066
if not all_versioned:
2067
raise errors.PathsNotVersionedError(specific_files)
2042
not_versioned.append(path)
2043
if len(not_versioned) > 0:
2044
raise errors.PathsNotVersionedError(not_versioned)
2068
2045
# -- remove redundancy in supplied specific_files to prevent over-scanning --
2069
2046
search_specific_files = osutils.minimum_path_selection(specific_files)
2084
2061
(revisiontree.RevisionTree, DirStateRevisionTree)):
2086
2063
# the source revid must be in the target dirstate
2087
if not (source._revision_id == NULL_REVISION or
2064
if not (source._revision_id == _mod_revision.NULL_REVISION or
2088
2065
source._revision_id in target.get_parent_ids()):
2089
2066
# TODO: what about ghosts? it may well need to
2090
2067
# check for them explicitly.