41
40
def print_usage( self, error_message ):
42
command = ' ' + the.command if the.command else ''
41
suffix = ' ' + the.command if the.command else ''
43
42
self.die( error_message + \
44
43
"\nTry '%s%s --help' for more information." % \
45
( self.name, command ) )
44
( self.name, suffix ) )
48
47
def print_help( self ):
49
48
print "Usage: " + self.name + " COMMAND [OPTION]..."
51
50
# 01234567890123456789012345678901234567890123456789012345678901234567890123456789
52
print "Tool to manage a set of files in your home directory and distribute them across"
53
print "multiple computers, merging local changes (in the same way as you would manage"
54
print "source code under version control)."
51
print "Manage your home directories, across multiple computers, similar to how you"
52
print "would software under version control."
56
54
print "Global options (for all commands):"
57
55
print " --help display help and exit"
63
61
print " resolve try to finish an update (that had conflicts)"
64
62
print " add add local files/changes to the repository"
65
63
print " remove remove a local file from the repository"
66
print " status list files that have changed locally"
67
print " diff shows changes made to local files"
68
64
print " revert undo changes made to a local file"
69
65
print " stage-add stage local files/changes"
70
66
print " stage-remove stage the removal of files"
71
67
print " stage-revert revert staged changes"
72
68
print " stage-status show status of staging area"
73
print " stage-diff shows staged changes"
74
69
print " stage-commit commit staged changes to repository"
76
71
print "For help about a particular command (including the additional options that the"
104
99
- `command`: the given command
107
if [ 'init', 'update', 'resolve', 'add', 'remove', 'revert', 'status',
108
'diff', 'stage-add', 'stage-remove', 'stage-revert',
109
'stage-status', 'stage-diff', 'stage-commit'
110
].count( command ) == 1:
102
if [ 'init', 'update', 'resolve', 'add', 'remove', 'revert',
103
'stage-add', 'stage-remove', 'stage-revert', 'stage-status',
104
'stage-commit' ].count( command ) == 1:
113
107
# resolve aliases
169
163
if the.command == None:
170
164
self.print_usage( "bad command" )
172
# calculate module and class name
166
# calculate class name
173
167
bits = the.command.split( '-' )
174
168
class_name = 'Command'
175
module_name = 'command'
177
170
class_name += bit[ 0 ].upper() + bit[ 1 : ]
178
module_name += '_' + bit
180
# import module and instantiate the class
181
module = __import__( 'stdhome.' + module_name,
172
# instantiate the command class
173
module = __import__( 'stdhome.command_' + the.command,
182
174
fromlist = [ class_name ] )
183
175
instance = getattr( module, class_name )()
187
179
instance.parse_command_line()
189
except( getopt.GetoptError, self.UsageError ) as e:
181
except ( getopt.GetoptError, self.UsageError ) as e:
190
182
self.print_usage( e.msg )
191
except Vcs.VcsError as e:
192
message = e.msg.rstrip()
193
if the.verbose and hasattr( e, 'output' ) and e.output:
194
message += '\n\nOUTPUT:\n' + e.output.rstrip()
183
except self.FatalError as e:
185
if the.verbose and e.output:
186
message += '\n\nOUTPUT:\n' + e.output
195
187
self.die( message )
196
except self.FatalError as e:
200
190
class UsageError( Exception ):
206
196
class FatalError( Exception ):
208
def __init__( self, message ):
198
def __init__( self, message, output = None ):
209
199
self.msg = message