/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

20
20
 
21
21
 
22
22
import sys, os, re, getopt, shutil, subprocess
23
 
import the
24
 
from deployment import Deployment
 
23
import the, deployment
25
24
from subprocess import Popen
26
25
 
27
26
 
46
45
                print
47
46
                print "Options:"
48
47
                print "  -r, --repo=REPO  select the repo to check-out or create (defaults to 'home')"
49
 
                print "  -v, --verbose    display information about what is being done"
50
48
                print "      --help       display help and exit"
51
49
                exit( 0 )
52
50
 
56
54
                        sys.argv[ 1: ], "r:v",
57
55
                        [ "repo=", "verbose", "help" ] )
58
56
                for opt, optarg in opts:
59
 
                        if opt in [ '--repo', '-r' ]:
 
57
                        if [ '--repo', '-r' ].count( opt ):
60
58
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
61
 
                                        raise the.program.FatalError(
 
59
                                        raise the.FatalError(
62
60
                                                'invalid repository name: ' + optarg )
63
61
                                self.repo = optarg
64
 
                        elif opt in [ '--verbose', '-v' ]:
 
62
                        elif [ '--verbose', '-v' ].count( opt ):
65
63
                                the.verbose = True
66
64
                        elif opt == "--help":
67
65
                                self.print_help()
78
76
 
79
77
 
80
78
        def run( self ):
81
 
 
82
 
                # set up repo and check it *doesn't* already exists
83
79
                the.set_repo( self.repo )
 
80
 
 
81
                # repo dir must not already exist
84
82
                the.repo.check_dir_exists( False )
85
83
 
86
84
                # ensure our top-level directory exists
87
 
                if not os.path.exists( the.full_dir ):
88
 
                        os.mkdir( the.full_dir )
 
85
                if not os.path.exists( the.expanded_dir ):
 
86
                        os.mkdir( the.expanded_dir )
89
87
 
90
 
                # checkout a remote repo, or create an empty local one?
91
88
                if self.url:
92
89
 
93
90
                        # expand url if it's a simple hostname
96
93
                                                   ( self.url, the.dir, the.repo.name )
97
94
 
98
95
                        # initialise deployment (with an empty repo)
99
 
                        deployment = Deployment()
 
96
                        deployment = Deployment( self.repo )
100
97
                        deployment.copy_in()
101
98
 
102
99
                        # perform bzr checkout
103
 
                        if the.verbose: print "checking out %s" % the.repo.dir
104
 
                        try:
105
 
                                the.repo.vcs.checkout( self.url )
106
 
                        except Exception as e:
 
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:
107
106
 
108
 
                                # attempt to clean-up repo dir
 
107
                                # attempt to clean-up repo dir, and die
109
108
                                try:
110
 
                                        shutil.rmtree( the.repo.full_dir )
111
 
                                except OSError:
 
109
                                        shutil.rmtree( the.repo.expanded_dir )
 
110
                                except OSError as e:
112
111
                                        pass
113
 
 
114
 
                                raise e
 
112
                                raise the.program.FatalError( 'checkout failed', out )
115
113
 
116
114
                        # perform deployment
117
 
                        try:
118
 
                                deployment.copy_out()
119
 
                        except deployment.Conflict as e:
120
 
                                raise the.program.FatalError( e.msg )
 
115
                        deployment.copy_out()
121
116
 
122
117
                else:
123
118
 
124
119
                        # perform bzr init
125
 
                        if the.verbose: print 'initialising %s' % the.repo.dir
126
 
                        try:
127
 
                                the.repo.vcs.init()
128
 
                        except Exception as e:
 
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:
129
126
 
130
127
                                # attempt to clean-up repo dir, and die
131
128
                                try:
132
 
                                        shutil.rmtree( the.repo.full_dir )
133
 
                                except OSError:
 
129
                                        shutil.rmtree( the.repo.expanded_dir )
 
130
                                except OSError as e:
134
131
                                        pass
135
 
 
136
 
                                raise e
 
132
                                raise the.program.FatalError( 'init failed', out )