Add patch editing command
[stgit] / stgit / commands / refresh.py
CommitLineData
fcee87cf
CM
1
2__copyright__ = """
3Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License version 2 as
7published by the Free Software Foundation.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17"""
18
19import sys, os
20from optparse import OptionParser, make_option
21
22from stgit.commands.common import *
23from stgit.utils import *
5e888f30 24from stgit.out import *
fcee87cf
CM
25from stgit import stack, git
26from stgit.config import config
27
28
29help = 'generate a new commit for the current patch'
026c0689 30usage = """%prog [options] [<files...>]
26aab5b0
CM
31
32Include the latest tree changes in the current patch. This command
33generates a new GIT commit object with the patch details, the previous
34one no longer being visible. The patch attributes like author,
35committer and description can be changed with the command line
36options. The '--force' option is useful when a commit object was
37created with a different tool but the changes need to be included in
38the current patch."""
fcee87cf
CM
39
40options = [make_option('-f', '--force',
41 help = 'force the refresh even if HEAD and '\
42 'top differ',
43 action = 'store_true'),
6ee70d6b
CM
44 make_option('--update',
45 help = 'only update the current patch files',
46 action = 'store_true'),
f80bef49
CM
47 make_option('--undo',
48 help = 'revert the commit generated by the last refresh',
49 action = 'store_true'),
eff17c6b
CM
50 make_option('-a', '--annotate', metavar = 'NOTE',
51 help = 'annotate the patch log entry'),
42fc7623 52 make_option('-p', '--patch',
130df01a 53 help = 'refresh (applied) PATCH instead of the top one')
ed60fdae 54 ]
fcee87cf
CM
55
56def func(parser, options, args):
c73e63b7 57 autoresolved = config.get('stgit.autoresolved')
fcee87cf
CM
58
59 if autoresolved != 'yes':
60 check_conflicts()
61
42fc7623 62 if options.patch:
6ee70d6b 63 if args or options.update:
42fc7623
YD
64 raise CmdException, \
65 'Only full refresh is available with the --patch option'
66 patch = options.patch
67 if not crt_series.patch_applied(patch):
68 raise CmdException, 'Patches "%s" not applied' % patch
69 else:
70 patch = crt_series.get_current()
71 if not patch:
72 raise CmdException, 'No patches applied'
fcee87cf
CM
73
74 if not options.force:
75 check_head_top_equal()
76
f80bef49 77 if options.undo:
27ac2b7e 78 out.start('Undoing the refresh of "%s"' % patch)
f80bef49 79 crt_series.undo_refresh()
27ac2b7e 80 out.done()
f80bef49
CM
81 return
82
14c88aa0 83 files = [path for (stat,path) in git.tree_status(verbose = True)]
6ee70d6b
CM
84 if args:
85 files = [f for f in files if f in args]
86
ed60fdae 87 if files or not crt_series.head_top_equal():
42fc7623
YD
88 if options.patch:
89 applied = crt_series.get_applied()
90 between = applied[:applied.index(patch):-1]
91 pop_patches(between, keep = True)
6ee70d6b
CM
92 elif options.update:
93 rev1 = git_id('//bottom')
94 rev2 = git_id('//top')
95 patch_files = git.barefiles(rev1, rev2).split('\n')
96 files = [f for f in files if f in patch_files]
97 if not files:
98 out.info('No modified files for updating patch "%s"' % patch)
99 return
42fc7623 100
27ac2b7e 101 out.start('Refreshing patch "%s"' % patch)
fcee87cf
CM
102
103 if autoresolved == 'yes':
104 resolved_all()
6ee70d6b 105 crt_series.refresh_patch(files = files,
ed60fdae 106 backup = True, notes = options.annotate)
fcee87cf 107
dc4e5946 108 if crt_series.empty_patch(patch):
27ac2b7e 109 out.done('empty patch')
dc4e5946 110 else:
27ac2b7e 111 out.done()
7c53fcf5 112
42fc7623
YD
113 if options.patch:
114 between.reverse()
115 push_patches(between)
ea7634bb
CM
116 elif options.annotate:
117 # only annotate the top log entry as there is no need to
118 # refresh the patch and generate a full commit
119 crt_series.log_patch(crt_series.get_patch(patch), None,
120 notes = options.annotate)
fcee87cf 121 else:
27ac2b7e 122 out.info('Patch "%s" is already up to date' % patch)