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
26
from stdhome.subprocess import Popen
29
class InitCommand( Command ):
30
32
def __init__( self ):
54
57
sys.argv[ 1: ], "r:v",
55
58
[ "repo=", "verbose", "help" ] )
56
59
for opt, optarg in opts:
57
if [ '--repo', '-r' ].count( opt ):
60
if opt in [ '--repo', '-r' ]:
58
61
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
62
raise the.program.FatalError(
60
63
'invalid repository name: ' + optarg )
62
elif [ '--verbose', '-v' ].count( opt ):
65
elif opt in [ '--verbose', '-v' ]:
64
67
elif opt == "--help":
83
# set up repo and check it *doesn't* already exists
79
84
the.set_repo( self.repo )
81
# repo dir must not already exist
82
85
the.repo.check_dir_exists( False )
84
87
# ensure our top-level directory exists
85
if not os.path.exists( the.expanded_dir ):
86
os.mkdir( the.expanded_dir )
88
if not os.path.exists( the.full_dir ):
89
os.mkdir( the.full_dir )
91
# checkout a remote repo, or create an empty local one?
90
94
# expand url if it's a simple hostname
93
97
( self.url, the.dir, the.repo.name )
95
99
# initialise deployment (with an empty repo)
96
deployment = Deployment( self.repo )
100
deployment = Deployment()
97
101
deployment.copy_in()
99
103
# 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 ]
104
if the.verbose: print "checking out %s" % the.repo.dir
106
the.repo.vcs.checkout( self.url )
107
except Exception as e:
107
# attempt to clean-up repo dir, and die
109
# attempt to clean-up repo dir
109
shutil.rmtree( the.repo.expanded_dir )
111
shutil.rmtree( the.repo.full_dir )
112
raise the.program.FatalError( 'checkout failed', out )
114
117
# perform deployment
115
deployment.copy_out()
119
deployment.copy_out()
120
except deployment.Conflict as e:
121
raise the.program.FatalError( e.msg )
119
125
# 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 ]
126
if the.verbose: print 'initialising %s' % the.repo.dir
129
except Exception as e:
127
131
# attempt to clean-up repo dir, and die
129
shutil.rmtree( the.repo.expanded_dir )
133
shutil.rmtree( the.repo.full_dir )
132
raise the.program.FatalError( 'init failed', out )