git apply --directory broken for new files

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

git apply --directory broken for new files

From: "H. Peter Anvin" <hpa@zytor.com>
Date: 2016-06-15 22:45:24

Trying with git 1.6.0.1:

: tazenda 124 ; git apply --directory=gpxe/ < /tmp/diff
fatal: git-apply: bad git-diff - inconsistent new filename on line 105

Line 105 in the diff is:

    101  diff --git a/src/arch/i386/firmware/pcbios/fakee820.c 
b/src/arch/i386/firmware/pcbios/fakee820.c
    102  new file mode 100644
    103  index 0000000..e171edf
    104  --- /dev/null
    105  +++ b/src/arch/i386/firmware/pcbios/fakee820.c

What I'm trying to do here is to apply a diff created via "git diff" to 
a subdirectory of another git repository.

	-hpa

Re: git apply --directory broken for new files

From: Jeff King <hidden>
Date: 2016-06-15 22:45:24

On Thu, Sep 25, 2008 at 01:41:56PM -0700, H. Peter Anvin wrote:
Trying with git 1.6.0.1:

: tazenda 124 ; git apply --directory=gpxe/ < /tmp/diff
fatal: git-apply: bad git-diff - inconsistent new filename on line 105
Hmm. It looks like this is broken for deletion, too. I believe the
problem is just that when sanity checking "diff --git" patches, we
weren't applying the --directory root consistently.

I think this fix is sane, but I would appreciate ACKs from Dscho and
Junio, who wrote the --directory code and the patch sanity checking
code, respectively.

-- >8 --
apply --directory: handle creation and deletion patches

We carefully verify that the input to git-apply is sane,
including cross-checking that the filenames we see in "+++"
headers match what was provided on the command line of "diff
--git". When --directory is used, however, we ended up
comparing the unadorned name to one with the prepended root,
causing us to complain about a mismatch.

We simply need to prepend the root directory, if any, when
pulling the name out of the git header.

Signed-off-by: Jeff King <redacted>
---
 builtin-apply.c       |    7 +++++++
 t/t4128-apply-root.sh |   35 +++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 2ab4aba..f9070d5 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -787,6 +787,13 @@ static char *git_header_name(char *line, int llen)
 					break;
 			}
 			if (second[len] == '\n' && !memcmp(name, second, len)) {
+				if (root) {
+					char *ret = xmalloc(root_len + len + 1);
+					strcpy(ret, root);
+					memcpy(ret + root_len, name, len);
+					ret[root_len + len] = '\0';
+					return ret;
+				}
 				return xmemdupz(name, len);
 			}
 		}
diff --git a/t/t4128-apply-root.sh b/t/t4128-apply-root.sh
index 2dd0c75..bd1bdf1 100755
--- a/t/t4128-apply-root.sh
+++ b/t/t4128-apply-root.sh
@@ -40,4 +40,39 @@ test_expect_success 'apply --directory -p (2) ' '
 
 '
 
+cat > patch << EOF
+diff --git a/newfile b/newfile
+new file mode 100644
+index 0000000..d95f3ad
+--- /dev/null
++++ b/newfile
+@@ -0,0 +1 @@
++content
+EOF
+
+test_expect_success 'apply --directory (new file)' '
+	git reset --hard initial &&
+	git apply --directory=some/sub/dir/ --index patch &&
+	test content = $(git show :some/sub/dir/newfile) &&
+	test content = $(cat some/sub/dir/newfile)
+'
+
+cat > patch << EOF
+diff --git a/delfile b/delfile
+deleted file mode 100644
+index d95f3ad..0000000
+--- a/delfile
++++ /dev/null
+@@ -1 +0,0 @@
+-content
+EOF
+
+test_expect_success 'apply --directory (delete file)' '
+	git reset --hard initial &&
+	echo content >some/sub/dir/delfile &&
+	git add some/sub/dir/delfile &&
+	git apply --directory=some/sub/dir/ --index patch &&
+	! git ls-files | grep delfile
+'
+
 test_done
-- 
1.6.0.2.517.g8be702.dirty
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help