git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Honor -p<n> when applying git diffs

From
Shawn O. Pearce <spearce@spearce.org>
Date
Apr 4, 2007, 15:19 UTC
Message-ID
<20070404151914.GA4910@spearce.org>

If the user is trying to apply a Git generated diff file and they have specified a -p<n> option, where <n> is not 1, the user probably has a good reason for doing this. Such as they are me, trying to apply a patch generated in git.git for the git-gui subdirectory to the git-gui.git repository, where there is no git-gui subdirectory present.

Users shouldn't supply -p2 unless they mean it. But if they are supplying it, they probably have thought about how to make this patch apply to their working directory, and want to risk whatever results may come from that.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 builtin-apply.c       |    4 ++--
 t/t4120-apply-popt.sh |   25 +++++++++++++++++++++++++
 2 files changed, 27 insertions(+), 2 deletions(-)
 create mode 100755 t/t4120-apply-popt.sh
diff --git a/builtin-apply.c b/builtin-apply.c
index 27a182b..a5d6126 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -417,7 +417,7 @@ static int gitdiff_hdrend(const char *line, struct patch *patch)
 static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name, const char *oldnew)
 {
 	if (!orig_name && !isnull)
-		return find_name(line, NULL, 1, TERM_TAB);
+		return find_name(line, NULL, p_value, TERM_TAB);
 
 	if (orig_name) {
 		int len;
@@ -427,7 +427,7 @@ static char *gitdiff_verify_name(const char *line, int isnull, char *orig_name,
 		len = strlen(name);
 		if (isnull)
 			die("git-apply: bad git-diff - expected /dev/null, got %s on line %d", name, linenr);
-		another = find_name(line, NULL, 1, TERM_TAB);
+		another = find_name(line, NULL, p_value, TERM_TAB);
 		if (!another || memcmp(another, name, len))
 			die("git-apply: bad git-diff - inconsistent %s filename on line %d", oldnew, linenr);
 		free(another);
diff --git a/t/t4120-apply-popt.sh b/t/t4120-apply-popt.sh
new file mode 100755
index 0000000..2f672f3
--- /dev/null
+++ b/t/t4120-apply-popt.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Copyright (c) 2007 Shawn O. Pearce
+#
+
+test_description='git-apply -p handling.'
+
+. ./test-lib.sh
+
+test_expect_success setup '
+	mkdir sub &&
+	echo A >sub/file1 &&
+	cp sub/file1 file1 &&
+	git add sub/file1 &&
+	echo B >sub/file1 &&
+	git diff >patch.file &&
+	rm sub/file1 &&
+	rmdir sub
+'
+
+test_expect_success 'apply git diff with -p2' '
+	git apply -p2 patch.file
+'
+
+test_done
-- 
1.5.1.rc3.672.gf5329
Next: Junio C Hamano
Message 1 of 2 in “Honor -p<n> when applying git diffs”
  1. Honor -p<n> when applying git diffsShawn O. Pearce, Apr 4, 2007
  2. Junio C HamanoApr 5, 2007

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.