/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: 2016-02-13 14:21:53 UTC
  • Revision ID: tim@ed.am-20160213142153-68g7pzq0au6bejep
fixed init command

Show diffs side-by-side

added added

removed removed

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
26
 
28
28
class InitCommand( Command ):
29
29
 
30
30
 
31
 
        def __init__( self ):
32
 
                self.quiet = False
33
 
                self.vcs = the.config.default_vcs
34
 
 
35
 
 
36
31
        def print_help( self ):
37
 
                print("Usage: " + the.program.name + " init [URL] [--repo=REPO]")
38
 
                print()
 
32
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
 
33
                print
39
34
                #      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")
 
35
                print "Initialise a local repository."
 
36
                print
 
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)."
 
42
                print
 
43
                print "Options:"
 
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"
54
47
                exit( 0 )
55
48
 
56
49
 
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:
62
 
                        if opt == "--quiet":
63
 
                                self.quiet = True
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 )
68
59
                                the.repo = optarg
69
 
                        elif opt == "--vcs":
70
 
                                self.vcs = optarg
71
 
                        elif opt in [ '--verbose', '-v' ]:
72
 
                                the.verbose += 1
73
60
                        elif opt == "--help":
74
61
                                self.print_help()
75
62
 
88
75
 
89
76
                # set up repo and check it *doesn't* already exists
90
77
                the.repo.check_dir_exists( False )
91
 
                the.repo.set_vcs( self.vcs )
92
78
 
93
79
                # ensure our top-level directory exists
94
80
                if not os.path.exists( the.full_dir ):
98
84
                if self.url:
99
85
 
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 )
103
90
 
104
91
                        # initialise deployment (with an empty repo)
105
92
                        deployment = Deployment()
106
93
                        deployment.copy_in()
107
94
 
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
110
97
                        try:
111
98
                                the.repo.vcs.checkout( self.url )
112
 
                        except Exception:
 
99
                        except Exception as e:
113
100
 
114
101
                                # 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
 
102
                                try:
 
103
                                        shutil.rmtree( the.repo.full_dir )
 
104
                                except OSError:
 
105
                                        pass
120
106
 
121
 
                                raise
 
107
                                raise e
122
108
 
123
109
                        message = ''
124
110
 
134
120
                                        'there were conflicts...\n' + message )
135
121
 
136
122
                        # perform deployment
137
 
                        deployment.copy_out( self.quiet )
 
123
                        deployment.copy_out()
138
124
 
139
125
                else:
140
126
 
141
127
                        # perform bzr init
142
 
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
 
128
                        if the.verbose >= 1: print 'initialising %s' % the.repo.dir
143
129
                        try:
144
130
                                the.repo.vcs.init()
145
 
                        except Exception:
 
131
                        except Exception as e:
146
132
 
147
133
                                # 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
 
134
                                try:
 
135
                                        shutil.rmtree( the.repo.full_dir )
 
136
                                except OSError:
 
137
                                        pass
153
138
 
154
 
                                raise
 
139
                                raise e