~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Martin Pool
  • Date: 2005-07-07 10:22:02 UTC
  • Revision ID: mbp@sourcefrog.net-20050707102201-2d2a13a25098b101
- rearrange and clear up merged weave

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.
18
 
 
19
 
# FIXME: I don't know if writing out the cache from the destructor is really a
20
 
# good idea, because destructors are considered poor taste in Python, and
21
 
# it's not predictable when it will be written out.
22
17
 
23
18
import os
24
19
    
35
30
    It is possible for a `WorkingTree` to have a filename which is
36
31
    not listed in the Inventory and vice versa.
37
32
    """
 
33
    _statcache = None
 
34
    
38
35
    def __init__(self, basedir, inv):
39
 
        from bzrlib.hashcache import HashCache
40
 
        from bzrlib.trace import note, mutter
41
 
 
42
36
        self._inventory = inv
43
37
        self.basedir = basedir
44
38
        self.path2id = inv.path2id
45
 
 
46
 
        # update the whole cache up front and write to disk if anything changed;
47
 
        # in the future we might want to do this more selectively
48
 
        hc = self._hashcache = HashCache(basedir)
49
 
        hc.read()
50
 
        hc.scan()
51
 
 
52
 
        if hc.needs_write:
53
 
            mutter("write hc")
54
 
            hc.write()
55
 
            
56
 
            
57
 
    def __del__(self):
58
 
        if self._hashcache.needs_write:
59
 
            self._hashcache.write()
60
 
 
 
39
        self._update_statcache()
61
40
 
62
41
    def __iter__(self):
63
42
        """Iterate through file_ids for this tree.
66
45
        and the working file exists.
67
46
        """
68
47
        inv = self._inventory
69
 
        for path, ie in inv.iter_entries():
70
 
            if os.path.exists(self.abspath(path)):
71
 
                yield ie.file_id
 
48
        for file_id in self._inventory:
 
49
            # TODO: This is slightly redundant; we should be able to just
 
50
            # check the statcache but it only includes regular files.
 
51
            # only include files which still exist on disk
 
52
            ie = inv[file_id]
 
53
            if ie.kind == 'file':
 
54
                if ((file_id in self._statcache)
 
55
                    or (os.path.exists(self.abspath(inv.id2path(file_id))))):
 
56
                    yield file_id
 
57
 
72
58
 
73
59
 
74
60
    def __repr__(self):
75
61
        return "<%s of %s>" % (self.__class__.__name__,
76
 
                               getattr(self, 'basedir', None))
77
 
 
78
 
 
 
62
                               self.basedir)
79
63
 
80
64
    def abspath(self, filename):
81
65
        return os.path.join(self.basedir, filename)
96
80
                
97
81
    def has_id(self, file_id):
98
82
        # files that have been deleted are excluded
99
 
        inv = self._inventory
100
 
        if not inv.has_id(file_id):
 
83
        if not self.inventory.has_id(file_id):
101
84
            return False
102
 
        path = inv.id2path(file_id)
103
 
        return os.path.exists(self.abspath(path))
 
85
        if file_id in self._statcache:
 
86
            return True
 
87
        return os.path.exists(self.abspath(self.id2path(file_id)))
104
88
 
105
89
 
106
90
    __contains__ = has_id
107
91
    
108
92
 
 
93
    def _update_statcache(self):
 
94
        if not self._statcache:
 
95
            from bzrlib.statcache import update_cache
 
96
            self._statcache = update_cache(self.basedir, self.inventory)
 
97
 
109
98
    def get_file_size(self, file_id):
110
 
        # is this still called?
111
 
        raise NotImplementedError()
 
99
        import os, stat
 
100
        return os.stat(self._get_store_filename(file_id))[stat.ST_SIZE]
112
101
 
113
102
 
114
103
    def get_file_sha1(self, file_id):
115
 
        path = self._inventory.id2path(file_id)
116
 
        return self._hashcache.get_sha1(path)
 
104
        from bzrlib.statcache import SC_SHA1
 
105
        return self._statcache[file_id][SC_SHA1]
117
106
 
118
107
 
119
108
    def file_class(self, filename):
138
127
        from osutils import appendpath, file_kind
139
128
        import os
140
129
 
141
 
        inv = self._inventory
 
130
        inv = self.inventory
142
131
 
143
132
        def descend(from_dir_relpath, from_dir_id, dp):
144
133
            ls = os.listdir(dp)
290
279
                    return pat
291
280
        else:
292
281
            return None
293
 
        
 
 
b'\\ No newline at end of file'
 
282
        
 
283
 
 
284
        
 
285
        
 
286