~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-04-15 12:07:39 UTC
  • mfrom: (5777.5.3 inventoryworkingtree)
  • Revision ID: pqm@pqm.ubuntu.com-20110415120739-7ftrzs0qmz98ar5e
(jelmer) Split inventory-specific implementation out of MutableTree into
 MutableInventoryTree. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2010 Canonical Ltd
 
1
# Copyright (C) 2007-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
31
31
import errno
32
32
import stat
33
33
 
34
 
import bzrlib
35
34
from bzrlib import (
36
35
    bzrdir,
37
36
    cache_utf8,
38
37
    debug,
39
38
    dirstate,
40
39
    errors,
 
40
    filters as _mod_filters,
41
41
    generate_ids,
42
42
    osutils,
43
43
    revision as _mod_revision,
46
46
    transform,
47
47
    views,
48
48
    )
49
 
import bzrlib.branch
50
 
import bzrlib.ui
51
49
""")
52
50
 
53
51
from bzrlib.decorators import needs_read_lock, needs_write_lock
54
 
from bzrlib.filters import filtered_input_file, internal_size_sha_file_byname
55
52
from bzrlib.inventory import Inventory, ROOT_ID, entry_factory
56
53
from bzrlib.lock import LogicalLockResult
57
54
from bzrlib.mutabletree import needs_tree_write_lock
62
59
    realpath,
63
60
    safe_unicode,
64
61
    )
65
 
from bzrlib.trace import mutter
66
62
from bzrlib.transport.local import LocalTransport
67
 
from bzrlib.tree import InterTree
68
 
from bzrlib.tree import Tree
69
 
from bzrlib.workingtree import WorkingTree, WorkingTree3, WorkingTreeFormat3
 
63
from bzrlib.tree import (
 
64
    InterTree,
 
65
    InventoryTree,
 
66
    )
 
67
from bzrlib.workingtree import (
 
68
    WorkingTree,
 
69
    WorkingTree3,
 
70
    WorkingTreeFormat3,
 
71
    )
70
72
 
71
73
 
72
74
class DirStateWorkingTree(WorkingTree3):
 
75
 
73
76
    def __init__(self, basedir,
74
77
                 branch,
75
78
                 _control_files=None,
85
88
        self._format = _format
86
89
        self.bzrdir = _bzrdir
87
90
        basedir = safe_unicode(basedir)
88
 
        mutter("opening working tree %r", basedir)
 
91
        trace.mutter("opening working tree %r", basedir)
89
92
        self._branch = branch
90
93
        self.basedir = realpath(basedir)
91
94
        # if branch is at our basedir and is a format 6 or less
369
372
        state = self.current_dirstate()
370
373
        if stat_value is None:
371
374
            try:
372
 
                stat_value = os.lstat(file_abspath)
 
375
                stat_value = osutils.lstat(file_abspath)
373
376
            except OSError, e:
374
377
                if e.errno == errno.ENOENT:
375
378
                    return None
478
481
            self._must_be_locked()
479
482
            if not path:
480
483
                path = self.id2path(file_id)
481
 
            mode = os.lstat(self.abspath(path)).st_mode
 
484
            mode = osutils.lstat(self.abspath(path)).st_mode
482
485
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
483
486
 
484
487
    def all_file_ids(self):
1254
1257
    def rename_one(self, from_rel, to_rel, after=False):
1255
1258
        """See WorkingTree.rename_one"""
1256
1259
        self.flush()
1257
 
        WorkingTree.rename_one(self, from_rel, to_rel, after)
 
1260
        super(DirStateWorkingTree, self).rename_one(from_rel, to_rel, after)
1258
1261
 
1259
1262
    @needs_tree_write_lock
1260
1263
    def apply_inventory_delta(self, changes):
1293
1296
            self._inventory = inv
1294
1297
        self.flush()
1295
1298
 
 
1299
    @needs_tree_write_lock
 
1300
    def reset_state(self, revision_ids=None):
 
1301
        """Reset the state of the working tree.
 
1302
 
 
1303
        This does a hard-reset to a last-known-good state. This is a way to
 
1304
        fix if something got corrupted (like the .bzr/checkout/dirstate file)
 
1305
        """
 
1306
        if revision_ids is None:
 
1307
            revision_ids = self.get_parent_ids()
 
1308
        if not revision_ids:
 
1309
            base_tree = self.branch.repository.revision_tree(
 
1310
                _mod_revision.NULL_REVISION)
 
1311
            trees = []
 
1312
        else:
 
1313
            trees = zip(revision_ids,
 
1314
                        self.branch.repository.revision_trees(revision_ids))
 
1315
            base_tree = trees[0][1]
 
1316
        state = self.current_dirstate()
 
1317
        # We don't support ghosts yet
 
1318
        state.set_state_from_scratch(base_tree.inventory, trees, [])
 
1319
 
1296
1320
 
1297
1321
class ContentFilterAwareSHA1Provider(dirstate.SHA1Provider):
1298
1322
 
1303
1327
        """See dirstate.SHA1Provider.sha1()."""
1304
1328
        filters = self.tree._content_filter_stack(
1305
1329
            self.tree.relpath(osutils.safe_unicode(abspath)))
1306
 
        return internal_size_sha_file_byname(abspath, filters)[1]
 
1330
        return _mod_filters.internal_size_sha_file_byname(abspath, filters)[1]
1307
1331
 
1308
1332
    def stat_and_sha1(self, abspath):
1309
1333
        """See dirstate.SHA1Provider.stat_and_sha1()."""
1313
1337
        try:
1314
1338
            statvalue = os.fstat(file_obj.fileno())
1315
1339
            if filters:
1316
 
                file_obj = filtered_input_file(file_obj, filters)
 
1340
                file_obj = _mod_filters.filtered_input_file(file_obj, filters)
1317
1341
            sha1 = osutils.size_sha_file(file_obj)[1]
1318
1342
        finally:
1319
1343
            file_obj.close()
1385
1409
 
1386
1410
class DirStateWorkingTreeFormat(WorkingTreeFormat3):
1387
1411
 
 
1412
    missing_parent_conflicts = True
 
1413
 
1388
1414
    def initialize(self, a_bzrdir, revision_id=None, from_branch=None,
1389
1415
                   accelerator_tree=None, hardlink=False):
1390
1416
        """See WorkingTreeFormat.initialize().
1585
1611
        return True
1586
1612
 
1587
1613
 
1588
 
class DirStateRevisionTree(Tree):
 
1614
class DirStateRevisionTree(InventoryTree):
1589
1615
    """A revision tree pulling the inventory from a dirstate.
1590
1616
    
1591
1617
    Note that this is one of the historical (ie revision) trees cached in the
1867
1893
    def is_executable(self, file_id, path=None):
1868
1894
        ie = self.inventory[file_id]
1869
1895
        if ie.kind != "file":
1870
 
            return None
 
1896
            return False
1871
1897
        return ie.executable
1872
1898
 
1873
1899
    def is_locked(self):