git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Add new 'rebase' command.

From
Yann Dirson <ydirson@altern.org>
Date
Jan 20, 2007, 18:04 UTC
Message-ID
<20070120180329.22621.30534.stgit@gandelf.nowhere.earth>
Signed-off-by: Yann Dirson <ydirson@altern.org>
---

Take two: I had forgotten to add "rebase" to the list of stack commands for the purpose of help.

 stgit/commands/rebase.py |   69 ++++++++++++++++++++++++++++++++++++++++++++++
 stgit/main.py            |    2 +
 t/t2200-rebase.sh        |   33 ++++++++++++++++++++++
 3 files changed, 104 insertions(+), 0 deletions(-)
diff --git a/stgit/commands/rebase.py b/stgit/commands/rebase.py
new file mode 100644
index 0000000..79d67a7
--- /dev/null
+++ b/stgit/commands/rebase.py
@@ -0,0 +1,69 @@
+__copyright__ = """
+Copyright (C) 2005, Catalin Marinas <catalin.marinas@gmail.com>
+
+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] --to <target-commit>
+
+Pop all patches from current stack, move the stack base to the
+given <target-commit>, and push the patches back."""
+
+options = [make_option('-n', '--nopush',
+                       help = 'do not push the patches back after pulling',
+                       action = 'store_true'),
+           make_option('--to', metavar = 'COMMITID',
+                       help = 'move the stack base to COMMITID')]
+
+def func(parser, options, args):
+    """Rebase the current stack
+    """
+    if len(args) > 0:
+        parser.error('incorrect number of arguments')
+
+    if not options.to:
+        parser.error('rebase requires option --to')
+
+    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"...' % options.to
+    git.reset(tree_id = git_id(options.to))
+
+    # 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 0f92f75..ca2bbde 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..6211cbd
--- /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 --to master~1 &&
+	test `git rev-parse bases/stack` = `git rev-parse master~1`
+	'
+
+test_done
Next: Catalin Marinas
Message 1 of 4 in “Add new 'rebase' command.”
  1. Add new 'rebase' command.Yann Dirson, Jan 20, 2007
  2. Catalin MarinasJan 21, 2007
  3. Yann DirsonJan 21, 2007
  4. Catalin MarinasJan 21, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.