/stdhome

To get this branch, use:
bzr branch http://bzr.ed.am/stdhome

« back to all changes in this revision

Viewing changes to lib/stdhome/program.py

  • Committer: Tim Marston
  • Date: 2014-02-26 19:10:31 UTC
  • Revision ID: tim@ed.am-20140226191031-elcqy5j09h2syn2j
moved copy-in, copy-out and deployment conflict checking to a set of "walkers";
bzr vcs back-end now parses affected files during update; deployment state now
includes affected files

Show diffs side-by-side

added added

removed removed

21
21
 
22
22
import os, sys, getopt
23
23
import the
 
24
from vcs.vcs import Vcs
24
25
 
25
26
 
26
27
class Program:
38
39
 
39
40
 
40
41
        def print_usage( self, error_message ):
41
 
                suffix = ' ' + the.command if the.command else ''
 
42
                command = ' ' + the.command if the.command else ''
42
43
                self.die( error_message + \
43
44
                                  "\nTry '%s%s --help' for more information." % \
44
 
                                  ( self.name, suffix ) )
 
45
                                  ( self.name, command ) )
45
46
 
46
47
 
47
48
        def print_help( self ):
48
49
                print "Usage: " + self.name + " COMMAND [OPTION]..."
49
50
                print
50
51
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
51
 
                print "Manage your home directories, across multiple computers, similar to how you"
52
 
                print "would software under version control."
 
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)."
53
55
                print
54
56
                print "Global options (for all commands):"
55
57
                print "     --help     display help and exit"
61
63
                print "  resolve       try to finish an update (that had conflicts)"
62
64
                print "  add           add local files/changes to the repository"
63
65
                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"
64
68
                print "  revert        undo changes made to a local file"
65
69
                print "  stage-add     stage local files/changes"
66
70
                print "  stage-remove  stage the removal of files"
67
71
                print "  stage-revert  revert staged changes"
68
72
                print "  stage-status  show status of staging area"
 
73
                print "  stage-diff    shows staged changes"
69
74
                print "  stage-commit  commit staged changes to repository"
70
75
                print
71
76
                print "For help about a particular command (including the additional options that the"
99
104
                - `command`: the given command
100
105
                """
101
106
                # commands
102
 
                if [ 'init', 'update', 'resolve', 'add', 'remove', 'revert',
103
 
                         'stage-add', 'stage-remove', 'stage-revert', 'stage-status',
104
 
                         'stage-commit' ].count( command ) == 1:
 
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:
105
111
                        return command
106
112
 
107
113
                # resolve aliases
163
169
                if the.command == None:
164
170
                        self.print_usage( "bad command" )
165
171
 
166
 
                # calculate class name
 
172
                # calculate module and class name
167
173
                bits = the.command.split( '-' )
168
174
                class_name = 'Command'
 
175
                module_name = 'command'
169
176
                for bit in bits:
170
177
                        class_name += bit[ 0 ].upper() + bit[ 1 : ]
 
178
                        module_name += '_' + bit
171
179
 
172
 
                # instantiate the command class
173
 
                module = __import__( 'stdhome.command_' + the.command,
 
180
                # import module and instantiate the class
 
181
                module = __import__( 'stdhome.' + module_name,
174
182
                                                         fromlist = [ class_name ] )
175
183
                instance = getattr( module, class_name )()
176
184
 
177
 
                # run it
 
185
                # run the command
178
186
                try:
179
187
                        instance.parse_command_line()
180
188
                        instance.run()
181
 
                except ( getopt.GetoptError, self.UsageError ) as e:
 
189
                except( getopt.GetoptError, self.UsageError ) as e:
182
190
                        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()
 
195
                        self.die( message )
183
196
                except self.FatalError as e:
184
 
                        message = e.msg
185
 
                        if the.verbose and e.output:
186
 
                                message += '\n\nOUTPUT:\n' + e.output
187
 
                        self.die( message )
 
197
                        self.die( e.msg )
188
198
 
189
199
 
190
200
        class UsageError( Exception ):
195
205
 
196
206
        class FatalError( Exception ):
197
207
 
198
 
                def __init__( self, message, output = None ):
 
208
                def __init__( self, message ):
199
209
                        self.msg = message
200
 
                        self.output = output