Import git show output easily
[stgit] / stgit / commands / delete.py
CommitLineData
fcee87cf
CM
1
2__copyright__ = """
3Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
4
5This program is free software; you can redistribute it and/or modify
6it under the terms of the GNU General Public License version 2 as
7published by the Free Software Foundation.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17"""
18
575bbdae 19from stgit.argparse import opt
5901dd6b
KH
20from stgit.commands import common
21from stgit.lib import transaction
6c8a90e1 22from stgit import argparse
fcee87cf 23
575bbdae 24help = 'Delete patches'
33ff9cdd 25kind = 'patch'
575bbdae
KH
26usage = ['[options] <patch1> [<patch2>] [<patch3>..<patch4>]']
27description = """
dacc59cb 28Delete the patches passed as arguments."""
fcee87cf 29
6c8a90e1
KH
30args = [argparse.patch_range(argparse.applied_patches,
31 argparse.unapplied_patches)]
575bbdae 32options = [
501a66de
KH
33 opt('--spill', action = 'store_true',
34 short = 'Spill patch contents to worktree and index', long = """
35 Delete the patches, but do not touch the index and worktree.
36 This only works with applied patches at the top of the stack.
37 The effect is to "spill" the patch contents into the index and
38 worktree. This can be useful e.g. if you want to split a patch
39 into several smaller pieces."""),
6c8a90e1 40 opt('-b', '--branch', args = [argparse.stg_branches],
575bbdae
KH
41 short = 'Use BRANCH instead of the default branch')]
42
5901dd6b 43directory = common.DirectoryHasRepositoryLib()
fcee87cf
CM
44
45def func(parser, options, args):
5901dd6b 46 """Delete one or more patches."""
13b26f1a 47 stack = directory.repository.get_stack(options.branch)
5901dd6b 48 if options.branch:
5901dd6b
KH
49 iw = None # can't use index/workdir to manipulate another branch
50 else:
5901dd6b 51 iw = stack.repository.default_iw
87bcf96e 52 if args:
dc7f6b07
CM
53 patches = set(common.parse_patches(args, list(stack.patchorder.all),
54 len(stack.patchorder.applied)))
87bcf96e
KH
55 else:
56 parser.error('No patches specified')
501a66de
KH
57
58 if options.spill:
59 if set(stack.patchorder.applied[-len(patches):]) != patches:
60 parser.error('Can only spill topmost applied patches')
61 iw = None # don't touch index+worktree
62
781e549a
KH
63 def allow_conflicts(trans):
64 # Allow conflicts if the topmost patch stays the same.
65 if stack.patchorder.applied:
66 return (trans.applied
67 and trans.applied[-1] == stack.patchorder.applied[-1])
68 else:
69 return not trans.applied
70 trans = transaction.StackTransaction(stack, 'delete',
71 allow_conflicts = allow_conflicts)
5901dd6b
KH
72 try:
73 to_push = trans.delete_patches(lambda pn: pn in patches)
74 for pn in to_push:
75 trans.push_patch(pn, iw)
76 except transaction.TransactionHalted:
77 pass
78 return trans.run(iw)