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 )