git/t/t4111-apply-subdir.sh
Thomas Rast 212eb96a96 apply: carefully strdup a possibly-NULL name
2901bbe (apply: free patch->{def,old,new}_name fields, 2012-03-21)
cleaned up the memory management of filenames in the patches, but
forgot that find_name_traditional() can return NULL as a way of saying
"I couldn't find a name".

That NULL unfortunately gets passed into xstrdup() next, resulting in
a segfault.  Use null_strdup() so as to safely propagate the null,
which will let us emit the correct error message.

Reported-by: DevHC on #git
Signed-off-by: Thomas Rast <trast@inf.ethz.ch>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2013-06-21 08:36:07 -07:00

157 lines
3.1 KiB
Bash
Executable File

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