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
20 from stgit
.argparse
import opt
21 from stgit
.commands
.common
import *
22 from stgit
.utils
import *
23 from stgit
.out
import *
24 from stgit
import stack
, git
25 from stgit
.config
import config
27 help = 'Generate a new commit for the current patch'
28 usage
= ['[options] [<files or dirs>]']
30 Include the latest tree changes in the current patch. This command
31 generates a new GIT commit object with the patch details, the previous
32 one no longer being visible. The '--force' option is useful
33 when a commit object was created with a different tool
34 but the changes need to be included in the current patch."""
37 opt('-f', '--force', action
= 'store_true',
38 short
= 'Force the refresh even if HEAD and top differ'),
39 opt('--update', action
= 'store_true',
40 short
= 'Only update the current patch files'),
41 opt('--index', action
= 'store_true',
42 short
= 'Refresh from index instead of worktree', long = """
43 Instead of setting the patch top to the current contents of
44 the worktree, set it to the current contents of the index."""),
45 opt('--undo', action
= 'store_true',
46 short
= 'Revert the commit generated by the last refresh'),
47 opt('-a', '--annotate', metavar
= 'NOTE',
48 short
= 'Annotate the patch log entry'),
50 short
= 'Refresh (applied) PATCH instead of the top patch')]
52 directory
= DirectoryHasRepository()
54 def func(parser
, options
, args
):
55 """Generate a new commit for the current or given patch.
57 args
= git
.ls_files(args
)
58 directory
.cd_to_topdir()
60 autoresolved
= config
.get('stgit.autoresolved')
61 if autoresolved
!= 'yes':
65 if args
or options
.update
:
67 'Only full refresh is available with the --patch option'
69 if not crt_series
.patch_applied(patch
):
70 raise CmdException
, 'Patches "%s" not applied' % patch
72 patch
= crt_series
.get_current()
74 raise CmdException
, 'No patches applied'
77 if args
or options
.update
:
79 'Only full refresh is available with the --index option'
82 '--patch is not compatible with the --index option'
85 check_head_top_equal(crt_series
)
88 out
.start('Undoing the refresh of "%s"' % patch
)
89 crt_series
.undo_refresh()
94 files
= [path
for (stat
, path
) in git
.tree_status(files
= args
, verbose
= True)]
96 if options
.index
or files
or not crt_series
.head_top_equal():
98 applied
= crt_series
.get_applied()
99 between
= applied
[:applied
.index(patch
):-1]
100 pop_patches(crt_series
, between
, keep
= True)
102 rev1
= git_id(crt_series
, 'HEAD^')
103 rev2
= git_id(crt_series
, 'HEAD')
104 patch_files
= git
.barefiles(rev1
, rev2
).split('\n')
105 files
= [f
for f
in files
if f
in patch_files
]
107 out
.info('No modified files for updating patch "%s"' % patch
)
110 out
.start('Refreshing patch "%s"' % patch
)
112 if autoresolved
== 'yes':
116 crt_series
.refresh_patch(cache_update
= False,
117 backup
= True, notes
= options
.annotate
)
119 crt_series
.refresh_patch(files
= files
,
120 backup
= True, notes
= options
.annotate
)
122 if crt_series
.empty_patch(patch
):
123 out
.done('empty patch')
129 push_patches(crt_series
, between
)
130 elif options
.annotate
:
131 # only annotate the top log entry as there is no need to
132 # refresh the patch and generate a full commit
133 crt_series
.log_patch(crt_series
.get_patch(patch
), None,
134 notes
= options
.annotate
)
136 out
.info('Patch "%s" is already up to date' % patch
)