mirror of
https://github.com/git/git.git
synced 2024-09-28 20:51:42 +02:00
180 lines
3.8 KiB
Bash
180 lines
3.8 KiB
Bash
|
#!/bin/sh
|
||
|
#
|
||
|
# Copyright (c) 2018 Johannes E. Schindelin
|
||
|
#
|
||
|
|
||
|
test_description='git rebase -i --rebase-merges
|
||
|
|
||
|
This test runs git rebase "interactively", retaining the branch structure by
|
||
|
recreating merge commits.
|
||
|
|
||
|
Initial setup:
|
||
|
|
||
|
-- B -- (first)
|
||
|
/ \
|
||
|
A - C - D - E - H (master)
|
||
|
\ /
|
||
|
F - G (second)
|
||
|
'
|
||
|
. ./test-lib.sh
|
||
|
. "$TEST_DIRECTORY"/lib-rebase.sh
|
||
|
|
||
|
test_cmp_graph () {
|
||
|
cat >expect &&
|
||
|
git log --graph --boundary --format=%s "$@" >output &&
|
||
|
sed "s/ *$//" <output >output.trimmed &&
|
||
|
test_cmp expect output.trimmed
|
||
|
}
|
||
|
|
||
|
test_expect_success 'setup' '
|
||
|
write_script replace-editor.sh <<-\EOF &&
|
||
|
mv "$1" "$(git rev-parse --git-path ORIGINAL-TODO)"
|
||
|
cp script-from-scratch "$1"
|
||
|
EOF
|
||
|
|
||
|
test_commit A &&
|
||
|
git checkout -b first &&
|
||
|
test_commit B &&
|
||
|
git checkout master &&
|
||
|
test_commit C &&
|
||
|
test_commit D &&
|
||
|
git merge --no-commit B &&
|
||
|
test_tick &&
|
||
|
git commit -m E &&
|
||
|
git tag -m E E &&
|
||
|
git checkout -b second C &&
|
||
|
test_commit F &&
|
||
|
test_commit G &&
|
||
|
git checkout master &&
|
||
|
git merge --no-commit G &&
|
||
|
test_tick &&
|
||
|
git commit -m H &&
|
||
|
git tag -m H H
|
||
|
'
|
||
|
|
||
|
test_expect_success 'create completely different structure' '
|
||
|
cat >script-from-scratch <<-\EOF &&
|
||
|
label onto
|
||
|
|
||
|
# onebranch
|
||
|
pick G
|
||
|
pick D
|
||
|
label onebranch
|
||
|
|
||
|
# second
|
||
|
reset onto
|
||
|
pick B
|
||
|
label second
|
||
|
|
||
|
reset onto
|
||
|
merge -C H second
|
||
|
merge onebranch # Merge the topic branch '\''onebranch'\''
|
||
|
EOF
|
||
|
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
|
||
|
test_tick &&
|
||
|
git rebase -i -r A &&
|
||
|
test_cmp_graph <<-\EOF
|
||
|
* Merge the topic branch '\''onebranch'\''
|
||
|
|\
|
||
|
| * D
|
||
|
| * G
|
||
|
* | H
|
||
|
|\ \
|
||
|
| |/
|
||
|
|/|
|
||
|
| * B
|
||
|
|/
|
||
|
* A
|
||
|
EOF
|
||
|
'
|
||
|
|
||
|
test_expect_success 'generate correct todo list' '
|
||
|
cat >expect <<-\EOF &&
|
||
|
label onto
|
||
|
|
||
|
reset onto
|
||
|
pick d9df450 B
|
||
|
label E
|
||
|
|
||
|
reset onto
|
||
|
pick 5dee784 C
|
||
|
label branch-point
|
||
|
pick ca2c861 F
|
||
|
pick 088b00a G
|
||
|
label H
|
||
|
|
||
|
reset branch-point # C
|
||
|
pick 12bd07b D
|
||
|
merge -C 2051b56 E # E
|
||
|
merge -C 233d48a H # H
|
||
|
|
||
|
EOF
|
||
|
|
||
|
grep -v "^#" <.git/ORIGINAL-TODO >output &&
|
||
|
test_cmp expect output
|
||
|
'
|
||
|
|
||
|
test_expect_success '`reset` refuses to overwrite untracked files' '
|
||
|
git checkout -b refuse-to-reset &&
|
||
|
test_commit dont-overwrite-untracked &&
|
||
|
git checkout @{-1} &&
|
||
|
: >dont-overwrite-untracked.t &&
|
||
|
echo "reset refs/tags/dont-overwrite-untracked" >script-from-scratch &&
|
||
|
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
|
||
|
test_must_fail git rebase -r HEAD &&
|
||
|
git rebase --abort
|
||
|
'
|
||
|
|
||
|
test_expect_success 'failed `merge` writes patch (may be rescheduled, too)' '
|
||
|
test_when_finished "test_might_fail git rebase --abort" &&
|
||
|
git checkout -b conflicting-merge A &&
|
||
|
|
||
|
: fail because of conflicting untracked file &&
|
||
|
>G.t &&
|
||
|
echo "merge -C H G" >script-from-scratch &&
|
||
|
test_config sequence.editor \""$PWD"/replace-editor.sh\" &&
|
||
|
test_tick &&
|
||
|
test_must_fail git rebase -ir HEAD &&
|
||
|
grep "^merge -C .* G$" .git/rebase-merge/done &&
|
||
|
grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
|
||
|
test_path_is_file .git/rebase-merge/patch &&
|
||
|
|
||
|
: fail because of merge conflict &&
|
||
|
rm G.t .git/rebase-merge/patch &&
|
||
|
git reset --hard &&
|
||
|
test_commit conflicting-G G.t not-G conflicting-G &&
|
||
|
test_must_fail git rebase --continue &&
|
||
|
! grep "^merge -C .* G$" .git/rebase-merge/git-rebase-todo &&
|
||
|
test_path_is_file .git/rebase-merge/patch
|
||
|
'
|
||
|
|
||
|
test_expect_success 'with a branch tip that was cherry-picked already' '
|
||
|
git checkout -b already-upstream master &&
|
||
|
base="$(git rev-parse --verify HEAD)" &&
|
||
|
|
||
|
test_commit A1 &&
|
||
|
test_commit A2 &&
|
||
|
git reset --hard $base &&
|
||
|
test_commit B1 &&
|
||
|
test_tick &&
|
||
|
git merge -m "Merge branch A" A2 &&
|
||
|
|
||
|
git checkout -b upstream-with-a2 $base &&
|
||
|
test_tick &&
|
||
|
git cherry-pick A2 &&
|
||
|
|
||
|
git checkout already-upstream &&
|
||
|
test_tick &&
|
||
|
git rebase -i -r upstream-with-a2 &&
|
||
|
test_cmp_graph upstream-with-a2.. <<-\EOF
|
||
|
* Merge branch A
|
||
|
|\
|
||
|
| * A1
|
||
|
* | B1
|
||
|
|/
|
||
|
o A2
|
||
|
EOF
|
||
|
'
|
||
|
|
||
|
test_done
|