contrib/vim: Add vim syntax highlighting for StGit commit messages
[stgit] / stgit / commands / rebase.py
index 8b7bca0..53ad1ea 100644 (file)
@@ -16,22 +16,38 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 """
 
 import sys, os
-from optparse import OptionParser, make_option
-
+from stgit.argparse import opt
 from stgit.commands.common import *
 from stgit.utils import *
-from stgit import stack, git
+from stgit import argparse, stack, git
+
+help = 'Move the stack base to another point in history'
+kind = 'stack'
+usage = ['[options] [--] <new-base-id>']
+description = """
+Pop all patches from current stack, move the stack base to the given
+<new-base-id> and push the patches back.
 
+If you experience merge conflicts, resolve the problem and continue
+the rebase by executing the following sequence:
 
-help = 'move the stack base to another point in history'
-usage = """%prog [options] <new-base-id>
+        $ git add --update
+        $ stg refresh
+        $ stg goto top-patch
 
-Pop all patches from current stack, move the stack base to the given
-<new-base-id> and push the patches back."""
+Or if you want to skip that patch:
 
-options = [make_option('-n', '--nopush',
-                       help = 'do not push the patches back after rebasing',
-                       action = 'store_true')]
+        $ stg undo --hard
+        $ stg push next-patch..top-patch"""
+
+args = [argparse.commit]
+options = [
+    opt('-n', '--nopush', action = 'store_true',
+        short = 'Do not push the patches back after rebasing'),
+    opt('-m', '--merged', action = 'store_true',
+        short = 'Check for patches merged upstream')]
+
+directory = DirectoryGotoToplevel(log = True)
 
 def func(parser, options, args):
     """Rebase the current stack
@@ -44,21 +60,14 @@ def func(parser, options, args):
 
     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]))
+    check_head_top_equal(crt_series)
 
-    # push the patches back
-    if not options.nopush:
-        push_patches(applied)
+    # ensure an exception is raised before popping on non-existent target
+    if git_id(crt_series, args[0]) == None:
+        raise GitException, 'Unknown revision: %s' % args[0]
+        
+    applied = prepare_rebase(crt_series)
+    rebase(crt_series, args[0])
+    post_rebase(crt_series, applied, options.nopush, options.merged)
 
-    print_crt_patch()
+    print_crt_patch(crt_series)