]> 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
 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
 "
 
 . git-sh-setup
@@ -42,6 +43,7 @@ PRESERVE_MERGES=
 STRATEGY=
 ONTO=
 VERBOSE=
 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
 
 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 () {
 }
 
 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."
        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 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
                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 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*)
                        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
 while test $# != 0
 do
        case "$1" in
+       --no-verify)
+               OK_TO_SKIP_PRE_REBASE=yes
+               ;;
+       --verify)
+               ;;
        --continue)
                is_standalone "$@" || usage
                get_saved_options
        --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=
                        # 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
                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
                                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
                                        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
                                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
                        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
                                        # 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
                                        rm "$REWRITTEN"/$rev
                                fi
                        done