t1015: demonstrate directory/file conflict recovery failures
Several "recovery" commands outright fail or do not fully recover when directory-file conflicts are present. This includes: * git read-tree --reset HEAD * git am --skip * git am --abort * git merge --abort * git reset --hard Add testcases documenting these shortcomings. Signed-off-by: Elijah Newren <newren@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Elijah Newren committed
Jul 31, 2018 at 10:12 UTC
25c200a70078054b59331d50509481d00647dcbf
1 file changed
+123
t/t1015-read-index-unmerged.sh
new
+123
@@ -0,0 +1,123 @@
1
+#!/bin/sh
2
+
3
+test_description='Test various callers of read_index_unmerged'
4
+. ./test-lib.sh
5
+
6
+test_expect_success 'setup modify/delete + directory/file conflict' '
7
+ test_create_repo df_plus_modify_delete &&
8
+ (
9
+ cd df_plus_modify_delete &&
10
+
11
+ test_write_lines a b c d e f g h >letters &&
12
+ git add letters &&
13
+ git commit -m initial &&
14
+
15
+ git checkout -b modify &&
16
+ # Throw in letters.txt for sorting order fun
17
+ # ("letters.txt" sorts between "letters" and "letters/file")
18
+ echo i >>letters &&
19
+ echo "version 2" >letters.txt &&
20
+ git add letters letters.txt &&
21
+ git commit -m modified &&
22
+
23
+ git checkout -b delete HEAD^ &&
24
+ git rm letters &&
25
+ mkdir letters &&
26
+ >letters/file &&
27
+ echo "version 1" >letters.txt &&
28
+ git add letters letters.txt &&
29
+ git commit -m deleted
30
+ )
31
+'
32
+
33
+test_expect_failure 'read-tree --reset cleans unmerged entries' '
34
+ test_when_finished "git -C df_plus_modify_delete clean -f" &&
35
+ test_when_finished "git -C df_plus_modify_delete reset --hard" &&
36
+ (
37
+ cd df_plus_modify_delete &&
38
+
39
+ git checkout delete^0 &&
40
+ test_must_fail git merge modify &&
41
+
42
+ git read-tree --reset HEAD &&
43
+ git ls-files -u >conflicts &&
44
+ test_must_be_empty conflicts
45
+ )
46
+'
47
+
48
+test_expect_failure 'One reset --hard cleans unmerged entries' '
49
+ test_when_finished "git -C df_plus_modify_delete clean -f" &&
50
+ test_when_finished "git -C df_plus_modify_delete reset --hard" &&
51
+ (
52
+ cd df_plus_modify_delete &&
53
+
54
+ git checkout delete^0 &&
55
+ test_must_fail git merge modify &&
56
+
57
+ git reset --hard &&
58
+ test_path_is_missing .git/MERGE_HEAD &&
59
+ git ls-files -u >conflicts &&
60
+ test_must_be_empty conflicts
61
+ )
62
+'
63
+
64
+test_expect_success 'setup directory/file conflict + simple edit/edit' '
65
+ test_create_repo df_plus_edit_edit &&
66
+ (
67
+ cd df_plus_edit_edit &&
68
+
69
+ test_seq 1 10 >numbers &&
70
+ git add numbers &&
71
+ git commit -m initial &&
72
+
73
+ git checkout -b d-edit &&
74
+ mkdir foo &&
75
+ echo content >foo/bar &&
76
+ git add foo &&
77
+ echo 11 >>numbers &&
78
+ git add numbers &&
79
+ git commit -m "directory and edit" &&
80
+
81
+ git checkout -b f-edit d-edit^1 &&
82
+ echo content >foo &&
83
+ git add foo &&
84
+ echo eleven >>numbers &&
85
+ git add numbers &&
86
+ git commit -m "file and edit"
87
+ )
88
+'
89
+
90
+test_expect_failure 'git merge --abort succeeds despite D/F conflict' '
91
+ test_when_finished "git -C df_plus_edit_edit clean -f" &&
92
+ test_when_finished "git -C df_plus_edit_edit reset --hard" &&
93
+ (
94
+ cd df_plus_edit_edit &&
95
+
96
+ git checkout f-edit^0 &&
97
+ test_must_fail git merge d-edit^0 &&
98
+
99
+ git merge --abort &&
100
+ test_path_is_missing .git/MERGE_HEAD &&
101
+ git ls-files -u >conflicts &&
102
+ test_must_be_empty conflicts
103
+ )
104
+'
105
+
106
+test_expect_failure 'git am --skip succeeds despite D/F conflict' '
107
+ test_when_finished "git -C df_plus_edit_edit clean -f" &&
108
+ test_when_finished "git -C df_plus_edit_edit reset --hard" &&
109
+ (
110
+ cd df_plus_edit_edit &&
111
+
112
+ git checkout f-edit^0 &&
113
+ git format-patch -1 d-edit &&
114
+ test_must_fail git am -3 0001*.patch &&
115
+
116
+ git am --skip &&
117
+ test_path_is_missing .git/rebase-apply &&
118
+ git ls-files -u >conflicts &&
119
+ test_must_be_empty conflicts
120
+ )
121
+'
122
+
123
+test_done