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
34
def print_help( self ):
44
47
print "Conflicts that arise from files already existing in your home directory must be"
45
48
print "dealt with by moving those files aside (currently)."
47
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:"
48
54
print " " + the.program.name + " conflicts"
50
print "After fixing outstanding conflicts, you can re-attempt the redeployment of"
51
print "your repository by typing:"
52
print " " + the.program.name + " resolve"
54
print "To back out of trying to update and revert the local repository, type:"
55
print " " + the.program.name + " stage-revert"
58
57
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
59
58
print " -v, --verbose display information about what is being done"
70
69
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
71
70
raise the.program.FatalError(
72
71
'invalid repository name: ' + optarg )
74
73
elif opt in [ '--verbose', '-v' ]:
76
75
elif opt == "--help":
89
88
# set up repo and check it exists
89
the.set_repo( self.repo )
90
90
the.repo.check_dir_exists()
92
# initialise deployment (and check it)
92
# initialise deployment (check it's valid)
93
93
deployment = Deployment()
94
94
deployment.check_ongoing( False )
103
103
# copy-in changes to repo
105
105
deployment.copy_in()
106
except deployment.CopyInConflicts as e:
107
raise the.program.FatalError(
108
'Files in %s differ too severly from %s:\n %s\n' % \
109
( the.home_dir, the.repo.dir, '\n '.join( e.conflicts ) ) )
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 )
133
127
# copy-out changes from repo
134
deployment.copy_out()
129
deployment.copy_out()
130
except deployment.Conflict as e:
131
raise the.program.FatalError( e.msg )
136
133
# now we've copied-out, revert any copied-in changes!
137
if the.verbose >= 1: print "reverting %s" % the.repo.dir
134
if the.verbose: print "reverting %s" % the.repo.dir
138
135
the.repo.vcs.revert()