chiark / gitweb /
Improve "stg uncommit" help text.
[stgit] / stgit / main.py
1 """Basic quilt-like functionality
2 """
3
4 __copyright__ = """
5 Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 """
20
21 import sys, os
22 from optparse import OptionParser, make_option
23
24 from stgit.utils import *
25 from stgit import stack, git, gitmergeonefile
26 from stgit.version import version
27 from stgit.config import config
28 from stgit.commands.common import *
29
30 # The commands
31 import stgit.commands.add
32 import stgit.commands.applied
33 import stgit.commands.branch
34 import stgit.commands.delete
35 import stgit.commands.diff
36 import stgit.commands.clean
37 import stgit.commands.clone
38 import stgit.commands.commit
39 import stgit.commands.export
40 import stgit.commands.files
41 import stgit.commands.fold
42 import stgit.commands.id
43 import stgit.commands.imprt
44 import stgit.commands.init
45 import stgit.commands.mail
46 import stgit.commands.new
47 import stgit.commands.patches
48 import stgit.commands.pick
49 import stgit.commands.pop
50 import stgit.commands.pull
51 import stgit.commands.push
52 import stgit.commands.refresh
53 import stgit.commands.rename
54 import stgit.commands.resolved
55 import stgit.commands.rm
56 import stgit.commands.series
57 import stgit.commands.status
58 import stgit.commands.top
59 import stgit.commands.unapplied
60 import stgit.commands.uncommit
61
62
63 #
64 # The commands map
65 #
66 commands = {
67     'add':      stgit.commands.add,
68     'applied':  stgit.commands.applied,
69     'branch':   stgit.commands.branch,
70     'delete':   stgit.commands.delete,
71     'diff':     stgit.commands.diff,
72     'clean':    stgit.commands.clean,
73     'clone':    stgit.commands.clone,
74     'commit':   stgit.commands.commit,
75     'export':   stgit.commands.export,
76     'files':    stgit.commands.files,
77     'fold':     stgit.commands.fold,
78     'id':       stgit.commands.id,
79     'import':   stgit.commands.imprt,
80     'init':     stgit.commands.init,
81     'mail':     stgit.commands.mail,
82     'new':      stgit.commands.new,
83     'patches':  stgit.commands.patches,
84     'pick':     stgit.commands.pick,
85     'pop':      stgit.commands.pop,
86     'pull':     stgit.commands.pull,
87     'push':     stgit.commands.push,
88     'refresh':  stgit.commands.refresh,
89     'rename':   stgit.commands.rename,
90     'resolved': stgit.commands.resolved,
91     'rm':       stgit.commands.rm,
92     'series':   stgit.commands.series,
93     'status':   stgit.commands.status,
94     'top':      stgit.commands.top,
95     'unapplied':stgit.commands.unapplied,
96     'uncommit': stgit.commands.uncommit,
97     }
98
99 def print_help():
100     print 'usage: %s <command> [options]' % os.path.basename(sys.argv[0])
101     print
102     print 'commands:'
103     print '  help        print the detailed command usage'
104     print '  version     display version information'
105     print '  copyright   display copyright information'
106     print
107
108     cmds = commands.keys()
109     cmds.sort()
110     for cmd in cmds:
111         print '  ' + cmd + ' ' * (12 - len(cmd)) + commands[cmd].help
112
113 #
114 # The main function (command dispatcher)
115 #
116 def main():
117     """The main function
118     """
119     prog = os.path.basename(sys.argv[0])
120
121     if len(sys.argv) < 2:
122         print >> sys.stderr, 'Unknown command'
123         print >> sys.stderr, \
124               '  Try "%s --help" for a list of supported commands' % prog
125         sys.exit(1)
126
127     cmd = sys.argv[1]
128
129     if cmd in ['-h', '--help']:
130         if len(sys.argv) == 3 and sys.argv[2] in commands:
131             cmd = sys.argv[2]
132             sys.argv[2] = '--help'
133         else:
134             print_help()
135             sys.exit(0)
136     if cmd == 'help':
137         if len(sys.argv) == 3 and not sys.argv[2] in ['-h', '--help']:
138             cmd = sys.argv[2]
139             if not cmd in commands:
140                 print >> sys.stderr, '%s help: "%s" command unknown' \
141                       % (prog, cmd)
142                 sys.exit(1)
143
144             sys.argv[0] += ' %s' % cmd
145             command = commands[cmd]
146             parser = OptionParser(usage = command.usage,
147                                   option_list = command.options)
148             parser.print_help()
149         else:
150             print 'usage: %s help <command>' % prog
151
152         sys.exit(0)
153     if cmd in ['-v', '--version', 'version']:
154         print 'Stacked GIT %s' % version
155         os.system('git --version')
156         print 'Python version %s' % sys.version
157         sys.exit(0)
158     if cmd in ['copyright']:
159         print __copyright__
160         sys.exit(0)
161     if not cmd in commands:
162         print >> sys.stderr, 'Unknown command: %s' % cmd
163         print >> sys.stderr, '  Try "%s help" for a list of supported ' \
164               'commands' % prog
165         sys.exit(1)
166
167     # re-build the command line arguments
168     sys.argv[0] += ' %s' % cmd
169     del(sys.argv[1])
170
171     command = commands[cmd]
172     usage = command.usage.split('\n')[0].strip()
173     parser = OptionParser(usage = usage, option_list = command.options)
174     options, args = parser.parse_args()
175     try:
176         # 'clone' doesn't expect an already initialised GIT tree. A Series
177         # object will be created after the GIT tree is cloned
178         if cmd != 'clone':
179             if hasattr(options, 'branch') and options.branch:
180                 command.crt_series = stack.Series(options.branch)
181             else:
182                 command.crt_series = stack.Series()
183             stgit.commands.common.crt_series = command.crt_series
184
185         command.func(parser, options, args)
186     except (IOError, CmdException, stack.StackException, git.GitException,
187             gitmergeonefile.GitMergeException), err:
188         print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
189         sys.exit(2)
190     except KeyboardInterrupt:
191         sys.exit(1)
192
193     sys.exit(0)