/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-02-12 21:51:08 UTC
  • Revision ID: tim@ed.am-20140212215108-stk5z0nlvgpi4oa8
added bzr as a vcs backend; finished init command; implemented deployment

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