The test files have to be adapted because of a slightly different way of
recording a "push" operation with the new infrastructure. The original
code was recording two transactions for a "push <patch>" - one for
reordering the unapplied patches and another for pushing the patch. One
would need two "undo" operations to restore the state prior to a "push".
The new infrastructure only records one transaction for "push" and only
one "undo" is necessary.
Since a "pop <middle patch>" operation involves popping the patches and
pushing one, with the above changes in the "push" implementation it
means that the patch order the test scripts expect is slightly
different.
Signed-off-by: Catalin Marinas <catalin.marinas@gmail.com>
Acked-by: Karl Hasselström <kha@treskal.com>
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""
+from stgit.commands import common
+from stgit.lib import transaction
+from stgit import argparse
from stgit.argparse import opt
from stgit.argparse import opt
-from stgit.commands.common import *
-from stgit.utils import *
-from stgit import argparse, stack, git
help = 'Pop one or more patches from the stack'
kind = 'stack'
help = 'Pop one or more patches from the stack'
kind = 'stack'
opt('-a', '--all', action = 'store_true',
short = 'Pop all the applied patches'),
opt('-n', '--number', type = 'int',
opt('-a', '--all', action = 'store_true',
short = 'Pop all the applied patches'),
opt('-n', '--number', type = 'int',
- short = 'Pop the specified number of patches'),
- opt('-k', '--keep', action = 'store_true',
- short = 'Keep the local changes')]
+ short = 'Pop the specified number of patches')
+ ] + argparse.keep_option()
-directory = DirectoryGotoToplevel(log = True)
+directory = common.DirectoryHasRepositoryLib()
def func(parser, options, args):
def func(parser, options, args):
- """Pop the topmost patch from the stack
- """
- check_conflicts()
- check_head_top_equal(crt_series)
+ """Pop the given patches or the topmost one from the stack."""
+ stack = directory.repository.current_stack
+ iw = stack.repository.default_iw
+ clean_iw = (not options.keep and iw) or None
+ trans = transaction.StackTransaction(stack, 'pop',
+ check_clean_iw = clean_iw)
- if not options.keep:
- check_local_changes()
-
- applied = crt_series.get_applied()
- if not applied:
- raise CmdException, 'No patches applied'
+ if not trans.applied:
+ raise common.CmdException('No patches applied')
+ patches = trans.applied
elif options.number:
# reverse it twice to also work with negative or bigger than
# the length numbers
elif options.number:
# 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]]
+ patches = trans.applied[::-1][:options.number][::-1]
+ elif not args:
+ patches = [trans.applied[-1]]
- patches = parse_patches(args, applied, ordered = True)
+ patches = common.parse_patches(args, trans.applied, ordered = True)
- raise CmdException, 'No patches to pop'
-
- # 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(crt_series, topop, options.keep)
- if topush:
- push_patches(crt_series, topush)
-
- print_crt_patch(crt_series)
+ raise common.CmdException('No patches to pop')
+
+ applied = [p for p in trans.applied if not p in set(patches)]
+ unapplied = patches + trans.unapplied
+ try:
+ trans.reorder_patches(applied, unapplied, iw = iw)
+ except transaction.TransactionException:
+ pass
+ return trans.run(iw)
C a
EOF
test_expect_success 'Pop middle patch, creating a conflict' '
C a
EOF
test_expect_success 'Pop middle patch, creating a conflict' '
- conflict_old stg pop p2 &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
test "$(echo $(stg series))" = "+ p1 > p3 - p2"
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
test "$(echo $(stg series))" = "+ p1 > p3 - p2"
stg reset --hard master.stgit^~1 &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
stg reset --hard master.stgit^~1 &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
- test "$(echo $(stg series))" = "> p1 - p3 - p2"
+ test "$(echo $(stg series))" = "> p1 - p2 - p3"
C a
EOF
test_expect_success 'Pop middle patch, creating a conflict' '
C a
EOF
test_expect_success 'Pop middle patch, creating a conflict' '
- conflict_old stg pop p2 &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
test "$(echo $(stg series))" = "+ p1 > p3 - p2"
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
test "$(echo $(stg series))" = "+ p1 > p3 - p2"
stg undo --hard &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
stg undo --hard &&
stg status a > actual.txt &&
test_cmp expected.txt actual.txt &&
- test "$(echo $(stg series))" = "> p1 - p3 - p2"
+ test "$(echo $(stg series))" = "> p1 - p2 - p3"