~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-05-17 06:56:16 UTC
  • Revision ID: mbp@sourcefrog.net-20050517065616-6f23381d6184a8aa
- add space for un-merged patches

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
 
19
19
import sys, os, time, os.path
 
20
from sets import Set
20
21
 
21
22
import bzrlib
22
23
from bzrlib.trace import mutter, note, log_error
37
38
    assert cmd.startswith("cmd_")
38
39
    return cmd[4:].replace('_','-')
39
40
 
40
 
def _parse_revision_str(revstr):
41
 
    """This handles a revision string -> revno. 
42
 
 
43
 
    There are several possibilities:
44
 
 
45
 
        '234'       -> 234
46
 
        '234:345'   -> [234, 345]
47
 
        ':234'      -> [None, 234]
48
 
        '234:'      -> [234, None]
49
 
 
50
 
    In the future we will also support:
51
 
        'uuid:blah-blah-blah'   -> ?
52
 
        'hash:blahblahblah'     -> ?
53
 
        potentially:
54
 
        'tag:mytag'             -> ?
55
 
    """
56
 
    if revstr.find(':') != -1:
57
 
        revs = revstr.split(':')
58
 
        if len(revs) > 2:
59
 
            raise ValueError('More than 2 pieces not supported for --revision: %r' % revstr)
60
 
 
61
 
        if not revs[0]:
62
 
            revs[0] = None
63
 
        else:
64
 
            revs[0] = int(revs[0])
65
 
 
66
 
        if not revs[1]:
67
 
            revs[1] = None
68
 
        else:
69
 
            revs[1] = int(revs[1])
70
 
    else:
71
 
        revs = int(revstr)
72
 
    return revs
73
 
 
74
41
def get_all_cmds():
75
42
    """Return canonical name and class for all registered commands."""
76
43
    for k, v in globals().iteritems():
100
67
    raise BzrCommandError("unknown command %r" % cmd)
101
68
 
102
69
 
103
 
class Command(object):
 
70
class Command:
104
71
    """Base class for commands.
105
72
 
106
73
    The docstring for an actual command should give a single-line
341
308
        else:
342
309
            inv = b.get_revision_inventory(b.lookup_revision(revision))
343
310
 
344
 
        for path, entry in inv.entries():
 
311
        for path, entry in inv.iter_entries():
345
312
            print '%-50s %s' % (entry.file_id, path)
346
313
 
347
314
 
527
494
 
528
495
    def run(self, revision=None, file_list=None):
529
496
        from bzrlib.diff import show_diff
530
 
        from bzrlib import find_branch
531
 
 
532
 
        if file_list:
533
 
            b = find_branch(file_list[0], lock_mode='r')
534
 
            file_list = [b.relpath(f) for f in file_list]
535
 
            if file_list == ['']:
536
 
                # just pointing to top-of-tree
537
 
                file_list = None
538
 
        else:
539
 
            b = Branch('.', lock_mode='r')
540
497
    
541
 
        show_diff(b, revision, specific_files=file_list)
 
498
        show_diff(Branch('.'), revision, specific_files=file_list)
542
499
 
543
500
 
544
501
        
628
585
class cmd_log(Command):
629
586
    """Show log of this branch.
630
587
 
631
 
    To request a range of logs, you can use the command -r begin:end
632
 
    -r revision requests a specific revision, -r :end or -r begin: are
633
 
    also valid.
 
588
    TODO: Option to limit range.
634
589
 
635
 
    TODO: Make --revision support uuid: and hash: [future tag:] notation.
636
 
  
 
590
    TODO: Perhaps show most-recent first with an option for last.
637
591
    """
638
 
 
639
592
    takes_args = ['filename?']
640
 
    takes_options = ['forward', 'timezone', 'verbose', 'show-ids', 'revision']
641
 
    
642
 
    def run(self, filename=None, timezone='original',
643
 
            verbose=False,
644
 
            show_ids=False,
645
 
            forward=False,
646
 
            revision=None):
647
 
        from bzrlib import show_log, find_branch
648
 
        import codecs
649
 
 
650
 
        direction = (forward and 'forward') or 'reverse'
651
 
        
 
593
    takes_options = ['timezone', 'verbose', 'show-ids']
 
594
    def run(self, filename=None, timezone='original', verbose=False, show_ids=False):
 
595
        from branch import find_branch
 
596
        b = find_branch((filename or '.'), lock_mode='r')
652
597
        if filename:
653
 
            b = find_branch(filename, lock_mode='r')
654
 
            fp = b.relpath(filename)
655
 
            if fp:
656
 
                file_id = b.read_working_inventory().path2id(fp)
657
 
            else:
658
 
                file_id = None  # points to branch root
659
 
        else:
660
 
            b = find_branch('.', lock_mode='r')
661
 
            file_id = None
662
 
 
663
 
        if revision == None:
664
 
            revision = [None, None]
665
 
        elif isinstance(revision, int):
666
 
            revision = [revision, revision]
667
 
        else:
668
 
            # pair of revisions?
669
 
            pass
670
 
            
671
 
        assert len(revision) == 2
672
 
 
673
 
        mutter('encoding log as %r' % bzrlib.user_encoding)
674
 
        outf = codecs.getwriter(bzrlib.user_encoding)(sys.stdout)
675
 
 
676
 
        show_log(b, file_id,
677
 
                 show_timezone=timezone,
678
 
                 verbose=verbose,
679
 
                 show_ids=show_ids,
680
 
                 to_file=outf,
681
 
                 direction=direction,
682
 
                 start_revision=revision[0],
683
 
                 end_revision=revision[1])
 
598
            filename = b.relpath(filename)
 
599
        bzrlib.show_log(b, filename,
 
600
                        show_timezone=timezone,
 
601
                        verbose=verbose,
 
602
                        show_ids=show_ids)
684
603
 
685
604
 
686
605
 
687
606
class cmd_touching_revisions(Command):
688
 
    """Return revision-ids which affected a particular file.
689
 
 
690
 
    A more user-friendly interface is "bzr log FILE"."""
 
607
    """Return revision-ids which affected a particular file."""
691
608
    hidden = True
692
609
    takes_args = ["filename"]
693
610
    def run(self, filename):
925
842
    def run(self):
926
843
        failures, tests = 0, 0
927
844
 
928
 
        import doctest, bzrlib.store
 
845
        import doctest, bzrlib.store, bzrlib.tests
929
846
        bzrlib.trace.verbose = False
930
847
 
931
848
        for m in bzrlib.store, bzrlib.inventory, bzrlib.branch, bzrlib.osutils, \
1031
948
    'all':                    None,
1032
949
    'help':                   None,
1033
950
    'file':                   unicode,
1034
 
    'forward':                None,
1035
951
    'message':                unicode,
1036
952
    'profile':                None,
1037
 
    'revision':               _parse_revision_str,
 
953
    'revision':               int,
1038
954
    'show-ids':               None,
1039
955
    'timezone':               str,
1040
956
    'verbose':                None,