~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree_4.py

Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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):
1324
1327
        """See dirstate.SHA1Provider.sha1()."""
1325
1328
        filters = self.tree._content_filter_stack(
1326
1329
            self.tree.relpath(osutils.safe_unicode(abspath)))
1327
 
        return internal_size_sha_file_byname(abspath, filters)[1]
 
1330
        return _mod_filters.internal_size_sha_file_byname(abspath, filters)[1]
1328
1331
 
1329
1332
    def stat_and_sha1(self, abspath):
1330
1333
        """See dirstate.SHA1Provider.stat_and_sha1()."""
1334
1337
        try:
1335
1338
            statvalue = os.fstat(file_obj.fileno())
1336
1339
            if filters:
1337
 
                file_obj = filtered_input_file(file_obj, filters)
 
1340
                file_obj = _mod_filters.filtered_input_file(file_obj, filters)
1338
1341
            sha1 = osutils.size_sha_file(file_obj)[1]
1339
1342
        finally:
1340
1343
            file_obj.close()
1608
1611
        return True
1609
1612
 
1610
1613
 
1611
 
class DirStateRevisionTree(Tree):
 
1614
class DirStateRevisionTree(InventoryTree):
1612
1615
    """A revision tree pulling the inventory from a dirstate.
1613
1616
    
1614
1617
    Note that this is one of the historical (ie revision) trees cached in the
1633
1636
    def annotate_iter(self, file_id,
1634
1637
                      default_revision=_mod_revision.CURRENT_REVISION):
1635
1638
        """See Tree.annotate_iter"""
1636
 
        text_key = (file_id, self.inventory[file_id].revision)
 
1639
        text_key = (file_id, self.get_file_revision(file_id))
1637
1640
        annotations = self._repository.texts.annotate(text_key)
1638
1641
        return [(key[-1], line) for (key, line) in annotations]
1639
1642
 
1803
1806
            return parent_details[1]
1804
1807
        return None
1805
1808
 
 
1809
    @needs_read_lock
 
1810
    def get_file_revision(self, file_id):
 
1811
        return self.inventory[file_id].revision
 
1812
 
1806
1813
    def get_file(self, file_id, path=None):
1807
1814
        return StringIO(self.get_file_text(file_id))
1808
1815