From d1368d811f20d4957d9fca7a8fe016e764f77d1b Mon Sep 17 00:00:00 2001 From: Catalin Marinas Date: Wed, 6 Dec 2006 22:12:14 +0000 Subject: [PATCH] Allow patch ranges for the 'pop' command This patch is to make 'pop' accept patch ranges. Only the patches specified in the range are now popped from the stack, the command performing the necessary pop/push operations. Signed-off-by: Catalin Marinas --- stgit/commands/common.py | 5 ++++- stgit/commands/pop.py | 51 ++++++++++++++++++++++++++---------------------- stgit/stack.py | 2 +- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/stgit/commands/common.py b/stgit/commands/common.py index 723fc5b..8a625f8 100644 --- a/stgit/commands/common.py +++ b/stgit/commands/common.py @@ -214,7 +214,7 @@ def pop_patches(patches, keep = False): print 'done' -def parse_patches(patch_args, patch_list, boundary = 0): +def parse_patches(patch_args, patch_list, boundary = 0, ordered = False): """Parse patch_args list for patch names in patch_list and return a list. The names can be individual patches and/or in the patch1..patch2 format. @@ -271,6 +271,9 @@ def parse_patches(patch_args, patch_list, boundary = 0): patches += pl + if ordered: + patches = [p for p in patch_list if p in patches] + return patches def name_email(address): diff --git a/stgit/commands/pop.py b/stgit/commands/pop.py index 645eebd..0dfaad9 100644 --- a/stgit/commands/pop.py +++ b/stgit/commands/pop.py @@ -25,12 +25,16 @@ from stgit import stack, git help = 'pop one or more patches from the stack' -usage = """%prog [options] [] +usage = """%prog [options] [] [] [..] -Pop the topmost patch or a range of patches starting with the topmost -one from the stack. The command fails if there are local changes or -conflicts. If a patch name is given as argument, the command will pop -all the patches up to the given one.""" +Pop the topmost patch or a range of patches from the stack. The +command fails if there are conflicts or local changes (and --keep was +not specified). + +A series of pop and push operations are performed so that only the +patches passed on the command line are popped from the stack. Some of +the push operations may fail because of conflicts (push --undo would +revert the last push operation).""" options = [make_option('-a', '--all', help = 'pop all the applied patches', @@ -45,9 +49,6 @@ options = [make_option('-a', '--all', def func(parser, options, args): """Pop the topmost patch from the stack """ - if len(args) > 1: - parser.error('incorrect number of arguments') - check_conflicts() check_head_top_equal() @@ -57,28 +58,32 @@ def func(parser, options, args): applied = crt_series.get_applied() if not applied: raise CmdException, 'No patches applied' - # the popping is done in reverse order - applied.reverse() if options.all: patches = applied elif options.number: - patches = applied[:options.number] - elif len(args) == 1: - upto_patch = args[0] - if upto_patch not in applied: - if upto_patch in crt_series.get_unapplied(): - raise CmdException, 'Patch "%s" is not currently applied' \ - % upto_patch - else: - raise CmdException, 'Patch "%s" does not exist' % upto_patch - patches = applied[:applied.index(upto_patch)] + # reverse it twice to also work with negative or bigger than + # the length numbers + patches = applied[::-1][:options.number][::-1] + elif len(args) == 0: + patches = [applied[-1]] else: - patches = [applied[0]] + patches = parse_patches(args, applied, ordered = True) - if patches == []: + if not patches: raise CmdException, 'No patches to pop' - pop_patches(patches, options.keep) + # pop to the most distant popped patch + topop = applied[applied.index(patches[0]):] + # push those not in the popped range + topush = [p for p in topop if p not in patches] + + if options.keep and topush: + raise CmdException, 'Cannot pop arbitrary patches with --keep' + + topop.reverse() + pop_patches(topop, options.keep) + if topush: + push_patches(topush) print_crt_patch() diff --git a/stgit/stack.py b/stgit/stack.py index 0a20f4b..2200d33 100644 --- a/stgit/stack.py +++ b/stgit/stack.py @@ -392,7 +392,7 @@ class Series(StgitObject): os.remove(protect_file) def get_description(self): - return self._get_field('description') + return self._get_field('description') or '' def set_description(self, line): self._set_field('description', line) -- 2.11.0