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
= (utils
.make_author_committer_options()
41 + utils
.make_message_options() + utils
.make_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 head
= directory
.repository
.refs
.get(directory
.repository
.head
)
62 cd
= gitlib
.CommitData(
63 tree
= head
.data
.tree
, parents
= [head
], message
= '',
64 author
= gitlib
.Person
.author(), committer
= gitlib
.Person
.committer())
66 # Set patch commit message from commandline.
67 if options
.message
!= None:
68 cd
= cd
.set_message(options
.message
)
70 # Modify author and committer data.
71 cd
= (cd
.set_author(options
.author(cd
.author
))
72 .set_committer(options
.committer(cd
.committer
)))
74 # Add Signed-off-by: or similar.
75 if options
.sign_str
!= None:
77 utils
.add_sign_line(cd
.message
, options
.sign_str
,
78 cd
.committer
.name
, cd
.committer
.email
))
80 if options
.save_template
:
81 options
.save_template(cd
.message
)
82 return utils
.STGIT_SUCCESS
84 # Let user edit the commit message manually.
85 if not options
.message
:
86 cd
= cd
.set_message(utils
.edit_string(cd
.message
, '.stgit-new.txt'))
88 name
= utils
.make_patch_name(cd
.message
,
89 lambda name
: stack
.patches
.exists(name
))
91 # Write the new patch.
92 iw
= stack
.repository
.default_iw
93 trans
= transaction
.StackTransaction(stack
, 'new')
94 trans
.patches
[name
] = stack
.repository
.commit(cd
)
95 trans
.applied
.append(name
)