X-Git-Url: https://git.distorted.org.uk/~mdw/stgit/blobdiff_plain/2cf7e94e933bf3e8091622d7d6730e145cc9bf64..1de97e5f5e62a46d69515052a860138e417f149b:/stgit/commands/goto.py diff --git a/stgit/commands/goto.py b/stgit/commands/goto.py index e129b8d..66f49df 100644 --- a/stgit/commands/goto.py +++ b/stgit/commands/goto.py @@ -15,47 +15,44 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ -import sys, os -from optparse import OptionParser, make_option - -from stgit.commands.common import * -from stgit.utils import * -from stgit import stack, git - - -help = 'push or pop patches to the given one' -usage = """%prog [options] - +from stgit.commands import common +from stgit.lib import transaction +from stgit import argparse +from stgit.argparse import opt + +help = 'Push or pop patches to the given one' +kind = 'stack' +usage = [''] +description = """ Push/pop patches to/from the stack until the one given on the command -line becomes current. This is a shortcut for the 'push --to' or 'pop ---to' commands. There is no '--undo' option for 'goto'. Use the 'push' -command for this.""" +line becomes current.""" -options = [] +args = [argparse.other_applied_patches, argparse.unapplied_patches] +options = argparse.keep_option() +directory = common.DirectoryHasRepositoryLib() def func(parser, options, args): - """Pushes the given patch or all onto the series - """ if len(args) != 1: parser.error('incorrect number of arguments') - - check_local_changes() - check_conflicts() - check_head_top_equal() - - applied = crt_series.get_applied() - unapplied = crt_series.get_unapplied() patch = args[0] - if patch in applied: - applied.reverse() - patches = applied[:applied.index(patch)] - pop_patches(patches) - elif patch in unapplied: - patches = unapplied[:unapplied.index(patch)+1] - push_patches(patches) + stack = directory.repository.current_stack + iw = stack.repository.default_iw + clean_iw = (not options.keep and iw) or None + trans = transaction.StackTransaction(stack, 'goto', + check_clean_iw = clean_iw) + if patch in trans.applied: + to_pop = set(trans.applied[trans.applied.index(patch)+1:]) + assert not trans.pop_patches(lambda pn: pn in to_pop) + elif patch in trans.unapplied: + try: + for pn in trans.unapplied[:trans.unapplied.index(patch)+1]: + trans.push_patch(pn, iw, allow_interactive = True) + except transaction.TransactionHalted: + pass + elif patch in trans.hidden: + raise common.CmdException('Cannot goto a hidden patch') else: - raise CmdException, 'Patch "%s" does not exist' % patch - - print_crt_patch() + raise common.CmdException('Patch "%s" does not exist' % patch) + return trans.run(iw)