Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
-import sys, os
-from optparse import OptionParser
+import sys, os, traceback
import stgit.commands
-from stgit.utils import out
+from stgit.out import *
+from stgit import argparse, run, utils
#
# The commands map
if not candidates:
out.error('Unknown command: %s' % key,
'Try "%s help" for a list of supported commands' % prog)
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
elif len(candidates) > 1:
out.error('Ambiguous command: %s' % key,
'Candidates are: %s' % ', '.join(candidates))
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
return candidates[0]
def __getitem__(self, key):
- """Return the command python module name based.
- """
- global prog
-
cmd_mod = self.get(key) or self.get(self.canonical_cmd(key))
-
- __import__('stgit.commands.' + cmd_mod)
- return getattr(stgit.commands, cmd_mod)
+ return stgit.commands.get_command(cmd_mod)
-commands = Commands({
- 'add': 'add',
- 'applied': 'applied',
- 'assimilate': 'assimilate',
- 'branch': 'branch',
- 'delete': 'delete',
- 'diff': 'diff',
- 'clean': 'clean',
- 'clone': 'clone',
- 'commit': 'commit',
- 'cp': 'copy',
- 'export': 'export',
- 'files': 'files',
- 'float': 'float',
- 'fold': 'fold',
- 'goto': 'goto',
- 'hide': 'hide',
- 'id': 'id',
- 'import': 'imprt',
- 'init': 'init',
- 'log': 'log',
- 'mail': 'mail',
- 'new': 'new',
- 'patches': 'patches',
- 'pick': 'pick',
- 'pop': 'pop',
- 'pull': 'pull',
- 'push': 'push',
- 'rebase': 'rebase',
- 'refresh': 'refresh',
- 'rename': 'rename',
- 'resolved': 'resolved',
- 'rm': 'rm',
- 'series': 'series',
- 'show': 'show',
- 'sink': 'sink',
- 'status': 'status',
- 'sync': 'sync',
- 'top': 'top',
- 'unapplied': 'unapplied',
- 'uncommit': 'uncommit',
- 'unhide': 'unhide'
- })
+cmd_list = stgit.commands.get_commands()
+commands = Commands((cmd, mod) for cmd, (mod, kind, help)
+ in cmd_list.iteritems())
-# classification: repository, stack, patch, working copy
-repocommands = (
- 'clone',
- 'id',
- )
-stackcommands = (
- 'applied',
- 'assimilate',
- 'branch',
- 'clean',
- 'commit',
- 'float',
- 'goto',
- 'hide',
- 'init',
- 'patches',
- 'pop',
- 'pull',
- 'push',
- 'rebase',
- 'series',
- 'sink',
- 'top',
- 'unapplied',
- 'uncommit',
- 'unhide',
- )
-patchcommands = (
- 'delete',
- 'export',
- 'files',
- 'fold',
- 'import',
- 'log',
- 'mail',
- 'new',
- 'pick',
- 'refresh',
- 'rename',
- 'show',
- 'sync',
- )
-wccommands = (
- 'add',
- 'cp',
- 'diff',
- 'resolved',
- 'rm',
- 'status',
- )
-
-def _print_helpstring(cmd):
- print ' ' + cmd + ' ' * (12 - len(cmd)) + commands[cmd].help
-
def print_help():
print 'usage: %s <command> [options]' % os.path.basename(sys.argv[0])
print
print ' help print the detailed command usage'
print ' version display version information'
print ' copyright display copyright information'
- # unclassified commands if any
- cmds = commands.keys()
- cmds.sort()
- for cmd in cmds:
- if not cmd in repocommands and not cmd in stackcommands \
- and not cmd in patchcommands and not cmd in wccommands:
- _print_helpstring(cmd)
- print
-
- print 'Repository commands:'
- for cmd in repocommands:
- _print_helpstring(cmd)
- print
-
- print 'Stack commands:'
- for cmd in stackcommands:
- _print_helpstring(cmd)
- print
-
- print 'Patch commands:'
- for cmd in patchcommands:
- _print_helpstring(cmd)
print
-
- print 'Working-copy commands:'
- for cmd in wccommands:
- _print_helpstring(cmd)
+ stgit.commands.pretty_command_list(cmd_list, sys.stdout)
#
# The main function (command dispatcher)
#
-def main():
+def _main():
"""The main function
"""
global prog
print >> sys.stderr, 'usage: %s <command>' % prog
print >> sys.stderr, \
' Try "%s --help" for a list of supported commands' % prog
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
cmd = sys.argv[1]
sys.argv[2] = '--help'
else:
print_help()
- sys.exit(0)
+ sys.exit(utils.STGIT_SUCCESS)
if cmd == 'help':
if len(sys.argv) == 3 and not sys.argv[2] in ['-h', '--help']:
cmd = commands.canonical_cmd(sys.argv[2])
if not cmd in commands:
out.error('%s help: "%s" command unknown' % (prog, cmd))
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
sys.argv[0] += ' %s' % cmd
command = commands[cmd]
- parser = OptionParser(usage = command.usage,
- option_list = command.options)
+ parser = argparse.make_option_parser(command)
from pydoc import pager
pager(parser.format_help())
else:
print_help()
- sys.exit(0)
+ sys.exit(utils.STGIT_SUCCESS)
if cmd in ['-v', '--version', 'version']:
from stgit.version import version
print 'Stacked GIT %s' % version
os.system('git --version')
print 'Python version %s' % sys.version
- sys.exit(0)
+ sys.exit(utils.STGIT_SUCCESS)
if cmd in ['copyright']:
print __copyright__
- sys.exit(0)
+ sys.exit(utils.STGIT_SUCCESS)
# re-build the command line arguments
cmd = commands.canonical_cmd(cmd)
del(sys.argv[1])
command = commands[cmd]
- usage = command.usage.split('\n')[0].strip()
- parser = OptionParser(usage = usage, option_list = command.options)
+ parser = argparse.make_option_parser(command)
options, args = parser.parse_args()
+ directory = command.directory
# These modules are only used from this point onwards and do not
# need to be imported earlier
+ from stgit.exception import StgException
from stgit.config import config_setup
from ConfigParser import ParsingError, NoSectionError
- from stgit.stack import Series, StackException
- from stgit.git import GitException
- from stgit.commands.common import CmdException
- from stgit.gitmergeonefile import GitMergeException
- from stgit.utils import EditorException
+ from stgit.stack import Series
try:
- debug_level = int(os.environ['STGIT_DEBUG_LEVEL'])
- except KeyError:
- debug_level = 0
+ debug_level = int(os.environ.get('STGIT_DEBUG_LEVEL', 0))
except ValueError:
out.error('Invalid STGIT_DEBUG_LEVEL environment variable')
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
try:
+ directory.setup()
config_setup()
- # 'clone' doesn't expect an already initialised GIT tree. A Series
- # object will be created after the GIT tree is cloned
- if cmd != 'clone':
+ # Some commands don't (always) need an initialized series.
+ if directory.needs_current_series:
if hasattr(options, 'branch') and options.branch:
command.crt_series = Series(options.branch)
else:
command.crt_series = Series()
- stgit.commands.common.crt_series = command.crt_series
- command.func(parser, options, args)
- except (IOError, ParsingError, NoSectionError, CmdException,
- StackException, GitException, GitMergeException,
- EditorException), err:
- print >> sys.stderr, '%s %s: %s' % (prog, cmd, err)
- if debug_level:
- raise
- else:
- sys.exit(2)
+ ret = command.func(parser, options, args)
+ except (StgException, IOError, ParsingError, NoSectionError), err:
+ directory.write_log(cmd)
+ out.error(str(err), title = '%s %s' % (prog, cmd))
+ if debug_level > 0:
+ traceback.print_exc()
+ sys.exit(utils.STGIT_COMMAND_ERROR)
+ except SystemExit:
+ # Triggered by the option parser when it finds bad commandline
+ # parameters.
+ sys.exit(utils.STGIT_COMMAND_ERROR)
except KeyboardInterrupt:
- sys.exit(1)
+ sys.exit(utils.STGIT_GENERAL_ERROR)
+ except:
+ out.error('Unhandled exception:')
+ traceback.print_exc()
+ sys.exit(utils.STGIT_BUG_ERROR)
- sys.exit(0)
+ directory.write_log(cmd)
+ sys.exit(ret or utils.STGIT_SUCCESS)
+
+def main():
+ try:
+ _main()
+ finally:
+ run.finish_logging()