This repository has been archived by the owner on Nov 9, 2017. It is now read-only.
forked from git-for-windows/git
-
Notifications
You must be signed in to change notification settings - Fork 316
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Teach rebase -i to honor pre-rebase hook
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>
- Loading branch information
Showing
3 changed files
with
148 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |