Implement the 'goto' command
[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.goto
43 import stgit.commands.id
44 import stgit.commands.imprt
45 import stgit.commands.init
46 import stgit.commands.mail
47 import stgit.commands.new
48 import stgit.commands.patches
49 import stgit.commands.pick
50 import stgit.commands.pop
51 import stgit.commands.pull
52 import stgit.commands.push
53 import stgit.commands.refresh
54 import stgit.commands.rename
55 import stgit.commands.resolved
56 import stgit.commands.rm
57 import stgit.commands.series
58 import stgit.commands.show
59 import stgit.commands.status
60 import stgit.commands.top
61 import stgit.commands.unapplied
62 import stgit.commands.uncommit
63
64
65 #
66 # The commands map
67 #
68 commands = {
69 'add': stgit.commands.add,
70 'applied': stgit.commands.applied,
71 'branch': stgit.commands.branch,
72 'delete': stgit.commands.delete,
73 'diff': stgit.commands.diff,
74 'clean': stgit.commands.clean,
75 'clone': stgit.commands.clone,
76 'commit': stgit.commands.commit,
77 'export': stgit.commands.export,
78 'files': stgit.commands.files,
79 'fold': stgit.commands.fold,
80 'goto': stgit.commands.goto,
81 'id': stgit.commands.id,
82 'import': stgit.commands.imprt,
83 'init': stgit.commands.init,
84 'mail': stgit.commands.mail,
85 'new': stgit.commands.new,
86 'patches': stgit.commands.patches,
87 'pick': stgit.commands.pick,
88 'pop': stgit.commands.pop,
89 'pull': stgit.commands.pull,
90 'push': stgit.commands.push,
91 'refresh': stgit.commands.refresh,
92 'rename': stgit.commands.rename,
93 'resolved': stgit.commands.resolved,
94 'rm': stgit.commands.rm,
95 'series': stgit.commands.series,
96 'show': stgit.commands.show,
97 'status': stgit.commands.status,
98 'top': stgit.commands.top,
99 'unapplied':stgit.commands.unapplied,
100 'uncommit': stgit.commands.uncommit,
101 }
102
103 def print_help():
104 print 'usage: %s <command> [options]' % os.path.basename(sys.argv[0])
105 print
106 print 'commands:'
107 print ' help print the detailed command usage'
108 print ' version display version information'
109 print ' copyright display copyright information'
110 print
111
112 cmds = commands.keys()
113 cmds.sort()
114 for cmd in cmds:
115 print ' ' + cmd + ' ' * (12 - len(cmd)) + commands[cmd].help
116
117 #
118 # The main function (command dispatcher)
119 #
120 def main():
121 """The main function
122 """
123 prog = os.path.basename(sys.argv[0])
124
125 if len(sys.argv) < 2:
126 print >> sys.stderr, 'Unknown command'
127 print >> sys.stderr, \
128 ' Try "%s --help" for a list of supported commands' % prog
129 sys.exit(1)
130
131 cmd = sys.argv[1]
132
133 if cmd in ['-h', '--help']:
134 if len(sys.argv) == 3 and sys.argv[2] in commands:
135 cmd = sys.argv[2]
136 sys.argv[2] = '--help'
137 else:
138 print_help()
139 sys.exit(0)
140 if cmd == 'help':
141 if len(sys.argv) == 3 and not sys.argv[2] in ['-h', '--help']:
142 cmd = sys.argv[2]
143 if not cmd in commands:
144 print >> sys.stderr, '%s help: "%s" command unknown' \
145 % (prog, cmd)
146 sys.exit(1)
147
148 sys.argv[0] += ' %s' % cmd
149 command = commands[cmd]
150 parser = OptionParser(usage = command.usage,
151 option_list = command.options)
152 parser.print_help()
153 else:
154 print 'usage: %s help <command>' % prog
155
156 sys.exit(0)
157 if cmd in ['-v', '--version', 'version']:
158 print 'Stacked GIT %s' % version
159 os.system('git --version')
160 print 'Python version %s' % sys.version
161 sys.exit(0)
162 if cmd in ['copyright']:
163 print __copyright__
164 sys.exit(0)
165 if not cmd in commands:
166 print >> sys.stderr, 'Unknown command: %s' % cmd
167 print >> sys.stderr, ' Try "%s help" for a list of supported ' \
168 'commands' % prog
169 sys.exit(1)
170
171 # re-build the command line arguments
172 sys.argv[0] += ' %s' % cmd
173 del(sys.argv[1])
174
175 command = commands[cmd]
176 usage = command.usage.split('\n')[0].strip()
177 parser = OptionParser(usage = usage, option_list = command.options)
178 options, args = parser.parse_args()
179 try:
180 # 'clone' doesn't expect an already initialised GIT tree. A Series
181 # object will be created after the GIT tree is cloned
182 if cmd != 'clone':
183 if hasattr(options, 'branch') and options.branch:
184 command.crt_series = stack.Series(options.branch)
185 else:
186 command.crt_series = stack.Series()
187 stgit.commands.common.crt_series = command.crt_series
188
189 command.func(parser, options, args)
190 except (IOError, CmdException, stack.StackException, git.GitException,
191 gitmergeonefile.GitMergeException), err:
192 print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
193 sys.exit(2)
194 except KeyboardInterrupt:
195 sys.exit(1)
196
197 sys.exit(0)