X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/stgit/blobdiff_plain/7354d6941b555dd15a0fe9c9e46d4394cf92f01f..2153b8f56dfa10936ca934a68a364dacdf161117:/stgit/commands/delete.py diff --git a/stgit/commands/delete.py b/stgit/commands/delete.py index c97d8ed..515f4b7 100644 --- a/stgit/commands/delete.py +++ b/stgit/commands/delete.py @@ -24,30 +24,57 @@ from stgit.utils import * from stgit import stack, git -help = 'remove the topmost or any unapplied patch' -usage = """%prog [options] +help = 'delete patches' +usage = """%prog [options] [] [..] -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()