Make the replay_opts_release() function added in the preceding commit non-static, and use it for freeing the "struct replay_opts" constructed for "rebase" and "revert". To safely call our new replay_opts_release() we'll need to stop calling it in sequencer_remove_state(), and instead call it where we allocate the "struct replay_opts" itself. This is because in e.g. do_interactive_rebase() we construct a "struct replay_opts" with "get_replay_opts()", and then call "complete_action()". If we get far enough in that function without encountering errors we'll call "pick_commits()" which (indirectly) calls sequencer_remove_state() at the end. But if we encounter errors anywhere along the way we'd punt out early, and not free() the memory we allocated. Remembering whether we previously called sequencer_remove_state() would be a hassle. Using a FREE_AND_NULL() pattern would also work, as it would be safe to call replay_opts_release() repeatedly. But let's fix this properly instead, by having the owner of the data free() it. Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
		
			
				
	
	
		
			119 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
 | 
						|
test_description='git rebase - test patch id computation'
 | 
						|
 | 
						|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
 | 
						|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
 | 
						|
 | 
						|
TEST_PASSES_SANITIZE_LEAK=true
 | 
						|
. ./test-lib.sh
 | 
						|
 | 
						|
scramble () {
 | 
						|
	i=0
 | 
						|
	while read x
 | 
						|
	do
 | 
						|
		if test $i -ne 0
 | 
						|
		then
 | 
						|
			echo "$x"
 | 
						|
		fi
 | 
						|
		i=$((($i+1) % 10))
 | 
						|
	done <"$1" >"$1.new"
 | 
						|
	mv -f "$1.new" "$1"
 | 
						|
}
 | 
						|
 | 
						|
test_expect_success 'setup' '
 | 
						|
	git commit --allow-empty -m initial &&
 | 
						|
	git tag root
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'setup: 500 lines' '
 | 
						|
	rm -f .gitattributes &&
 | 
						|
	git checkout -q -f main &&
 | 
						|
	git reset --hard root &&
 | 
						|
	test_seq 500 >file &&
 | 
						|
	git add file &&
 | 
						|
	git commit -q -m initial &&
 | 
						|
	git branch -f other &&
 | 
						|
 | 
						|
	scramble file &&
 | 
						|
	git add file &&
 | 
						|
	git commit -q -m "change big file" &&
 | 
						|
 | 
						|
	git checkout -q other &&
 | 
						|
	: >newfile &&
 | 
						|
	git add newfile &&
 | 
						|
	git commit -q -m "add small file" &&
 | 
						|
 | 
						|
	git cherry-pick main >/dev/null 2>&1 &&
 | 
						|
 | 
						|
	git branch -f squashed main &&
 | 
						|
	git checkout -q -f squashed &&
 | 
						|
	git reset -q --soft HEAD~2 &&
 | 
						|
	git commit -q -m squashed &&
 | 
						|
 | 
						|
	git branch -f mode main &&
 | 
						|
	git checkout -q -f mode &&
 | 
						|
	test_chmod +x file &&
 | 
						|
	git commit -q -a --amend &&
 | 
						|
 | 
						|
	git branch -f modeother other &&
 | 
						|
	git checkout -q -f modeother &&
 | 
						|
	test_chmod +x file &&
 | 
						|
	git commit -q -a --amend
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'detect upstream patch' '
 | 
						|
	git checkout -q main^{} &&
 | 
						|
	scramble file &&
 | 
						|
	git add file &&
 | 
						|
	git commit -q -m "change big file again" &&
 | 
						|
	git checkout -q other^{} &&
 | 
						|
	git rebase main &&
 | 
						|
	git rev-list main...HEAD~ >revs &&
 | 
						|
	test_must_be_empty revs
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'detect upstream patch binary' '
 | 
						|
	echo "file binary" >.gitattributes &&
 | 
						|
	git checkout -q other^{} &&
 | 
						|
	git rebase main &&
 | 
						|
	git rev-list main...HEAD~ >revs &&
 | 
						|
	test_must_be_empty revs &&
 | 
						|
	test_when_finished "rm .gitattributes"
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'detect upstream patch modechange' '
 | 
						|
	git checkout -q modeother^{} &&
 | 
						|
	git rebase mode &&
 | 
						|
	git rev-list mode...HEAD~ >revs &&
 | 
						|
	test_must_be_empty revs
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'do not drop patch' '
 | 
						|
	git checkout -q other^{} &&
 | 
						|
	test_must_fail git rebase squashed &&
 | 
						|
	test_when_finished "git rebase --abort"
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'do not drop patch binary' '
 | 
						|
	echo "file binary" >.gitattributes &&
 | 
						|
	git checkout -q other^{} &&
 | 
						|
	test_must_fail git rebase squashed &&
 | 
						|
	test_when_finished "git rebase --abort" &&
 | 
						|
	test_when_finished "rm .gitattributes"
 | 
						|
'
 | 
						|
 | 
						|
test_expect_success 'do not drop patch modechange' '
 | 
						|
	git checkout -q modeother^{} &&
 | 
						|
	git rebase other &&
 | 
						|
	cat >expected <<-\EOF &&
 | 
						|
	diff --git a/file b/file
 | 
						|
	old mode 100644
 | 
						|
	new mode 100755
 | 
						|
	EOF
 | 
						|
	git diff HEAD~ >modediff &&
 | 
						|
	test_cmp expected modediff
 | 
						|
'
 | 
						|
 | 
						|
test_done
 |