chiark / gitweb /
d8d2868f558aa1b767913e7290fab097a733d79d
[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
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.delete
34 import stgit.commands.diff
35 import stgit.commands.clean
36 import stgit.commands.clone
37 import stgit.commands.export
38 import stgit.commands.files
39 import stgit.commands.fold
40 import stgit.commands.id
41 import stgit.commands.imprt
42 import stgit.commands.init
43 import stgit.commands.mail
44 import stgit.commands.new
45 import stgit.commands.pop
46 import stgit.commands.pull
47 import stgit.commands.push
48 import stgit.commands.refresh
49 import stgit.commands.rename
50 import stgit.commands.resolved
51 import stgit.commands.rm
52 import stgit.commands.series
53 import stgit.commands.status
54 import stgit.commands.top
55 import stgit.commands.unapplied
56
57
58 #
59 # The commands map
60 #
61 commands = {
62     'add':      stgit.commands.add,
63     'applied':  stgit.commands.applied,
64     'delete':   stgit.commands.delete,
65     'diff':     stgit.commands.diff,
66     'clean':    stgit.commands.clean,
67     'clone':    stgit.commands.clone,
68     'export':   stgit.commands.export,
69     'files':    stgit.commands.files,
70     'fold':     stgit.commands.fold,
71     'id':       stgit.commands.id,
72     'import':   stgit.commands.imprt,
73     'init':     stgit.commands.init,
74     'mail':     stgit.commands.mail,
75     'new':      stgit.commands.new,
76     'pop':      stgit.commands.pop,
77     'pull':     stgit.commands.pull,
78     'push':     stgit.commands.push,
79     'refresh':  stgit.commands.refresh,
80     'rename':   stgit.commands.rename,
81     'resolved': stgit.commands.resolved,
82     'rm':       stgit.commands.rm,
83     'series':   stgit.commands.series,
84     'status':   stgit.commands.status,
85     'top':      stgit.commands.top,
86     'unapplied':stgit.commands.unapplied,
87     }
88
89 def print_help():
90     print 'usage: %s <command> [options]' % os.path.basename(sys.argv[0])
91     print
92     print 'commands:'
93     print '  help        print this message'
94
95     cmds = commands.keys()
96     cmds.sort()
97     for cmd in cmds:
98         print '  ' + cmd + ' ' * (12 - len(cmd)) + commands[cmd].help
99
100 #
101 # The main function (command dispatcher)
102 #
103 def main():
104     """The main function
105     """
106     prog = os.path.basename(sys.argv[0])
107
108     if len(sys.argv) < 2:
109         print >> sys.stderr, 'Unknown command'
110         print >> sys.stderr, \
111               '  Try "%s help" for a list of supported commands' % prog
112         sys.exit(1)
113
114     cmd = sys.argv[1]
115
116     if cmd in ['-h', '--help', 'help']:
117         print_help()
118         sys.exit(0)
119     if cmd in ['-v', '--version']:
120         print '%s %s' % (prog, version)
121         sys.exit(0)
122     if not cmd in commands:
123         print >> sys.stderr, 'Unknown command: %s' % cmd
124         print >> sys.stderr, '  Try "%s help" for a list of supported commands' \
125               % prog
126         sys.exit(1)
127
128     # re-build the command line arguments
129     sys.argv[0] += ' %s' % cmd
130     del(sys.argv[1])
131
132     command = commands[cmd]
133     parser = OptionParser(usage = command.usage,
134                           option_list = command.options)
135     options, args = parser.parse_args()
136     try:
137         # 'clone' doesn't expect an already initialised GIT tree
138         if cmd == 'clone':
139             stgit.commands.common.crt_series = stack.Series('master')
140         else:
141             stgit.commands.common.crt_series = stack.Series()
142         # the line below is a simple way to avoid an exception when
143         # stgit is run outside an initialised tree
144         setattr(command, 'crt_series', stgit.commands.common.crt_series)
145
146         command.func(parser, options, args)
147     except (IOError, CmdException, stack.StackException, git.GitException), \
148                err:
149         print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
150         sys.exit(2)
151
152     sys.exit(0)