chiark / gitweb /
Slightly change the multiple patches delete function
[stgit] / stgit / commands / delete.py
index c97d8ed00643e1d08ac8270fde240dbe6e65249d..515f4b7048e1978b2ee9cb2f3579a102b2b8cdb1 100644 (file)
@@ -24,30 +24,57 @@ from stgit.utils import *
 from stgit import stack, git
 
 
-help = 'remove the topmost or any unapplied patch'
-usage = """%prog [options] <patch>
+help = 'delete patches'
+usage = """%prog [options] <patch1> [<patch2>] [<patch3>..<patch4>]
 
-Delete the patch passed as argument. The patch to be deleted can only
-be part of the unapplied list or be the topmost one, in the latter
-case the command also popping it from the stack. Note that the
-'delete' operation is irreversible."""
+Delete the patches passed as arguments. If an applied patch is to be
+deleted, all other patches applied on top of it must be deleted too,
+and they must be explicitly specified, since this command will not try
+to delete a patch unless you explicitly ask it to. If any applied
+patches are deleted, they are popped from the stack.
+
+Note that the 'delete' operation is irreversible."""
 
 options = [make_option('-b', '--branch',
                        help = 'use BRANCH instead of the default one')]
 
 def func(parser, options, args):
-    """Deletes a patch
+    """Deletes one or more patches.
     """
-    if len(args) != 1:
-        parser.error('incorrect number of arguments')
+    applied_patches = crt_series.get_applied()
+    unapplied_patches = crt_series.get_unapplied()
+    all_patches = applied_patches + unapplied_patches
+
+    if args:
+        patches = parse_patches(args, all_patches)
+    else:
+        parser.error('No patches specified')
+
+    applied = []
+
+    # find the applied patches to be deleted. We can only delete
+    # consecutive patches in the applied range
+    for patch in applied_patches[::-1]:
+        if patch in patches:
+            applied.append(patch)
+            patches.remove(patch)
+        else:
+            break
+
+    # any applied patches to be deleted but not in consecutive order?
+    for patch in patches:
+        if patch in applied_patches:
+            raise CmdException, 'Cannot delete the applied patch "%s"' % patch
 
-    if args[0] == crt_series.get_current():
+    if applied and not options.branch:
         check_local_changes()
         check_conflicts()
         check_head_top_equal()
 
-    crt_series.delete_patch(args[0])
-    print 'Patch "%s" successfully deleted' % args[0]
+    # delete the patches
+    for patch in applied + patches:
+        crt_series.delete_patch(patch)
+        print 'Patch "%s" successfully deleted' % patch
 
     if not options.branch:
         print_crt_patch()