Merge branch 'mg/status-in-progress-info' into pu
[git] / t / t3430-rebase-recreate-merges.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2017 Johannes E. Schindelin
4 #
5
6 test_description='git rebase -i --recreate-merges
7
8 This test runs git rebase "interactively", retaining the branch structure by
9 recreating merge commits.
10
11 Initial setup:
12
13     -- B --                   (first)
14    /       \
15  A - C - D - E - H            (master)
16        \       /
17          F - G                (second)
18 '
19 . ./test-lib.sh
20 . "$TEST_DIRECTORY"/lib-rebase.sh
21
22 test_expect_success 'setup' '
23         write_script replace-editor.sh <<-\EOF &&
24         mv "$1" "$(git rev-parse --git-path ORIGINAL-TODO)"
25         cp script-from-scratch "$1"
26         EOF
27
28         test_commit A &&
29         git checkout -b first &&
30         test_commit B &&
31         git checkout master &&
32         test_commit C &&
33         test_commit D &&
34         git merge --no-commit B &&
35         test_tick &&
36         git commit -m E &&
37         git tag -m E E &&
38         git checkout -b second C &&
39         test_commit F &&
40         test_commit G &&
41         git checkout master &&
42         git merge --no-commit G &&
43         test_tick &&
44         git commit -m H &&
45         git tag -m H H
46 '
47
48 cat >script-from-scratch <<\EOF
49 label onto
50
51 # onebranch
52 pick G
53 pick D
54 label onebranch
55
56 # second
57 reset onto
58 pick B
59 label second
60
61 reset onto
62 merge -C H second
63 merge onebranch # Merge the topic branch 'onebranch'
64 EOF
65
66 test_cmp_graph () {
67         cat >expect &&
68         git log --graph --boundary --format=%s "$@" >output &&
69         sed "s/ *$//" <output >output.trimmed &&
70         test_cmp expect output.trimmed
71 }
72
73 test_expect_success 'create completely different structure' '
74         test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
75         test_tick &&
76         git rebase -i --recreate-merges A &&
77         test_cmp_graph <<-\EOF
78         *   Merge the topic branch '\''onebranch'\''
79         |\
80         | * D
81         | * G
82         * |   H
83         |\ \
84         | |/
85         |/|
86         | * B
87         |/
88         * A
89         EOF
90 '
91
92 test_expect_success 'generate correct todo list' '
93         cat >expect <<-\EOF &&
94         label onto
95
96         reset onto
97         pick d9df450 B
98         label E
99
100         reset onto
101         pick 5dee784 C
102         label branch-point
103         pick ca2c861 F
104         pick 088b00a G
105         label H
106
107         reset branch-point # C
108         pick 12bd07b D
109         merge -C 2051b56 E # E
110         merge -C 233d48a H # H
111
112         EOF
113
114         grep -v "^#" <.git/ORIGINAL-TODO >output &&
115         test_cmp expect output
116 '
117
118 test_expect_success 'with a branch tip that was cherry-picked already' '
119         git checkout -b already-upstream master &&
120         base="$(git rev-parse --verify HEAD)" &&
121
122         test_commit A1 &&
123         test_commit A2 &&
124         git reset --hard $base &&
125         test_commit B1 &&
126         test_tick &&
127         git merge -m "Merge branch A" A2 &&
128
129         git checkout -b upstream-with-a2 $base &&
130         test_tick &&
131         git cherry-pick A2 &&
132
133         git checkout already-upstream &&
134         test_tick &&
135         git rebase -i --recreate-merges upstream-with-a2 &&
136         test_cmp_graph upstream-with-a2.. <<-\EOF
137         *   Merge branch A
138         |\
139         | * A1
140         * | B1
141         |/
142         o A2
143         EOF
144 '
145
146 test_expect_success 'do not rebase cousins unless asked for' '
147         write_script copy-editor.sh <<-\EOF &&
148         cp "$1" "$(git rev-parse --git-path ORIGINAL-TODO)"
149         EOF
150
151         test_config sequence.editor \""$PWD"/copy-editor.sh\" &&
152         git checkout -b cousins master &&
153         before="$(git rev-parse --verify HEAD)" &&
154         test_tick &&
155         git rebase -i --recreate-merges HEAD^ &&
156         test_cmp_rev HEAD $before &&
157         test_tick &&
158         git rebase -i --recreate-merges=rebase-cousins HEAD^ &&
159         test_cmp_graph HEAD^.. <<-\EOF
160         *   Merge the topic branch '\''onebranch'\''
161         |\
162         | * D
163         | * G
164         |/
165         o H
166         EOF
167 '
168
169 test_expect_success 'refs/rewritten/* is worktree-local' '
170         git worktree add wt &&
171         cat >wt/script-from-scratch <<-\EOF &&
172         label xyz
173         exec GIT_DIR=../.git git rev-parse --verify refs/rewritten/xyz >a || :
174         exec git rev-parse --verify refs/rewritten/xyz >b
175         EOF
176
177         test_config -C wt sequence.editor \""$PWD"/replace-editor.sh\" &&
178         git -C wt rebase -i HEAD &&
179         test_must_be_empty wt/a &&
180         test_cmp_rev HEAD "$(cat wt/b)"
181 '
182
183 test_expect_success 'post-rewrite hook and fixups work for merges' '
184         git checkout -b post-rewrite &&
185         test_commit same1 &&
186         git reset --hard HEAD^ &&
187         test_commit same2 &&
188         git merge -m "to fix up" same1 &&
189         echo same old same old >same2.t &&
190         test_tick &&
191         git commit --fixup HEAD same2.t &&
192         fixup="$(git rev-parse HEAD)" &&
193
194         mkdir -p .git/hooks &&
195         test_when_finished "rm .git/hooks/post-rewrite" &&
196         echo "cat >actual" | write_script .git/hooks/post-rewrite &&
197
198         test_tick &&
199         git rebase -i --autosquash --recreate-merges HEAD^^^ &&
200         printf "%s %s\n%s %s\n%s %s\n%s %s\n" >expect $(git rev-parse \
201                 $fixup^^2 HEAD^2 \
202                 $fixup^^ HEAD^ \
203                 $fixup^ HEAD \
204                 $fixup HEAD) &&
205         test_cmp expect actual
206 '
207
208 test_done