#!/bin/sh test_description='git rebase with its hook(s)' GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME TEST_PASSES_SANITIZE_LEAK=true . ./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 main && 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 main && test "z$(cat git)" = zworld ' test_expect_success 'rebase -i' ' git checkout test && git reset --hard side && EDITOR=true git rebase -i main && test "z$(cat git)" = zworld ' test_expect_success 'setup pre-rebase hook' ' test_hook --setup pre-rebase <<-\EOF echo "$1,$2" >.git/PRE-REBASE-INPUT EOF ' test_expect_success 'pre-rebase hook gets correct input (1)' ' git checkout test && git reset --hard side && git rebase main && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain, ' test_expect_success 'pre-rebase hook gets correct input (2)' ' git checkout test && git reset --hard side && git rebase main test && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (3)' ' git checkout test && git reset --hard side && git checkout main && git rebase main test && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (4)' ' git checkout test && git reset --hard side && EDITOR=true git rebase -i main && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain, ' test_expect_success 'pre-rebase hook gets correct input (5)' ' git checkout test && git reset --hard side && EDITOR=true git rebase -i main test && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'pre-rebase hook gets correct input (6)' ' git checkout test && git reset --hard side && git checkout main && EDITOR=true git rebase -i main test && test "z$(cat git)" = zworld && test "z$(cat .git/PRE-REBASE-INPUT)" = zmain,test ' test_expect_success 'setup pre-rebase hook that fails' ' test_hook --setup --clobber pre-rebase <<-\EOF false EOF ' test_expect_success 'pre-rebase hook stops rebase (1)' ' git checkout test && git reset --hard side && test_must_fail git rebase main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test 0 = $(git rev-list HEAD...side | wc -l) && test_must_fail git rebase --quit 2>err && test_grep "no rebase in progress" err ' test_expect_success 'pre-rebase hook stops rebase (2)' ' git checkout test && git reset --hard side && test_must_fail env EDITOR=: git rebase -i main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test 0 = $(git rev-list HEAD...side | wc -l) ' test_expect_success 'rebase --no-verify overrides pre-rebase (1)' ' git checkout test && git reset --hard side && git rebase --no-verify main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test "z$(cat git)" = zworld ' test_expect_success 'rebase --no-verify overrides pre-rebase (2)' ' git checkout test && git reset --hard side && EDITOR=true git rebase --no-verify -i main && test "z$(git symbolic-ref HEAD)" = zrefs/heads/test && test "z$(cat git)" = zworld ' test_done