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