from stgit import stack, git
-help = 'remove the topmost or any unapplied patch'
-usage = '%prog <name>'
+help = 'delete patches'
+usage = """%prog [options] <patch1> [<patch2>] [<patch3>..<patch4>]
-options = []
+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 = []
- if args[0] == crt_series.get_current():
+ # 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 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]
- print_crt_patch()
+ # 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()