From: Phillip Wood <phillip.wood123@gmail.com>
To: Rafael Silva <rafaeloliveira.cs@gmail.com>, git@vger.kernel.org
Cc: Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [PATCH 5/7] worktree: `list` escape lock reason in --porcelain
Date: Tue, 5 Jan 2021 10:29:14 +0000 [thread overview]
Message-ID: <428d16e8-fdb8-a587-6a0b-39c6c50eba99@gmail.com> (raw)
In-Reply-To: <20210104162128.95281-6-rafaeloliveira.cs@gmail.com>
Hi Rafael
Thanks for working on this
On 04/01/2021 16:21, Rafael Silva wrote:
> "git worktree list" porcelain format shows one attribute per line, each
> attribute is listed with a label and value separated by a single space.
> If any worktree is locked, a "locked" attribute is listed followed by the
> reason, if available, otherwise only "locked" is shown.
>
> In case the lock reason contains newline characters (i.e: LF or CRLF)
> this will cause the format to break as each line should correspond to
> one attribute. This leads to unwanted behavior, specially as the
> porcelain is intended to be machine-readable. To address this shortcoming
> let's teach "git worktree list" to escape any newline character before
> outputting the locked reason for porcelain format.
As the porcelain output format cannot handle worktree paths that contain
newlines either I think it would be better to add a `-z` flag which uses
NUL termination as we have for many other commands (diff, ls-files etc).
This would fix the problem forever without having to worry about quoting
each time a new field is added.
If you really need to quote the lock reason then please use one of the
path quoting routines (probably quote_c_style() or write_name_quoted())
in quote.c rather than rolling your own - the code below gives the same
output for a string that contains the two characters `\` followed by `n`
as it does for the single character `\n`. People are (hopefully) used to
dequoting our path quoting and there are routines out there to do it (we
have one git Git.pm) using a function in quote.c will allow them to use
those routines here.
Best Wishes
Phillip
> Signed-off-by: Rafael Silva <rafaeloliveira.cs@gmail.com>
> ---
> builtin/worktree.c | 26 +++++++++++++++++++++++---
> 1 file changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> index dedd4089e5..9156ccd67e 100644
> --- a/builtin/worktree.c
> +++ b/builtin/worktree.c
> @@ -567,6 +567,24 @@ static int add(int ac, const char **av, const char *prefix)
> return add_worktree(path, branch, &opts);
> }
>
> +static char *worktree_escape_reason(char *reason)
> +{
> + struct strbuf escaped = STRBUF_INIT;
> + char *r;
> +
> + for (r = reason; *r; r++) {
> + if (*r == '\r' && *(r + 1) && *(r + 1) == '\n') {
> + strbuf_addstr(&escaped, "\\r\\n");
> + r++;
> + } else if (*r == '\n')
> + strbuf_addstr(&escaped, "\\n");
> + else
> + strbuf_addch(&escaped, *r);
> + }
> +
> + return strbuf_detach(&escaped, NULL);
> +}
> +
> static void show_worktree_porcelain(struct worktree *wt)
> {
> printf("worktree %s\n", wt->path);
> @@ -580,9 +598,11 @@ static void show_worktree_porcelain(struct worktree *wt)
> printf("branch %s\n", wt->head_ref);
>
> if (worktree_lock_reason(wt)) {
> - if (*wt->lock_reason)
> - printf("locked %s\n", wt->lock_reason);
> - else
> + if (*wt->lock_reason) {
> + char *reason = worktree_escape_reason(wt->lock_reason);
> + printf("locked %s\n", reason);
> + free(reason);
> + } else
> printf("locked\n");
> }
>
>
next prev parent reply other threads:[~2021-01-05 10:30 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-04 16:21 [PATCH 0/7] teach `worktree list` verbose mode and prunable annotations Rafael Silva
2021-01-04 16:21 ` [PATCH 1/7] worktree: move should_prune_worktree() to worktree.c Rafael Silva
2021-01-06 5:58 ` Eric Sunshine
2021-01-08 7:40 ` Rafael Silva
2021-01-06 6:55 ` Eric Sunshine
2021-01-07 7:24 ` Eric Sunshine
2021-01-08 7:41 ` Rafael Silva
2021-01-04 16:21 ` [PATCH 2/7] worktree: implement worktree_prune_reason() wrapper Rafael Silva
2021-01-06 7:08 ` Eric Sunshine
2021-01-08 7:42 ` Rafael Silva
2021-01-04 16:21 ` [PATCH 3/7] worktree: teach worktree_lock_reason() to gently handle main worktree Rafael Silva
2021-01-06 7:29 ` Eric Sunshine
2021-01-08 7:43 ` Rafael Silva
2021-01-04 16:21 ` [PATCH 4/7] worktree: teach `list` prunable annotation and verbose Rafael Silva
2021-01-06 8:31 ` Eric Sunshine
2021-01-08 7:45 ` Rafael Silva
2021-01-04 16:21 ` [PATCH 5/7] worktree: `list` escape lock reason in --porcelain Rafael Silva
2021-01-05 10:29 ` Phillip Wood [this message]
2021-01-05 11:02 ` [PATCH] worktree: add -z option for list subcommand Phillip Wood
2021-01-07 3:34 ` Eric Sunshine
2021-01-08 10:33 ` Phillip Wood
2021-01-10 7:27 ` Eric Sunshine
2021-01-06 9:07 ` [PATCH 5/7] worktree: `list` escape lock reason in --porcelain Eric Sunshine
2021-01-08 7:47 ` Rafael Silva
2021-01-06 8:59 ` Eric Sunshine
2021-01-04 16:21 ` [PATCH 6/7] worktree: add tests for `list` verbose and annotations Rafael Silva
2021-01-06 9:39 ` Eric Sunshine
2021-01-07 4:09 ` Eric Sunshine
2021-01-08 7:49 ` Rafael Silva
2021-01-04 16:21 ` [PATCH 7/7] worktree: document `list` verbose and prunable annotations Rafael Silva
2021-01-06 9:57 ` Eric Sunshine
2021-01-08 7:49 ` Rafael Silva
2021-01-06 5:36 ` [PATCH 0/7] teach `worktree list` verbose mode " Eric Sunshine
2021-01-08 7:38 ` Rafael Silva
2021-01-08 8:19 ` Eric Sunshine
2021-01-17 23:42 ` [PATCH v2 0/6] " Rafael Silva
2021-01-17 23:42 ` [PATCH v2 1/6] worktree: libify should_prune_worktree() Rafael Silva
2021-01-17 23:42 ` [PATCH v2 2/6] worktree: teach worktree to lazy-load "prunable" reason Rafael Silva
2021-01-18 2:57 ` Eric Sunshine
2021-01-19 7:57 ` Rafael Silva
2021-01-17 23:42 ` [PATCH v2 3/6] worktree: teach worktree_lock_reason() to gently handle main worktree Rafael Silva
2021-01-17 23:42 ` [PATCH v2 4/6] worktree: teach `list --porcelain` to annotate locked worktree Rafael Silva
2021-01-18 3:55 ` Eric Sunshine
2021-01-19 8:20 ` Rafael Silva
2021-01-19 17:16 ` Eric Sunshine
2021-01-17 23:42 ` [PATCH v2 5/6] worktree: teach `list` to annotate prunable worktree Rafael Silva
2021-01-18 4:45 ` Eric Sunshine
2021-01-19 10:26 ` Rafael Silva
2021-01-19 17:23 ` Eric Sunshine
2021-01-17 23:42 ` [PATCH v2 6/6] worktree: teach `list` verbose mode Rafael Silva
2021-01-18 5:15 ` Eric Sunshine
2021-01-18 19:40 ` Eric Sunshine
2021-01-18 5:33 ` [PATCH v2 0/6] teach `worktree list` verbose mode and prunable annotations Eric Sunshine
2021-01-19 16:44 ` Rafael Silva
2021-01-19 21:27 ` [PATCH v3 0/7] " Rafael Silva
2021-01-19 21:27 ` [PATCH v3 1/7] worktree: libify should_prune_worktree() Rafael Silva
2021-01-19 21:27 ` [PATCH v3 2/7] worktree: teach worktree to lazy-load "prunable" reason Rafael Silva
2021-01-19 21:27 ` [PATCH v3 3/7] worktree: teach worktree_lock_reason() to gently handle main worktree Rafael Silva
2021-01-19 21:27 ` [PATCH v3 4/7] t2402: ensure locked worktree is properly cleaned up Rafael Silva
2021-01-24 7:50 ` Eric Sunshine
2021-01-24 10:19 ` Rafael Silva
2021-01-19 21:27 ` [PATCH v3 5/7] worktree: teach `list --porcelain` to annotate locked worktree Rafael Silva
2021-01-20 11:00 ` Phillip Wood
2021-01-21 3:18 ` Junio C Hamano
2021-01-21 15:25 ` Rafael Silva
2021-01-24 8:24 ` Eric Sunshine
2021-01-24 8:10 ` Eric Sunshine
2021-01-24 10:20 ` Rafael Silva
2021-01-19 21:27 ` [PATCH v3 6/7] worktree: teach `list` to annotate prunable worktree Rafael Silva
2021-01-21 3:28 ` Junio C Hamano
2021-01-21 15:09 ` Rafael Silva
2021-01-21 22:18 ` Junio C Hamano
2021-01-19 21:27 ` [PATCH v3 7/7] worktree: teach `list` verbose mode Rafael Silva
2021-01-24 8:42 ` Eric Sunshine
2021-01-24 10:21 ` Rafael Silva
2021-01-24 8:51 ` [PATCH v3 0/7] teach `worktree list` verbose mode and prunable annotations Eric Sunshine
2021-01-27 8:08 ` Rafael Silva
2021-01-27 8:03 ` Rafael Silva
2021-01-27 8:03 ` [PATCH v4 1/7] worktree: libify should_prune_worktree() Rafael Silva
2021-01-27 8:03 ` [PATCH v4 2/7] worktree: teach worktree to lazy-load "prunable" reason Rafael Silva
2021-01-27 8:03 ` [PATCH v4 3/7] worktree: teach worktree_lock_reason() to gently handle main worktree Rafael Silva
2021-01-27 8:03 ` [PATCH v4 4/7] t2402: ensure locked worktree is properly cleaned up Rafael Silva
2021-01-27 8:03 ` [PATCH v4 5/7] worktree: teach `list --porcelain` to annotate locked worktree Rafael Silva
2021-01-27 8:03 ` [PATCH v4 6/7] worktree: teach `list` to annotate prunable worktree Rafael Silva
2021-01-27 8:03 ` [PATCH v4 7/7] worktree: teach `list` verbose mode Rafael Silva
2021-01-30 7:04 ` [PATCH v3 0/7] teach `worktree list` verbose mode and prunable annotations Eric Sunshine
2021-01-30 9:42 ` Rafael Silva
2021-01-30 17:50 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=428d16e8-fdb8-a587-6a0b-39c6c50eba99@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=git@vger.kernel.org \
--cc=phillip.wood@dunelm.org.uk \
--cc=rafaeloliveira.cs@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).