| #!/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 |