23
23
from command import Command
24
24
import stdhome.the as the
25
25
from stdhome.deployment import Deployment
26
from stdhome.subprocess import Popen
29
28
class InitCommand( Command ):
33
self.vcs = the.config.default_vcs
32
36
def print_help( self ):
33
37
print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
42
46
print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
49
print " --quiet do not report changes to the home directory"
45
50
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
46
51
print " -v, --verbose display information about what is being done"
52
print " --vcs=VCS select the version control system"
47
53
print " --help display help and exit"
51
57
def parse_command_line( self ):
52
58
opts, args = getopt.gnu_getopt(
53
59
sys.argv[ 1: ], "r:v",
54
[ "repo=", "verbose", "help" ] )
60
[ "quiet", "repo=", "vcs=", "verbose", "help" ] )
55
61
for opt, optarg in opts:
56
if opt in [ '--repo', '-r' ]:
57
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 ):
58
66
raise the.program.FatalError(
59
67
'invalid repository name: ' + optarg )
61
71
elif opt in [ '--verbose', '-v' ]:
63
73
elif opt == "--help":
66
76
# discard first argument (the command)
70
80
self.url = args[ 0 ].strip() if len( args ) else None
82
# check remaining arguments
73
83
if len( args ) > 1:
74
84
raise the.program.UsageError( 'too many arguments' )
79
89
# set up repo and check it *doesn't* already exists
80
90
the.repo.check_dir_exists( False )
91
the.repo.set_vcs( self.vcs )
82
93
# ensure our top-level directory exists
83
94
if not os.path.exists( the.full_dir ):
89
100
# expand url if it's a simple hostname
90
if re.match( '^[0-9a-zA-z.]+$', self.url ):
91
self.url = 'sftp://%s/%s/%s' % \
92
( 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 )
94
104
# initialise deployment (with an empty repo)
95
105
deployment = Deployment()
96
106
deployment.copy_in()
98
108
# perform bzr checkout
99
if the.verbose: print "checking out %s" % the.repo.dir
109
if the.verbose >= 1: print "checking out %s" % the.repo.dir
101
111
the.repo.vcs.checkout( self.url )
102
except Exception as e:
104
114
# attempt to clean-up repo dir
106
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 )
112
136
# perform deployment
114
deployment.copy_out()
115
except deployment.Conflict as e:
116
raise the.program.FatalError( e.msg )
137
deployment.copy_out( self.quiet )
120
141
# perform bzr init
121
if the.verbose: print 'initialising %s' % the.repo.dir
142
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
123
144
the.repo.vcs.init()
124
except Exception as e:
126
147
# attempt to clean-up repo dir, and die
128
shutil.rmtree( the.repo.full_dir )
148
if os.path.exists( the.repo.full_dir ):
150
shutil.rmtree( the.repo.full_dir )