You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
215 lines
4.9 KiB
215 lines
4.9 KiB
#!/bin/sh |
|
# |
|
# Copyright (c) 2010 Thomas Rast |
|
# |
|
|
|
test_description='Test the post-rewrite hook.' |
|
. ./test-lib.sh |
|
|
|
test_expect_success 'setup' ' |
|
test_commit A foo A && |
|
test_commit B foo B && |
|
test_commit C foo C && |
|
test_commit D foo D && |
|
git checkout A^0 && |
|
test_commit E bar E && |
|
test_commit F foo F && |
|
git checkout master |
|
' |
|
|
|
mkdir .git/hooks |
|
|
|
cat >.git/hooks/post-rewrite <<EOF |
|
#!/bin/sh |
|
echo \$@ > "$TRASH_DIRECTORY"/post-rewrite.args |
|
cat > "$TRASH_DIRECTORY"/post-rewrite.data |
|
EOF |
|
chmod u+x .git/hooks/post-rewrite |
|
|
|
clear_hook_input () { |
|
rm -f post-rewrite.args post-rewrite.data |
|
} |
|
|
|
verify_hook_input () { |
|
test_cmp "$TRASH_DIRECTORY"/post-rewrite.args expected.args && |
|
test_cmp "$TRASH_DIRECTORY"/post-rewrite.data expected.data |
|
} |
|
|
|
test_expect_success 'git commit --amend' ' |
|
clear_hook_input && |
|
echo "D new message" > newmsg && |
|
oldsha=$(git rev-parse HEAD^0) && |
|
git commit -Fnewmsg --amend && |
|
echo amend > expected.args && |
|
echo $oldsha $(git rev-parse HEAD^0) > expected.data && |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git commit --amend --no-post-rewrite' ' |
|
clear_hook_input && |
|
echo "D new message again" > newmsg && |
|
git commit --no-post-rewrite -Fnewmsg --amend && |
|
test ! -f post-rewrite.args && |
|
test ! -f post-rewrite.data |
|
' |
|
|
|
test_expect_success 'git rebase' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_must_fail git rebase --onto A B && |
|
echo C > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD^) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase --skip' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_must_fail git rebase --onto A B && |
|
test_must_fail git rebase --skip && |
|
echo D > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase --skip the last one' ' |
|
git reset --hard F && |
|
clear_hook_input && |
|
test_must_fail git rebase --onto D A && |
|
git rebase --skip && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse E) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -m' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_must_fail git rebase -m --onto A B && |
|
echo C > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD^) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -m --skip' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_must_fail git rebase --onto A B && |
|
test_must_fail git rebase --skip && |
|
echo D > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
. "$TEST_DIRECTORY"/lib-rebase.sh |
|
|
|
set_fake_editor |
|
|
|
# Helper to work around the lack of one-shot exporting for |
|
# test_must_fail (as it is a shell function) |
|
test_fail_interactive_rebase () { |
|
( |
|
FAKE_LINES="$1" && |
|
shift && |
|
export FAKE_LINES && |
|
test_must_fail git rebase -i "$@" |
|
) |
|
} |
|
|
|
test_expect_success 'git rebase -i (unchanged)' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_fail_interactive_rebase "1 2" --onto A B && |
|
echo C > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD^) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -i (skip)' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_fail_interactive_rebase "2" --onto A B && |
|
echo D > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -i (squash)' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
test_fail_interactive_rebase "1 squash 2" --onto A B && |
|
echo C > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -i (fixup without conflict)' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
FAKE_LINES="1 fixup 2" git rebase -i B && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_expect_success 'git rebase -i (double edit)' ' |
|
git reset --hard D && |
|
clear_hook_input && |
|
FAKE_LINES="edit 1 edit 2" git rebase -i B && |
|
git rebase --continue && |
|
echo something > foo && |
|
git add foo && |
|
git rebase --continue && |
|
echo rebase >expected.args && |
|
cat >expected.data <<EOF && |
|
$(git rev-parse C) $(git rev-parse HEAD^) |
|
$(git rev-parse D) $(git rev-parse HEAD) |
|
EOF |
|
verify_hook_input |
|
' |
|
|
|
test_done
|
|
|