5 Copyright (C) 2005, Chuck Lever <cel@netapp.com>
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 from optparse import OptionParser, make_option
24 from stgit.commands.common import *
25 from stgit.utils import *
26 from stgit import stack, git
29 help = 'manage development branches'
30 usage = """%prog [options] branch-name [commit-id]
32 Create, list, switch between, rename, or delete development branches
33 within a git repository. By default, a single branch called 'master'
34 is always created in a new repository. This subcommand allows you to
35 manage several patch series in the same repository.
37 When displaying the branches, the names can be prefixed with
38 's' (StGIT managed) or 'p' (protected)."""
40 options = [make_option('-c', '--create',
41 help = 'create a new development branch',
42 action = 'store_true'),
43 make_option('--delete',
44 help = 'delete an existing development branch',
45 action = 'store_true'),
46 make_option('--force',
47 help = 'force a delete when the series is not empty',
48 action = 'store_true'),
49 make_option('-l', '--list',
50 help = 'list branches contained in this repository',
51 action = 'store_true'),
52 make_option('-p', '--protect',
53 help = 'prevent "stg pull" from modifying this branch',
54 action = 'store_true'),
55 make_option('-r', '--rename',
56 help = 'rename an existing development branch',
57 action = 'store_true'),
58 make_option('-u', '--unprotect',
59 help = 'allow "stg pull" to modify this branch',
60 action = 'store_true')]
63 def __is_current_branch(branch_name):
64 return crt_series.get_branch() == branch_name
66 def __print_branch(branch_name):
71 branch = stack.Series(branch_name)
73 if branch.is_initialised():
75 if __is_current_branch(branch_name):
77 if branch.get_protected():
79 print '%s %s%s\t%s\t%s' % (current, initialized, protected, branch_name, \
80 branch.get_description())
82 def __delete_branch(doomed_name, force = False):
83 doomed = stack.Series(doomed_name)
85 if doomed.get_protected():
86 raise CmdException, 'This branch is protected. Delete is not permitted'
88 print 'Deleting branch "%s"...' % doomed_name,
91 if __is_current_branch(doomed_name):
94 check_head_top_equal()
96 if doomed_name != 'master':
97 git.switch_branch('master')
101 if doomed_name != 'master':
102 git.delete_branch(doomed_name)
106 def func(parser, options, args):
110 if len(args) == 0 or len(args) > 2:
111 parser.error('incorrect number of arguments')
113 check_local_changes()
115 check_head_top_equal()
121 git.create_branch(args[0], tree_id)
122 stack.Series(args[0]).init()
124 print 'Branch "%s" created.' % args[0]
130 parser.error('incorrect number of arguments')
131 __delete_branch(args[0], options.force)
137 parser.error('incorrect number of arguments')
139 branches = os.listdir(os.path.join(git.base_dir, 'refs', 'heads'))
142 print 'Available branches:'
147 elif options.protect:
150 branch_name = git.get_head_file()
152 branch_name = args[0]
154 parser.error('incorrect number of arguments')
155 branch = stack.Series(branch_name)
157 if not branch.is_initialised():
158 raise CmdException, 'Branch "%s" is not controlled by StGIT' \
161 print 'Protecting branch "%s"...' % branch_name,
171 parser.error('incorrect number of arguments')
173 if __is_current_branch(args[0]):
174 raise CmdException, 'Renaming the current branch is not supported'
176 stack.Series(args[0]).rename(args[1])
178 print 'Renamed branch "%s" as "%s".' % (args[0], args[1])
182 elif options.unprotect:
185 branch_name = git.get_head_file()
187 branch_name = args[0]
189 parser.error('incorrect number of arguments')
190 branch = stack.Series(branch_name)
192 if not branch.is_initialised():
193 raise CmdException, 'Branch "%s" is not controlled by StGIT' \
196 print 'Unprotecting branch "%s"...' % branch_name,
205 if __is_current_branch(args[0]):
206 raise CmdException, 'Branch "%s" is already the current branch' \
209 check_local_changes()
211 check_head_top_equal()
213 print 'Switching to branch "%s"...' % args[0],
216 git.switch_branch(args[0])
221 # default action: print the current branch
223 parser.error('incorrect number of arguments')
225 print git.get_head_file()