| #!/bin/sh | 
 |  | 
 | test_description='patching from inconvenient places' | 
 |  | 
 | . ./test-lib.sh | 
 |  | 
 | test_expect_success 'setup' ' | 
 | 	cat >patch <<-\EOF && | 
 | 	diff file.orig file | 
 | 	--- a/file.orig | 
 | 	+++ b/file | 
 | 	@@ -1 +1,2 @@ | 
 | 	 1 | 
 | 	+2 | 
 | 	EOF | 
 | 	patch="$(pwd)/patch" && | 
 |  | 
 | 	echo 1 >preimage && | 
 | 	printf "%s\n" 1 2 >postimage && | 
 | 	echo 3 >other && | 
 |  | 
 | 	test_tick && | 
 | 	git commit --allow-empty -m basis | 
 | ' | 
 |  | 
 | test_expect_success 'setup: subdir' ' | 
 | 	reset_subdir() { | 
 | 		git reset && | 
 | 		mkdir -p sub/dir/b && | 
 | 		mkdir -p objects && | 
 | 		cp "$1" file && | 
 | 		cp "$1" objects/file && | 
 | 		cp "$1" sub/dir/file && | 
 | 		cp "$1" sub/dir/b/file && | 
 | 		git add file sub/dir/file sub/dir/b/file objects/file && | 
 | 		cp "$2" file && | 
 | 		cp "$2" sub/dir/file && | 
 | 		cp "$2" sub/dir/b/file && | 
 | 		cp "$2" objects/file && | 
 | 		test_might_fail git update-index --refresh -q | 
 | 	} | 
 | ' | 
 |  | 
 | test_expect_success 'apply from subdir of toplevel' ' | 
 | 	cp postimage expected && | 
 | 	reset_subdir other preimage && | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		git apply "$patch" | 
 | 	) && | 
 | 	test_cmp expected sub/dir/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply --cached from subdir of toplevel' ' | 
 | 	cp postimage expected && | 
 | 	cp other expected.working && | 
 | 	reset_subdir preimage other && | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		git apply --cached "$patch" | 
 | 	) && | 
 | 	git show :sub/dir/file >actual && | 
 | 	test_cmp expected actual && | 
 | 	test_cmp expected.working sub/dir/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply --index from subdir of toplevel' ' | 
 | 	cp postimage expected && | 
 | 	reset_subdir preimage other && | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		test_must_fail git apply --index "$patch" | 
 | 	) && | 
 | 	reset_subdir other preimage && | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		test_must_fail git apply --index "$patch" | 
 | 	) && | 
 | 	reset_subdir preimage preimage && | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		git apply --index "$patch" | 
 | 	) && | 
 | 	git show :sub/dir/file >actual && | 
 | 	test_cmp expected actual && | 
 | 	test_cmp expected sub/dir/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply half-broken patch from subdir of toplevel' ' | 
 | 	( | 
 | 		cd sub/dir && | 
 | 		test_must_fail git apply <<-EOF | 
 | 		--- sub/dir/file | 
 | 		+++ sub/dir/file | 
 | 		@@ -1,0 +1,0 @@ | 
 | 		--- file_in_root | 
 | 		+++ file_in_root | 
 | 		@@ -1,0 +1,0 @@ | 
 | 		EOF | 
 | 	) | 
 | ' | 
 |  | 
 | test_expect_success 'apply from .git dir' ' | 
 | 	cp postimage expected && | 
 | 	cp preimage .git/file && | 
 | 	cp preimage .git/objects/file && | 
 | 	( | 
 | 		cd .git && | 
 | 		git apply "$patch" | 
 | 	) && | 
 | 	test_cmp expected .git/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply from subdir of .git dir' ' | 
 | 	cp postimage expected && | 
 | 	cp preimage .git/file && | 
 | 	cp preimage .git/objects/file && | 
 | 	( | 
 | 		cd .git/objects && | 
 | 		git apply "$patch" | 
 | 	) && | 
 | 	test_cmp expected .git/objects/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply --cached from .git dir' ' | 
 | 	cp postimage expected && | 
 | 	cp other expected.working && | 
 | 	cp other .git/file && | 
 | 	reset_subdir preimage other && | 
 | 	( | 
 | 		cd .git && | 
 | 		git apply --cached "$patch" | 
 | 	) && | 
 | 	git show :file >actual && | 
 | 	test_cmp expected actual && | 
 | 	test_cmp expected.working file && | 
 | 	test_cmp expected.working .git/file | 
 | ' | 
 |  | 
 | test_expect_success 'apply --cached from subdir of .git dir' ' | 
 | 	cp postimage expected && | 
 | 	cp preimage expected.subdir && | 
 | 	cp other .git/file && | 
 | 	cp other .git/objects/file && | 
 | 	reset_subdir preimage other && | 
 | 	( | 
 | 		cd .git/objects && | 
 | 		git apply --cached "$patch" | 
 | 	) && | 
 | 	git show :file >actual && | 
 | 	git show :objects/file >actual.subdir && | 
 | 	test_cmp expected actual && | 
 | 	test_cmp expected.subdir actual.subdir | 
 | ' | 
 |  | 
 | test_done |