Merge branch 'mh/rebase-skip-hard'
authorJunio C Hamano <gitster@pobox.com>
Sun, 25 Nov 2007 00:31:08 +0000 (16:31 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 25 Nov 2007 00:31:08 +0000 (16:31 -0800)
* mh/rebase-skip-hard:
Do git reset --hard HEAD when using git rebase --skip

1  2 
git-rebase.sh
t/t3403-rebase-skip.sh
diff --combined git-rebase.sh
index df5fd65d56bde3ed046c9ed40e62e8a17ede2e8e,9af9da992fae7c6d5aaf3f553e684db623060a97..461ca8d93f4ab5c43792b4658d53b2e39ad18af1
@@@ -29,7 -29,6 +29,7 @@@ Example:       git-rebase master~1 topi
  '
  
  SUBDIRECTORY_OK=Yes
 +OPTIONS_SPEC=
  . git-sh-setup
  set_reflog_action rebase
  require_work_tree
@@@ -88,7 -87,7 +88,7 @@@ call_merge () 
        cmt="$(cat "$dotest/cmt.$1")"
        echo "$cmt" > "$dotest/current"
        hd=$(git rev-parse --verify HEAD)
 -      cmt_name=$(git symbolic-ref HEAD)
 +      cmt_name=$(git symbolic-ref HEAD 2> /dev/null || echo HEAD)
        msgnum=$(cat "$dotest/msgnum")
        end=$(cat "$dotest/end")
        eval GITHEAD_$cmt='"${cmt_name##refs/heads/}~$(($end - $msgnum))"'
        esac
  }
  
 +move_to_original_branch () {
 +      test -z "$head_name" &&
 +              head_name="$(cat "$dotest"/head-name)" &&
 +              onto="$(cat "$dotest"/onto)" &&
 +              orig_head="$(cat "$dotest"/orig-head)"
 +      case "$head_name" in
 +      refs/*)
 +              message="rebase finished: $head_name onto $onto"
 +              git update-ref -m "$message" \
 +                      $head_name $(git rev-parse HEAD) $orig_head &&
 +              git symbolic-ref HEAD $head_name ||
 +              die "Could not move back to $head_name"
 +              ;;
 +      esac
 +}
 +
  finish_rb_merge () {
 +      move_to_original_branch
        rm -r "$dotest"
        echo "All done."
  }
                        finish_rb_merge
                        exit
                fi
 -              git am --resolved --3way --resolvemsg="$RESOLVEMSG"
 +              head_name=$(cat .dotest/head-name) &&
 +              onto=$(cat .dotest/onto) &&
 +              orig_head=$(cat .dotest/orig-head) &&
 +              git am --resolved --3way --resolvemsg="$RESOLVEMSG" &&
 +              move_to_original_branch
                exit
                ;;
        --skip)
+               git reset --hard HEAD || exit $?
                if test -d "$dotest"
                then
                        git rerere clear
                        finish_rb_merge
                        exit
                fi
 -              git am -3 --skip --resolvemsg="$RESOLVEMSG"
 +              head_name=$(cat .dotest/head-name) &&
 +              onto=$(cat .dotest/onto) &&
 +              orig_head=$(cat .dotest/orig-head) &&
 +              git am -3 --skip --resolvemsg="$RESOLVEMSG" &&
 +              move_to_original_branch
                exit
                ;;
        --abort)
                git rerere clear
                if test -d "$dotest"
                then
 +                      move_to_original_branch
                        rm -r "$dotest"
                elif test -d .dotest
                then
 +                      dotest=.dotest
 +                      move_to_original_branch
                        rm -r .dotest
                else
                        die "No rebase in progress?"
@@@ -347,19 -319,6 +348,19 @@@ the
        GIT_PAGER='' git diff --stat --summary "$mb" "$onto"
  fi
  
 +# move to a detached HEAD
 +orig_head=$(git rev-parse HEAD^0)
 +head_name=$(git symbolic-ref HEAD 2> /dev/null)
 +case "$head_name" in
 +'')
 +      head_name="detached HEAD"
 +      ;;
 +*)
 +      git checkout "$orig_head" > /dev/null 2>&1 ||
 +              die "could not detach HEAD"
 +      ;;
 +esac
 +
  # Rewind the head to "$onto"; this saves our current head in ORIG_HEAD.
  echo "First, rewinding head to replay your work on top of it..."
  git-reset --hard "$onto"
  if test "$mb" = "$branch"
  then
        echo >&2 "Fast-forwarded $branch_name to $onto_name."
 +      move_to_original_branch
        exit 0
  fi
  
  if test -z "$do_merge"
  then
        git format-patch -k --stdout --full-index --ignore-if-in-upstream "$upstream"..ORIG_HEAD |
 -      git am $git_am_opt --binary -3 -k --resolvemsg="$RESOLVEMSG"
 -      exit $?
 +      git am $git_am_opt --binary -3 -k --resolvemsg="$RESOLVEMSG" &&
 +      move_to_original_branch
 +      ret=$?
 +      test 0 != $ret -a -d .dotest &&
 +              echo $head_name > .dotest/head-name &&
 +              echo $onto > .dotest/onto &&
 +              echo $orig_head > .dotest/orig-head
 +      exit $ret
  fi
  
  # start doing a rebase with git-merge
  mkdir -p "$dotest"
  echo "$onto" > "$dotest/onto"
  echo "$onto_name" > "$dotest/onto_name"
 -prev_head=`git rev-parse HEAD^0`
 +prev_head=$orig_head
  echo "$prev_head" > "$dotest/prev_head"
 +echo "$orig_head" > "$dotest/orig-head"
 +echo "$head_name" > "$dotest/head-name"
  
  msgnum=0
  for cmt in `git rev-list --reverse --no-merges "$upstream"..ORIG_HEAD`
diff --combined t/t3403-rebase-skip.sh
index 2ee5a00ea794e31946ee3228bc66ecc8e7d3b38f,becabfc33c6e392c9d8fca231a6d2b99b3e80a29..657f68104d52558668119234a0637ac2bca33c0a
@@@ -36,38 -36,19 +36,36 @@@ test_expect_failure 'rebase with git a
  '
  
  test_expect_success 'rebase --skip with am -3' '
-       git reset --hard HEAD &&
        git rebase --skip
        '
 +
 +test_expect_success 'rebase moves back to skip-reference' '
 +      test refs/heads/skip-reference = $(git symbolic-ref HEAD) &&
 +      git branch post-rebase &&
 +      git reset --hard pre-rebase &&
 +      ! git rebase master &&
 +      echo "hello" > hello &&
 +      git add hello &&
 +      git rebase --continue &&
 +      test refs/heads/skip-reference = $(git symbolic-ref HEAD) &&
 +      git reset --hard post-rebase
 +'
 +
  test_expect_success 'checkout skip-merge' 'git checkout -f skip-merge'
  
  test_expect_failure 'rebase with --merge' 'git rebase --merge master'
  
  test_expect_success 'rebase --skip with --merge' '
-       git reset --hard HEAD &&
        git rebase --skip
        '
  
  test_expect_success 'merge and reference trees equal' \
        'test -z "`git diff-tree skip-merge skip-reference`"'
  
 +test_expect_success 'moved back to branch correctly' '
 +      test refs/heads/skip-merge = $(git symbolic-ref HEAD)
 +'
 +
  test_debug 'gitk --all & sleep 1'
  
  test_done