22
22
import sys, re, getopt
23
from command import Command
24
import stdhome.the as the
25
from stdhome.deployment import Deployment
28
class UpdateCommand( Command ):
24
from deployment import Deployment
31
30
def __init__( self ):
35
34
def print_help( self ):
48
47
print "Conflicts that arise from files already existing in your home directory must be"
49
48
print "dealt with by moving those files aside (currently)."
51
print "After a failed update, you can list outstanding conflicts by typing:"
50
print "You can resume the redeployment of your repository by typing:"
51
print " " + the.program.name + " resolve"
53
print "You can list outstanding conflicts by typing:"
52
54
print " " + the.program.name + " conflicts"
54
print "After fixing outstanding conflicts, you can re-attempt the redeployment of"
55
print "your repository by typing:"
56
print " " + the.program.name + " resolve"
58
print "To back out of trying to update and revert the local repository, type:"
59
print " " + the.program.name + " stage-revert"
62
print " --quiet do not report changes to the home directory"
63
57
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
64
58
print " -v, --verbose display information about what is being done"
65
59
print " --help display help and exit"
69
63
def parse_command_line( self ):
70
64
opts, args = getopt.gnu_getopt(
71
sys.argv[ 1: ], "qr:v",
72
[ "quiet", "repo=", "verbose", "help" ] )
65
sys.argv[ 1: ], "r:v",
66
[ "repo=", "verbose", "help" ] )
73
67
for opt, optarg in opts:
76
elif opt in [ '--repo', '-r' ]:
77
if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
68
if opt in [ '--repo', '-r' ]:
69
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
78
70
raise the.program.FatalError(
79
71
'invalid repository name: ' + optarg )
73
elif opt in [ '--verbose', '-v' ]:
81
75
elif opt == "--help":
84
78
# discard first argument (the command)
94
88
# set up repo and check it exists
89
the.set_repo( self.repo )
95
90
the.repo.check_dir_exists()
97
# initialise deployment (and check it)
92
# initialise deployment (check it's valid)
98
93
deployment = Deployment()
99
94
deployment.check_ongoing( False )
102
97
if the.repo.vcs.has_changes():
103
98
raise the.program.FatalError(
104
99
'repo has local changes: %s\n'
105
'Hint: see "%s stage-revert --help"' %
100
'Hint: see "%s stage-revert --help"' %
106
101
( the.repo.name, the.program.name ) )
108
103
# copy-in changes to repo
106
except( deployment.Conflict, deployment.DeploymentOngoing ) as e:
107
raise the.program.FatalError( e.msg )
111
109
# perform vcs update
112
if the.verbose >= 1: print "updating %s" % the.repo.dir
113
updated_files = the.repo.vcs.update()
110
if the.verbose: print "updating %s" % the.repo.dir
111
the.repo.vcs.update()
113
# check for conflicts
117
# check for conflicts in repo
118
115
files = the.repo.vcs.get_conflicts()
120
message += 'conflicts in %s:\n %s' % \
117
message += 'Conflicts in %s:\n %s' % \
121
118
( the.repo.name, '\n '.join( files ) )
123
# check for deployment conclicts
124
conflicts = deployment.get_conflicts( updated_files )
126
message += 'deployment conflicts:\n %s' % \
127
'\n '.join( conflicts )
129
# stop if there are conflicts
119
files = deployment.get_conflicts()
121
message += 'Deployment conflicts:\n %s' % \
131
124
raise the.program.FatalError(
132
125
'there were conflicts...\n' + message )
134
127
# copy-out changes from repo
135
deployment.copy_out( self.quiet )
129
deployment.copy_out()
130
except deployment.Conflict as e:
131
raise the.program.FatalError( e.msg )
137
133
# now we've copied-out, revert any copied-in changes!
138
if the.verbose >= 1: print "reverting %s" % the.repo.dir
134
if the.verbose: print "reverting %s" % the.repo.dir
139
135
the.repo.vcs.revert()