19
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
22
import sys, os, re, getopt, shutil, subprocess
23
import the, deployment
24
from subprocess import Popen
28
34
def print_help( self ):
29
print "Usage: " + self.program + " init [URL] [--repo=REPO]"
35
print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
31
37
# 01234567890123456789012345678901234567890123456789012345678901234567890123456789
32
38
print "Initialise a local repository."
38
44
print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
41
print " --repo select the repo to check-out or create (defaults to 'home')"
42
print " --help display help and exit"
47
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
48
print " --help display help and exit"
46
def run( self, stdhome ):
49
opts, args = getopt.gnu_getopt(
52
except getopt.GetoptError as e:
53
stdhome.print_usage( e )
54
for opt, optargs in opts:
52
def parse_command_line( self ):
53
opts, args = getopt.gnu_getopt(
54
sys.argv[ 1: ], "r:v",
55
[ "repo=", "verbose", "help" ] )
56
for opt, optarg in opts:
57
if [ '--repo', '-r' ].count( opt ):
58
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
60
'invalid repository name: ' + optarg )
62
elif [ '--verbose', '-v' ].count( opt ):
57
elif aopt == "--repo":
67
# discard first argument (the command)
71
self.url = args[ 0 ].strip() if len( args ) else None
75
raise the.program.UsageError( 'too many arguments' )
79
the.set_repo( self.repo )
81
# repo dir must not already exist
82
the.repo.check_dir_exists( False )
84
# ensure our top-level directory exists
85
if not os.path.exists( the.expanded_dir ):
86
os.mkdir( the.expanded_dir )
90
# expand url if it's a simple hostname
91
if re.match( '^[0-9a-zA-z.]+$', self.url ):
92
self.url = 'sftp://%s/%s/%s' % \
93
( self.url, the.dir, the.repo.name )
95
# initialise deployment (with an empty repo)
96
deployment = Deployment( self.repo )
99
# 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 ]
107
# attempt to clean-up repo dir, and die
109
shutil.rmtree( the.repo.expanded_dir )
112
raise the.program.FatalError( 'checkout failed', out )
115
deployment.copy_out()
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 ]
127
# attempt to clean-up repo dir, and die
129
shutil.rmtree( the.repo.expanded_dir )
132
raise the.program.FatalError( 'init failed', out )