~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/commands.py

  • Committer: Martin Pool
  • Date: 2005-05-05 02:59:39 UTC
  • Revision ID: mbp@sourcefrog.net-20050505025938-8399b9ca401a1176
- Split out help functions into bzrlib.help

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
"""Bazaar-NG -- a free distributed version-control tool
18
 
http://bazaar-ng.org/
19
 
 
20
 
**WARNING: THIS IS AN UNSTABLE DEVELOPMENT VERSION**
21
 
 
22
 
* Metadata format is not stable yet -- you may need to
23
 
  discard history in the future.
24
 
 
25
 
* Many commands unimplemented or partially implemented.
26
 
 
27
 
* Space-inefficient storage.
28
 
 
29
 
* No merge operators yet.
30
 
 
31
 
Interesting commands:
32
 
 
33
 
  bzr help [COMMAND]
34
 
      Show help screen
35
 
  bzr version
36
 
      Show software version/licence/non-warranty.
37
 
  bzr init
38
 
      Start versioning the current directory
39
 
  bzr add FILE...
40
 
      Make files versioned.
41
 
  bzr log
42
 
      Show revision history.
43
 
  bzr rename FROM TO
44
 
      Rename one file.
45
 
  bzr move FROM... DESTDIR
46
 
      Move one or more files to a different directory.
47
 
  bzr diff [FILE...]
48
 
      Show changes from last revision to working copy.
49
 
  bzr commit -m 'MESSAGE'
50
 
      Store current state as new revision.
51
 
  bzr export [-r REVNO] DESTINATION
52
 
      Export the branch state at a previous version.
53
 
  bzr status
54
 
      Show summary of pending changes.
55
 
  bzr remove FILE...
56
 
      Make a file not versioned.
57
 
  bzr info
58
 
      Show statistics about this branch.
59
 
  bzr check
60
 
      Verify history is stored safely. 
61
 
  (for more type 'bzr help commands')
62
 
"""
63
 
 
64
 
 
65
17
 
66
18
 
67
19
import sys, os, time, os.path
85
37
    assert cmd.startswith("cmd_")
86
38
    return cmd[4:].replace('_','-')
87
39
 
88
 
def _get_all_cmds():
 
40
def get_all_cmds():
89
41
    """Return canonical name and class for all registered commands."""
90
42
    for k, v in globals().iteritems():
91
43
        if k.startswith("cmd_"):
92
44
            yield _unsquish_command_name(k), v
93
45
 
94
 
def _get_cmd_class(cmd):
 
46
def get_cmd_class(cmd):
95
47
    """Return the canonical name and command class for a command.
96
48
    """
97
49
    cmd = str(cmd)                      # not unicode
103
55
        pass
104
56
 
105
57
    # look for any command which claims this as an alias
106
 
    for cmdname, cmdclass in _get_all_cmds():
 
58
    for cmdname, cmdclass in get_all_cmds():
107
59
        if cmd in cmdclass.aliases:
108
60
            return cmdname, cmdclass
109
61
    else:
702
654
    aliases = ['?']
703
655
    
704
656
    def run(self, topic=None):
705
 
        help(topic)
706
 
 
707
 
 
708
 
def help(topic=None):
709
 
    if topic == None:
710
 
        print __doc__
711
 
    elif topic == 'commands':
712
 
        help_commands()
713
 
    else:
714
 
        help_on_command(topic)
715
 
 
716
 
 
717
 
def help_on_command(cmdname):
718
 
    cmdname = str(cmdname)
719
 
 
720
 
    from inspect import getdoc
721
 
    topic, cmdclass = _get_cmd_class(cmdname)
722
 
 
723
 
    doc = getdoc(cmdclass)
724
 
    if doc == None:
725
 
        raise NotImplementedError("sorry, no detailed help yet for %r" % cmdname)
726
 
 
727
 
    if '\n' in doc:
728
 
        short, rest = doc.split('\n', 1)
729
 
    else:
730
 
        short = doc
731
 
        rest = ''
732
 
 
733
 
    print 'usage: bzr ' + topic,
734
 
    for aname in cmdclass.takes_args:
735
 
        aname = aname.upper()
736
 
        if aname[-1] in ['$', '+']:
737
 
            aname = aname[:-1] + '...'
738
 
        elif aname[-1] == '?':
739
 
            aname = '[' + aname[:-1] + ']'
740
 
        elif aname[-1] == '*':
741
 
            aname = '[' + aname[:-1] + '...]'
742
 
        print aname,
743
 
    print 
744
 
    print short
745
 
    if rest:
746
 
        print rest
747
 
 
748
 
    help_on_option(cmdclass.takes_options)
749
 
 
750
 
 
751
 
def help_on_option(options):
752
 
    if not options:
753
 
        return
754
 
    
755
 
    print
756
 
    print 'options:'
757
 
    for on in options:
758
 
        l = '    --' + on
759
 
        for shortname, longname in SHORT_OPTIONS.items():
760
 
            if longname == on:
761
 
                l += ', -' + shortname
762
 
                break
763
 
        print l
764
 
 
765
 
 
766
 
def help_commands():
767
 
    """List all commands"""
768
 
    import inspect
769
 
    
770
 
    accu = []
771
 
    for cmdname, cmdclass in _get_all_cmds():
772
 
        accu.append((cmdname, cmdclass))
773
 
    accu.sort()
774
 
    for cmdname, cmdclass in accu:
775
 
        if cmdclass.hidden:
776
 
            continue
777
 
        print cmdname
778
 
        help = inspect.getdoc(cmdclass)
779
 
        if help:
780
 
            print "    " + help.split('\n', 1)[0]
781
 
            
 
657
        import help
 
658
        help.help(topic)
 
659
 
782
660
 
783
661
######################################################################
784
662
# main routine
924
802
    This is similar to main(), but without all the trappings for
925
803
    logging and error handling.  
926
804
    """
927
 
 
928
805
    argv = [a.decode(bzrlib.user_encoding) for a in argv]
929
806
    
930
807
    try:
931
808
        args, opts = parse_args(argv[1:])
932
809
        if 'help' in opts:
 
810
            import help
933
811
            if args:
934
 
                help(args[0])
 
812
                help.help(args[0])
935
813
            else:
936
 
                help()
 
814
                help.help()
937
815
            return 0
938
816
        elif 'version' in opts:
939
817
            show_version()
944
822
        log_error('  try "bzr help"')
945
823
        return 1
946
824
 
947
 
    canonical_cmd, cmd_class = _get_cmd_class(cmd)
 
825
    canonical_cmd, cmd_class = get_cmd_class(cmd)
948
826
 
949
827
    # global option
950
828
    if 'profile' in opts: