Browse Source
The original git-rebase honored pre-rebase hook so that public branches can be protected from getting rebased, but rebase --interactive ignored the hook entirely. This fixes it. Signed-off-by: Nanako Shiraishi <nanako3@lavabit.com> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>maint
Nanako Shiraishi
16 years ago
committed by
Shawn O. Pearce
3 changed files with 148 additions and 7 deletions
@ -0,0 +1,126 @@ |
|||||||
|
#!/bin/sh |
||||||
|
|
||||||
|
test_description='git rebase with its hook(s)' |
||||||
|
|
||||||
|
. ./test-lib.sh |
||||||
|
|
||||||
|
test_expect_success setup ' |
||||||
|
echo hello >file && |
||||||
|
git add file && |
||||||
|
test_tick && |
||||||
|
git commit -m initial && |
||||||
|
echo goodbye >file && |
||||||
|
git add file && |
||||||
|
test_tick && |
||||||
|
git commit -m second && |
||||||
|
git checkout -b side HEAD^ && |
||||||
|
echo world >git && |
||||||
|
git add git && |
||||||
|
test_tick && |
||||||
|
git commit -m side && |
||||||
|
git checkout master && |
||||||
|
git log --pretty=oneline --abbrev-commit --graph --all && |
||||||
|
git branch test side |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'rebase' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
git rebase master && |
||||||
|
test "z$(cat git)" = zworld |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'rebase -i' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
EDITOR=true git rebase -i master && |
||||||
|
test "z$(cat git)" = zworld |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'setup pre-rebase hook' ' |
||||||
|
mkdir -p .git/hooks && |
||||||
|
cat >.git/hooks/pre-rebase <<EOF && |
||||||
|
#!$SHELL_PATH |
||||||
|
echo "\$1,\$2" >.git/PRE-REBASE-INPUT |
||||||
|
EOF |
||||||
|
chmod +x .git/hooks/pre-rebase |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (1)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
git rebase master && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster, |
||||||
|
|
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (2)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
git rebase master test && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (3)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
git checkout master && |
||||||
|
git rebase master test && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (4)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
EDITOR=true git rebase -i master && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster, |
||||||
|
|
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (5)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
EDITOR=true git rebase -i master test && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook gets correct input (6)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
git checkout master && |
||||||
|
EDITOR=true git rebase -i master test && |
||||||
|
test "z$(cat git)" = zworld && |
||||||
|
test "z$(cat .git/PRE-REBASE-INPUT)" = zmaster,test |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'setup pre-rebase hook that fails' ' |
||||||
|
mkdir -p .git/hooks && |
||||||
|
cat >.git/hooks/pre-rebase <<EOF && |
||||||
|
#!$SHELL_PATH |
||||||
|
false |
||||||
|
EOF |
||||||
|
chmod +x .git/hooks/pre-rebase |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook stops rebase (1)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
test_must_fail git rebase master && |
||||||
|
test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && |
||||||
|
test 0 = $(git rev-list HEAD...side | wc -l) |
||||||
|
' |
||||||
|
|
||||||
|
test_expect_success 'pre-rebase hook stops rebase (2)' ' |
||||||
|
git checkout test && |
||||||
|
git reset --hard side && |
||||||
|
EDITOR=true test_must_fail git rebase -i master && |
||||||
|
test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && |
||||||
|
test 0 = $(git rev-list HEAD...side | wc -l) |
||||||
|
' |
||||||
|
|
||||||
|
test_done |
Loading…
Reference in new issue