Merge branch 'sh/maint-rebase3'
authorJunio C Hamano <gitster@pobox.com>
Sun, 19 Oct 2008 23:07:29 +0000 (16:07 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 19 Oct 2008 23:07:29 +0000 (16:07 -0700)
* sh/maint-rebase3:
rebase--interactive: fix parent rewriting for dropped commits

1  2 
git-rebase--interactive.sh
index 86290f63b25f921de5c78b087e111e6b872676fb,30e45237a2d9c126d9d3dd29737a09cb2de290a1..39f8d73dfa4377922fd8ebc406643d73338916d0
@@@ -26,7 -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
@@@ -38,11 -37,11 +38,12 @@@ DONE="$DOTEST"/don
  MSG="$DOTEST"/message
  SQUASH_MSG="$DOTEST"/message-squash
  REWRITTEN="$DOTEST"/rewritten
+ DROPPED="$DOTEST"/dropped
  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
@@@ -68,8 -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."
@@@ -182,8 -180,12 +183,12 @@@ pick_one_preserving_merges () 
  
        # rewrite parents; if none were rewritten, we can fast-forward.
        new_parents=
-       for p in $(git rev-list --parents -1 $sha1 | cut -d' ' -f2-)
+       pend=" $(git rev-list --parents -1 $sha1 | cut -d' ' -f2-)"
+       while [ "$pend" != "" ]
        do
+               p=$(expr "$pend" : ' \([^ ]*\)')
+               pend="${pend# $p}"
                if test -f "$REWRITTEN"/$p
                then
                        new_p=$(cat "$REWRITTEN"/$p)
                                ;;
                        esac
                else
-                       new_parents="$new_parents $p"
+                       if test -f "$DROPPED"/$p
+                       then
+                               fast_forward=f
+                               pend=" $(cat "$DROPPED"/$p)$pend"
+                       else
+                               new_parents="$new_parents $p"
+                       fi
                fi
        done
        case $fast_forward in
@@@ -424,11 -432,6 +435,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
@@@ -607,6 -610,28 +618,28 @@@ first and then run 'git rebase --contin
  #
  EOF
  
+               # Watch for commits that been dropped by --cherry-pick
+               if test t = "$PRESERVE_MERGES"
+               then
+                       mkdir "$DROPPED"
+                       # drop the --cherry-pick parameter this time
+                       git rev-list $MERGES_OPTION --abbrev-commit \
+                               --abbrev=7 $UPSTREAM...$HEAD --left-right | \
+                               sed -n "s/^>//p" | while read rev
+                       do
+                               grep --quiet "$rev" "$TODO"
+                               if [ $? -ne 0 ]
+                               then
+                                       # Use -f2 because if rev-list is telling this commit is not
+                                       # worthwhile, we don't want to track its multiple heads,
+                                       # just the history of its first-parent for others that will
+                                       # be rebasing on top of us
+                                       full=$(git rev-parse $rev)
+                                       git rev-list --parents -1 $rev | cut -d' ' -f2 > "$DROPPED"/$full
+                               fi
+                       done
+               fi
                has_action "$TODO" ||
                        die_abort "Nothing to do"