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
35
42
from bzrlib import (
45
conflicts as _mod_conflicts,
43
55
revision as _mod_revision,
49
64
import bzrlib.branch
65
from bzrlib.transport import get_transport
69
from bzrlib import symbol_versioning
53
70
from bzrlib.decorators import needs_read_lock, needs_write_lock
54
from bzrlib.filters import filtered_input_file, internal_size_sha_file_byname
55
from bzrlib.inventory import Inventory, ROOT_ID, entry_factory
71
from bzrlib.inventory import InventoryEntry, Inventory, ROOT_ID, entry_factory
72
from bzrlib.lockable_files import LockableFiles, TransportLock
73
from bzrlib.lockdir import LockDir
74
import bzrlib.mutabletree
56
75
from bzrlib.mutabletree import needs_tree_write_lock
57
76
from bzrlib.osutils import (
64
from bzrlib.trace import mutter
86
from bzrlib.trace import mutter, note
65
87
from bzrlib.transport.local import LocalTransport
66
88
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,
67
97
from bzrlib.tree import Tree
68
98
from bzrlib.workingtree import WorkingTree, WorkingTree3, WorkingTreeFormat3
71
class DirStateWorkingTree(WorkingTree3):
101
class WorkingTree4(WorkingTree3):
102
"""This is the Format 4 working tree.
104
This differs from WorkingTree3 by:
105
- Having a consolidated internal dirstate, stored in a
106
randomly-accessible sorted file on disk.
107
- Not having a regular inventory attribute. One can be synthesized
108
on demand but this is expensive and should be avoided.
110
This is new in bzr 0.15.
72
113
def __init__(self, basedir,
74
115
_control_files=None,
217
258
return self._dirstate
218
259
local_path = self.bzrdir.get_workingtree_transport(None
219
260
).local_abspath('dirstate')
220
self._dirstate = dirstate.DirState.on_file(local_path,
221
self._sha1_provider())
261
self._dirstate = dirstate.DirState.on_file(local_path)
222
262
return self._dirstate
224
def _sha1_provider(self):
225
"""A function that returns a SHA1Provider suitable for this tree.
227
:return: None if content filtering is not supported by this tree.
228
Otherwise, a SHA1Provider is returned that sha's the canonical
229
form of files, i.e. after read filters are applied.
231
if self.supports_content_filtering():
232
return ContentFilterAwareSHA1Provider(self)
236
264
def filter_unversioned_files(self, paths):
237
265
"""Filter out paths that are versioned.
1280
1286
if self._dirty:
1281
1287
raise AssertionError("attempting to write an inventory when the "
1282
1288
"dirstate is dirty will lose pending changes")
1283
had_inventory = self._inventory is not None
1284
# Setting self._inventory = None forces the dirstate to regenerate the
1285
# working inventory. We do this because self.inventory may be inv, or
1286
# may have been modified, and either case would prevent a clean delta
1288
self._inventory = None
1290
delta = inv._make_delta(self.inventory)
1292
self.apply_inventory_delta(delta)
1289
self.current_dirstate().set_state_from_inventory(inv)
1290
self._make_dirty(reset_inventory=False)
1291
if self._inventory is not None:
1294
1292
self._inventory = inv
1298
class ContentFilterAwareSHA1Provider(dirstate.SHA1Provider):
1300
def __init__(self, tree):
1303
def sha1(self, abspath):
1304
"""See dirstate.SHA1Provider.sha1()."""
1305
filters = self.tree._content_filter_stack(
1306
self.tree.relpath(osutils.safe_unicode(abspath)))
1307
return internal_size_sha_file_byname(abspath, filters)[1]
1309
def stat_and_sha1(self, abspath):
1310
"""See dirstate.SHA1Provider.stat_and_sha1()."""
1311
filters = self.tree._content_filter_stack(
1312
self.tree.relpath(osutils.safe_unicode(abspath)))
1313
file_obj = file(abspath, 'rb', 65000)
1315
statvalue = os.fstat(file_obj.fileno())
1317
file_obj = filtered_input_file(file_obj, filters)
1318
sha1 = osutils.size_sha_file(file_obj)[1]
1321
return statvalue, sha1
1324
class ContentFilteringDirStateWorkingTree(DirStateWorkingTree):
1325
"""Dirstate working tree that supports content filtering.
1327
The dirstate holds the hash and size of the canonical form of the file,
1328
and most methods must return that.
1331
def _file_content_summary(self, path, stat_result):
1332
# This is to support the somewhat obsolete path_content_summary method
1333
# with content filtering: see
1334
# <https://bugs.edge.launchpad.net/bzr/+bug/415508>.
1336
# If the dirstate cache is up to date and knows the hash and size,
1338
# Otherwise if there are no content filters, return the on-disk size
1339
# and leave the hash blank.
1340
# Otherwise, read and filter the on-disk file and use its size and
1343
# The dirstate doesn't store the size of the canonical form so we
1344
# can't trust it for content-filtered trees. We just return None.
1345
dirstate_sha1 = self._dirstate.sha1_from_stat(path, stat_result)
1346
executable = self._is_executable_from_path_and_stat(path, stat_result)
1347
return ('file', None, executable, dirstate_sha1)
1350
class WorkingTree4(DirStateWorkingTree):
1351
"""This is the Format 4 working tree.
1353
This differs from WorkingTree3 by:
1354
- Having a consolidated internal dirstate, stored in a
1355
randomly-accessible sorted file on disk.
1356
- Not having a regular inventory attribute. One can be synthesized
1357
on demand but this is expensive and should be avoided.
1359
This is new in bzr 0.15.
1363
class WorkingTree5(ContentFilteringDirStateWorkingTree):
1364
"""This is the Format 5 working tree.
1366
This differs from WorkingTree4 by:
1367
- Supporting content filtering.
1369
This is new in bzr 1.11.
1373
class WorkingTree6(ContentFilteringDirStateWorkingTree):
1374
"""This is the Format 6 working tree.
1376
This differs from WorkingTree5 by:
1377
- Supporting a current view that may mask the set of files in a tree
1378
impacted by most user operations.
1380
This is new in bzr 1.14.
1383
def _make_views(self):
1384
return views.PathBasedViews(self)
1387
class DirStateWorkingTreeFormat(WorkingTreeFormat3):
1296
class WorkingTreeFormat4(WorkingTreeFormat3):
1297
"""The first consolidated dirstate working tree format.
1300
- exists within a metadir controlling .bzr
1301
- includes an explicit version marker for the workingtree control
1302
files, separate from the BzrDir format
1303
- modifies the hash cache format
1304
- is new in bzr 0.15
1305
- uses a LockDir to guard access to it.
1308
upgrade_recommended = False
1310
_tree_class = WorkingTree4
1312
def get_format_string(self):
1313
"""See WorkingTreeFormat.get_format_string()."""
1314
return "Bazaar Working Tree Format 4 (bzr 0.15)\n"
1316
def get_format_description(self):
1317
"""See WorkingTreeFormat.get_format_description()."""
1318
return "Working tree format 4"
1389
1320
def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
1390
1321
accelerator_tree=None, hardlink=False):
1514
1433
_matchingbzrdir = property(__get_matchingbzrdir)
1517
class WorkingTreeFormat4(DirStateWorkingTreeFormat):
1518
"""The first consolidated dirstate working tree format.
1521
- exists within a metadir controlling .bzr
1522
- includes an explicit version marker for the workingtree control
1523
files, separate from the BzrDir format
1524
- modifies the hash cache format
1525
- is new in bzr 0.15
1526
- uses a LockDir to guard access to it.
1529
upgrade_recommended = False
1531
_tree_class = WorkingTree4
1533
def get_format_string(self):
1534
"""See WorkingTreeFormat.get_format_string()."""
1535
return "Bazaar Working Tree Format 4 (bzr 0.15)\n"
1537
def get_format_description(self):
1538
"""See WorkingTreeFormat.get_format_description()."""
1539
return "Working tree format 4"
1542
class WorkingTreeFormat5(DirStateWorkingTreeFormat):
1543
"""WorkingTree format supporting content filtering.
1546
upgrade_recommended = False
1548
_tree_class = WorkingTree5
1550
def get_format_string(self):
1551
"""See WorkingTreeFormat.get_format_string()."""
1552
return "Bazaar Working Tree Format 5 (bzr 1.11)\n"
1554
def get_format_description(self):
1555
"""See WorkingTreeFormat.get_format_description()."""
1556
return "Working tree format 5"
1558
def supports_content_filtering(self):
1562
class WorkingTreeFormat6(DirStateWorkingTreeFormat):
1563
"""WorkingTree format supporting views.
1566
upgrade_recommended = False
1568
_tree_class = WorkingTree6
1570
def get_format_string(self):
1571
"""See WorkingTreeFormat.get_format_string()."""
1572
return "Bazaar Working Tree Format 6 (bzr 1.14)\n"
1574
def get_format_description(self):
1575
"""See WorkingTreeFormat.get_format_description()."""
1576
return "Working tree format 6"
1578
def _init_custom_control_files(self, wt):
1579
"""Subclasses with custom control files should override this method."""
1580
wt._transport.put_bytes('views', '', mode=wt.bzrdir._get_file_mode())
1582
def supports_content_filtering(self):
1585
def supports_views(self):
1589
1436
class DirStateRevisionTree(Tree):
1590
"""A revision tree pulling the inventory from a dirstate.
1592
Note that this is one of the historical (ie revision) trees cached in the
1593
dirstate for easy access, not the workingtree.
1437
"""A revision tree pulling the inventory from a dirstate."""
1596
1439
def __init__(self, dirstate, revision_id, repository):
1597
1440
self._dirstate = dirstate
1874
1712
return ie.executable
1876
def is_locked(self):
1879
def list_files(self, include_root=False, from_dir=None, recursive=True):
1714
def list_files(self, include_root=False):
1880
1715
# We use a standard implementation, because DirStateRevisionTree is
1881
1716
# dealing with one of the parents of the current state
1882
1717
inv = self._get_inventory()
1883
if from_dir is None:
1886
from_dir_id = inv.path2id(from_dir)
1887
if from_dir_id is None:
1888
# Directory not versioned
1890
entries = inv.iter_entries(from_dir=from_dir_id, recursive=recursive)
1891
if inv.root is not None and not include_root and from_dir is None:
1718
entries = inv.iter_entries()
1719
if self.inventory.root is not None and not include_root:
1893
1721
for path, entry in entries:
1894
1722
yield path, 'V', entry.kind, entry.file_id, entry
1896
1724
def lock_read(self):
1897
"""Lock the tree for a set of operations.
1899
:return: An object with an unlock method which will release the lock
1725
"""Lock the tree for a set of operations."""
1902
1726
if not self._locked:
1903
1727
self._repository.lock_read()
1904
1728
if self._dirstate._lock_token is None:
1905
1729
self._dirstate.lock_read()
1906
1730
self._dirstate_locked = True
1907
1731
self._locked += 1
1910
1733
def _must_be_locked(self):
1911
1734
if not self._locked:
2004
def make_source_parent_tree_compiled_dirstate(klass, test_case, source,
1827
def make_source_parent_tree_compiled_dirstate(klass, test_case, source, target):
2006
1828
from bzrlib.tests.test__dirstate_helpers import \
2007
compiled_dirstate_helpers_feature
2008
test_case.requireFeature(compiled_dirstate_helpers_feature)
2009
from bzrlib._dirstate_helpers_pyx import ProcessEntryC
1829
CompiledDirstateHelpersFeature
1830
if not CompiledDirstateHelpersFeature.available():
1831
from bzrlib.tests import UnavailableFeature
1832
raise UnavailableFeature(CompiledDirstateHelpersFeature)
1833
from bzrlib._dirstate_helpers_c import ProcessEntryC
2010
1834
result = klass.make_source_parent_tree(source, target)
2011
1835
result[1]._iter_changes = ProcessEntryC
2102
1928
if not found_versioned:
2103
1929
# none of the indexes was not 'absent' at all ids for this
2105
not_versioned.append(path)
2106
if len(not_versioned) > 0:
2107
raise errors.PathsNotVersionedError(not_versioned)
1931
all_versioned = False
1933
if not all_versioned:
1934
raise errors.PathsNotVersionedError(specific_files)
2108
1935
# -- remove redundancy in supplied specific_files to prevent over-scanning --
2109
search_specific_files = osutils.minimum_path_selection(specific_files)
1936
for path in specific_files:
1937
other_specific_files = specific_files.difference(set([path]))
1938
if not osutils.is_inside_any(other_specific_files, path):
1939
# this is a top level path, we must check it.
1940
search_specific_files.add(path)
2111
1942
use_filesystem_for_exec = (sys.platform != 'win32')
2112
1943
iter_changes = self.target._iter_changes(include_unchanged,
2118
1949
def is_compatible(source, target):
2119
1950
# the target must be a dirstate working tree
2120
if not isinstance(target, DirStateWorkingTree):
1951
if not isinstance(target, WorkingTree4):
2122
# the source must be a revtree or dirstate rev tree.
1953
# the source must be a revtreee or dirstate rev tree.
2123
1954
if not isinstance(source,
2124
1955
(revisiontree.RevisionTree, DirStateRevisionTree)):
2126
1957
# the source revid must be in the target dirstate
2127
if not (source._revision_id == _mod_revision.NULL_REVISION or
1958
if not (source._revision_id == NULL_REVISION or
2128
1959
source._revision_id in target.get_parent_ids()):
2129
# TODO: what about ghosts? it may well need to
1960
# TODO: what about ghosts? it may well need to
2130
1961
# check for them explicitly.
2177
2008
tree._transport.put_bytes('format',
2178
2009
self.target_format.get_format_string(),
2179
2010
mode=tree.bzrdir._get_file_mode())
2182
class Converter4to5(object):
2183
"""Perform an in-place upgrade of format 4 to format 5 trees."""
2186
self.target_format = WorkingTreeFormat5()
2188
def convert(self, tree):
2189
# lock the control files not the tree, so that we don't get tree
2190
# on-unlock behaviours, and so that no-one else diddles with the
2191
# tree during upgrade.
2192
tree._control_files.lock_write()
2194
self.update_format(tree)
2196
tree._control_files.unlock()
2198
def update_format(self, tree):
2199
"""Change the format marker."""
2200
tree._transport.put_bytes('format',
2201
self.target_format.get_format_string(),
2202
mode=tree.bzrdir._get_file_mode())
2205
class Converter4or5to6(object):
2206
"""Perform an in-place upgrade of format 4 or 5 to format 6 trees."""
2209
self.target_format = WorkingTreeFormat6()
2211
def convert(self, tree):
2212
# lock the control files not the tree, so that we don't get tree
2213
# on-unlock behaviours, and so that no-one else diddles with the
2214
# tree during upgrade.
2215
tree._control_files.lock_write()
2217
self.init_custom_control_files(tree)
2218
self.update_format(tree)
2220
tree._control_files.unlock()
2222
def init_custom_control_files(self, tree):
2223
"""Initialize custom control files."""
2224
tree._transport.put_bytes('views', '',
2225
mode=tree.bzrdir._get_file_mode())
2227
def update_format(self, tree):
2228
"""Change the format marker."""
2229
tree._transport.put_bytes('format',
2230
self.target_format.get_format_string(),
2231
mode=tree.bzrdir._get_file_mode())