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 )
 
125
 
                        # check for deployment conclicts
 
126
 
                        conflicts = deployment.get_conflicts()
 
128
 
                                message += 'deployment conflicts:\n  %s' % \
 
129
 
                                                   '\n  '.join( conflicts )
 
131
 
                        # stop if there are conflicts
 
133
 
                                raise the.program.FatalError(
 
134
 
                                        'there were conflicts...\n' + message )
 
 
103
                                        shutil.rmtree( the.repo.full_dir )
 
136
109
                        # perform deployment
 
137
 
                        deployment.copy_out( self.quiet )
 
 
111
                                deployment.copy_out()
 
 
112
                        except deployment.Conflict as e:
 
 
113
                                raise the.program.FatalError( e.msg )
 
141
117
                        # perform bzr init
 
142
 
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
 
 
118
                        if the.verbose >= 1: print 'initialising %s' % the.repo.dir
 
144
120
                                the.repo.vcs.init()
 
 
121
                        except Exception as e:
 
147
123
                                # attempt to clean-up repo dir, and die
 
148
 
                                if os.path.exists( the.repo.full_dir ):
 
150
 
                                                shutil.rmtree( the.repo.full_dir )
 
 
125
                                        shutil.rmtree( the.repo.full_dir )