/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: 2013-12-08 19:28:11 UTC
  • Revision ID: tim@ed.am-20131208192811-r20qj7cgmn4duw11
initial commit; basic app startup and initial command-line processing

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, re, getopt, shutil, subprocess
23
 
import the, deployment
24
 
from subprocess import Popen
 
22
import sys, os
 
23
import getopt
25
24
 
26
25
 
27
26
class CommandInit:
28
27
 
29
 
 
30
 
        def __init__( self ):
31
 
                self.repo = None
32
 
 
33
 
 
34
28
        def print_help( self ):
35
 
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
 
29
                print "Usage: " + self.program + " init [URL] [--repo=REPO]"
36
30
                print
37
31
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
38
32
                print "Initialise a local repository."
44
38
                print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
45
39
                print
46
40
                print "Options:"
47
 
                print "  -r, --repo=REPO  select the repo to check-out or create (defaults to 'home')"
48
 
                print "      --help       display help and exit"
 
41
                print "     --repo     select the repo to check-out or create (defaults to 'home')"
 
42
                print "     --help     display help and exit"
49
43
                exit( 0 )
50
44
 
51
45
 
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 )
 
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":
 
56
                                self.print_help()
 
57
                        elif aopt == "--repo":
61
58
                                self.repo = optarg
62
 
                        elif [ '--verbose', '-v' ].count( opt ):
63
 
                                the.verbose = True
64
 
                        elif opt == "--help":
65
 
                                self.print_help()
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 )
 
59
 
 
60
                print "init"