~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Martin Pool
  • Date: 2005-07-18 13:12:43 UTC
  • Revision ID: mbp@sourcefrog.net-20050718131243-44532527fd065b31
- update convertinv to work with current weave code

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
# TODO: Don't allow WorkingTrees to be constructed for remote branches.
17
18
 
18
19
import os
19
20
    
20
21
import bzrlib.tree
21
22
from errors import BzrCheckError
22
23
from trace import mutter
23
 
import statcache
24
24
 
25
25
class WorkingTree(bzrlib.tree.Tree):
26
26
    """Working copy tree.
31
31
    It is possible for a `WorkingTree` to have a filename which is
32
32
    not listed in the Inventory and vice versa.
33
33
    """
34
 
    _statcache = None
35
 
    
36
34
    def __init__(self, basedir, inv):
 
35
        from bzrlib.hashcache import HashCache
 
36
        from bzrlib.trace import note, mutter
 
37
 
37
38
        self._inventory = inv
38
39
        self.basedir = basedir
39
40
        self.path2id = inv.path2id
40
 
        self._update_statcache()
 
41
 
 
42
        # update the whole cache up front and write to disk if anything changed;
 
43
        # in the future we might want to do this more selectively
 
44
        hc = self._hashcache = HashCache(basedir)
 
45
        hc.read()
 
46
        for path, ie in inv.iter_entries():
 
47
            hc.get_sha1(path)
 
48
 
 
49
        if hc.needs_write:
 
50
            mutter("write hc")
 
51
            hc.write()
 
52
 
 
53
 
41
54
 
42
55
    def __iter__(self):
43
56
        """Iterate through file_ids for this tree.
46
59
        and the working file exists.
47
60
        """
48
61
        inv = self._inventory
49
 
        for file_id in self._inventory:
50
 
            # TODO: This is slightly redundant; we should be able to just
51
 
            # check the statcache but it only includes regular files.
52
 
            # only include files which still exist on disk
53
 
            ie = inv[file_id]
54
 
            if ie.kind == 'file':
55
 
                if ((file_id in self._statcache)
56
 
                    or (os.path.exists(self.abspath(inv.id2path(file_id))))):
57
 
                    yield file_id
58
 
 
 
62
        for path, ie in inv.iter_entries():
 
63
            if os.path.exists(self.abspath(path)):
 
64
                yield ie.file_id
59
65
 
60
66
 
61
67
    def __repr__(self):
62
68
        return "<%s of %s>" % (self.__class__.__name__,
63
69
                               self.basedir)
64
70
 
 
71
 
 
72
 
65
73
    def abspath(self, filename):
66
74
        return os.path.join(self.basedir, filename)
67
75
 
81
89
                
82
90
    def has_id(self, file_id):
83
91
        # files that have been deleted are excluded
84
 
        if not self.inventory.has_id(file_id):
 
92
        inv = self._inventory
 
93
        if not inv.has_id(file_id):
85
94
            return False
86
 
        if file_id in self._statcache:
87
 
            return True
88
 
        return os.path.exists(self.abspath(self.id2path(file_id)))
 
95
        path = inv.id2path(file_id)
 
96
        return os.path.exists(self.abspath(path))
89
97
 
90
98
 
91
99
    __contains__ = has_id
92
100
    
93
101
 
94
 
    def _update_statcache(self):
95
 
        import statcache
96
 
        if not self._statcache:
97
 
            self._statcache = statcache.update_cache(self.basedir, self.inventory)
98
 
 
99
102
    def get_file_size(self, file_id):
100
 
        import os, stat
101
 
        return os.stat(self._get_store_filename(file_id))[stat.ST_SIZE]
 
103
        # is this still called?
 
104
        raise NotImplementedError()
102
105
 
103
106
 
104
107
    def get_file_sha1(self, file_id):
105
 
        return self._statcache[file_id][statcache.SC_SHA1]
 
108
        path = self._inventory.id2path(file_id)
 
109
        return self._hashcache.get_sha1(path)
106
110
 
107
111
 
108
112
    def file_class(self, filename):
127
131
        from osutils import appendpath, file_kind
128
132
        import os
129
133
 
130
 
        inv = self.inventory
 
134
        inv = self._inventory
131
135
 
132
136
        def descend(from_dir_relpath, from_dir_id, dp):
133
137
            ls = os.listdir(dp)