/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-01-05 11:51:35 UTC
  • Revision ID: tim@ed.am-20140105115135-6ses87ggwyjrxzfj
added global objects (the.repo, the.program), deployment object and implemented
init command

Show diffs side-by-side

added added

removed removed

19
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 
21
21
 
22
 
import sys, os
23
 
import getopt
 
22
import sys, os, re, getopt, shutil, subprocess
 
23
import the, deployment
 
24
from subprocess import Popen
24
25
 
25
26
 
26
27
class CommandInit:
27
28
 
 
29
 
 
30
        def __init__( self ):
 
31
                self.repo = None
 
32
 
 
33
 
28
34
        def print_help( self ):
29
 
                print "Usage: " + self.program + " init [URL] [--repo=REPO]"
 
35
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
30
36
                print
31
37
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
32
38
                print "Initialise a local repository."
38
44
                print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
39
45
                print
40
46
                print "Options:"
41
 
                print "     --repo     select the repo to check-out or create (defaults to 'home')"
42
 
                print "     --help     display help and exit"
 
47
                print "  -r, --repo=REPO  select the repo to check-out or create (defaults to 'home')"
 
48
                print "      --help       display help and exit"
43
49
                exit( 0 )
44
50
 
45
51
 
46
 
        def run( self, stdhome ):
47
 
                # parse command line
48
 
                try:
49
 
                        opts, args = getopt.gnu_getopt(
50
 
                                sys.argv[ 1: ], "",
51
 
                                [ "repo:", "help" ] )
52
 
                except getopt.GetoptError as e:
53
 
                        stdhome.print_usage( e )
54
 
                for opt, optargs in opts:
55
 
                        if opt == "--help":
 
52
        def parse_command_line( self ):
 
53
                opts, args = getopt.gnu_getopt(
 
54
                        sys.argv[ 1: ], "r:v",
 
55
                        [ "repo=", "verbose", "help" ] )
 
56
                for opt, optarg in opts:
 
57
                        if [ '--repo', '-r' ].count( opt ):
 
58
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
 
59
                                        raise the.FatalError(
 
60
                                                'invalid repository name: ' + optarg )
 
61
                                self.repo = optarg
 
62
                        elif [ '--verbose', '-v' ].count( opt ):
 
63
                                the.verbose = True
 
64
                        elif opt == "--help":
56
65
                                self.print_help()
57
 
                        elif aopt == "--repo":
58
 
                                self.repo = optarg
59
 
 
60
 
                print "init"
 
66
                
 
67
                # discard first argument (the command)
 
68
                args.pop( 0 )
 
69
 
 
70
                # URL argument
 
71
                self.url = args[ 0 ].strip() if len( args ) else None
 
72
 
 
73
                # remaining arguments
 
74
                if len( args ) > 1:
 
75
                        raise the.program.UsageError( 'too many arguments' )
 
76
 
 
77
 
 
78
        def run( self ):
 
79
                the.set_repo( self.repo )
 
80
 
 
81
                # repo dir must not already exist
 
82
                the.repo.check_dir_exists( False )
 
83
 
 
84
                # ensure our top-level directory exists
 
85
                if not os.path.exists( the.expanded_dir ):
 
86
                        os.mkdir( the.expanded_dir )
 
87
 
 
88
                if self.url:
 
89
 
 
90
                        # expand url if it's a simple hostname
 
91
                        if re.match( '^[0-9a-zA-z.]+$', self.url ):
 
92
                                self.url = 'sftp://%s/%s/%s' % \
 
93
                                                   ( self.url, the.dir, the.repo.name )
 
94
 
 
95
                        # initialise deployment (with an empty repo)
 
96
                        deployment = Deployment( self.repo )
 
97
                        deployment.copy_in()
 
98
 
 
99
                        # perform bzr checkout
 
100
                        print "checking out %s" % the.repo.dir
 
101
                        p = Popen( [ 'bzr', 'co', self.url, the.repo.name ],
 
102
                                           cwd = the.expanded_dir,
 
103
                                           stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
 
104
                        out = p.communicate()[ 0 ]
 
105
                        if p.returncode > 0:
 
106
 
 
107
                                # attempt to clean-up repo dir, and die
 
108
                                try:
 
109
                                        shutil.rmtree( the.repo.expanded_dir )
 
110
                                except OSError as e:
 
111
                                        pass
 
112
                                raise the.program.FatalError( 'checkout failed', out )
 
113
 
 
114
                        # perform deployment
 
115
                        deployment.copy_out()
 
116
 
 
117
                else:
 
118
 
 
119
                        # perform bzr init
 
120
                        print 'creating %s' % the.repo.dir
 
121
                        p = Popen( [ 'bzr', 'init', the.repo.name ],
 
122
                                           cwd = the.expanded_dir,
 
123
                                           stdout = subprocess.PIPE, stderr = subprocess.STDOUT )
 
124
                        out = p.communicate()[ 0 ]
 
125
                        if p.returncode > 0:
 
126
 
 
127
                                # attempt to clean-up repo dir, and die
 
128
                                try:
 
129
                                        shutil.rmtree( the.repo.expanded_dir )
 
130
                                except OSError as e:
 
131
                                        pass
 
132
                                raise the.program.FatalError( 'init failed', out )