~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to weave.py

  • Committer: Martin Pool
  • Date: 2005-07-01 03:32:39 UTC
  • mto: This revision was merged to the branch mainline in revision 852.
  • Revision ID: mbp@sourcefrog.net-20050701033239-4b1053cafa991dcf
Update Weave.check
Add new external check command that invokes it
Check sha1 sums for all versions

Show diffs side-by-side

added added

removed removed

Lines of Context:
397
397
        pprint(self._v, to_file)
398
398
 
399
399
 
 
400
 
 
401
    def numversions(self):
 
402
        l = len(self._v)
 
403
        assert l == len(self._sha1s)
 
404
        return l
 
405
 
 
406
 
400
407
    def check(self):
401
 
        for vers_info in self._v:
402
 
            included = set()
403
 
            for vi in vers_info[0]:
404
 
                if vi < 0 or vi >= index:
 
408
        # check no circular inclusions
 
409
        for version in range(self.numversions()):
 
410
            inclusions = list(self._v[version])
 
411
            if inclusions:
 
412
                inclusions.sort()
 
413
                if inclusions[-1] >= version:
405
414
                    raise WeaveFormatError("invalid included version %d for index %d"
406
 
                                               % (vi, index))
407
 
                if vi in included:
408
 
                    raise WeaveFormatError("repeated included version %d for index %d"
409
 
                                               % (vi, index))
410
 
                included.add(vi)
 
415
                                           % (inclusions[-1], version))
 
416
 
 
417
        # try extracting all versions; this is a bit slow and parallel
 
418
        # extraction could be used
 
419
        import sha
 
420
        for version in range(self.numversions()):
 
421
            s = sha.new()
 
422
            for l in self.get_iter(version):
 
423
                s.update(l)
 
424
            hd = s.hexdigest()
 
425
            expected = self._sha1s[version]
 
426
            if hd != expected:
 
427
                raise WeaveError("mismatched sha1 for version %d; "
 
428
                                 "got %s, expected %s"
 
429
                                 % (version, hd, expected))
411
430
 
412
431
 
413
432
 
479
498
    print >>out, "weave contains %d versions" % len(w._v)
480
499
 
481
500
    total = 0
482
 
    print ' %8s %8s %8s' % ('version', 'lines', 'bytes')
483
 
    print ' -------- -------- --------'
 
501
    print ' %8s %8s %8s %s' % ('version', 'lines', 'bytes', 'sha1')
 
502
    print ' -------- -------- -------- ----------------------------------------'
484
503
    for i in range(len(w._v)):
485
504
        text = w.get(i)
486
505
        lines = len(text)
487
506
        bytes = sum((len(a) for a in text))
488
 
        print ' %8d %8d %8d' % (i, lines, bytes)
 
507
        sha1 = w._sha1s[i]
 
508
        print ' %8d %8d %8d %s' % (i, lines, bytes, sha1)
489
509
        total += bytes
490
510
 
491
511
    print >>out, "versions total %d bytes" % total
496
516
def main(argv):
497
517
    import sys
498
518
    import os
499
 
    from weavefile import write_weave_v1, read_weave_v1
 
519
    from weavefile import write_weave_v1, read_weave
500
520
    cmd = argv[1]
501
521
    if cmd == 'add':
502
 
        w = read_weave_v1(file(argv[2], 'rb'))
 
522
        w = read_weave(file(argv[2], 'rb'))
503
523
        # at the moment, based on everything in the file
504
524
        parents = set(range(len(w._v)))
505
525
        lines = sys.stdin.readlines()
513
533
        w = Weave()
514
534
        write_weave_v1(w, file(fn, 'wb'))
515
535
    elif cmd == 'get':
516
 
        w = read_weave_v1(file(argv[2], 'rb'))
 
536
        w = read_weave(file(argv[2], 'rb'))
517
537
        sys.stdout.writelines(w.getiter(int(argv[3])))
518
538
    elif cmd == 'annotate':
519
 
        w = read_weave_v1(file(argv[2], 'rb'))
 
539
        w = read_weave(file(argv[2], 'rb'))
520
540
        # newline is added to all lines regardless; too hard to get
521
541
        # reasonable formatting otherwise
522
542
        lasto = None
529
549
                lasto = origin
530
550
    elif cmd == 'info':
531
551
        weave_info(argv[2], sys.stdout)
 
552
    elif cmd == 'check':
 
553
        w = read_weave(file(argv[2], 'rb'))
 
554
        w.check()
532
555
    else:
533
556
        raise ValueError('unknown command %r' % cmd)
534
557