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

[PATCH] Turn off pathspec magic on "{checkout,reset,add} -p" on native Windows builds

From
Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Date
Sep 1, 2013, 02:08 UTC
Message-ID
<1378001284-18426-1-git-send-email-pclouds@gmail.com>
In-Reply-To
<521EF02A.2020300@viscovery.net>

git-add--interactive.perl rejects arguments with colons in 21e9757 (Hack git-add--interactive to make it work with ActiveState Perl - 2007-08-01). Pathspec magic starts with a colon, so it won't work if these pathspecs are passed to git-add--interactive.perl running with ActiveState Perl. Make sure we only pass plain paths in this case.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
---
 Johannes, can you check the test suite passes for you with this
 patch? I assume that Cygwin Perl behaves differently and does not hit
 this limit. So I keep the special case to GIT_WINDOWS_NATIVE only.
 I'll resend the patch with a few others on the same topic if it works
 for you.
 builtin/add.c      | 13 +++++++++++++
 builtin/checkout.c | 23 ++++++++++++++++++++---
 builtin/reset.c    | 24 ++++++++++++++++++++----
 3 files changed, 53 insertions(+), 7 deletions(-)
diff --git a/builtin/add.c b/builtin/add.c
index 9d52fc7..3402239 100644
--- a/builtin/add.c
+++ b/builtin/add.c
@@ -270,6 +270,18 @@ int interactive_add(int argc, const char **argv, const char *prefix, int patch)
 {
 	struct pathspec pathspec;
 
+#ifdef GIT_WINDOWS_NATIVE
+	/*
+	 * Pathspec magic is completely turned off on native Windows
+	 * builds because git-add-interactive.perl won't accept
+	 * arguments with colons in them. :/foo is an exception
+	 * because no colons remain after parsing.
+	 */
+	parse_pathspec(&pathspec, PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
+		       PATHSPEC_PREFER_FULL |
+		       PATHSPEC_SYMLINK_LEADING_PATH,
+		       prefix, argv);
+#else
 	/*
 	 * git-add--interactive itself does not parse pathspec. It
 	 * simply passes the pathspec to other builtin commands. Let's
@@ -281,6 +293,7 @@ int interactive_add(int argc, const char **argv, const char *prefix, int patch)
 		       PATHSPEC_SYMLINK_LEADING_PATH |
 		       PATHSPEC_PREFIX_ORIGIN,
 		       prefix, argv);
+#endif
 
 	return run_add_interactive(NULL,
 				   patch ? "--patch" : NULL,
diff --git a/builtin/checkout.c b/builtin/checkout.c
index 7ea1100..e12330f 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -1156,9 +1156,26 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
 		 * cannot handle. Magic mask is pretty safe to be
 		 * lifted for new magic when opts.patch_mode == 0.
 		 */
-		parse_pathspec(&opts.pathspec, 0,
-			       opts.patch_mode ? PATHSPEC_PREFIX_ORIGIN : 0,
-			       prefix, argv);
+		if (opts.patch_mode) {
+#ifdef GIT_WINDOWS_NATIVE
+			/*
+			 * Pathspec magic is completely turned off on
+			 * native Windows builds because
+			 * git-add-interactive.perl won't accept
+			 * arguments with colons in them. :/foo is an
+			 * exception because no colons remain after
+			 * parsing.
+			 */
+			parse_pathspec(&opts.pathspec,
+				       PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
+				       0, prefix, argv);
+#else
+			parse_pathspec(&opts.pathspec, 0,
+				       PATHSPEC_PREFIX_ORIGIN,
+				       prefix, argv);
+#endif
+		} else
+			parse_pathspec(&opts.pathspec, 0, 0, prefix, argv);
 
 		if (!opts.pathspec.nr)
 			die(_("invalid path specification"));
diff --git a/builtin/reset.c b/builtin/reset.c
index 86150d1..65f7390 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -220,10 +220,26 @@ static void parse_args(struct pathspec *pathspec,
 		}
 	}
 	*rev_ret = rev;
-	parse_pathspec(pathspec, 0,
-		       PATHSPEC_PREFER_FULL |
-		       (patch_mode ? PATHSPEC_PREFIX_ORIGIN : 0),
-		       prefix, argv);
+	if (patch_mode) {
+#ifdef GIT_WINDOWS_NATIVE
+		/*
+		 * Pathspec magic is completely turned off on native
+		 * Windows builds because git-add-interactive.perl
+		 * won't accept arguments with colons in them. :/foo
+		 * is an exception because no colons remain after
+		 * parsing.
+		 */
+		parse_pathspec(pathspec,
+			       PATHSPEC_ALL_MAGIC & ~PATHSPEC_FROMTOP,
+			       PATHSPEC_PREFER_FULL, prefix, argv);
+#else
+		parse_pathspec(pathspec, 0,
+			       PATHSPEC_PREFER_FULL | PATHSPEC_PREFIX_ORIGIN,
+			       prefix, argv);
+#endif
+	} else
+		parse_pathspec(pathspec, 0, PATHSPEC_PREFER_FULL,
+			       prefix, argv);
 }
 
 static int update_refs(const char *rev, const unsigned char *sha1)
-- 
1.8.2.83.gc99314b
Previous: Alex RiesenNext: Johannes Sixt
Message 4 of 10 in “nd/magic-pathspec exposes breakage in git-add--interactive on Windows”
  1. Johannes SixtAug 29, 2013
  2. Duy NguyenAug 29, 2013
  3. Alex RiesenAug 29, 2013
  4. Turn off pathspec magic on "{checkout,reset,add} -p" on native Windows buildsNguyễn Thái Ngọc Duy, Sep 1, 2013
  5. Johannes SixtSep 2, 2013
  6. Duy NguyenSep 2, 2013
  7. Johannes SixtSep 2, 2013
  8. Duy NguyenSep 2, 2013
  9. add--interactive: fix external command invocation on WindowsJohannes Sixt, Sep 4, 2013
  10. Duy NguyenSep 4, 2013

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.