rebase: remember strategy and strategy options
authorMartin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Sun, 6 Feb 2011 18:43:55 +0000 (13:43 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Feb 2011 22:08:09 +0000 (14:08 -0800)
When a rebase is resumed, interactive rebase remembers any merge
strategy passed when the rebase was initated. Make non-interactive
rebase remember any merge strategy as well. Also make non-interactive
rebase remember any merge strategy options.

To be able to resume a rebase that was initiated with an older version
of git (older than this commit), make sure not to expect the saved
option files to exist.

Test case idea taken from Junio's 71fc224 (t3402: test "rebase
-s<strategy> -X<opt>", 2010-11-11).

Signed-off-by: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase--interactive.sh
git-rebase.sh
t/t3418-rebase-continue.sh
index f076a6edfbab13242dc8c45e465dfd643df0425a..5773b75f54b7b55e3faa65f0752985e5d4207e6c 100755 (executable)
@@ -584,7 +584,6 @@ skip_unnecessary_picks () {
 
 get_saved_options () {
        test -d "$rewritten" && preserve_merges=t
-       test -f "$state_dir"/strategy && strategy="$(cat "$state_dir"/strategy)"
        test -f "$state_dir"/rebase-root && rebase_root=t
 }
 
@@ -713,7 +712,6 @@ case "$rebase_root" in
 *)
        : >"$state_dir"/rebase-root ;;
 esac
-test -z "$strategy" || echo "$strategy" > "$state_dir"/strategy
 if test t = "$preserve_merges"
 then
        if test -z "$rebase_root"
index 8a36e7a86162839b7afb9b9cd45745da6e95f8e2..f4ad7c1659c4576e15886a0cb67bfcd6b6fbf977 100755 (executable)
@@ -81,6 +81,9 @@ read_basic_state () {
        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)"
 }
 
 write_basic_state () {
@@ -89,6 +92,9 @@ write_basic_state () {
        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
 }
 
 output () {
index 1d90191e542ad43d9d21837b9515b1b8ab647350..5469546c3221e3596fe3a8a9a0102e50fc140467 100755 (executable)
@@ -45,4 +45,33 @@ test_expect_success 'rebase --continue can not be used with other options' '
        test_must_fail git rebase --continue -v
 '
 
+test_expect_success 'rebase --continue remembers merge strategy and options' '
+       rm -fr .git/rebase-* &&
+       git reset --hard commit-new-file-F2-on-topic-branch &&
+       test_commit "commit-new-file-F3-on-topic-branch" F3 32 &&
+       test_when_finished "rm -fr test-bin funny.was.run" &&
+       mkdir test-bin &&
+       cat >test-bin/git-merge-funny <<-EOF
+       #!$SHELL_PATH
+       case "\$1" in --opt) ;; *) exit 2 ;; esac
+       shift &&
+       >funny.was.run &&
+       exec git merge-recursive "\$@"
+       EOF
+       chmod +x test-bin/git-merge-funny &&
+       (
+               PATH=./test-bin:$PATH
+               test_must_fail git rebase -s funny -Xopt master topic
+       ) &&
+       test -f funny.was.run &&
+       rm funny.was.run &&
+       echo "Resolved" >F2 &&
+       git add F2 &&
+       (
+               PATH=./test-bin:$PATH
+               git rebase --continue
+       ) &&
+       test -f funny.was.run
+'
+
 test_done