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
'