/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: 2022-06-27 15:51:01 UTC
  • Revision ID: tim@ed.am-20220627155101-znatxg4q91gqs1sc
additional change for brz->bzr

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
 
31
36
        def print_help( self ):
32
 
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
33
 
                print
 
37
                print("Usage: " + the.program.name + " init [URL] [--repo=REPO]")
 
38
                print()
34
39
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
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"
 
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")
47
54
                exit( 0 )
48
55
 
49
56
 
50
57
        def parse_command_line( self ):
51
58
                opts, args = getopt.gnu_getopt(
52
59
                        sys.argv[ 1: ], "r:v",
53
 
                        [ "repo=", "verbose", "help" ] )
 
60
                        [ "quiet", "repo=", "vcs=", "verbose", "help" ] )
54
61
                for opt, optarg in opts:
55
 
                        if opt in [ '--repo', '-r' ]:
56
 
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
 
62
                        if opt == "--quiet":
 
63
                                self.quiet = True
 
64
                        elif opt in [ '--repo', '-r' ]:
 
65
                                if not re.search( '^[-a-zA-z0-9.]+$', optarg ):
57
66
                                        raise the.program.FatalError(
58
67
                                                'invalid repository name: ' + optarg )
59
68
                                the.repo = optarg
 
69
                        elif opt == "--vcs":
 
70
                                self.vcs = optarg
 
71
                        elif opt in [ '--verbose', '-v' ]:
 
72
                                the.verbose += 1
60
73
                        elif opt == "--help":
61
74
                                self.print_help()
62
75
 
75
88
 
76
89
                # set up repo and check it *doesn't* already exists
77
90
                the.repo.check_dir_exists( False )
 
91
                the.repo.set_vcs( self.vcs )
78
92
 
79
93
                # ensure our top-level directory exists
80
94
                if not os.path.exists( the.full_dir ):
84
98
                if self.url:
85
99
 
86
100
                        # expand url if it's a simple hostname
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 )
 
101
                        if re.search( '^[0-9a-zA-z.]+$', self.url ):
 
102
                                self.url = the.repo.vcs.expand_repo_url( self.url )
90
103
 
91
104
                        # initialise deployment (with an empty repo)
92
105
                        deployment = Deployment()
93
106
                        deployment.copy_in()
94
107
 
95
108
                        # perform bzr checkout
96
 
                        if the.verbose >= 1: print "checking out %s" % the.repo.dir
 
109
                        if the.verbose >= 1: print("checking out %s" % the.repo.dir)
97
110
                        try:
98
111
                                the.repo.vcs.checkout( self.url )
99
 
                        except Exception as e:
 
112
                        except Exception:
100
113
 
101
114
                                # attempt to clean-up repo dir
102
 
                                try:
103
 
                                        shutil.rmtree( the.repo.full_dir )
104
 
                                except OSError:
105
 
                                        pass
 
115
                                if os.path.exists( the.repo.full_dir ):
 
116
                                        try:
 
117
                                                shutil.rmtree( the.repo.full_dir )
 
118
                                        except OSError:
 
119
                                                pass
106
120
 
107
 
                                raise e
 
121
                                raise
108
122
 
109
123
                        message = ''
110
124
 
120
134
                                        'there were conflicts...\n' + message )
121
135
 
122
136
                        # perform deployment
123
 
                        deployment.copy_out()
 
137
                        deployment.copy_out( self.quiet )
124
138
 
125
139
                else:
126
140
 
127
141
                        # perform bzr init
128
 
                        if the.verbose >= 1: print 'initialising %s' % the.repo.dir
 
142
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
129
143
                        try:
130
144
                                the.repo.vcs.init()
131
 
                        except Exception as e:
 
145
                        except Exception:
132
146
 
133
147
                                # attempt to clean-up repo dir, and die
134
 
                                try:
135
 
                                        shutil.rmtree( the.repo.full_dir )
136
 
                                except OSError:
137
 
                                        pass
 
148
                                if os.path.exists( the.repo.full_dir ):
 
149
                                        try:
 
150
                                                shutil.rmtree( the.repo.full_dir )
 
151
                                        except OSError:
 
152
                                                pass
138
153
 
139
 
                                raise e
 
154
                                raise