3 Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License version 2 as
7 published by the Free Software Foundation.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 from optparse import make_option
21 from stgit import utils
22 from stgit.commands import common
23 from stgit.lib import git as gitlib, transaction
25 help = 'create a new patch and make it the topmost one'
26 usage = """%prog [options] [name]
28 Create a new, empty patch and make it the topmost one. If the
29 '--message' option is not passed, an editor is invoked with the
30 .git/patchdescr.tmpl, ~/.stgit/templates/patchdescr.tmpl or
31 /usr/share/stgit/templates/patchdescr.tmpl file used a as template,
32 together with generated lines. The local changes in the working tree
33 are not included in the patch; an "stg refresh" command is needed for
36 If no name is given for the new patch, one is generated from the first
37 line of the commit message."""
39 directory = common.DirectoryHasRepositoryLib()
40 options = [make_option('-m', '--message',
41 help = 'use MESSAGE as the patch description'),
42 ] + (utils.make_author_committer_options()
43 + utils.make_sign_options())
45 def func(parser, options, args):
46 """Create a new patch."""
47 stack = directory.repository.current_stack
48 if stack.repository.default_index.conflicts():
49 raise common.CmdException(
50 'Cannot create a new patch -- resolve conflicts first')
52 # Choose a name for the new patch -- or None, which means make one
53 # up later when we've gotten hold of the commit message.
58 if stack.patches.exists(name):
59 raise common.CmdException('%s: patch already exists' % name)
61 parser.error('incorrect number of arguments')
63 head = directory.repository.refs.get(directory.repository.head)
64 cd = gitlib.Commitdata(
65 tree = head.data.tree, parents = [head], message = '',
66 author = gitlib.Person.author(), committer = gitlib.Person.committer())
68 # Set patch commit message from commandline.
69 if options.message != None:
70 cd = cd.set_message(options.message)
72 # Modify author and committer data.
73 cd = (cd.set_author(options.author(cd.author))
74 .set_committer(options.committer(cd.committer)))
76 # Add Signed-off-by: or similar.
77 if options.sign_str != None:
79 utils.add_sign_line(cd.message, options.sign_str,
80 cd.committer.name, cd.committer.email))
82 # Let user edit the commit message manually.
83 if not options.message:
84 cd = cd.set_message(utils.edit_string(cd.message, '.stgit-new.txt'))
86 name = utils.make_patch_name(cd.message,
87 lambda name: stack.patches.exists(name))
89 # Write the new patch.
90 iw = stack.repository.default_iw
91 trans = transaction.StackTransaction(stack, 'new')
92 trans.patches[name] = stack.repository.commit(cd)
93 trans.applied.append(name)