From: Eric Sunshine <sunshine@sunshineco.com>
To: Phillip Wood <phillip.wood@dunelm.org.uk>
Cc: Git Mailing List <git@vger.kernel.org>,
Rafael Silva <rafaeloliveira.cs@gmail.com>
Subject: Re: [PATCH] worktree: add -z option for list subcommand
Date: Wed, 6 Jan 2021 22:34:10 -0500 [thread overview]
Message-ID: <CAPig+cT-9sjmkdWFEcFS=rg9ziV9b6uWNMpQ8BTYP-a258La6Q@mail.gmail.com> (raw)
In-Reply-To: <20210105110219.99610-1-phillip.wood123@gmail.com>
On Tue, Jan 5, 2021 at 6:02 AM Phillip Wood <phillip.wood123@gmail.com> wrote:
> Add a -z option to be used in conjunction with --porcelain that gives
> NUL-terminated output. This enables 'worktree list --porcelain' to
> handle worktree paths that contain newlines.
Adding a -z mode makes a lot of sense. This, along with a fix to call
quote_c_style() on paths in normal (not `-z`) porcelain mode, can
easily be done after Rafael's series lands. Or they could be done
before his series, though that might make a lot of extra work for him.
> Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk>
> ---
> I found an old patch that added NUL termination. I've rebased it
> but the new test fails as there seems to be another worktree thats
> been added since I wrote this, anyway I thought it might be a useful
> start for adding a `-z` option.
The test failure is fallout from a "bug" in a test added by Rafael's
earlier series[1] which was not caught by the reviewer[2]. In fact,
his current series has a drive-by fix[3] for this bug in patch [6/7].
Applying that fix (or the refinement[4] I suggested in my review)
makes your test work.
[1]: https://lore.kernel.org/git/20201011101152.5291-2-rafaeloliveira.cs@gmail.com/
[2]: https://lore.kernel.org/git/CAPig+cS8hvX4GCsnfLBnQ4Q_AkUad=bw7rjVcaOqSEqcLZvx8w@mail.gmail.com/
[3]: https://lore.kernel.org/git/20210104162128.95281-7-rafaeloliveira.cs@gmail.com/
[4]: https://lore.kernel.org/git/CAPig+cRysXpK0e1xXOuVd+EtkeyTk8FR6MUrL=Bg3W4ve8jdNA@mail.gmail.com/
> diff --git a/Documentation/git-worktree.txt b/Documentation/git-worktree.txt
> @@ -217,7 +217,13 @@ This can also be set up as the default behaviour by using the
> +-z::
> + When `--porcelain` is specified with `list` terminate each line with a
> + NUL rather than a newline. This makes it possible to parse the output
> + when a worktree path contains a newline character.
If we fix normal-mode porcelain to call quote_c_style(), then we can
drop the last sentence or refine it to say something along the lines
of it being easier to deal with paths with embedded newlines than in
normal porcelain mode.
> diff --git a/builtin/worktree.c b/builtin/worktree.c
> @@ -640,19 +640,25 @@ static int add(int ac, const char **av, const char *prefix)
> +static void show_worktree_porcelain(struct worktree *wt, int line_terminator)
> {
> + printf("worktree %s", wt->path);
> + fputc(line_terminator, stdout);
> + if (wt->is_bare) {
> + printf("bare");
> + fputc(line_terminator, stdout);
> + } else {
> + printf("HEAD %s", oid_to_hex(&wt->head_oid));
> + fputc(line_terminator, stdout);
> + if (wt->is_detached) {
> + printf("detached");
> + fputc(line_terminator, stdout);
> + } else if (wt->head_ref) {
> + printf("branch %s", wt->head_ref);
> + fputc(line_terminator, stdout);
> + }
Perhaps this could all be done a bit more concisely with printf()
alone rather than combining it with fputc(). For instance:
printf("worktree %s%c", wt->path, line_terminator);
and so on.
> - printf("\n");
> + fputc(line_terminator, stdout);
This use of fputc() makes sense.
> @@ -720,15 +726,20 @@ static void pathsort(struct worktree **wt)
> static int list(int ac, const char **av, const char *prefix)
> {
> + OPT_SET_INT('z', NULL, &line_terminator,
> + N_("fields are separated with NUL character"), '\0'),
"fields" sounds a little odd. "lines" might make more sense. "records"
might be even better and matches the wording of some other Git
commands accepting `-z`.
> + else if (!line_terminator && !porcelain)
> + die(_("'-z' requires '--porcelain'"));
Other error messages in this file don't quote command-line options, so:
die(_("-z requires --porcelain"));
would be more consistent.
> diff --git a/t/t2402-worktree-list.sh b/t/t2402-worktree-list.sh
> @@ -71,6 +71,28 @@ test_expect_success '"list" all worktrees with locked annotation' '
> +test_expect_success '"list" all worktrees --porcelain -z' '
> + test_when_finished "rm -rf here _actual actual expect &&
> + git worktree prune" &&
> + printf "worktree %sQHEAD %sQbranch %sQQ" \
> + "$(git rev-parse --show-toplevel)" \
> + "$(git rev-parse HEAD)" \
> + "$(git symbolic-ref HEAD)" >expect &&
> + git worktree add --detach here master &&
> + printf "worktree %sQHEAD %sQdetachedQQ" \
> + "$(git -C here rev-parse --show-toplevel)" \
> + "$(git rev-parse HEAD)" >>expect &&
> + git worktree list --porcelain -z >_actual &&
> + cat _actual | tr "\0" Q >actual &&
Or just use nul_to_q():
nul_to_q <_actual >actual &&
(And there's no need to `cat` the file.)
> + test_cmp expect actual
> +'
> +
> +test_expect_success '"list" -z fails without --porcelain' '
> + test_when_finished "rm -rf here && git worktree prune" &&
> + git worktree add --detach here master &&
> + test_must_fail git worktree list -z
> +'
I don't think there's any need for this test to create (and cleanup) a
worktree. So, the entire test could collapse to:
test_expect_success '"list" -z fails without --porcelain' '
test_must_fail git worktree list -z
'
next prev parent reply other threads:[~2021-01-07 3:35 UTC|newest]
Thread overview: 98+ 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
2021-01-05 11:02 ` [PATCH] worktree: add -z option for list subcommand Phillip Wood
2021-01-07 3:34 ` Eric Sunshine [this message]
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
-- strict thread matches above, loose matches on Subject: below --
2022-02-25 15:08 [PATCH] worktree: add -z option for list subcommand Phillip Wood via GitGitGadget
2022-02-25 17:59 ` Junio C Hamano
2022-02-28 8:35 ` Eric Sunshine
2022-02-28 16:10 ` Phillip Wood
2022-02-28 17:16 ` Junio C Hamano
2022-02-28 16:00 ` Phillip Wood
2022-02-28 8:16 ` Eric Sunshine
2022-02-28 11:08 ` Phillip Wood
2022-02-28 9:47 ` Jean-Noël Avila
2022-02-28 10:57 ` Phillip Wood
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='CAPig+cT-9sjmkdWFEcFS=rg9ziV9b6uWNMpQ8BTYP-a258La6Q@mail.gmail.com' \
--to=sunshine@sunshineco.com \
--cc=git@vger.kernel.org \
--cc=phillip.wood@dunelm.org.uk \
--cc=rafaeloliveira.cs@gmail.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).