/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: 2021-09-01 12:55:42 UTC
  • Revision ID: tim@ed.am-20210901125542-zbuzpswfo7mmm5br
fix broken use of self in @staticmethod

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
27
26
 
28
27
 
29
28
class InitCommand( Command ):
30
29
 
31
30
 
32
31
        def __init__( self ):
33
 
                self.repo = None
 
32
                self.quiet = False
 
33
                self.vcs = the.config.default_vcs
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 "  -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"
 
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")
52
54
                exit( 0 )
53
55
 
54
56
 
55
57
        def parse_command_line( self ):
56
58
                opts, args = getopt.gnu_getopt(
57
59
                        sys.argv[ 1: ], "r:v",
58
 
                        [ "repo=", "verbose", "help" ] )
 
60
                        [ "quiet", "repo=", "vcs=", "verbose", "help" ] )
59
61
                for opt, optarg in opts:
60
 
                        if opt in [ '--repo', '-r' ]:
61
 
                                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 ):
62
66
                                        raise the.program.FatalError(
63
67
                                                'invalid repository name: ' + optarg )
64
 
                                self.repo = optarg
 
68
                                the.repo = optarg
 
69
                        elif opt == "--vcs":
 
70
                                self.vcs = optarg
65
71
                        elif opt in [ '--verbose', '-v' ]:
66
72
                                the.verbose += 1
67
73
                        elif opt == "--help":
68
74
                                self.print_help()
69
 
                
 
75
 
70
76
                # discard first argument (the command)
71
77
                args.pop( 0 )
72
78
 
73
79
                # URL argument
74
80
                self.url = args[ 0 ].strip() if len( args ) else None
75
81
 
76
 
                # remaining arguments
 
82
                # check remaining arguments
77
83
                if len( args ) > 1:
78
84
                        raise the.program.UsageError( 'too many arguments' )
79
85
 
81
87
        def run( self ):
82
88
 
83
89
                # set up repo and check it *doesn't* already exists
84
 
                the.set_repo( self.repo )
85
90
                the.repo.check_dir_exists( False )
 
91
                the.repo.set_vcs( self.vcs )
86
92
 
87
93
                # ensure our top-level directory exists
88
94
                if not os.path.exists( the.full_dir ):
92
98
                if self.url:
93
99
 
94
100
                        # expand url if it's a simple hostname
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 )
 
101
                        if re.search( '^[0-9a-zA-z.]+$', self.url ):
 
102
                                self.url = the.repo.vcs.expand_repo_url( self.url )
98
103
 
99
104
                        # initialise deployment (with an empty repo)
100
105
                        deployment = Deployment()
101
106
                        deployment.copy_in()
102
107
 
103
108
                        # perform bzr checkout
104
 
                        if the.verbose: print "checking out %s" % the.repo.dir
 
109
                        if the.verbose >= 1: print("checking out %s" % the.repo.dir)
105
110
                        try:
106
111
                                the.repo.vcs.checkout( self.url )
107
 
                        except Exception as e:
 
112
                        except Exception:
108
113
 
109
114
                                # attempt to clean-up repo dir
110
 
                                try:
111
 
                                        shutil.rmtree( the.repo.full_dir )
112
 
                                except OSError:
113
 
                                        pass
114
 
 
115
 
                                raise e
 
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 )
116
135
 
117
136
                        # perform deployment
118
 
                        try:
119
 
                                deployment.copy_out()
120
 
                        except deployment.Conflict as e:
121
 
                                raise the.program.FatalError( e.msg )
 
137
                        deployment.copy_out( self.quiet )
122
138
 
123
139
                else:
124
140
 
125
141
                        # perform bzr init
126
 
                        if the.verbose: print 'initialising %s' % the.repo.dir
 
142
                        if the.verbose >= 1: print('initialising %s' % the.repo.dir)
127
143
                        try:
128
144
                                the.repo.vcs.init()
129
 
                        except Exception as e:
 
145
                        except Exception:
130
146
 
131
147
                                # attempt to clean-up repo dir, and die
132
 
                                try:
133
 
                                        shutil.rmtree( the.repo.full_dir )
134
 
                                except OSError:
135
 
                                        pass
 
148
                                if os.path.exists( the.repo.full_dir ):
 
149
                                        try:
 
150
                                                shutil.rmtree( the.repo.full_dir )
 
151
                                        except OSError:
 
152
                                                pass
136
153
 
137
 
                                raise e
 
154
                                raise