All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Karl Hasselström" <kha@treskal.com>
To: Catalin Marinas <catalin.marinas@gmail.com>
Cc: git@vger.kernel.org
Subject: [PATCH] Allow deletion of several patches at once
Date: Wed, 01 Nov 2006 10:07:14 +0100	[thread overview]
Message-ID: <20061101090714.2066.93948.stgit@localhost> (raw)
In-Reply-To: <20061023123714.GB10872@diana.vm.bytemark.co.uk>

From: Karl Hasselström <kha@treskal.com>

Signed-off-by: Karl Hasselström <kha@treskal.com>
---

This is an updated patch, which uses parse_patches() to support patch
ranges. It replaces patch 2/2 in the series; patch 1/2 (original
delete regression test) is unaffected.

 stgit/commands/delete.py |   54 +++++++++++++++++------
 t/t1600-delete-one.sh    |  109 ++++++++++++++++++++++++++++++++++++++++++++++
 t/t1600-delete.sh        |  109 ----------------------------------------------
 t/t1601-delete-many.sh   |   55 +++++++++++++++++++++++
 4 files changed, 205 insertions(+), 122 deletions(-)

diff --git a/stgit/commands/delete.py b/stgit/commands/delete.py
index c97d8ed..2f3aece 100644
--- a/stgit/commands/delete.py
+++ b/stgit/commands/delete.py
@@ -24,30 +24,58 @@ 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
-    """
-    if len(args) != 1:
-        parser.error('incorrect number of arguments')
+    """Deletes one or more patches."""
+    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 = {}
+    unapplied = {}
+    for patch in patches:
+        if patch in unapplied_patches:
+            unapplied[patch] = None
+        else:
+            applied[patch] = None
 
-    if args[0] == crt_series.get_current():
+    while crt_series.get_current() in applied:
+        patch = crt_series.get_current()
         check_local_changes()
         check_conflicts()
         check_head_top_equal()
+        crt_series.delete_patch(patch)
+        del applied[patch]
+        print 'Patch "%s" successfully deleted' % patch
+
+    for patch in unapplied.iterkeys():
+        crt_series.delete_patch(patch)
+        print 'Patch "%s" successfully deleted' % patch
+
+    if applied:
+        print 'Error: failed to delete %s' % ', '.join(applied.iterkeys())
 
-    crt_series.delete_patch(args[0])
-    print 'Patch "%s" successfully deleted' % args[0]
+    failed = len(applied)
+    if failed:
+        raise CmdException, 'Failed to delete %d patches' % failed
 
     if not options.branch:
         print_crt_patch()
diff --git a/t/t1600-delete-one.sh b/t/t1600-delete-one.sh
new file mode 100644
index 0000000..df03d79
--- /dev/null
+++ b/t/t1600-delete-one.sh
@@ -0,0 +1,109 @@
+#!/bin/sh
+# Copyright (c) 2006 Karl Hasselström
+test_description='Test the delete command (deleting one patch at a time).'
+. ./test-lib.sh
+
+test_expect_success \
+    'Initialize the StGIT repository' \
+    'stg init'
+
+test_expect_success \
+    'Create a patch' \
+    '
+    stg new foo -m foo &&
+    echo foo > foo.txt &&
+    stg add foo.txt &&
+    stg refresh
+    '
+
+test_expect_success \
+    'Try to delete a non-existing patch' \
+    '
+    [ $(stg applied | wc -l) -eq 1 ] &&
+    ! stg delete bar &&
+    [ $(stg applied | wc -l) -eq 1 ]
+    '
+
+test_expect_success \
+    'Try to delete the topmost patch while dirty' \
+    '
+    echo dirty >> foo.txt &&
+    [ $(stg applied | wc -l) -eq 1 ] &&
+    ! stg delete foo &&
+    [ $(stg applied | wc -l) -eq 1 ] &&
+    git reset --hard
+    '
+
+test_expect_success \
+    'Delete the topmost patch' \
+    '
+    [ $(stg applied | wc -l) -eq 1 ] &&
+    stg delete foo &&
+    [ $(stg applied | wc -l) -eq 0 ]
+    '
+
+test_expect_success \
+    'Create an unapplied patch' \
+    '
+    stg new foo -m foo &&
+    echo foo > foo.txt &&
+    stg add foo.txt &&
+    stg refresh &&
+    stg pop
+    '
+
+test_expect_success \
+    'Delete an unapplied patch' \
+    '
+    [ $(stg unapplied | wc -l) -eq 1 ] &&
+    stg delete foo &&
+    [ $(stg unapplied | wc -l) -eq 0 ]
+    '
+
+test_expect_success \
+    'Create two patches' \
+    '
+    stg new foo -m foo &&
+    echo foo > foo.txt &&
+    stg add foo.txt &&
+    stg refresh &&
+    stg new bar -m bar &&
+    echo bar > bar.txt &&
+    stg add bar.txt &&
+    stg refresh
+    '
+
+test_expect_success \
+    'Try to delete a non-topmost applied patch' \
+    '
+    [ $(stg applied | wc -l) -eq 2 ] &&
+    ! stg delete foo &&
+    [ $(stg applied | wc -l) -eq 2 ]
+    '
+
+test_expect_success \
+    'Create another branch, and put one patch in each branch' \
+    '
+    stg branch --create br &&
+    stg new baz -m baz &&
+    echo baz > baz.txt &&
+    stg add baz.txt &&
+    stg refresh &&
+    stg branch master &&
+    stg new baz -m baz &&
+    echo baz > baz.txt &&
+    stg add baz.txt &&
+    stg refresh
+    '
+
+test_expect_success \
+    'Delete a patch in another branch' \
+    '
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg applied -b br | wc -l) -eq 1 ] &&
+    stg delete -b br baz &&
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg applied -b br | wc -l) -eq 0 ]
+    '
+
+test_done
diff --git a/t/t1600-delete.sh b/t/t1600-delete.sh
deleted file mode 100644
index e22e624..0000000
--- a/t/t1600-delete.sh
+++ /dev/null
@@ -1,109 +0,0 @@
-#!/bin/sh
-# Copyright (c) 2006 Karl Hasselström
-test_description='Test the delete command.'
-. ./test-lib.sh
-
-test_expect_success \
-    'Initialize the StGIT repository' \
-    'stg init'
-
-test_expect_success \
-    'Create a patch' \
-    '
-    stg new foo -m foo &&
-    echo foo > foo.txt &&
-    stg add foo.txt &&
-    stg refresh
-    '
-
-test_expect_success \
-    'Try to delete a non-existing patch' \
-    '
-    [ $(stg applied | wc -l) -eq 1 ] &&
-    ! stg delete bar &&
-    [ $(stg applied | wc -l) -eq 1 ]
-    '
-
-test_expect_success \
-    'Try to delete the topmost patch while dirty' \
-    '
-    echo dirty >> foo.txt &&
-    [ $(stg applied | wc -l) -eq 1 ] &&
-    ! stg delete foo &&
-    [ $(stg applied | wc -l) -eq 1 ] &&
-    git reset --hard
-    '
-
-test_expect_success \
-    'Delete the topmost patch' \
-    '
-    [ $(stg applied | wc -l) -eq 1 ] &&
-    stg delete foo &&
-    [ $(stg applied | wc -l) -eq 0 ]
-    '
-
-test_expect_success \
-    'Create an unapplied patch' \
-    '
-    stg new foo -m foo &&
-    echo foo > foo.txt &&
-    stg add foo.txt &&
-    stg refresh &&
-    stg pop
-    '
-
-test_expect_success \
-    'Delete an unapplied patch' \
-    '
-    [ $(stg unapplied | wc -l) -eq 1 ] &&
-    stg delete foo &&
-    [ $(stg unapplied | wc -l) -eq 0 ]
-    '
-
-test_expect_success \
-    'Create two patches' \
-    '
-    stg new foo -m foo &&
-    echo foo > foo.txt &&
-    stg add foo.txt &&
-    stg refresh &&
-    stg new bar -m bar &&
-    echo bar > bar.txt &&
-    stg add bar.txt &&
-    stg refresh
-    '
-
-test_expect_success \
-    'Try to delete a non-topmost applied patch' \
-    '
-    [ $(stg applied | wc -l) -eq 2 ] &&
-    ! stg delete foo &&
-    [ $(stg applied | wc -l) -eq 2 ]
-    '
-
-test_expect_success \
-    'Create another branch, and put one patch in each branch' \
-    '
-    stg branch --create br &&
-    stg new baz -m baz &&
-    echo baz > baz.txt &&
-    stg add baz.txt &&
-    stg refresh &&
-    stg branch master &&
-    stg new baz -m baz &&
-    echo baz > baz.txt &&
-    stg add baz.txt &&
-    stg refresh
-    '
-
-test_expect_success \
-    'Delete a patch in another branch' \
-    '
-    [ $(stg applied | wc -l) -eq 3 ] &&
-    [ $(stg applied -b br | wc -l) -eq 1 ] &&
-    stg delete -b br baz &&
-    [ $(stg applied | wc -l) -eq 3 ] &&
-    [ $(stg applied -b br | wc -l) -eq 0 ]
-    '
-
-test_done
diff --git a/t/t1601-delete-many.sh b/t/t1601-delete-many.sh
new file mode 100644
index 0000000..8648ed1
--- /dev/null
+++ b/t/t1601-delete-many.sh
@@ -0,0 +1,55 @@
+#!/bin/sh
+# Copyright (c) 2006 Karl Hasselström
+test_description='Test the delete command (deleting many patches at once).'
+. ./test-lib.sh
+
+test_expect_success \
+    'Initialize the StGIT repository' \
+    'stg init'
+
+test_expect_success \
+    'Create five applied and five unapplied patches' \
+    '
+    stg new foo0 -m foo0 &&
+    echo foo0 > foo.txt &&
+    stg add foo.txt &&
+    stg refresh &&
+    for i in 1 2 3 4 5 6 7 8 9; do
+        stg new foo$i -m foo$i &&
+        echo foo$i >> foo.txt &&
+        stg refresh;
+    done &&
+    stg pop -n 5
+    '
+
+test_expect_success \
+    'Delete some patches' \
+    '
+    [ $(stg applied | wc -l) -eq 5 ] &&
+    [ $(stg unapplied | wc -l) -eq 5 ] &&
+    stg delete foo7 foo6 foo3 foo4 &&
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg unapplied | wc -l) -eq 3 ]
+    '
+
+test_expect_success \
+    'Delete some more patches, some of which do not exist' \
+    '
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg unapplied | wc -l) -eq 3 ] &&
+    ! stg delete foo7 foo8 foo2 foo0 &&
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg unapplied | wc -l) -eq 3 ]
+    '
+
+test_expect_success \
+    'Delete a range of patches' \
+    '
+    [ $(stg applied | wc -l) -eq 3 ] &&
+    [ $(stg unapplied | wc -l) -eq 3 ] &&
+    stg delete foo1..foo8 &&
+    [ $(stg applied | wc -l) -eq 1 ] &&
+    [ $(stg unapplied | wc -l) -eq 1 ]
+    '
+

  reply	other threads:[~2006-11-01  9:09 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-22 12:53 [PATCH 0/2] Teach "stg delete" to delete several patches at once Karl Hasselström
2006-10-22 12:58 ` [PATCH 1/2] Regression test for "stg delete" Karl Hasselström
2006-10-22 12:58 ` [PATCH 2/2] Allow deletion of several patches at once Karl Hasselström
2006-10-22 13:01   ` Karl Hasselström
2006-10-23 11:57   ` Catalin Marinas
2006-10-23 12:37     ` Karl Hasselström
2006-11-01  9:07       ` Karl Hasselström [this message]
2006-11-02 10:36         ` [PATCH] " Catalin Marinas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20061101090714.2066.93948.stgit@localhost \
    --to=kha@treskal.com \
    --cc=catalin.marinas@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.