~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revfile.py

  • Committer: Martin Pool
  • Date: 2005-08-12 15:41:44 UTC
  • Revision ID: mbp@sourcefrog.net-20050812154144-bc98570a78b8f633
- merge in deferred revfile work

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
 
# 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.
 
92
 
95
93
 
96
94
import sys, zlib, struct, mdiff, stat, os, sha
97
95
from binascii import hexlify, unhexlify
112
110
FL_GZIP = 1
113
111
 
114
112
# maximum number of patches in a row before recording a whole text.
115
 
CHAIN_LIMIT = 10
 
113
CHAIN_LIMIT = 25
116
114
 
117
115
 
118
116
class RevfileError(Exception):
149
147
            self.idxfile = open(idxname, 'w+b')
150
148
            self.datafile = open(dataname, 'w+b')
151
149
            
 
150
            print 'init empty file'
152
151
            self.idxfile.write(_HEADER)
153
152
            self.idxfile.flush()
154
153
        else:
268
267
            return self._add_full_text(text, text_sha, compress)
269
268
        
270
269
        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
 
            
277
270
        
278
271
        # If the delta is larger than the text, we might as well just
279
272
        # store the text.  (OK, the delta might be more compressible,
285
278
            return self._add_compressed(text_sha, data, base, compress)
286
279
 
287
280
 
288
 
    def add(self, text, base=None, compress=True):
 
281
    def add(self, text, base=_NO_RECORD, compress=True):
289
282
        """Add a new text to the revfile.
290
283
 
291
284
        If the text is already present them its existing id is
299
292
        only be used if it would be a size win and if the existing
300
293
        base is not at too long of a delta chain already.
301
294
        """
302
 
        if base == None:
303
 
            base = _NO_RECORD
304
 
        
305
295
        self._check_write()
306
296
        
307
297
        text_sha = sha.new(text).digest()
338
328
            text = self._get_patched(idx, idxrec, recursion_limit)
339
329
 
340
330
        if sha.new(text).digest() != idxrec[I_SHA]:
341
 
            raise RevfileError("corrupt SHA-1 digest on record %d in %s"
342
 
                               % (idx, self.basename))
 
331
            raise RevfileError("corrupt SHA-1 digest on record %d"
 
332
                               % idx)
343
333
 
344
334
        return text
345
335
 
478
468
        for idx in range(len(self)):
479
469
            t += len(self.get(idx))
480
470
        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()
493
471
        
494
472
 
495
473
 
508
486
                         "       revfile last REVFILE\n")
509
487
        return 1
510
488
 
511
 
    if filename.endswith('.drev') or filename.endswith('.irev'):
512
 
        filename = filename[:-5]
513
 
 
514
489
    def rw():
515
490
        return Revfile(filename, 'w')
516
491
 
560
535
        print ro().total_text_size()
561
536
    elif cmd == 'last':
562
537
        print len(ro())-1
563
 
    elif cmd == 'check':
564
 
        import bzrlib.progress
565
 
        pb = bzrlib.progress.ProgressBar()
566
 
        ro().check(pb)
567
538
    else:
568
539
        sys.stderr.write("unknown command %r\n" % cmd)
569
540
        return 1