]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'jc/apply-parse-diff-git-header-names-fix'
authorJunio C Hamano <gitster@pobox.com>
Tue, 9 Apr 2024 21:31:43 +0000 (14:31 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 9 Apr 2024 21:31:43 +0000 (14:31 -0700)
"git apply" failed to extract the filename the patch applied to,
when the change was about an empty file created in or deleted from
a directory whose name ends with a SP, which has been corrected.

* jc/apply-parse-diff-git-header-names-fix:
  t4126: fix "funny directory name" test on Windows (again)
  t4126: make sure a directory with SP at the end is usable
  apply: parse names out of "diff --git" more carefully

apply.c
t/t4126-apply-empty.sh

diff --git a/apply.c b/apply.c
index 432837a674c3cc559f762aa4b7766bd8f43177e0..e311013bc434dbec6612fa07b1d5c9e4d7979b74 100644 (file)
--- a/apply.c
+++ b/apply.c
@@ -1292,8 +1292,15 @@ static char *git_header_name(int p_value,
                                return NULL; /* no postimage name */
                        second = skip_tree_prefix(p_value, name + len + 1,
                                                  line_len - (len + 1));
+                       /*
+                        * If we are at the SP at the end of a directory,
+                        * skip_tree_prefix() may return NULL as that makes
+                        * it appears as if we have an absolute path.
+                        * Keep going to find another SP.
+                        */
                        if (!second)
-                               return NULL;
+                               continue;
+
                        /*
                         * Does len bytes starting at "name" and "second"
                         * (that are separated by one HT or SP we just
index ece9fae207dbdbcc28a4ac999a351bd059c0968a..56210b5609919dbd625cfe12c49ab7e858534896 100755 (executable)
@@ -66,4 +66,28 @@ test_expect_success 'apply --index create' '
        git diff --exit-code
 '
 
+test_expect_success !MINGW 'apply with no-contents and a funny pathname' '
+       test_when_finished "rm -fr \"funny \"; git reset --hard" &&
+
+       mkdir "funny " &&
+       >"funny /empty" &&
+       git add "funny /empty" &&
+       git diff HEAD -- "funny /" >sample.patch &&
+       git diff -R HEAD -- "funny /" >elpmas.patch &&
+
+       git reset --hard &&
+
+       git apply --stat --check --apply sample.patch &&
+       test_must_be_empty "funny /empty" &&
+
+       git apply --stat --check --apply elpmas.patch &&
+       test_path_is_missing "funny /empty" &&
+
+       git apply -R --stat --check --apply elpmas.patch &&
+       test_must_be_empty "funny /empty" &&
+
+       git apply -R --stat --check --apply sample.patch &&
+       test_path_is_missing "funny /empty"
+'
+
 test_done