~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

  • Committer: Martin Pool
  • Date: 2005-07-11 02:02:58 UTC
  • Revision ID: mbp@sourcefrog.net-20050711020258-2281af27e5af39d2
- more weave.py command line options

- better error when invalid version is given

- weave help and weave mash commands

Show diffs side-by-side

added added

removed removed

Lines of Context:
242
242
        """Expand out everything included by versions."""
243
243
        i = set(versions)
244
244
        for v in versions:
245
 
            i.update(self._v[v])
 
245
            try:
 
246
                i.update(self._v[v])
 
247
            except IndexError:
 
248
                raise ValueError("version %d not present in weave" % v)
246
249
        return i
247
250
 
248
251
 
259
262
 
260
263
        for l in text:
261
264
            if not isinstance(l, basestring):
262
 
                raise ValueError("text line should be a string or unicode, not %s" % type(l))
 
265
                raise ValueError("text line should be a string or unicode, not %s"
 
266
                                 % type(l))
263
267
        
264
268
 
265
269
 
528
532
 
529
533
    print >>out, "versions total %d bytes" % total
530
534
    print >>out, "compression ratio %.3f" % (float(total)/float(weave_size))
 
535
 
 
536
 
 
537
def usage():
 
538
    print """bzr weave tool:
 
539
usage:
 
540
    weave init WEAVEFILE
 
541
        Create an empty weave file
 
542
    weave get WEAVEFILE VERSION
 
543
        Write out specified version.
 
544
    weave check WEAVEFILE
 
545
        Check consistency of all versions.
 
546
    weave info WEAVEFILE
 
547
        Display table of contents.
 
548
    weave add WEAVEFILE [BASE...] < NEWTEXT
 
549
        Add NEWTEXT, with specified parent versions.
 
550
    weave annotate WEAVEFILE VERSION
 
551
        Display origin of each line.
 
552
    weave mash WEAVEFILE VERSION...
 
553
        Display composite of all selected versions.
 
554
    weave merge WEAVEFILE VERSION1 VERSION2 > OUT
 
555
        Auto-merge two versions and display conflicts.
 
556
"""
531
557
    
532
558
 
533
559
 
534
560
def main(argv):
535
561
    import sys
536
562
    import os
537
 
    from weavefile import write_weave_v1, read_weave
 
563
    from weavefile import write_weave, read_weave
538
564
    cmd = argv[1]
539
 
    if cmd == 'add':
540
 
        w = read_weave(file(argv[2], 'rb'))
 
565
 
 
566
    def readit():
 
567
        return read_weave(file(argv[2], 'rb'))
 
568
    
 
569
    if cmd == 'help':
 
570
        usage()
 
571
    elif cmd == 'add':
 
572
        w = readit()
541
573
        # at the moment, based on everything in the file
542
 
        parents = set(range(len(w._v)))
 
574
        parents = map(int, argv[3:])
543
575
        lines = sys.stdin.readlines()
544
576
        ver = w.add(parents, lines)
545
 
        write_weave_v1(w, file(argv[2], 'wb'))
546
 
        print 'added %d' % ver
 
577
        write_weave(w, file(argv[2], 'wb'))
 
578
        print 'added version %d' % ver
547
579
    elif cmd == 'init':
548
580
        fn = argv[2]
549
581
        if os.path.exists(fn):
550
582
            raise IOError("file exists")
551
583
        w = Weave()
552
 
        write_weave_v1(w, file(fn, 'wb'))
553
 
    elif cmd == 'get':
554
 
        w = read_weave(file(argv[2], 'rb'))
 
584
        write_weave(w, file(fn, 'wb'))
 
585
    elif cmd == 'get': # get one version
 
586
        w = readit()
555
587
        sys.stdout.writelines(w.get_iter(int(argv[3])))
 
588
        
 
589
    elif cmd == 'mash': # get composite
 
590
        w = readit()
 
591
        sys.stdout.writelines(w.mash_iter(map(int, argv[3:])))
 
592
 
556
593
    elif cmd == 'annotate':
557
 
        w = read_weave(file(argv[2], 'rb'))
 
594
        w = readit()
558
595
        # newline is added to all lines regardless; too hard to get
559
596
        # reasonable formatting otherwise
560
597
        lasto = None
568
605
    elif cmd == 'info':
569
606
        weave_info(argv[2], sys.stdout)
570
607
    elif cmd == 'check':
571
 
        w = read_weave(file(argv[2], 'rb'))
 
608
        w = readit()
572
609
        w.check()
573
610
    else:
574
611
        raise ValueError('unknown command %r' % cmd)