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

[PATCH v2 4/7] quote_path: code clarification

From
Junio C Hamano <gitster@pobox.com>
Date
Sep 10, 2020, 17:01 UTC
Message-ID
<20200910170159.1278781-5-gitster@pobox.com>
In-Reply-To
<20200910170159.1278781-1-gitster@pobox.com>

The implementation we moved from wt-status to enclose a pathname that has a SP in it inside a dq-pair is a bit convoluted. It lets quote_c_style_counted() do its escaping and then

 (1) if the input string got escaped, which is checked by seeing if
     the result begins with a double-quote, declare that we are
     done.  If there wasn't any SP in the input, that is OK, and if
     there was, the result is quoted already so it is OK, too.
 (2) if the input string did not get escaped, and the result has SP
     in it, enclose the whole thing in a dq-pair ourselves.

Instead we can scan the path upfront to see if the input has SP in it. If so, we tell quote_c_style_counted() not to enclose its output in a dq-pair, and we add a dq-pair ourselves. Whether the input had bytes that quote_c_style_counted() uses backslash quoting, this would give us a desired quoted string. If the input does not have SP in it, we just let quote_c_style_counted() do its thing as usual, which would enclose the result in a dq-pair only when needed.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 quote.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)
diff --git a/quote.c b/quote.c
index aa9a37b1b1..b8107cd403 100644
--- a/quote.c
+++ b/quote.c
@@ -356,16 +356,21 @@ char *quote_path(const char *in, const char *prefix, struct strbuf *out, unsigne
 {
 	struct strbuf sb = STRBUF_INIT;
 	const char *rel = relative_path(in, prefix, &sb);
+	int force_dq = ((flags & QUOTE_PATH_QUOTE_SP) && strchr(rel, ' '));
+
 	strbuf_reset(out);
-	quote_c_style_counted(rel, strlen(rel), out, NULL, 0);
-	strbuf_release(&sb);
 
-	if ((flags & QUOTE_PATH_QUOTE_SP) &&
-	    (out->buf[0] != '"' && strchr(out->buf, ' '))) {
-		/* Ensure the whole thing is quoted if the path has SP in it */
-		strbuf_insertstr(out, 0, "\"");
+	/*
+	 * If the caller wants us to enclose the output in a dq-pair
+	 * whether quote_c_style_counted() needs to, we do it ourselves
+	 * and tell quote_c_style_counted() not to.
+	 */
+	if (force_dq)
 		strbuf_addch(out, '"');
-	}
+	quote_c_style_counted(rel, strlen(rel), out, NULL, !!force_dq);
+	if (force_dq)
+		strbuf_addch(out, '"');
+	strbuf_release(&sb);
 
 	return out->buf;
 }
-- 
2.28.0-603-ga98dad7d4d
Previous: Junio C HamanoNext: Jeff King
Message 30 of 41 in “[Bug report] git status doesn't escape paths of untracked files”
  1. Patrick FongSep 8, 2020
  2. Junio C HamanoSep 8, 2020
  3. brian m. carlsonSep 8, 2020
  4. Junio C HamanoSep 8, 2020
  5. Junio C HamanoSep 8, 2020
  6. Junio C HamanoSep 8, 2020
  7. Martin ÅgrenSep 8, 2020
  8. René ScharfeSep 8, 2020
  9. Junio C HamanoSep 9, 2020
  10. René ScharfeSep 10, 2020
  11. Junio C HamanoSep 10, 2020
  12. wt-status: quote paths identically whether tracked or untrackedbrian m. carlson, Sep 8, 2020
  13. 0/6 quote_path() clean-upsJunio C Hamano, Sep 8, 2020
  14. 2/6 quote_path: give flags parameter to quote_path()Junio C Hamano, Sep 8, 2020
  15. Jeff KingSep 10, 2020
  16. Junio C HamanoSep 10, 2020
  17. Junio C HamanoSep 10, 2020
  18. Jeff KingSep 10, 2020
  19. 3/6 quote_path: optionally allow quoting a path with SP in itJunio C Hamano, Sep 8, 2020
  20. Jeff KingSep 10, 2020
  21. 4/6 wt-status: consistently quote paths in "status --short" outputJunio C Hamano, Sep 8, 2020
  22. 1/6 quote_path: rename quote_path_relative() to quote_path()Junio C Hamano, Sep 8, 2020
  23. 6/6 quote: turn 'nodq' parameter into a set of flagsJunio C Hamano, Sep 8, 2020
  24. Jeff KingSep 10, 2020
  25. 5/6 quote: rename misnamed sq_lookup[] to cq_lookup[]Junio C Hamano, Sep 8, 2020
  26. Chris TorekSep 8, 2020
  27. Jeff KingSep 10, 2020
  28. 0/7 quote_path() clean-upsJunio C Hamano, Sep 10, 2020
  29. 1/7 quote_path: rename quote_path_relative() to quote_path()Junio C Hamano, Sep 10, 2020
  30. 4/7 quote_path: code clarificationJunio C Hamano, Sep 10, 2020
  31. Jeff KingSep 10, 2020
  32. Junio C HamanoSep 10, 2020
  33. Jeff KingSep 10, 2020
  34. 7/7 quote: turn 'nodq' parameter into a set of flagsJunio C Hamano, Sep 10, 2020
  35. 5/7 wt-status: consistently quote paths in "status --short" outputJunio C Hamano, Sep 10, 2020
  36. Jeff KingSep 10, 2020
  37. Junio C HamanoSep 10, 2020
  38. 2/7 quote_path: give flags parameter to quote_path()Junio C Hamano, Sep 10, 2020
  39. 3/7 quote_path: optionally allow quoting a path with SP in itJunio C Hamano, Sep 10, 2020
  40. 6/7 quote: rename misnamed sq_lookup[] to cq_lookup[]Junio C Hamano, Sep 10, 2020
  41. brian m. carlsonSep 10, 2020

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.