22
22
import sys, os, re, getopt, shutil, subprocess
23
from .command import Command
23
from command import Command
24
24
import stdhome.the as the
25
25
from stdhome.deployment import Deployment
28
28
class InitCommand( Command ):
33
self.vcs = the.config.default_vcs
36
31
def print_help( self ):
37
print("Usage: " + the.program.name + " init [URL] [--repo=REPO]")
32
print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
39
34
# 01234567890123456789012345678901234567890123456789012345678901234567890123456789
40
print("Initialise a local repository.")
42
print("If an URL is given, the local reposity is a checkout of it (i.e., you can")
43
print("receive updates from it and changes you commit will be sent to it). The URL")
44
print("can take the form of a simple hostname, such as \"example.com\", or it can be a")
45
print("fully-qualified bazaar URL. (Actually, in the first case, where it is a simple")
46
print("hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO).")
49
print(" --quiet do not report changes to the home directory")
50
print(" -r, --repo=REPO select the repo to check-out or create (defaults to 'home')")
51
print(" -v, --verbose display information about what is being done")
52
print(" --vcs=VCS select the version control system")
53
print(" --help display help and exit")
35
print "Initialise a local repository."
37
print "If an URL is given, the local reposity is a checkout of it (i.e., you can"
38
print "receive updates from it and changes you commit will be sent to it). The URL"
39
print "can take the form of a simple hostname, such as \"example.com\", or it can be a"
40
print "fully-qualified bazaar URL. (Actually, in the first case, where it is a simple"
41
print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
44
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
45
print " -v, --verbose display information about what is being done"
46
print " --help display help and exit"
57
50
def parse_command_line( self ):
58
51
opts, args = getopt.gnu_getopt(
59
52
sys.argv[ 1: ], "r:v",
60
[ "quiet", "repo=", "vcs=", "verbose", "help" ] )
53
[ "repo=", "verbose", "help" ] )
61
54
for opt, optarg in opts:
64
elif opt in [ '--repo', '-r' ]:
65
if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
55
if opt in [ '--repo', '-r' ]:
56
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
66
57
raise the.program.FatalError(
67
58
'invalid repository name: ' + optarg )
71
elif opt in [ '--verbose', '-v' ]:
73
60
elif opt == "--help":
100
86
# expand url if it's a simple hostname
101
if re.search( '^[0-9a-zA-z.]+$', self.url ):
102
self.url = the.repo.vcs.expand_repo_url( self.url )
87
if re.match( '^[0-9a-zA-z.]+$', self.url ):
88
self.url = 'bzr+ssh://%s/%s/%s' % \
89
( self.url, the.dir, the.repo.name )
104
91
# initialise deployment (with an empty repo)
105
92
deployment = Deployment()
106
93
deployment.copy_in()
108
95
# perform bzr checkout
109
if the.verbose >= 1: print("checking out %s" % the.repo.dir)
96
if the.verbose >= 1: print "checking out %s" % the.repo.dir
111
98
the.repo.vcs.checkout( self.url )
99
except Exception as e:
114
101
# attempt to clean-up repo dir
115
if os.path.exists( the.repo.full_dir ):
117
shutil.rmtree( the.repo.full_dir )
103
shutil.rmtree( the.repo.full_dir )
125
109
# check for deployment conclicts
126
110
conflicts = deployment.get_conflicts()
128
112
message += 'deployment conflicts:\n %s' % \
129
113
'\n '.join( conflicts )
131
# stop if there are conflicts
133
raise the.program.FatalError(
134
'there were conflicts...\n' + message )
136
115
# perform deployment
137
deployment.copy_out( self.quiet )
116
deployment.copy_out()
141
120
# perform bzr init
142
if the.verbose >= 1: print('initialising %s' % the.repo.dir)
121
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
144
123
the.repo.vcs.init()
124
except Exception as e:
147
126
# attempt to clean-up repo dir, and die
148
if os.path.exists( the.repo.full_dir ):
150
shutil.rmtree( the.repo.full_dir )
128
shutil.rmtree( the.repo.full_dir )