266 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			266 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #!/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 expected.args "$TRASH_DIRECTORY"/post-rewrite.args &&
 | |
| 	test_cmp expected.data "$TRASH_DIRECTORY"/post-rewrite.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 C) $(git rev-parse HEAD^)
 | |
| 	$(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)
 | |
| 	$(git rev-parse F) $(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 -m --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 C) $(git rev-parse HEAD^)
 | |
| 	$(git rev-parse D) $(git rev-parse HEAD)
 | |
| 	EOF
 | |
| 	verify_hook_input
 | |
| '
 | |
| 
 | |
| test_expect_success 'git rebase with implicit use of interactive backend' '
 | |
| 	git reset --hard D &&
 | |
| 	clear_hook_input &&
 | |
| 	test_must_fail git rebase --keep-empty --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 with implicit use of interactive backend' '
 | |
| 	git reset --hard D &&
 | |
| 	clear_hook_input &&
 | |
| 	test_must_fail git rebase --keep-empty --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 C) $(git rev-parse HEAD^)
 | |
| 	$(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_expect_success 'git rebase -i (exec)' '
 | |
| 	git reset --hard D &&
 | |
| 	clear_hook_input &&
 | |
| 	FAKE_LINES="edit 1 exec_false 2" git rebase -i B &&
 | |
| 	echo something >bar &&
 | |
| 	git add bar &&
 | |
| 	# Fails because of exec false
 | |
| 	test_must_fail git rebase --continue &&
 | |
| 	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
 |