Re: [PATCH] apply: handle filenames with double slashes better

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

Re: [PATCH] apply: handle filenames with double slashes better

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:46:48

Michal Marek [off-list ref] writes:
I tried this, but I'm not sure it's better now (and there might be some
inconsistencies left). IMHO removing the double slashes is an operation
similar to the unquoting done in find_name(), i.e. converting the text
in the patch to something that can be passed to lstat() or
cache_name_lookup().
Ok, you convinced me.

Let's take your first patch with just the s/canon_name/squash_slash/
change.

Thanks.

Re: [PATCH] apply: handle filenames with double slashes better

From: Michal Marek <hidden>
Date: 2016-06-15 22:46:49

On Thu, May 21, 2009 at 12:22:16PM -0700, Junio C Hamano wrote:
Let's take your first patch with just the s/canon_name/squash_slash/
change.
Sorry for the delay, Here's hopefully the final patch:

Collapse double slashes to make patches like this work with --index or
--cached:

git apply --index <<-EOF
	--- a/perl//Git.pm
	+++ b/perl//Git.pm
	@@ -1358,3 +1358,4 @@

	 1; # Famous last words
	+# test
EOF

Signed-off-by: Michal Marek <redacted>
---
 builtin-apply.c |   28 ++++++++++++++++++++++------
 1 files changed, 22 insertions(+), 6 deletions(-)
diff --git a/builtin-apply.c b/builtin-apply.c
index 8a3771e..10fefa0 100644
--- a/builtin-apply.c
+++ b/builtin-apply.c
@@ -320,6 +320,22 @@ static int name_terminate(const char *name, int namelen, int c, int terminate)
 	return 1;
 }
 
+/* remove double slashes to make --index work with such filenames */
+static char *squash_slash(char *name)
+{
+	int i = 0, j = 0;
+
+	if (!name)
+		return name;
+	while (name[i]) {
+		if ((name[j++] = name[i++]) == '/')
+			while (name[i] == '/')
+				i++;
+	}
+	name[j] = '\0';
+	return name;
+}
+
 static char *find_name(const char *line, char *def, int p_value, int terminate)
 {
 	int len;
@@ -349,7 +365,7 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
 				free(def);
 				if (root)
 					strbuf_insert(&name, 0, root, root_len);
-				return strbuf_detach(&name, NULL);
+				return squash_slash(strbuf_detach(&name, NULL));
 			}
 		}
 		strbuf_release(&name);
@@ -369,10 +385,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
 			start = line;
 	}
 	if (!start)
-		return def;
+		return squash_slash(def);
 	len = line - start;
 	if (!len)
-		return def;
+		return squash_slash(def);
 
 	/*
 	 * Generally we prefer the shorter name, especially
@@ -383,7 +399,7 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
 	if (def) {
 		int deflen = strlen(def);
 		if (deflen < len && !strncmp(start, def, deflen))
-			return def;
+			return squash_slash(def);
 		free(def);
 	}
 
@@ -392,10 +408,10 @@ static char *find_name(const char *line, char *def, int p_value, int terminate)
 		strcpy(ret, root);
 		memcpy(ret + root_len, start, len);
 		ret[root_len + len] = '\0';
-		return ret;
+		return squash_slash(ret);
 	}
 
-	return xmemdupz(start, len);
+	return squash_slash(xmemdupz(start, len));
 }
 
 static int count_slashes(const char *cp)
-- 
1.6.3
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help