chiark / gitweb /
95c962fd2b003cb53cde95bac4cc8cdf9c260bf6
[stgit] / stgit / commands / fold.py
1 __copyright__ = """
2 Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License version 2 as
6 published by the Free Software Foundation.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 """
17
18 import sys, os
19 from optparse import OptionParser, make_option
20
21 from stgit.commands.common import *
22 from stgit.utils import *
23 from stgit import stack, git
24
25
26 help = 'integrate a GNU diff patch into the current patch'
27 usage = """%prog [options] [<file>]
28
29 Apply the given GNU diff file (or the standard input) onto the top of
30 the current patch. With the '--threeway' option, the patch is applied
31 onto the bottom of the current patch and a three-way merged is
32 performed with the current top."""
33
34 options = [make_option('-t', '--threeway',
35                        help = 'perform a three-way merge with the current patch',
36                        action = 'store_true'),
37            make_option('-n', '--norefresh',
38                        help = 'do not refresh the current patch',
39                        action = 'store_true')]
40
41
42 def func(parser, options, args):
43     """Integrate a GNU diff patch into the current patch
44     """
45     if len(args) > 1:
46         parser.error('incorrect number of arguments')
47
48     check_local_changes()
49     check_conflicts()
50     check_head_top_equal()
51
52     if len(args) == 1:
53         filename = args[0]
54     else:
55         filename = None
56
57     current = crt_series.get_current()
58     if not current:
59         raise CmdException, 'No patches applied'
60
61     if filename:
62         print 'Folding patch "%s"...' % filename,
63     else:
64         print 'Folding patch from stdin...',
65     sys.stdout.flush()
66
67     if options.threeway:
68         crt_patch = crt_series.get_patch(current)
69         bottom = crt_patch.get_bottom()
70         top = crt_patch.get_top()
71
72         git.switch(bottom)
73         git.apply_patch(filename)
74         fold_head = crt_series.refresh_patch(commit_only = True)
75         git.switch(top)
76
77         git.merge(bottom, top, fold_head)
78     else:
79         git.apply_patch(filename)
80
81     # no merge conflicts at this point, exception would have been raised
82     modified = git.local_changes()
83
84     if not options.norefresh and modified:
85         crt_series.refresh_patch()
86
87     if modified:
88         print 'done'
89     else:
90         print 'done (unchanged)'