19
19
# along with this program. If not, see <http://www.gnu.org/licenses/>.
22
import sys, os, re, getopt, shutil, subprocess
23
from command import Command
24
import stdhome.the as the
25
from stdhome.deployment import Deployment
28
class InitCommand( Command ):
28
31
def print_help( self ):
29
print "Usage: " + self.program + " init [URL] [--repo=REPO]"
32
print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
31
34
# 01234567890123456789012345678901234567890123456789012345678901234567890123456789
32
35
print "Initialise a local repository."
38
41
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"
44
print " --quiet do not report changes to the home directory"
45
print " -r, --repo=REPO select the repo to check-out or create (defaults to 'home')"
46
print " -v, --verbose display information about what is being done"
47
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:
51
def parse_command_line( self ):
52
opts, args = getopt.gnu_getopt(
53
sys.argv[ 1: ], "r:v",
54
[ "quiet", "repo=", "verbose", "help" ] )
55
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(
61
'invalid repository name: ' + optarg )
57
elif aopt == "--repo":
66
# discard first argument (the command)
70
self.url = args[ 0 ].strip() if len( args ) else None
72
# check remaining arguments
74
raise the.program.UsageError( 'too many arguments' )
79
# set up repo and check it *doesn't* already exists
80
the.repo.check_dir_exists( False )
82
# ensure our top-level directory exists
83
if not os.path.exists( the.full_dir ):
84
os.mkdir( the.full_dir )
86
# checkout a remote repo, or create an empty local one?
89
# 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' % \
92
( self.url, the.dir, the.repo.name )
94
# initialise deployment (with an empty repo)
95
deployment = Deployment()
98
# 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:
104
# attempt to clean-up repo dir
106
shutil.rmtree( the.repo.full_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 )
126
deployment.copy_out( self.quiet )
131
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
134
except Exception as e:
136
# attempt to clean-up repo dir, and die
138
shutil.rmtree( the.repo.full_dir )