/stdhome

To get this branch, use:
bzr branch http://bzr.ed.am/stdhome

« back to all changes in this revision

Viewing changes to lib/stdhome/command/init.py

  • Committer: Tim Marston
  • Date: 2014-03-19 20:02:10 UTC
  • Revision ID: tim@ed.am-20140319200210-b6nm63rpktfmw0l3
changed working of output

Show diffs side-by-side

added added

removed removed

Lines of Context:
20
20
 
21
21
 
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
 
26
from stdhome.subprocess import Popen
26
27
 
27
28
 
28
29
class InitCommand( Command ):
29
30
 
30
31
 
31
32
        def __init__( self ):
32
 
                self.quiet = False
33
 
                self.vcs = the.config.default_vcs
 
33
                self.repo = None
34
34
 
35
35
 
36
36
        def print_help( self ):
37
 
                print("Usage: " + the.program.name + " init [URL] [--repo=REPO]")
38
 
                print()
 
37
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
 
38
                print
39
39
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
40
 
                print("Initialise a local repository.")
41
 
                print()
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).")
47
 
                print()
48
 
                print("Options:")
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")
 
40
                print "Initialise a local repository."
 
41
                print
 
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)."
 
47
                print
 
48
                print "Options:"
 
49
                print "  -r, --repo=REPO  select the repo to check-out or create (defaults to 'home')"
 
50
                print "  -v, --verbose    display information about what is being done"
 
51
                print "      --help       display help and exit"
54
52
                exit( 0 )
55
53
 
56
54
 
57
55
        def parse_command_line( self ):
58
56
                opts, args = getopt.gnu_getopt(
59
57
                        sys.argv[ 1: ], "r:v",
60
 
                        [ "quiet", "repo=", "vcs=", "verbose", "help" ] )
 
58
                        [ "repo=", "verbose", "help" ] )
61
59
                for opt, optarg in opts:
62
 
                        if opt == "--quiet":
63
 
                                self.quiet = True
64
 
                        elif opt in [ '--repo', '-r' ]:
65
 
                                if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
 
60
                        if opt in [ '--repo', '-r' ]:
 
61
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
66
62
                                        raise the.program.FatalError(
67
63
                                                'invalid repository name: ' + optarg )
68
 
                                the.repo = optarg
69
 
                        elif opt == "--vcs":
70
 
                                self.vcs = optarg
 
64
                                self.repo = optarg
71
65
                        elif opt in [ '--verbose', '-v' ]:
72
66
                                the.verbose += 1
73
67
                        elif opt == "--help":
74
68
                                self.print_help()
75
 
 
 
69
                
76
70
                # discard first argument (the command)
77
71
                args.pop( 0 )
78
72
 
79
73
                # URL argument
80
74
                self.url = args[ 0 ].strip() if len( args ) else None
81
75
 
82
 
                # check remaining arguments
 
76
                # remaining arguments
83
77
                if len( args ) > 1:
84
78
                        raise the.program.UsageError( 'too many arguments' )
85
79
 
87
81
        def run( self ):
88
82
 
89
83
                # set up repo and check it *doesn't* already exists
 
84
                the.set_repo( self.repo )
90
85
                the.repo.check_dir_exists( False )
91
 
                the.repo.set_vcs( self.vcs )
92
86
 
93
87
                # ensure our top-level directory exists
94
88
                if not os.path.exists( the.full_dir ):
98
92
                if self.url:
99
93
 
100
94
                        # 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 )
 
95
                        if re.match( '^[0-9a-zA-z.]+$', self.url ):
 
96
                                self.url = 'sftp://%s/%s/%s' % \
 
97
                                                   ( self.url, the.dir, the.repo.name )
103
98
 
104
99
                        # initialise deployment (with an empty repo)
105
100
                        deployment = Deployment()
106
101
                        deployment.copy_in()
107
102
 
108
103
                        # perform bzr checkout
109
 
                        if the.verbose >= 1: print("checking out %s" % the.repo.dir)
 
104
                        if the.verbose: print "checking out %s" % the.repo.dir
110
105
                        try:
111
106
                                the.repo.vcs.checkout( self.url )
112
 
                        except Exception:
 
107
                        except Exception as e:
113
108
 
114
109
                                # attempt to clean-up repo dir
115
 
                                if os.path.exists( the.repo.full_dir ):
116
 
                                        try:
117
 
                                                shutil.rmtree( the.repo.full_dir )
118
 
                                        except OSError:
119
 
                                                pass
120
 
 
121
 
                                raise
122
 
 
123
 
                        message = ''
124
 
 
125
 
                        # check for deployment conclicts
126
 
                        conflicts = deployment.get_conflicts()
127
 
                        if conflicts:
128
 
                                message += 'deployment conflicts:\n  %s' % \
129
 
                                                   '\n  '.join( conflicts )
130
 
 
131
 
                        # stop if there are conflicts
132
 
                        if message:
133
 
                                raise the.program.FatalError(
134
 
                                        'there were conflicts...\n' + message )
 
110
                                try:
 
111
                                        shutil.rmtree( the.repo.full_dir )
 
112
                                except OSError:
 
113
                                        pass
 
114
 
 
115
                                raise e
135
116
 
136
117
                        # perform deployment
137
 
                        deployment.copy_out( self.quiet )
 
118
                        try:
 
119
                                deployment.copy_out()
 
120
                        except deployment.Conflict as e:
 
121
                                raise the.program.FatalError( e.msg )
138
122
 
139
123
                else:
140
124
 
141
125
                        # perform bzr init
142
 
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
 
126
                        if the.verbose: print 'initialising %s' % the.repo.dir
143
127
                        try:
144
128
                                the.repo.vcs.init()
145
 
                        except Exception:
 
129
                        except Exception as e:
146
130
 
147
131
                                # attempt to clean-up repo dir, and die
148
 
                                if os.path.exists( the.repo.full_dir ):
149
 
                                        try:
150
 
                                                shutil.rmtree( the.repo.full_dir )
151
 
                                        except OSError:
152
 
                                                pass
 
132
                                try:
 
133
                                        shutil.rmtree( the.repo.full_dir )
 
134
                                except OSError:
 
135
                                        pass
153
136
 
154
 
                                raise
 
137
                                raise e