/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

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