/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-04-06 14:36:49 UTC
  • Revision ID: tim@ed.am-20140406143649-h9ftqylzzoke9tek
updated Makefile.am

Show diffs side-by-side

added added

removed removed

1
 
# command_init.py
 
1
# init.py
2
2
#
3
3
# Copyright (C) 2013 Tim Marston <tim@edm.am>
4
4
#
19
19
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
20
 
21
21
 
22
 
import sys, os
23
 
import getopt
24
 
 
25
 
 
26
 
class CommandInit:
 
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 ):
 
30
 
27
31
 
28
32
        def print_help( self ):
29
 
                print "Usage: " + self.program + " init [URL] [--repo=REPO]"
 
33
                print "Usage: " + the.program.name + " init [URL] [--repo=REPO]"
30
34
                print
31
35
                #      01234567890123456789012345678901234567890123456789012345678901234567890123456789
32
36
                print "Initialise a local repository."
38
42
                print "hostname, it is internally expanded to scp://HOSTNAME/~/.stdhome/REPO)."
39
43
                print
40
44
                print "Options:"
41
 
                print "     --repo     select the repo to check-out or create (defaults to 'home')"
42
 
                print "     --help     display help and exit"
 
45
                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
                print "      --help       display help and exit"
43
48
                exit( 0 )
44
49
 
45
50
 
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":
 
51
        def parse_command_line( self ):
 
52
                opts, args = getopt.gnu_getopt(
 
53
                        sys.argv[ 1: ], "r:v",
 
54
                        [ "repo=", "verbose", "help" ] )
 
55
                for opt, optarg in opts:
 
56
                        if opt in [ '--repo', '-r' ]:
 
57
                                if not re.match( '^[-a-zA-z0-9.]+$', optarg ):
 
58
                                        raise the.program.FatalError(
 
59
                                                'invalid repository name: ' + optarg )
 
60
                                the.repo = optarg
 
61
                        elif opt in [ '--verbose', '-v' ]:
 
62
                                the.verbose += 1
 
63
                        elif opt == "--help":
56
64
                                self.print_help()
57
 
                        elif aopt == "--repo":
58
 
                                self.repo = optarg
59
 
 
60
 
                print "init"
 
65
                
 
66
                # discard first argument (the command)
 
67
                args.pop( 0 )
 
68
 
 
69
                # URL argument
 
70
                self.url = args[ 0 ].strip() if len( args ) else None
 
71
 
 
72
                # remaining arguments
 
73
                if len( args ) > 1:
 
74
                        raise the.program.UsageError( 'too many arguments' )
 
75
 
 
76
 
 
77
        def run( self ):
 
78
 
 
79
                # set up repo and check it *doesn't* already exists
 
80
                the.repo.check_dir_exists( False )
 
81
 
 
82
                # ensure our top-level directory exists
 
83
                if not os.path.exists( the.full_dir ):
 
84
                        os.mkdir( the.full_dir )
 
85
 
 
86
                # checkout a remote repo, or create an empty local one?
 
87
                if self.url:
 
88
 
 
89
                        # expand url if it's a simple hostname
 
90
                        if re.match( '^[0-9a-zA-z.]+$', self.url ):
 
91
                                self.url = 'sftp://%s/%s/%s' % \
 
92
                                                   ( self.url, the.dir, the.repo.name )
 
93
 
 
94
                        # initialise deployment (with an empty repo)
 
95
                        deployment = Deployment()
 
96
                        deployment.copy_in()
 
97
 
 
98
                        # perform bzr checkout
 
99
                        if the.verbose: print "checking out %s" % the.repo.dir
 
100
                        try:
 
101
                                the.repo.vcs.checkout( self.url )
 
102
                        except Exception as e:
 
103
 
 
104
                                # attempt to clean-up repo dir
 
105
                                try:
 
106
                                        shutil.rmtree( the.repo.full_dir )
 
107
                                except OSError:
 
108
                                        pass
 
109
 
 
110
                                raise e
 
111
 
 
112
                        # perform deployment
 
113
                        try:
 
114
                                deployment.copy_out()
 
115
                        except deployment.Conflict as e:
 
116
                                raise the.program.FatalError( e.msg )
 
117
 
 
118
                else:
 
119
 
 
120
                        # perform bzr init
 
121
                        if the.verbose: print 'initialising %s' % the.repo.dir
 
122
                        try:
 
123
                                the.repo.vcs.init()
 
124
                        except Exception as e:
 
125
 
 
126
                                # attempt to clean-up repo dir, and die
 
127
                                try:
 
128
                                        shutil.rmtree( the.repo.full_dir )
 
129
                                except OSError:
 
130
                                        pass
 
131
 
 
132
                                raise e