]> asedeno.scripts.mit.edu Git - git.git/blobdiff - git-rebase--interactive.sh
Merge git://repo.or.cz/git-gui
[git.git] / git-rebase--interactive.sh
index 851066f0f47a6c850c649112a88a060fc3ecb99a..1172e47571dfe1d6dd088381d63045fd5eae3db3 100755 (executable)
@@ -26,6 +26,7 @@ i,interactive      always used (no-op)
 continue           continue rebasing process
 abort              abort rebasing process and restore original branch
 skip               skip current patch and continue rebasing process
+no-verify          override pre-rebase hook from stopping the operation
 "
 
 . git-sh-setup
@@ -42,6 +43,7 @@ PRESERVE_MERGES=
 STRATEGY=
 ONTO=
 VERBOSE=
+OK_TO_SKIP_PRE_REBASE=
 
 GIT_CHERRY_PICK_HELP="  After resolving the conflicts,
 mark the corrected paths with 'git add <paths>', and
@@ -67,7 +69,8 @@ output () {
 }
 
 run_pre_rebase_hook () {
-       if test -x "$GIT_DIR/hooks/pre-rebase"
+       if test -z "$OK_TO_SKIP_PRE_REBASE" &&
+          test -x "$GIT_DIR/hooks/pre-rebase"
        then
                "$GIT_DIR/hooks/pre-rebase" ${1+"$@"} || {
                        echo >&2 "The pre-rebase hook refused to rebase."
@@ -170,7 +173,7 @@ pick_one_preserving_merges () {
 
        if test -f "$DOTEST"/current-commit
        then
-               if [ "$fast_forward" == "t" ]
+               if test "$fast_forward" = t
                then
                        cat "$DOTEST"/current-commit | while read current_commit
                        do
@@ -194,6 +197,15 @@ pick_one_preserving_merges () {
                if test -f "$REWRITTEN"/$p
                then
                        new_p=$(cat "$REWRITTEN"/$p)
+
+                       # If the todo reordered commits, and our parent is marked for
+                       # rewriting, but hasn't been gotten to yet, assume the user meant to
+                       # drop it on top of the current HEAD
+                       if test -z "$new_p"
+                       then
+                               new_p=$(git rev-parse HEAD)
+                       fi
+
                        test $p != $new_p && fast_forward=f
                        case "$new_parents" in
                        *$new_p*)
@@ -428,6 +440,11 @@ get_saved_options () {
 while test $# != 0
 do
        case "$1" in
+       --no-verify)
+               OK_TO_SKIP_PRE_REBASE=yes
+               ;;
+       --verify)
+               ;;
        --continue)
                is_standalone "$@" || usage
                get_saved_options
@@ -583,6 +600,7 @@ first and then run 'git rebase --continue' again."
                        # parents to rewrite and skipping dropped commits would
                        # prematurely end our probe
                        MERGES_OPTION=
+                       first_after_upstream="$(git rev-list --reverse --first-parent $UPSTREAM..$HEAD | head -n 1)"
                else
                        MERGES_OPTION="--no-merges --cherry-pick"
                fi
@@ -603,7 +621,7 @@ first and then run 'git rebase --continue' again."
                                preserve=t
                                for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -f2-)
                                do
-                                       if test -f "$REWRITTEN"/$p
+                                       if test -f "$REWRITTEN"/$p -a \( $p != $UPSTREAM -o $sha1 = $first_after_upstream \)
                                        then
                                                preserve=f
                                        fi
@@ -625,8 +643,8 @@ first and then run 'git rebase --continue' again."
                                sed -n "s/^>//p" > "$DOTEST"/not-cherry-picks
                        # Now all commits and note which ones are missing in
                        # not-cherry-picks and hence being dropped
-                       git rev-list $UPSTREAM...$HEAD --left-right | \
-                               sed -n "s/^>//p" | while read rev
+                       git rev-list $UPSTREAM..$HEAD |
+                       while read rev
                        do
                                if test -f "$REWRITTEN"/$rev -a "$(grep "$rev" "$DOTEST"/not-cherry-picks)" = ""
                                then
@@ -635,7 +653,8 @@ first and then run 'git rebase --continue' again."
                                        # just the history of its first-parent for others that will
                                        # be rebasing on top of it
                                        git rev-list --parents -1 $rev | cut -d' ' -f2 > "$DROPPED"/$rev
-                                       cat "$TODO" | grep -v "${rev:0:7}" > "${TODO}2" ; mv "${TODO}2" "$TODO"
+                                       short=$(git rev-list -1 --abbrev-commit --abbrev=7 $rev)
+                                       grep -v "^[a-z][a-z]* $short" <"$TODO" > "${TODO}2" ; mv "${TODO}2" "$TODO"
                                        rm "$REWRITTEN"/$rev
                                fi
                        done