1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-04-27 19:55:09 +02:00

quote_path: code clarification

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>
This commit is contained in:
Junio C Hamano 2020-09-10 10:01:56 -07:00
parent f3fc4a1b86
commit e2773aa45f

21
quote.c
View File

@ -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);
strbuf_reset(out);
quote_c_style_counted(rel, strlen(rel), out, NULL, 0);
strbuf_release(&sb);
int force_dq = ((flags & QUOTE_PATH_QUOTE_SP) && strchr(rel, ' '));
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, "\"");
strbuf_reset(out);
/*
* 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;
}