~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: Martin Pool
  • Date: 2005-07-22 18:05:47 UTC
  • Revision ID: mbp@sourcefrog.net-20050722180547-fbfa10a567eca667
- refactor imports and stats for hashcache

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
 
 
18
 
 
19
 
# TODO: Perhaps have a way to stat all the files in inode order, and
20
 
# then remember that they're all fresh for the lifetime of the object?
21
 
 
22
 
# TODO: Keep track of whether there are in-memory updates that need to
23
 
# be flushed.
 
17
# TODO: Up-front, stat all files in order and remove those which are deleted or 
 
18
# out-of-date.  Don't actually re-read them until they're needed.  That ought 
 
19
# to bring all the inodes into core so that future stats to them are fast, and 
 
20
# it preserves the nice property that any caller will always get up-to-date
 
21
# data except in unavoidable cases.
24
22
 
25
23
# TODO: Perhaps return more details on the file to avoid statting it
26
24
# again: nonexistent, file type, size, etc
27
25
 
28
26
 
29
27
 
30
 
 
31
28
CACHE_HEADER = "### bzr hashcache v5\n"
32
29
 
 
30
import os, stat, time
 
31
 
 
32
from bzrlib.osutils import sha_file
 
33
from bzrlib.trace import mutter, warning
 
34
 
 
35
 
33
36
 
34
37
def _fingerprint(abspath):
35
 
    import os, stat
36
 
 
37
38
    try:
38
39
        fs = os.lstat(abspath)
39
40
    except OSError:
91
92
        self.miss_count = 0
92
93
        self.stat_count = 0
93
94
        self.danger_count = 0
 
95
        self.gone_count = 0
 
96
        self.removed_count = 0
94
97
        self._cache = {}
95
98
 
96
99
 
97
 
 
98
100
    def cache_file_name(self):
99
 
        import os.path
100
 
        return os.path.join(self.basedir, '.bzr', 'stat-cache')
 
101
        return os.sep.join([self.basedir, '.bzr', 'stat-cache'])
101
102
 
102
103
 
103
104
 
111
112
            self._cache = {}
112
113
 
113
114
 
 
115
    def refresh_all(self):
 
116
        prep = [(ce[1][3], path) for (path, ce) in self._cache.iteritems()]
 
117
        prep.sort()
 
118
        
 
119
        for inum, path in prep:
 
120
            # we don't really need to re-hash them; we just need to check 
 
121
            # if they're up to date
 
122
            self.get_sha1(path)
 
123
 
 
124
 
114
125
    def get_sha1(self, path):
115
 
        """Return the hex SHA-1 of the contents of the file at path.
116
 
 
117
 
        XXX: If the file does not exist or is not a plain file???
 
126
        """Return the sha1 of a file.
118
127
        """
119
 
 
120
 
        import os, time
121
 
        from bzrlib.osutils import sha_file
122
 
        from bzrlib.trace import mutter
123
 
        
124
 
        abspath = os.path.join(self.basedir, path)
 
128
        abspath = os.sep.join([self.basedir, path])
125
129
        fp = _fingerprint(abspath)
 
130
 
126
131
        c = self._cache.get(path)
127
132
        if c:
128
133
            cache_sha1, cache_fp = c
133
138
 
134
139
        if not fp:
135
140
            # not a regular file
 
141
            if path in self._cache:
 
142
                self.removed_count += 1
 
143
                self.needs_write = True
 
144
                del self._cache[path]
136
145
            return None
137
146
        elif cache_fp and (cache_fp == fp):
138
147
            self.hit_count += 1
148
157
                # next time.
149
158
                self.danger_count += 1 
150
159
                if cache_fp:
151
 
                    mutter("remove outdated entry for %s" % path)
 
160
                    self.removed_count += 1
152
161
                    self.needs_write = True
153
162
                    del self._cache[path]
154
163
            elif (fp != cache_fp) or (digest != cache_sha1):
155
 
                mutter("update entry for %s" % path)
156
 
                mutter("  %r" % (fp,))
157
 
                mutter("  %r" % (cache_fp,))
 
164
#                 mutter("update entry for %s" % path)
 
165
#                 mutter("  %r" % (fp,))
 
166
#                 mutter("  %r" % (cache_fp,))
158
167
                self.needs_write = True
159
168
                self._cache[path] = (digest, fp)
160
 
 
 
169
            else:
 
170
                # huh?
 
171
                assert 0
 
172
            
161
173
            return digest
 
174
            
162
175
 
163
176
 
164
177
 
194
207
 
195
208
        If the cache file has the wrong version marker, this just clears 
196
209
        the cache."""
197
 
        from bzrlib.trace import mutter, warning
198
 
 
199
210
        self._cache = {}
200
211
 
201
212
        fn = self.cache_file_name()