Print conflict details with the new infrastructure (bug #11181)
[stgit] / stgit / commands / fold.py
index 95c962f..66a2dd9 100644 (file)
@@ -16,28 +16,31 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 """
 
 import sys, os
-from optparse import OptionParser, make_option
-
+from stgit.argparse import opt
 from stgit.commands.common import *
 from stgit.utils import *
-from stgit import stack, git
-
-
-help = 'integrate a GNU diff patch into the current patch'
-usage = """%prog [options] [<file>]
+from stgit.out import *
+from stgit import argparse, stack, git
 
+help = 'Integrate a GNU diff patch into the current patch'
+kind = 'patch'
+usage = ['[options] [<file>]']
+description = """
 Apply the given GNU diff file (or the standard input) onto the top of
 the current patch. With the '--threeway' option, the patch is applied
-onto the bottom of the current patch and a three-way merged is
-performed with the current top."""
+onto the bottom of the current patch and a three-way merge is
+performed with the current top. With the --base option, the patch is
+applied onto the specified base and a three-way merged is performed
+with the current top."""
 
-options = [make_option('-t', '--threeway',
-                       help = 'perform a three-way merge with the current patch',
-                       action = 'store_true'),
-           make_option('-n', '--norefresh',
-                       help = 'do not refresh the current patch',
-                       action = 'store_true')]
+args = [argparse.files]
+options = [
+    opt('-t', '--threeway', action = 'store_true',
+        short = 'Perform a three-way merge with the current patch'),
+    opt('-b', '--base', args = [argparse.commit],
+        short = 'Use BASE instead of HEAD applying the patch')]
 
+directory = DirectoryHasRepository(log = True)
 
 def func(parser, options, args):
     """Integrate a GNU diff patch into the current patch
@@ -47,7 +50,7 @@ def func(parser, options, args):
 
     check_local_changes()
     check_conflicts()
-    check_head_top_equal()
+    check_head_top_equal(crt_series)
 
     if len(args) == 1:
         filename = args[0]
@@ -59,32 +62,21 @@ def func(parser, options, args):
         raise CmdException, 'No patches applied'
 
     if filename:
-        print 'Folding patch "%s"...' % filename,
+        if os.path.exists(filename):
+            out.start('Folding patch "%s"' % filename)
+        else:
+            raise CmdException, 'No such file: %s' % filename
     else:
-        print 'Folding patch from stdin...',
-    sys.stdout.flush()
+        out.start('Folding patch from stdin')
 
     if options.threeway:
         crt_patch = crt_series.get_patch(current)
         bottom = crt_patch.get_bottom()
-        top = crt_patch.get_top()
-
-        git.switch(bottom)
-        git.apply_patch(filename)
-        fold_head = crt_series.refresh_patch(commit_only = True)
-        git.switch(top)
-
-        git.merge(bottom, top, fold_head)
+        git.apply_patch(filename = filename, base = bottom)
+    elif options.base:
+        git.apply_patch(filename = filename,
+                        base = git_id(crt_series, options.base))
     else:
-        git.apply_patch(filename)
-
-    # no merge conflicts at this point, exception would have been raised
-    modified = git.local_changes()
+        git.apply_patch(filename = filename)
 
-    if not options.norefresh and modified:
-        crt_series.refresh_patch()
-
-    if modified:
-        print 'done'
-    else:
-        print 'done (unchanged)'
+    out.done()