From 22037590baa995704b6cc08d844e024c85c7c578 Mon Sep 17 00:00:00 2001 From: Yann Dirson Date: Sat, 20 Jan 2007 19:04:21 +0100 Subject: [PATCH] Add new 'rebase' command. Signed-off-by: Yann Dirson --- contrib/stgit-completion.bash | 1 + stgit/commands/rebase.py | 64 +++++++++++++++++++++++++++++++++++++++++++ stgit/main.py | 2 ++ t/t2200-rebase.sh | 33 ++++++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 stgit/commands/rebase.py create mode 100755 t/t2200-rebase.sh diff --git a/contrib/stgit-completion.bash b/contrib/stgit-completion.bash index 92d41b1..d0d716c 100644 --- a/contrib/stgit-completion.bash +++ b/contrib/stgit-completion.bash @@ -36,6 +36,7 @@ _stg_commands=" pop pull push + rebase refresh rename resolved diff --git a/stgit/commands/rebase.py b/stgit/commands/rebase.py new file mode 100644 index 0000000..8b7bca0 --- /dev/null +++ b/stgit/commands/rebase.py @@ -0,0 +1,64 @@ +__copyright__ = """ +Copyright (C) 2005, Catalin Marinas + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +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 = 'move the stack base to another point in history' +usage = """%prog [options] + +Pop all patches from current stack, move the stack base to the given + and push the patches back.""" + +options = [make_option('-n', '--nopush', + help = 'do not push the patches back after rebasing', + action = 'store_true')] + +def func(parser, options, args): + """Rebase the current stack + """ + if len(args) != 1: + parser.error('incorrect number of arguments') + + if crt_series.get_protected(): + raise CmdException, 'This branch is protected. Rebase is not permitted' + + check_local_changes() + check_conflicts() + check_head_top_equal() + + # pop all patches + applied = crt_series.get_applied() + if len(applied) > 0: + print 'Popping all applied patches...', + sys.stdout.flush() + crt_series.pop_patch(applied[0]) + print 'done' + + print 'Rebasing to "%s"...' % args[0] + git.reset(tree_id = git_id(args[0])) + + # push the patches back + if not options.nopush: + push_patches(applied) + + print_crt_patch() diff --git a/stgit/main.py b/stgit/main.py index 99e0832..f9b07d7 100644 --- a/stgit/main.py +++ b/stgit/main.py @@ -80,6 +80,7 @@ commands = Commands({ 'pop': 'pop', 'pull': 'pull', 'push': 'push', + 'rebase': 'rebase', 'refresh': 'refresh', 'rename': 'rename', 'resolved': 'resolved', @@ -110,6 +111,7 @@ stackcommands = ( 'init', 'pop', 'push', + 'rebase', 'series', 'top', 'unapplied', diff --git a/t/t2200-rebase.sh b/t/t2200-rebase.sh new file mode 100755 index 0000000..e2d9d9a --- /dev/null +++ b/t/t2200-rebase.sh @@ -0,0 +1,33 @@ +#!/bin/sh +# +# Copyright (c) 2007 Yann Dirson +# + +test_description='Test the "rebase" command.' + +. ./test-lib.sh + +test_expect_success \ + 'Setup a multi-commit branch and fork an stgit stack' \ + ' + echo foo > file1 && + git add file1 && + git commit -m a && + echo foo > file2 && + git add file2 && + git commit -m b && + + stg branch --create stack && + stg new p -m . && + echo bar >> file1 && + stg refresh + ' + +test_expect_success \ + 'Rebase to previous commit' \ + ' + stg rebase master~1 && + test `git rev-parse bases/stack` = `git rev-parse master~1` + ' + +test_done -- 2.11.0