Print conflict details with the new infrastructure (bug #11181)
[stgit] / stgit / commands / pick.py
index 1f7c84b..ee08c01 100644 (file)
@@ -16,18 +16,17 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 """
 
 import sys, os
 """
 
 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.out import *
 from stgit.commands.common import *
 from stgit.utils import *
 from stgit.out import *
-from stgit import stack, git
+from stgit import argparse, stack, git
 from stgit.stack import Series
 
 from stgit.stack import Series
 
-
-help = 'import a patch from a different branch or a commit object'
-usage = """%prog [options] ([<patch1>] [<patch2>] [<patch3>..<patch4>])|<commit>
-
+help = 'Import a patch from a different branch or a commit object'
+kind = 'patch'
+usage = ['[options] ([<patch1>] [<patch2>] [<patch3>..<patch4>])|<commit>']
+description = """
 Import one or more patches from a different branch or a commit object
 into the current series. By default, the name of the imported patch is
 used as the name of the current patch. It can be overridden with the
 Import one or more patches from a different branch or a commit object
 into the current series. By default, the name of the imported patch is
 used as the name of the current patch. It can be overridden with the
@@ -35,28 +34,28 @@ used as the name of the current patch. It can be overridden with the
 option. The log and author information are those of the commit
 object."""
 
 option. The log and author information are those of the commit
 object."""
 
-directory = DirectoryGotoToplevel()
-options = [make_option('-n', '--name',
-                       help = 'use NAME as the patch name'),
-           make_option('-B', '--ref-branch',
-                       help = 'pick patches from BRANCH'),
-           make_option('-r', '--reverse',
-                       help = 'reverse the commit object before importing',
-                       action = 'store_true'),
-           make_option('-p', '--parent', metavar = 'COMMITID',
-                       help = 'use COMMITID as parent'),
-           make_option('-x', '--expose',
-                       help = 'append the imported commit id to the patch log',
-                       action = 'store_true'),
-           make_option('--fold',
-                       help = 'fold the commit object into the current patch',
-                       action = 'store_true'),
-           make_option('--update',
-                       help = 'like fold but only update the current patch files',
-                       action = 'store_true'),
-           make_option('--unapplied',
-                       help = 'keep the patch unapplied',
-                       action = 'store_true')]
+args = [argparse.patch_range(argparse.applied_patches,
+                             argparse.unapplied_patches,
+                             argparse.hidden_patches)]
+options = [
+    opt('-n', '--name',
+        short = 'Use NAME as the patch name'),
+    opt('-B', '--ref-branch', args = [argparse.stg_branches],
+        short = 'Pick patches from BRANCH'),
+    opt('-r', '--reverse', action = 'store_true',
+        short = 'Reverse the commit object before importing'),
+    opt('-p', '--parent', metavar = 'COMMITID', args = [argparse.commit],
+        short = 'Use COMMITID as parent'),
+    opt('-x', '--expose', action = 'store_true',
+        short = 'Append the imported commit id to the patch log'),
+    opt('--fold', action = 'store_true',
+        short = 'Fold the commit object into the current patch'),
+    opt('--update', action = 'store_true',
+        short = 'Like fold but only update the current patch files'),
+    opt('--unapplied', action = 'store_true',
+        short = 'Keep the patch unapplied')]
+
+directory = DirectoryGotoToplevel(log = True)
 
 def __pick_commit(commit_id, patchname, options):
     """Pick a commit id.
 
 def __pick_commit(commit_id, patchname, options):
     """Pick a commit id.
@@ -65,6 +64,8 @@ def __pick_commit(commit_id, patchname, options):
 
     if options.name:
         patchname = options.name
 
     if options.name:
         patchname = options.name
+    if patchname:
+        patchname = find_patch_name(patchname, crt_series.patch_exists)
 
     if options.parent:
         parent = git_id(crt_series, options.parent)
 
     if options.parent:
         parent = git_id(crt_series, options.parent)
@@ -81,14 +82,14 @@ def __pick_commit(commit_id, patchname, options):
     if options.fold:
         out.start('Folding commit %s' % commit_id)
 
     if options.fold:
         out.start('Folding commit %s' % commit_id)
 
-        # try a direct git-apply first
+        # try a direct git apply first
         if not git.apply_diff(bottom, top):
             git.merge_recursive(bottom, git.get_head(), top)
 
         out.done()
     elif options.update:
         if not git.apply_diff(bottom, top):
             git.merge_recursive(bottom, git.get_head(), top)
 
         out.done()
     elif options.update:
-        rev1 = git_id(crt_series, '//bottom')
-        rev2 = git_id(crt_series, '//top')
+        rev1 = git_id(crt_series, 'HEAD^')
+        rev2 = git_id(crt_series, 'HEAD')
         files = git.barefiles(rev1, rev2).split('\n')
 
         out.start('Updating with commit %s' % commit_id)
         files = git.barefiles(rev1, rev2).split('\n')
 
         out.start('Updating with commit %s' % commit_id)
@@ -115,10 +116,8 @@ def __pick_commit(commit_id, patchname, options):
         patchname = newpatch.get_name()
 
         # find a patchlog to fork from
         patchname = newpatch.get_name()
 
         # find a patchlog to fork from
-        (refpatchname, refbranchname, refpatchid) = parse_rev(patchname)
-        if refpatchname and not refpatchid and \
-               (not refpatchid or refpatchid == 'top'):
-            # FIXME: should also support picking //top.old
+        refbranchname, refpatchname = parse_rev(patchname)
+        if refpatchname:
             if refbranchname:
                 # assume the refseries is OK, since we already resolved
                 # commit_str to a git_id
             if refbranchname:
                 # assume the refseries is OK, since we already resolved
                 # commit_str to a git_id
@@ -180,11 +179,16 @@ def func(parser, options, args):
         if options.parent:
             raise CmdException, '--parent can only be specified with one patch'
 
         if options.parent:
             raise CmdException, '--parent can only be specified with one patch'
 
-    if (options.fold or options.update) and not crt_series.get_current():
+    if options.update and not crt_series.get_current():
         raise CmdException, 'No patches applied'
 
     if commit_id:
         raise CmdException, 'No patches applied'
 
     if commit_id:
-        __pick_commit(commit_id, None, options)
+        # Try to guess a patch name if the argument was <branch>:<patch>
+        try:
+            patchname = args[0].split(':')[1]
+        except IndexError:
+            patchname = None
+        __pick_commit(commit_id, patchname, options)
     else:
         if options.unapplied:
             patches.reverse()
     else:
         if options.unapplied:
             patches.reverse()