3 # Copyright (c) 2017 Johannes E. Schindelin
6 test_description='git rebase -i --recreate-merges
8 This test runs git rebase "interactively", retaining the branch structure by
9 recreating merge commits.
15 A - C - D - E - H (master)
20 . "$TEST_DIRECTORY"/lib-rebase.sh
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"
29 git checkout -b first &&
31 git checkout master &&
34 git merge --no-commit B &&
38 git checkout -b second C &&
41 git checkout master &&
42 git merge --no-commit G &&
48 cat >script-from-scratch <<\EOF
63 merge onebranch # Merge the topic branch 'onebranch'
68 git log --graph --boundary --format=%s "$@" >output &&
69 sed "s/ *$//" <output >output.trimmed &&
70 test_cmp expect output.trimmed
73 test_expect_success 'create completely different structure' '
74 test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
76 git rebase -i --recreate-merges A &&
77 test_cmp_graph <<-\EOF
78 * Merge the topic branch '\''onebranch'\''
92 test_expect_success 'generate correct todo list' '
93 cat >expect <<-\EOF &&
107 reset branch-point # C
109 merge -C 2051b56 E # E
110 merge -C 233d48a H # H
114 grep -v "^#" <.git/ORIGINAL-TODO >output &&
115 test_cmp expect output
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)" &&
124 git reset --hard $base &&
127 git merge -m "Merge branch A" A2 &&
129 git checkout -b upstream-with-a2 $base &&
131 git cherry-pick A2 &&
133 git checkout already-upstream &&
135 git rebase -i --recreate-merges upstream-with-a2 &&
136 test_cmp_graph upstream-with-a2.. <<-\EOF
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)"
151 test_config sequence.editor \""$PWD"/copy-editor.sh\" &&
152 git checkout -b cousins master &&
153 before="$(git rev-parse --verify HEAD)" &&
155 git rebase -i --recreate-merges HEAD^ &&
156 test_cmp_rev HEAD $before &&
158 git rebase -i --recreate-merges=rebase-cousins HEAD^ &&
159 test_cmp_graph HEAD^.. <<-\EOF
160 * Merge the topic branch '\''onebranch'\''
169 test_expect_success 'refs/rewritten/* is worktree-local' '
170 git worktree add wt &&
171 cat >wt/script-from-scratch <<-\EOF &&
173 exec GIT_DIR=../.git git rev-parse --verify refs/rewritten/xyz >a || :
174 exec git rev-parse --verify refs/rewritten/xyz >b
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)"
183 test_expect_success 'post-rewrite hook and fixups work for merges' '
184 git checkout -b post-rewrite &&
186 git reset --hard HEAD^ &&
188 git merge -m "to fix up" same1 &&
189 echo same old same old >same2.t &&
191 git commit --fixup HEAD same2.t &&
192 fixup="$(git rev-parse HEAD)" &&
194 mkdir -p .git/hooks &&
195 test_when_finished "rm .git/hooks/post-rewrite" &&
196 echo "cat >actual" | write_script .git/hooks/post-rewrite &&
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 \
205 test_cmp expect actual