22
22
import sys, os, re, getopt, shutil, subprocess
23
import the, deployment
24
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 ):
34
31
def print_help( self ):
54
52
sys.argv[ 1: ], "r:v",
55
53
[ "repo=", "verbose", "help" ] )
56
54
for opt, optarg in opts:
57
if [ '--repo', '-r' ].count( opt ):
55
if opt in [ '--repo', '-r' ]:
58
56
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
57
raise the.program.FatalError(
60
58
'invalid repository name: ' + optarg )
62
elif [ '--verbose', '-v' ].count( opt ):
64
60
elif opt == "--help":
67
63
# discard first argument (the command)
71
67
self.url = args[ 0 ].strip() if len( args ) else None
69
# check remaining arguments
74
70
if len( args ) > 1:
75
71
raise the.program.UsageError( 'too many arguments' )
79
the.set_repo( self.repo )
81
# repo dir must not already exist
76
# set up repo and check it *doesn't* already exists
82
77
the.repo.check_dir_exists( False )
84
79
# ensure our top-level directory exists
85
if not os.path.exists( the.expanded_dir ):
86
os.mkdir( the.expanded_dir )
80
if not os.path.exists( the.full_dir ):
81
os.mkdir( the.full_dir )
83
# checkout a remote repo, or create an empty local one?
90
86
# expand url if it's a simple hostname
91
87
if re.match( '^[0-9a-zA-z.]+$', self.url ):
92
self.url = 'sftp://%s/%s/%s' % \
88
self.url = 'bzr+ssh://%s/%s/%s' % \
93
89
( self.url, the.dir, the.repo.name )
95
91
# initialise deployment (with an empty repo)
96
deployment = Deployment( self.repo )
92
deployment = Deployment()
97
93
deployment.copy_in()
99
95
# perform bzr checkout
100
print "checking out %s" % the.repo.dir
101
p = Popen( [ 'bzr', 'co', self.url, the.repo.name ],
102
cwd = the.expanded_dir,
103
stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
104
out = p.communicate()[ 0 ]
96
if the.verbose >= 1: print "checking out %s" % the.repo.dir
98
the.repo.vcs.checkout( self.url )
99
except Exception as e:
107
# attempt to clean-up repo dir, and die
101
# attempt to clean-up repo dir
109
shutil.rmtree( the.repo.expanded_dir )
103
shutil.rmtree( the.repo.full_dir )
112
raise the.program.FatalError( 'checkout failed', out )
111
# check for deployment conclicts
112
conflicts = deployment.get_conflicts()
114
message += 'deployment conflicts:\n %s' % \
115
'\n '.join( conflicts )
117
# stop if there are conflicts
119
raise the.program.FatalError(
120
'there were conflicts...\n' + message )
114
122
# perform deployment
115
123
deployment.copy_out()
119
127
# perform bzr init
120
print 'creating %s' % the.repo.dir
121
p = Popen( [ 'bzr', 'init', the.repo.name ],
122
cwd = the.expanded_dir,
123
stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
124
out = p.communicate()[ 0 ]
128
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
131
except Exception as e:
127
133
# attempt to clean-up repo dir, and die
129
shutil.rmtree( the.repo.expanded_dir )
135
shutil.rmtree( the.repo.full_dir )
132
raise the.program.FatalError( 'init failed', out )