~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

Added more docs

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 by Canonical Ltd
 
1
# (C) 2005 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
32
32
import os, stat, time
33
33
import sha
34
34
 
35
 
from bzrlib.osutils import sha_file, pathjoin, safe_unicode
 
35
from bzrlib.osutils import sha_file, pathjoin
36
36
from bzrlib.trace import mutter, warning
37
37
from bzrlib.atomicfile import AtomicFile
38
38
from bzrlib.errors import BzrError
94
94
    """
95
95
    needs_write = False
96
96
 
97
 
    def __init__(self, root, cache_file_name, mode=None):
98
 
        """Create a hash cache in base dir, and set the file mode to mode."""
99
 
        self.root = safe_unicode(root)
 
97
    def __init__(self, basedir):
 
98
        self.basedir = basedir
100
99
        self.hit_count = 0
101
100
        self.miss_count = 0
102
101
        self.stat_count = 0
104
103
        self.removed_count = 0
105
104
        self.update_count = 0
106
105
        self._cache = {}
107
 
        self._mode = mode
108
 
        self._cache_file_name = safe_unicode(cache_file_name)
109
106
 
110
107
    def cache_file_name(self):
111
 
        return self._cache_file_name
 
108
        # FIXME: duplicate path logic here, this should be 
 
109
        # something like 'branch.controlfile'.
 
110
        return pathjoin(self.basedir, '.bzr', 'stat-cache')
112
111
 
113
112
    def clear(self):
114
113
        """Discard all cached information.
118
117
            self.needs_write = True
119
118
            self._cache = {}
120
119
 
 
120
 
121
121
    def scan(self):
122
122
        """Scan all files and remove entries where the cache entry is obsolete.
123
123
        
124
124
        Obsolete entries are those where the file has been modified or deleted
125
125
        since the entry was inserted.        
126
126
        """
127
 
        # FIXME optimisation opportunity, on linux [and check other oses]:
128
 
        # rather than iteritems order, stat in inode order.
129
127
        prep = [(ce[1][3], path, ce) for (path, ce) in self._cache.iteritems()]
130
128
        prep.sort()
131
129
        
132
130
        for inum, path, cache_entry in prep:
133
 
            abspath = pathjoin(self.root, path)
 
131
            abspath = pathjoin(self.basedir, path)
134
132
            fp = _fingerprint(abspath)
135
133
            self.stat_count += 1
136
134
            
146
144
    def get_sha1(self, path):
147
145
        """Return the sha1 of a file.
148
146
        """
149
 
        abspath = pathjoin(self.root, path)
 
147
        abspath = pathjoin(self.basedir, path)
150
148
        self.stat_count += 1
151
149
        file_fp = _fingerprint(abspath)
152
150
        
204
202
        
205
203
    def write(self):
206
204
        """Write contents of cache to file."""
207
 
        outf = AtomicFile(self.cache_file_name(), 'wb', new_mode=self._mode)
 
205
        outf = AtomicFile(self.cache_file_name(), 'wb')
208
206
        try:
209
207
            print >>outf, CACHE_HEADER,
210
208
 
216
214
                for fld in c[1]:
217
215
                    print >>outf, "%d" % fld,
218
216
                print >>outf
 
217
 
219
218
            outf.commit()
220
219
            self.needs_write = False
221
 
            mutter("write hash cache: %s hits=%d misses=%d stat=%d recent=%d updates=%d",
222
 
                   self.cache_file_name(), self.hit_count, self.miss_count,
223
 
                   self.stat_count,
224
 
                   self.danger_count, self.update_count)
225
220
        finally:
226
221
            if not outf.closed:
227
222
                outf.abort()