~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/hashcache.py

  • Committer: John Arbash Meinel
  • Date: 2006-07-27 18:14:48 UTC
  • mto: (1946.2.6 reduce-knit-churn)
  • mto: This revision was merged to the branch mainline in revision 1887.
  • Revision ID: john@arbash-meinel.com-20060727181448-62962f823be5d3cc
minor typo fix

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
 
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
#
 
7
 
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
12
 
#
 
12
 
13
13
# You should have received a copy of the GNU General Public License
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
83
83
    def __init__(self, root, cache_file_name, mode=None):
84
84
        """Create a hash cache in base dir, and set the file mode to mode."""
85
85
        self.root = safe_unicode(root)
86
 
        self.root_utf8 = self.root.encode('utf8') # where is the filesystem encoding ?
87
86
        self.hit_count = 0
88
87
        self.miss_count = 0
89
88
        self.stat_count = 0
129
128
                self.needs_write = True
130
129
                del self._cache[path]
131
130
 
132
 
    def get_sha1(self, path, stat_value=None):
 
131
    def get_sha1(self, path):
133
132
        """Return the sha1 of a file.
134
133
        """
135
 
        if path.__class__ is str:
136
 
            abspath = pathjoin(self.root_utf8, path)
137
 
        else:
138
 
            abspath = pathjoin(self.root, path)
 
134
        abspath = pathjoin(self.root, path)
139
135
        self.stat_count += 1
140
 
        file_fp = self._fingerprint(abspath, stat_value)
 
136
        file_fp = self._fingerprint(abspath)
141
137
        
142
138
        if not file_fp:
143
139
            # not a regular file or not existing
207
203
        """Write contents of cache to file."""
208
204
        outf = AtomicFile(self.cache_file_name(), 'wb', new_mode=self._mode)
209
205
        try:
210
 
            outf.write(CACHE_HEADER)
 
206
            print >>outf, CACHE_HEADER,
211
207
 
212
208
            for path, c  in self._cache.iteritems():
213
209
                assert '//' not in path, path
214
 
                line_info = [path.encode('utf-8'), '// ', c[0], ' ']
215
 
                line_info.append(' '.join([str(fld) for fld in c[1]]))
216
 
                line_info.append('\n')
217
 
                outf.write(''.join(line_info))
 
210
                outf.write(path.encode('utf-8'))
 
211
                outf.write('// ')
 
212
                print >>outf, c[0],     # hex sha1
 
213
                for fld in c[1]:
 
214
                    print >>outf, "%d" % fld,
 
215
                print >>outf
218
216
            outf.commit()
219
217
            self.needs_write = False
220
218
            ## mutter("write hash cache: %s hits=%d misses=%d stat=%d recent=%d updates=%d",
222
220
            ##        self.stat_count,
223
221
            ##        self.danger_count, self.update_count)
224
222
        finally:
225
 
            outf.close()
 
223
            if not outf.closed:
 
224
                outf.abort()
226
225
 
227
226
    def read(self):
228
227
        """Reinstate cache from file.
281
280
        """
282
281
        return int(time.time()) - 3
283
282
           
284
 
    def _fingerprint(self, abspath, stat_value=None):
285
 
        if stat_value is None:
286
 
            try:
287
 
                stat_value = os.lstat(abspath)
288
 
            except OSError:
289
 
                # might be missing, etc
290
 
                return None
291
 
        if stat.S_ISDIR(stat_value.st_mode):
 
283
    def _fingerprint(self, abspath):
 
284
        try:
 
285
            fs = os.lstat(abspath)
 
286
        except OSError:
 
287
            # might be missing, etc
 
288
            return None
 
289
        if stat.S_ISDIR(fs.st_mode):
292
290
            return None
293
291
        # we discard any high precision because it's not reliable; perhaps we
294
292
        # could do better on some systems?
295
 
        return (stat_value.st_size, long(stat_value.st_mtime),
296
 
                long(stat_value.st_ctime), stat_value.st_ino, 
297
 
                stat_value.st_dev, stat_value.st_mode)
 
293
        return (fs.st_size, long(fs.st_mtime),
 
294
                long(fs.st_ctime), fs.st_ino, fs.st_dev, fs.st_mode)