chiark / gitweb /
stgit new: Do not open editor if --save-template was specified
[stgit] / stgit / commands / float.py
index 5af7e85374736848d968938ed24d537c0f640b63..e561c3995414240b623d5df6205dea86667b8bbd 100644 (file)
@@ -16,47 +16,46 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 """
 
-import sys, os
-from optparse import OptionParser, make_option
-
-from stgit.commands.common import *
-from stgit.utils import *
-from stgit import stack, git
-
-help = 'push patches to the top, even if applied'
-usage = """%prog [<patches> | -s [<series>] ]
-
+import sys
+from stgit.argparse import opt
+from stgit.commands import common
+from stgit.lib import transaction
+from stgit import argparse
+
+help = 'Push patches to the top, even if applied'
+kind = 'stack'
+usage = ['<patches>',
+         '-s <series>']
+description = """
 Push a patch or a range of patches to the top even if applied. The
 necessary pop and push operations will be performed to accomplish
 this. The '--series' option can be used to rearrange the (top) patches
 as specified by the given series file (or the standard input)."""
 
-directory = DirectoryGotoToplevel()
-options = [make_option('-s', '--series',
-                       help = 'rearrange according to a series file',
-                       action = 'store_true')]
+args = [argparse.patch_range(argparse.applied_patches,
+                             argparse.unapplied_patches)]
+options = [
+    opt('-s', '--series', metavar = 'FILE',
+        short = 'Rearrange according to the series FILE')
+    ] + argparse.keep_option()
+
+directory = common.DirectoryHasRepositoryLib()
 
 def func(parser, options, args):
-    """Pops and pushed to make the named patch the topmost patch
+    """Reorder patches to make the named patch the topmost one.
     """
-    args_nr = len(args)
-    if (options.series and args_nr > 1) \
-           or (not options.series and args_nr == 0):
+    if options.series and args:
+        parser.error('<patches> cannot be used with --series')
+    elif not options.series and not args:
         parser.error('incorrect number of arguments')
 
-    check_local_changes()
-    check_conflicts()
-    check_head_top_equal(crt_series)
-
-    unapplied = crt_series.get_unapplied()
-    applied = crt_series.get_applied()
-    all = unapplied + applied
+    stack = directory.repository.current_stack
 
     if options.series:
-        if args_nr:
-            f = file(args[0])
-        else:
+        if options.series == '-':
             f = sys.stdin
+        else:
+            f = file(args[0])
 
         patches = []
         for line in f:
@@ -64,35 +63,22 @@ def func(parser, options, args):
             if patch:
                 patches.append(patch)
     else:
-        patches = parse_patches(args, all)
-
-    # working with "topush" patches in reverse order might be a bit
-    # more efficient for large series but the main reason is for the
-    # "topop != topush" comparison to work
-    patches.reverse()
+        patches = common.parse_patches(args, stack.patchorder.all)
 
-    topush = []
-    topop = []
+    if not patches:
+        raise common.CmdException('No patches to float')
 
-    for p in patches:
-        while p in applied:
-            top = applied.pop()
-            if not top in patches:
-                topush.append(top)
-            topop.append(top)
-    topush = patches + topush
+    applied = [p for p in stack.patchorder.applied if p not in patches] + \
+            patches
+    unapplied = [p for p in stack.patchorder.unapplied if not p in patches]
 
-    # remove common patches to avoid unnecessary pop/push
-    while topush and topop:
-        if topush[-1] != topop[-1]:
-            break
-        topush.pop()
-        topop.pop()
+    iw = stack.repository.default_iw
+    clean_iw = (not options.keep and iw) or None
+    trans = transaction.StackTransaction(stack, 'sink',
+                                         check_clean_iw = clean_iw)
 
-    # check whether the operation is really needed
-    if topop != topush:
-        if topop:
-            pop_patches(crt_series, topop)
-        if topush:
-            topush.reverse()
-            push_patches(crt_series, topush)
+    try:
+        trans.reorder_patches(applied, unapplied, iw = iw)
+    except transaction.TransactionHalted:
+        pass
+    return trans.run(iw)