~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revfile.py

  • Committer: Martin Pool
  • Date: 2005-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

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