Commit | Line | Data |
---|---|---|
fcee87cf CM |
1 | |
2 | __copyright__ = """ | |
3 | Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com> | |
4 | ||
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. | |
8 | ||
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. | |
13 | ||
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 | |
17 | """ | |
18 | ||
19 | import sys, os | |
20 | from optparse import OptionParser, make_option | |
21 | ||
22 | from stgit.commands.common import * | |
23 | from stgit.utils import * | |
170f576b | 24 | from stgit import stack, git, basedir |
1e075406 | 25 | from stgit.config import config, file_extensions |
fcee87cf CM |
26 | |
27 | ||
28 | help = 'mark a file conflict as solved' | |
26aab5b0 CM |
29 | usage = """%prog [options] [<files...>] |
30 | ||
31 | Mark a merge conflict as resolved. The conflicts can be seen with the | |
32 | 'status' command, the corresponding files being prefixed with a | |
d7fade4b CM |
33 | 'C'. This command also removes any <file>.{ancestor,current,patched} |
34 | files.""" | |
fcee87cf CM |
35 | |
36 | options = [make_option('-a', '--all', | |
37 | help = 'mark all conflicts as solved', | |
7c47d096 | 38 | action = 'store_true'), |
d7fade4b | 39 | make_option('-r', '--reset', metavar = '(ancestor|current|patched)', |
1e075406 CM |
40 | help = 'reset the file(s) to the given state'), |
41 | make_option('-i', '--interactive', | |
42 | help = 'run the interactive merging tool', | |
43 | action = 'store_true')] | |
fcee87cf | 44 | |
1e075406 CM |
45 | def interactive_merge(filename): |
46 | """Run the interactive merger on the given file | |
47 | """ | |
48 | try: | |
49 | imerger = config.get('stgit', 'imerger') | |
50 | except Exception, err: | |
51 | raise CmdException, 'Configuration error: %s' % err | |
52 | ||
53 | extensions = file_extensions() | |
54 | ||
55 | ancestor = filename + extensions['ancestor'] | |
56 | current = filename + extensions['current'] | |
57 | patched = filename + extensions['patched'] | |
58 | ||
59 | # check whether we have all the files for a three-way merge | |
60 | for fn in [filename, ancestor, current, patched]: | |
61 | if not os.path.isfile(fn): | |
62 | raise CmdException, \ | |
63 | 'Cannot run the interactive merger: "%s" missing' % fn | |
64 | ||
65 | mtime = os.path.getmtime(filename) | |
66 | ||
67 | err = os.system(imerger % {'branch1': current, | |
68 | 'ancestor': ancestor, | |
69 | 'branch2': patched, | |
70 | 'output': filename}) | |
71 | ||
72 | if err != 0: | |
73 | raise CmdException, 'The interactive merger failed: %d' % err | |
74 | if not os.path.isfile(filename): | |
75 | raise CmdException, 'The "%s" file is missing' % filename | |
76 | if mtime == os.path.getmtime(filename): | |
77 | raise CmdException, 'The "%s" file was not modified' % filename | |
fcee87cf CM |
78 | |
79 | def func(parser, options, args): | |
80 | """Mark the conflict as resolved | |
81 | """ | |
d7fade4b CM |
82 | if options.reset \ |
83 | and options.reset not in file_extensions(): | |
7c47d096 CM |
84 | raise CmdException, 'Unknown reset state: %s' % options.reset |
85 | ||
1e075406 | 86 | if options.all and not options.interactive: |
7c47d096 | 87 | resolved_all(options.reset) |
fcee87cf CM |
88 | return |
89 | ||
1e075406 CM |
90 | conflicts = git.get_conflicts() |
91 | ||
92 | if len(args) != 0: | |
93 | files = args | |
94 | elif options.all: | |
95 | files = conflicts | |
96 | else: | |
fcee87cf CM |
97 | parser.error('incorrect number of arguments') |
98 | ||
fcee87cf CM |
99 | if not conflicts: |
100 | raise CmdException, 'No more conflicts' | |
1e075406 | 101 | |
fcee87cf | 102 | # check for arguments validity |
1e075406 CM |
103 | if not options.all: |
104 | for filename in files: | |
105 | if not filename in conflicts: | |
106 | raise CmdException, 'No conflicts for "%s"' % filename | |
fcee87cf | 107 | |
1e075406 CM |
108 | # resolved |
109 | try: | |
110 | for filename in files: | |
111 | if options.interactive: | |
112 | interactive_merge(filename) | |
113 | resolved(filename, options.reset) | |
114 | del conflicts[conflicts.index(filename)] | |
115 | finally: | |
116 | # save or remove the conflicts file. Needs a finally clause to | |
117 | # ensure that already solved conflicts are marked | |
118 | if conflicts == []: | |
119 | os.remove(os.path.join(basedir.get(), 'conflicts')) | |
120 | else: | |
121 | f = file(os.path.join(basedir.get(), 'conflicts'), 'w+') | |
122 | f.writelines([line + '\n' for line in conflicts]) | |
123 | f.close() |