cherry-pick/revert: remember --rerere-autoupdate

When continuing after conflicts, cherry-pick forgot if the user had specified '--rerere-autoupdate'. Redo the cherry-pick rerere tests to check --rerere-autoupdate works as expected. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Phillip Wood committed Aug 2, 2017 at 11:44 UTC 8d8cb4b047cef546ea80b8224c7b33707f6d6a4c
2 files changed +62 -8
sequencer.c
+9 -1
@@ -1439,7 +1439,11 @@ static int populate_opts_cb(const char *key, const char *value, void *data)
1439 else if (!strcmp(key, "options.strategy-option")) {
1440 ALLOC_GROW(opts->xopts, opts->xopts_nr + 1, opts->xopts_alloc);
1441 opts->xopts[opts->xopts_nr++] = xstrdup(value);
1442 - } else
1442 + } else if (!strcmp(key, "options.allow-rerere-auto"))
1443 + opts->allow_rerere_auto =
1444 + git_config_bool_or_int(key, value, &error_flag) ?
1445 + RERERE_AUTOUPDATE : RERERE_NOAUTOUPDATE;
1446 + else
1447 return error(_("invalid key: %s"), key);
1448
1449 if (!error_flag)
@@ -1752,6 +1756,10 @@ static int save_opts(struct replay_opts *opts)
1756 "options.strategy-option",
1757 opts->xopts[i], "^$", 0);
1758 }
1759 + if (opts->allow_rerere_auto)
1760 + res |= git_config_set_in_file_gently(opts_file, "options.allow-rerere-auto",
1761 + opts->allow_rerere_auto == RERERE_AUTOUPDATE ?
1762 + "true" : "false");
1763 return res;
1764 }
1765
t/t3504-cherry-pick-rerere.sh
+53 -7
@@ -7,9 +7,11 @@ test_description='cherry-pick should rerere for conflicts'
7 test_expect_success setup '
8 test_commit foo &&
9 test_commit foo-master foo &&
10 + test_commit bar-master bar &&
11
12 git checkout -b dev foo &&
13 test_commit foo-dev foo &&
14 + test_commit bar-dev bar &&
15 git config rerere.enabled true
16 '
17
@@ -19,22 +21,66 @@ test_expect_success 'conflicting merge' '
21
22 test_expect_success 'fixup' '
23 echo foo-resolved >foo &&
24 + echo bar-resolved >bar &&
25 git commit -am resolved &&
23 - cp foo expect &&
26 + cp foo foo-expect &&
27 + cp bar bar-expect &&
28 git reset --hard HEAD^
29 '
30
27 -test_expect_success 'cherry-pick conflict' '
28 - test_must_fail git cherry-pick master &&
29 - test_cmp expect foo
31 +test_expect_success 'cherry-pick conflict with --rerere-autoupdate' '
32 + test_must_fail git cherry-pick --rerere-autoupdate foo..bar-master &&
33 + test_cmp foo-expect foo &&
34 + git diff-files --quiet &&
35 + test_must_fail git cherry-pick --continue &&
36 + test_cmp bar-expect bar &&
37 + git diff-files --quiet &&
38 + git cherry-pick --continue &&
39 + git reset --hard bar-dev
40 +'
41 +
42 +test_expect_success 'cherry-pick conflict repsects rerere.autoUpdate' '
43 + test_config rerere.autoUpdate true &&
44 + test_must_fail git cherry-pick foo..bar-master &&
45 + test_cmp foo-expect foo &&
46 + git diff-files --quiet &&
47 + test_must_fail git cherry-pick --continue &&
48 + test_cmp bar-expect bar &&
49 + git diff-files --quiet &&
50 + git cherry-pick --continue &&
51 + git reset --hard bar-dev
52 +'
53 +
54 +test_expect_success 'cherry-pick conflict with --no-rerere-autoupdate' '
55 + test_config rerere.autoUpdate true &&
56 + test_must_fail git cherry-pick --no-rerere-autoupdate foo..bar-master &&
57 + test_cmp foo-expect foo &&
58 + test_must_fail git diff-files --quiet &&
59 + git add foo &&
60 + test_must_fail git cherry-pick --continue &&
61 + test_cmp bar-expect bar &&
62 + test_must_fail git diff-files --quiet &&
63 + git add bar &&
64 + git cherry-pick --continue &&
65 + git reset --hard bar-dev
66 '
67
32 -test_expect_success 'reconfigure' '
33 - git config rerere.enabled false &&
34 - git reset --hard
68 +test_expect_success 'cherry-pick --rerere-autoupdate more than once' '
69 + test_must_fail git cherry-pick --rerere-autoupdate --rerere-autoupdate foo..bar-master &&
70 + test_cmp foo-expect foo &&
71 + git diff-files --quiet &&
72 + git cherry-pick --abort &&
73 + test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate foo..bar-master &&
74 + test_cmp foo-expect foo &&
75 + git diff-files --quiet &&
76 + git cherry-pick --abort &&
77 + test_must_fail git cherry-pick --rerere-autoupdate --no-rerere-autoupdate foo..bar-master &&
78 + test_must_fail git diff-files --quiet &&
79 + git cherry-pick --abort
80 '
81
82 test_expect_success 'cherry-pick conflict without rerere' '
83 + test_config rerere.enabled false &&
84 test_must_fail git cherry-pick master &&
85 test_must_fail test_cmp expect foo
86 '