rebase -m: remember allow_rerere_autoupdate option
[gitweb.git] / git-rebase.sh
index 44e169fe15a8b9c2078ef050987f0fcd3e1f4a7a..be9ec2a1f79cc8d61e7255a1609577fc7c2c29f2 100755 (executable)
@@ -70,8 +70,49 @@ test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
 read_basic_state () {
        head_name=$(cat "$state_dir"/head-name) &&
        onto=$(cat "$state_dir"/onto) &&
-       orig_head=$(cat "$state_dir"/orig-head) &&
-       GIT_QUIET=$(cat "$state_dir"/quiet)
+       # We always write to orig-head, but interactive rebase used to write to
+       # head. Fall back to reading from head to cover for the case that the
+       # user upgraded git with an ongoing interactive rebase.
+       if test -f "$state_dir"/orig-head
+       then
+               orig_head=$(cat "$state_dir"/orig-head)
+       else
+               orig_head=$(cat "$state_dir"/head)
+       fi &&
+       GIT_QUIET=$(cat "$state_dir"/quiet) &&
+       test -f "$state_dir"/verbose && verbose=t
+       test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
+       test -f "$state_dir"/strategy_opts &&
+               strategy_opts="$(cat "$state_dir"/strategy_opts)"
+       test -f "$state_dir"/allow_rerere_autoupdate &&
+               allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)"
+}
+
+write_basic_state () {
+       echo "$head_name" > "$state_dir"/head-name &&
+       echo "$onto" > "$state_dir"/onto &&
+       echo "$orig_head" > "$state_dir"/orig-head &&
+       echo "$GIT_QUIET" > "$state_dir"/quiet &&
+       test t = "$verbose" && : > "$state_dir"/verbose
+       test -n "$strategy" && echo "$strategy" > "$state_dir"/strategy
+       test -n "$strategy_opts" && echo "$strategy_opts" > \
+               "$state_dir"/strategy_opts
+       test -n "$allow_rerere_autoupdate" && echo "$allow_rerere_autoupdate" > \
+               "$state_dir"/allow_rerere_autoupdate
+}
+
+output () {
+       case "$verbose" in
+       '')
+               output=$("$@" 2>&1 )
+               status=$?
+               test $status != 0 && printf "%s\n" "$output"
+               return $status
+               ;;
+       *)
+               "$@"
+               ;;
+       esac
 }
 
 move_to_original_branch () {
@@ -91,7 +132,7 @@ run_specific_rebase () {
                GIT_EDITOR=:
                export GIT_EDITOR
        fi
-       test "$type" != am && . git-rebase--$type
+       . git-rebase--$type
 }
 
 run_pre_rebase_hook () {
@@ -248,11 +289,19 @@ test $# -gt 2 && usage
 if test -n "$action"
 then
        test -z "$in_progress" && die "No rebase in progress?"
-       test "$type" = interactive && run_specific_rebase
+       # Only interactive rebase uses detailed reflog messages
+       if test "$type" = interactive && test "$GIT_REFLOG_ACTION" = rebase
+       then
+               GIT_REFLOG_ACTION="rebase -i ($action)"
+               export GIT_REFLOG_ACTION
+       fi
 fi
 
 case "$action" in
 continue)
+       # Sanity check
+       git rev-parse --verify HEAD >/dev/null ||
+               die "Cannot read HEAD"
        git update-index --ignore-submodules --refresh &&
        git diff-files --quiet --ignore-submodules || {
                echo "You must edit all merge conflicts and then"
@@ -261,17 +310,11 @@ continue)
        }
        read_basic_state
        run_specific_rebase
-       git am --resolved --3way --resolvemsg="$resolvemsg" &&
-       move_to_original_branch
-       exit
        ;;
 skip)
-       git reset --hard HEAD || exit $?
+       output git reset --hard HEAD || exit $?
        read_basic_state
        run_specific_rebase
-       git am -3 --skip --resolvemsg="$resolvemsg" &&
-       move_to_original_branch
-       exit
        ;;
 abort)
        git rerere clear
@@ -282,7 +325,7 @@ abort)
                die "Could not move back to $head_name"
                ;;
        esac
-       git reset --hard $orig_head
+       output git reset --hard $orig_head
        rm -r "$state_dir"
        exit
        ;;
@@ -324,14 +367,12 @@ then
        shift
        upstream=`git rev-parse --verify "${upstream_name}^0"` ||
        die "invalid upstream $upstream_name"
-       unset root_flag
        upstream_arg="$upstream_name"
 else
        test -z "$onto" && die "You must specify --onto when using --root"
        unset upstream_name
        unset upstream
-       root_flag="--root"
-       upstream_arg="$root_flag"
+       upstream_arg=--root
 fi
 
 # Make sure the branch to rebase onto is valid.
@@ -457,23 +498,4 @@ else
        revisions="$upstream..$orig_head"
 fi
 
-if test -z "$do_merge"
-then
-       git format-patch -k --stdout --full-index --ignore-if-in-upstream \
-               --src-prefix=a/ --dst-prefix=b/ \
-               --no-renames $root_flag "$revisions" |
-       git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" &&
-       move_to_original_branch
-       ret=$?
-       test 0 != $ret -a -d "$apply_dir" &&
-               echo $head_name > "$apply_dir/head-name" &&
-               echo $onto > "$apply_dir/onto" &&
-               echo $orig_head > "$apply_dir/orig-head" &&
-               echo "$GIT_QUIET" > "$apply_dir/quiet"
-       exit $ret
-fi
-
-# start doing a rebase with git-merge
-# this is rename-aware if the recursive (default) strategy is used
-
 run_specific_rebase