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 argparse, 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 = (argparse.author_committer_options()
41 + argparse.message_options() + argparse.sign_options())
43 def func(parser, options, args):
44 """Create a new patch."""
45 stack = directory.repository.current_stack
46 if stack.repository.default_index.conflicts():
47 raise common.CmdException(
48 'Cannot create a new patch -- resolve conflicts first')
50 # Choose a name for the new patch -- or None, which means make one
51 # up later when we've gotten hold of the commit message.
56 if stack.patches.exists(name):
57 raise common.CmdException('%s: patch already exists' % name)
59 parser.error('incorrect number of arguments')
61 cd = gitlib.CommitData(
62 tree = stack.head.data.tree, parents = [stack.head], message = '',
63 author = gitlib.Person.author(), committer = gitlib.Person.committer())
65 # Set patch commit message from commandline.
66 if options.message != None:
67 cd = cd.set_message(options.message)
69 # Modify author and committer data.
70 cd = (cd.set_author(options.author(cd.author))
71 .set_committer(options.committer(cd.committer)))
73 # Add Signed-off-by: or similar.
74 if options.sign_str != None:
76 utils.add_sign_line(cd.message, options.sign_str,
77 cd.committer.name, cd.committer.email))
79 if options.save_template:
80 options.save_template(cd.message)
81 return utils.STGIT_SUCCESS
83 # Let user edit the commit message manually.
84 if not options.message:
85 cd = cd.set_message(utils.edit_string(cd.message, '.stgit-new.txt'))
87 name = utils.make_patch_name(cd.message,
88 lambda name: stack.patches.exists(name))
90 # Write the new patch.
91 iw = stack.repository.default_iw
92 trans = transaction.StackTransaction(stack, 'new')
93 trans.patches[name] = stack.repository.commit(cd)
94 trans.applied.append(name)