22
22
import sys, os, re, getopt, shutil, subprocess
 
24
 
from deployment import Deployment
 
25
 
from subprocess import Popen
 
 
23
from .command import Command
 
 
24
import stdhome.the as the
 
 
25
from stdhome.deployment import Deployment
 
 
28
class InitCommand( Command ):
 
31
31
        def __init__( self ):
 
 
33
                self.vcs = the.config.default_vcs
 
35
36
        def print_help( self ):
 
36
 
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
 
 
37
                print("Usage: " + the.program.name + " init [URL] [--repo=REPO]")
 
38
39
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
 
39
 
                print "Initialise a local repository."
 
41
 
                print "If an URL is given, the local reposity is a checkout of it (i.e., you can"
 
42
 
                print "receive updates from it and changes you commit will be sent to it).  The URL"
 
43
 
                print "can take the form of a simple hostname, such as \"example.com\", or it can be a"
 
44
 
                print "fully-qualified bazaar URL.  (Actually, in the first case, where it is a simple"
 
45
 
                print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
 
48
 
                print "  -r, --repo=REPO  select the repo to check-out or create (defaults to 'home')"
 
49
 
                print "  -v, --verbose    display information about what is being done"
 
50
 
                print "      --help       display help and exit"
 
 
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")
 
54
57
        def parse_command_line( self ):
 
55
58
                opts, args = getopt.gnu_getopt(
 
56
59
                        sys.argv[ 1: ], "r:v",
 
57
 
                        [ "repo=", "verbose", "help" ] )
 
 
60
                        [ "quiet", "repo=", "vcs=", "verbose", "help" ] )
 
58
61
                for opt, optarg in opts:
 
59
 
                        if opt in [ '--repo', '-r' ]:
 
60
 
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
 
 
64
                        elif opt in [ '--repo', '-r' ]:
 
 
65
                                if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
 
61
66
                                        raise the.program.FatalError(
 
62
67
                                                'invalid repository name: ' + optarg )
 
64
71
                        elif opt in [ '--verbose', '-v' ]:
 
66
73
                        elif opt == "--help":
 
69
76
                # discard first argument (the command)
 
73
80
                self.url = args[ 0 ].strip() if len( args ) else None
 
 
82
                # check remaining arguments
 
76
83
                if len( args ) > 1:
 
77
84
                        raise the.program.UsageError( 'too many arguments' )
 
 
93
100
                        # expand url if it's a simple hostname
 
94
 
                        if re.match( '^[0-9a-zA-z.]+$', self.url ):
 
95
 
                                self.url = 'sftp://%s/%s/%s' % \
 
96
 
                                                   ( self.url, the.dir, the.repo.name )
 
 
101
                        if re.search( '^[0-9a-zA-z.]+$', self.url ):
 
 
102
                                self.url = the.repo.vcs.expand_repo_url( self.url )
 
98
104
                        # initialise deployment (with an empty repo)
 
99
105
                        deployment = Deployment()
 
100
106
                        deployment.copy_in()
 
102
108
                        # perform bzr checkout
 
103
 
                        if the.verbose: print "checking out %s" % the.repo.dir
 
 
109
                        if the.verbose >= 1: print("checking out %s" % the.repo.dir)
 
105
111
                                the.repo.vcs.checkout( self.url )
 
106
 
                        except Exception as e:
 
108
114
                                # attempt to clean-up repo dir
 
110
 
                                        shutil.rmtree( the.repo.full_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 )
 
116
136
                        # perform deployment
 
118
 
                                deployment.copy_out()
 
119
 
                        except deployment.Conflict as e:
 
120
 
                                raise the.program.FatalError( e.msg )
 
 
137
                        deployment.copy_out( self.quiet )
 
124
141
                        # perform bzr init
 
125
 
                        if the.verbose: print 'initialising %s' % the.repo.dir
 
 
142
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
 
127
144
                                the.repo.vcs.init()
 
128
 
                        except Exception as e:
 
130
147
                                # attempt to clean-up repo dir, and die
 
132
 
                                        shutil.rmtree( the.repo.full_dir )
 
 
148
                                if os.path.exists( the.repo.full_dir ):
 
 
150
                                                shutil.rmtree( the.repo.full_dir )