Add the --replace option to import
[stgit] / stgit / main.py
... / ...
CommitLineData
1"""Basic quilt-like functionality
2"""
3
4__copyright__ = """
5Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License version 2 as
9published by the Free Software Foundation.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19"""
20
21import sys, os
22from optparse import OptionParser, make_option
23
24from stgit.utils import *
25from stgit import stack, git, gitmergeonefile
26from stgit.version import version
27from stgit.config import config
28from stgit.commands.common import *
29
30# The commands
31import stgit.commands.add
32import stgit.commands.applied
33import stgit.commands.branch
34import stgit.commands.delete
35import stgit.commands.diff
36import stgit.commands.clean
37import stgit.commands.clone
38import stgit.commands.commit
39import stgit.commands.export
40import stgit.commands.files
41import stgit.commands.fold
42import stgit.commands.goto
43import stgit.commands.id
44import stgit.commands.imprt
45import stgit.commands.init
46import stgit.commands.mail
47import stgit.commands.new
48import stgit.commands.patches
49import stgit.commands.pick
50import stgit.commands.pop
51import stgit.commands.pull
52import stgit.commands.push
53import stgit.commands.refresh
54import stgit.commands.rename
55import stgit.commands.resolved
56import stgit.commands.rm
57import stgit.commands.series
58import stgit.commands.show
59import stgit.commands.status
60import stgit.commands.top
61import stgit.commands.unapplied
62import stgit.commands.uncommit
63
64
65#
66# The commands map
67#
68commands = {
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
103def 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#
120def 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)