22
22
import sys, os, re, getopt, shutil, subprocess
24
from deployment import Deployment
25
from subprocess import Popen
23
from command import Command
24
import stdhome.the as the
25
from stdhome.deployment import Deployment
28
class InitCommand( Command ):
31
31
def __init__( self ):
33
self.vcs = the.config.default_vcs
35
36
def print_help( self ):
45
46
print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
49
print " --quiet do not report changes to the home directory"
48
50
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
49
51
print " -v, --verbose display information about what is being done"
52
print " --vcs=VCS select the version control system"
50
53
print " --help display help and exit"
54
57
def parse_command_line( self ):
55
58
opts, args = getopt.gnu_getopt(
56
59
sys.argv[ 1: ], "r:v",
57
[ "repo=", "verbose", "help" ] )
60
[ "quiet", "repo=", "vcs=", "verbose", "help" ] )
58
61
for opt, optarg in opts:
59
if opt in [ '--repo', '-r' ]:
60
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
64
elif opt in [ '--repo', '-r' ]:
65
if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
61
66
raise the.program.FatalError(
62
67
'invalid repository name: ' + optarg )
64
71
elif opt in [ '--verbose', '-v' ]:
66
73
elif opt == "--help":
69
76
# discard first argument (the command)
73
80
self.url = args[ 0 ].strip() if len( args ) else None
82
# check remaining arguments
76
83
if len( args ) > 1:
77
84
raise the.program.UsageError( 'too many arguments' )
82
89
# set up repo and check it *doesn't* already exists
83
the.set_repo( self.repo )
84
90
the.repo.check_dir_exists( False )
91
the.repo.set_vcs( self.vcs )
86
93
# ensure our top-level directory exists
87
94
if not os.path.exists( the.full_dir ):
93
100
# expand url if it's a simple hostname
94
if re.match( '^[0-9a-zA-z.]+$', self.url ):
95
self.url = 'sftp://%s/%s/%s' % \
96
( self.url, the.dir, the.repo.name )
101
if re.search( '^[0-9a-zA-z.]+$', self.url ):
102
self.url = the.repo.vcs.expand_repo_url( self.url )
98
104
# initialise deployment (with an empty repo)
99
105
deployment = Deployment()
100
106
deployment.copy_in()
102
108
# perform bzr checkout
103
if the.verbose: print "checking out %s" % the.repo.dir
109
if the.verbose >= 1: print "checking out %s" % the.repo.dir
105
111
the.repo.vcs.checkout( self.url )
106
except Exception as e:
108
114
# attempt to clean-up repo dir
110
shutil.rmtree( the.repo.full_dir )
115
if os.path.exists( the.repo.full_dir ):
117
shutil.rmtree( the.repo.full_dir )
125
# check for deployment conclicts
126
conflicts = deployment.get_conflicts()
128
message += 'deployment conflicts:\n %s' % \
129
'\n '.join( conflicts )
131
# stop if there are conflicts
133
raise the.program.FatalError(
134
'there were conflicts...\n' + message )
116
136
# perform deployment
118
deployment.copy_out()
119
except deployment.Conflict as e:
120
raise the.program.FatalError( e.msg )
137
deployment.copy_out( self.quiet )
124
141
# perform bzr init
125
if the.verbose: print 'initialising %s' % the.repo.dir
142
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
127
144
the.repo.vcs.init()
128
except Exception as e:
130
147
# attempt to clean-up repo dir, and die
132
shutil.rmtree( the.repo.full_dir )
148
if os.path.exists( the.repo.full_dir ):
150
shutil.rmtree( the.repo.full_dir )