~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revfile.py

  • Committer: Martin Pool
  • Date: 2005-08-26 02:31:37 UTC
  • Revision ID: mbp@sourcefrog.net-20050826023137-eb4b101cc92f9792
- ignore tags files

Show diffs side-by-side

added added

removed removed

Lines of Context:
89
89
# if there are gaps and that can happen if we're interrupted while
90
90
# writing to the datafile.  Overlapping would be very bad though.
91
91
 
92
 
 
 
92
# TODO: Shouldn't need to lock if we always write in append mode and
 
93
# then ftell after writing to see where it went.  In any case we
 
94
# assume the whole branch is protected by a lock.
93
95
 
94
96
import sys, zlib, struct, mdiff, stat, os, sha
95
97
from binascii import hexlify, unhexlify
110
112
FL_GZIP = 1
111
113
 
112
114
# maximum number of patches in a row before recording a whole text.
113
 
CHAIN_LIMIT = 25
 
115
CHAIN_LIMIT = 10
114
116
 
115
117
 
116
118
class RevfileError(Exception):
147
149
            self.idxfile = open(idxname, 'w+b')
148
150
            self.datafile = open(dataname, 'w+b')
149
151
            
150
 
            print 'init empty file'
151
152
            self.idxfile.write(_HEADER)
152
153
            self.idxfile.flush()
153
154
        else:
267
268
            return self._add_full_text(text, text_sha, compress)
268
269
        
269
270
        data = mdiff.bdiff(base_text, text)
 
271
 
 
272
 
 
273
        if True: # paranoid early check for bad diff
 
274
            result = mdiff.bpatch(base_text, data)
 
275
            assert result == text
 
276
            
270
277
        
271
278
        # If the delta is larger than the text, we might as well just
272
279
        # store the text.  (OK, the delta might be more compressible,
278
285
            return self._add_compressed(text_sha, data, base, compress)
279
286
 
280
287
 
281
 
    def add(self, text, base=_NO_RECORD, compress=True):
 
288
    def add(self, text, base=None, compress=True):
282
289
        """Add a new text to the revfile.
283
290
 
284
291
        If the text is already present them its existing id is
292
299
        only be used if it would be a size win and if the existing
293
300
        base is not at too long of a delta chain already.
294
301
        """
 
302
        if base == None:
 
303
            base = _NO_RECORD
 
304
        
295
305
        self._check_write()
296
306
        
297
307
        text_sha = sha.new(text).digest()
328
338
            text = self._get_patched(idx, idxrec, recursion_limit)
329
339
 
330
340
        if sha.new(text).digest() != idxrec[I_SHA]:
331
 
            raise RevfileError("corrupt SHA-1 digest on record %d"
332
 
                               % idx)
 
341
            raise RevfileError("corrupt SHA-1 digest on record %d in %s"
 
342
                               % (idx, self.basename))
333
343
 
334
344
        return text
335
345
 
468
478
        for idx in range(len(self)):
469
479
            t += len(self.get(idx))
470
480
        return t
 
481
 
 
482
 
 
483
    def check(self, pb=None):
 
484
        """Extract every version and check its hash."""
 
485
        total = len(self)
 
486
        for i in range(total):
 
487
            if pb:
 
488
                pb.update("check revision", i, total)
 
489
            # the get method implicitly checks the SHA-1
 
490
            self.get(i)
 
491
        if pb:
 
492
            pb.clear()
471
493
        
472
494
 
473
495
 
486
508
                         "       revfile last REVFILE\n")
487
509
        return 1
488
510
 
 
511
    if filename.endswith('.drev') or filename.endswith('.irev'):
 
512
        filename = filename[:-5]
 
513
 
489
514
    def rw():
490
515
        return Revfile(filename, 'w')
491
516
 
535
560
        print ro().total_text_size()
536
561
    elif cmd == 'last':
537
562
        print len(ro())-1
 
563
    elif cmd == 'check':
 
564
        import bzrlib.progress
 
565
        pb = bzrlib.progress.ProgressBar()
 
566
        ro().check(pb)
538
567
    else:
539
568
        sys.stderr.write("unknown command %r\n" % cmd)
540
569
        return 1