]> git.ipfire.org Git - thirdparty/git.git/commitdiff
quote_path: code clarification
authorJunio C Hamano <gitster@pobox.com>
Thu, 10 Sep 2020 17:01:56 +0000 (10:01 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 10 Sep 2020 20:07:19 +0000 (13:07 -0700)
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

diff --git a/quote.c b/quote.c
index aa9a37b1b1076fdd595bbfdecdf62bd208ce3eba..0b01121192622f915bc23a6f739a15835993d10e 100644 (file)
--- 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;
 }