~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/revfile.py

  • Committer: mbp at sourcefrog
  • Date: 2005-04-11 02:53:57 UTC
  • Revision ID: mbp@sourcefrog.net-20050411025357-af577721308648ae
- remove profiler temporary file when done

Show diffs side-by-side

added added

removed removed

Lines of Context:
94
94
import sys, zlib, struct, mdiff, stat, os, sha
95
95
from binascii import hexlify, unhexlify
96
96
 
 
97
factor = 10
 
98
 
97
99
_RECORDSIZE = 48
98
100
 
99
101
_HEADER = "bzr revfile v1\n"
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 = 50
114
116
 
115
117
 
116
118
class RevfileError(Exception):
119
121
class LimitHitException(Exception):
120
122
    pass
121
123
 
122
 
class Revfile(object):
 
124
class Revfile:
123
125
    def __init__(self, basename, mode):
124
126
        # TODO: Lock file  while open
125
127
 
215
217
        assert self.idxfile.tell() == _RECORDSIZE * (idx + 1)
216
218
        data_offset = self.datafile.tell()
217
219
 
218
 
        assert isinstance(data, str) # not unicode or anything weird
 
220
        assert isinstance(data, str) # not unicode or anything wierd
219
221
 
220
222
        self.datafile.write(data)
221
223
        self.datafile.flush()
241
243
        return self._add_compressed(text_sha, text, _NO_RECORD, compress)
242
244
 
243
245
 
244
 
    # NOT USED
245
 
    def _choose_base(self, seed, base):
246
 
        while seed & 3 == 3:
247
 
            if base == _NO_RECORD:
248
 
                return _NO_RECORD
249
 
            idxrec = self[base]
250
 
            if idxrec[I_BASE] == _NO_RECORD:
251
 
                return base
252
 
 
253
 
            base = idxrec[I_BASE]
254
 
            seed >>= 2
255
 
                
256
 
        return base        # relative to this full text
257
 
        
258
 
 
259
 
 
260
246
    def _add_delta(self, text, text_sha, base, compress):
261
247
        """Add a text stored relative to a previous text."""
262
248
        self._check_index(base)
263
 
 
 
249
        
264
250
        try:
265
 
            base_text = self.get(base, CHAIN_LIMIT)
 
251
            base_text = self.get(base, recursion_limit=CHAIN_LIMIT)
266
252
        except LimitHitException:
267
253
            return self._add_full_text(text, text_sha, compress)
268
254
        
302
288
            # it's the same, in case someone ever breaks SHA-1.
303
289
            return idx                  # already present
304
290
        
305
 
        # base = self._choose_base(ord(text_sha[0]), base)
306
 
 
307
291
        if base == _NO_RECORD:
308
292
            return self._add_full_text(text, text_sha, compress)
309
293
        else:
404
388
        self._seek_index(idx)
405
389
        idxrec = self._read_next_index()
406
390
        if idxrec == None:
407
 
            raise IndexError("no index %d" % idx)
 
391
            raise IndexError()
408
392
        else:
409
393
            return idxrec
410
394
 
420
404
        """Read back all index records.
421
405
 
422
406
        Do not seek the index file while this is underway!"""
423
 
        ## sys.stderr.write(" ** iter called ** \n")
 
407
        sys.stderr.write(" ** iter called ** \n")
424
408
        self._seek_index(0)
425
409
        while True:
426
410
            idxrec = self._read_next_index()
474
458
def main(argv):
475
459
    try:
476
460
        cmd = argv[1]
477
 
        filename = argv[2]
478
461
    except IndexError:
479
 
        sys.stderr.write("usage: revfile dump REVFILE\n"
480
 
                         "       revfile add REVFILE < INPUT\n"
481
 
                         "       revfile add-delta REVFILE BASE < INPUT\n"
482
 
                         "       revfile add-series REVFILE BASE FILE...\n"
483
 
                         "       revfile get REVFILE IDX\n"
484
 
                         "       revfile find-sha REVFILE HEX\n"
485
 
                         "       revfile total-text-size REVFILE\n"
486
 
                         "       revfile last REVFILE\n")
 
462
        sys.stderr.write("usage: revfile dump\n"
 
463
                         "       revfile add\n"
 
464
                         "       revfile add-delta BASE\n"
 
465
                         "       revfile get IDX\n"
 
466
                         "       revfile find-sha HEX\n"
 
467
                         "       revfile total-text-size\n"
 
468
                         "       revfile last\n")
487
469
        return 1
488
470
 
489
471
    def rw():
490
 
        return Revfile(filename, 'w')
 
472
        return Revfile('testrev', 'w')
491
473
 
492
474
    def ro():
493
 
        return Revfile(filename, 'r')
 
475
        return Revfile('testrev', 'r')
494
476
 
495
477
    if cmd == 'add':
496
478
        print rw().add(sys.stdin.read())
497
479
    elif cmd == 'add-delta':
498
 
        print rw().add(sys.stdin.read(), int(argv[3]))
499
 
    elif cmd == 'add-series':
500
 
        r = rw()
501
 
        rev = int(argv[3])
502
 
        for fn in argv[4:]:
503
 
            print rev
504
 
            rev = r.add(file(fn).read(), rev)
 
480
        print rw().add(sys.stdin.read(), int(argv[2]))
505
481
    elif cmd == 'dump':
506
482
        ro().dump()
507
483
    elif cmd == 'get':
508
484
        try:
509
 
            idx = int(argv[3])
 
485
            idx = int(argv[2])
510
486
        except IndexError:
511
 
            sys.stderr.write("usage: revfile get FILE IDX\n")
 
487
            sys.stderr.write("usage: revfile get IDX\n")
512
488
            return 1
513
489
 
514
 
        r = ro()
515
 
 
516
490
        if idx < 0 or idx >= len(r):
517
491
            sys.stderr.write("invalid index %r\n" % idx)
518
492
            return 1
519
493
 
520
 
        sys.stdout.write(r.get(idx))
 
494
        sys.stdout.write(ro().get(idx))
521
495
    elif cmd == 'find-sha':
522
496
        try:
523
 
            s = unhexlify(argv[3])
 
497
            s = unhexlify(argv[2])
524
498
        except IndexError:
525
 
            sys.stderr.write("usage: revfile find-sha FILE HEX\n")
 
499
            sys.stderr.write("usage: revfile find-sha HEX\n")
526
500
            return 1
527
501
 
528
502
        idx = ro().find_sha(s)