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