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
26
from stdhome.subprocess import Popen
29
class InitCommand( Command ):
28
32
def print_help( self ):
29
print "Usage: " + self.program + " init [URL] [--repo=REPO]"
33
print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
31
35
# 01234567890123456789012345678901234567890123456789012345678901234567890123456789
32
36
print "Initialise a local repository."
38
42
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"
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
[ "repo=", "verbose", "help" ] )
55
for opt, optarg in opts:
56
if opt in [ '--repo', '-r' ]:
57
if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
58
raise the.program.FatalError(
59
'invalid repository name: ' + optarg )
61
elif opt in [ '--verbose', '-v' ]:
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.match( '^[0-9a-zA-z.]+$', self.url ):
91
self.url = 'sftp://%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
deployment.copy_out()
115
except deployment.Conflict as e:
116
raise the.program.FatalError( e.msg )
121
if the.verbose >= 1: print 'initialising %s' % the.repo.dir
124
except Exception as e:
126
# attempt to clean-up repo dir, and die
128
shutil.rmtree( the.repo.full_dir )