All of lore.kernel.org
 help / color / mirror / Atom feed
From: ZheNing Hu <adlternative@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com>,
	"Git List" <git@vger.kernel.org>,
	"Christian Couder" <christian.couder@gmail.com>,
	"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
	"Phillip Wood" <phillip.wood123@gmail.com>,
	"Torsten Bögershausen" <tboegi@web.de>
Subject: Re: [PATCH v6] ls-files: introduce "--format" option
Date: Tue, 12 Jul 2022 21:53:57 +0800	[thread overview]
Message-ID: <CAOLTT8RSo83ZBXbT_MLigD946_xHjnX-aS76D_K7=ScbMR=nYw@mail.gmail.com> (raw)
In-Reply-To: <xmqqleszl2p0.fsf@gitster.g>

Junio C Hamano <gitster@pobox.com> 于2022年7月12日周二 06:11写道:
>
> "ZheNing Hu via GitGitGadget" <gitgitgadget@gmail.com> writes:
>
> > From: ZheNing Hu <adlternative@gmail.com>
> >
> > Add a new option --format that output index enties ...
>
> Let's quote the options and use the Oxford comma.
>
>     ls-files: introduce "--format" option
>
>     Add a new option "--format" that outputs index entries in a
>     custom format, taking inspiration from the option with the same
>     name in the `git ls-tree` command.
>
>     "--format" cannot used with "-s", "-o", "-k", "-t", "--resolve-undo",
>     "--deduplicate", and "--eol".
>
> > +It is possible to print in a custom format by using the `--format`
> > +option, which is able to interpolate different fields using
>
> So we use the term "field" to mean different piece of information we
> can present.  The definition of what fields are available come later
> and the presentation order is a bit awkward, but hopefully the text
> is understandable as-is.
>

OK.

> > +a `%(fieldname)` notation. For example, if you only care about the
> > +"objectname" and "path" fields, you can execute with a specific
> > +"--format" like
> > +
> > +     git ls-files --format='%(objectname) %(path)'
>
> And the example makes it pretty clear.  OK.
>
> > +FIELD NAMES
> > +-----------
> > +Various values from structured fields can be used to interpolate
>
> Are we dealing with unstructured fields, too?  If not, let's drop
> "structured".
>

OK (copy from git-ls-tree.txt too)

> > +into the resulting output. For each outputting line, the following
> > +names can be used:
>
> "outputting line" sounds like a non language.
>
>
>     The way each path is shown can be customized by using the
>     `--format=<format>` option, where the %(fieldname) in the
>     <format> string for various aspects of the index entry are
>     interpolated.  The following "fieldname" are understood:
>
> perhaps?
>

This will indeed be better.

> > +{
> > +     struct show_index_data *data = context;
> > +     const char *end;
> > +     const char *p;
> > +     size_t len = strbuf_expand_literal_cb(sb, start, NULL);
> > +     struct stat st;
> > +
> > +     if (len)
> > +             return len;
> > +     if (*start != '(')
> > +             die(_("bad ls-files format: element '%s' "
> > +                   "does not start with '('"), start);
> > +
> > +     end = strchr(start + 1, ')');
> > +     if (!end)
> > +             die(_("bad ls-files format: element '%s'"
> > +                   "does not end in ')'"), start);
> > +
> > +     len = end - start + 1;
> > +     if (skip_prefix(start, "(objectmode)", &p))
>
>
> Using skip_prefix() not for the purpose of skipping (notice that
> nobody uses p at all) is ugly.  We already computed start and end
> (hence the length), so we should be able to do much better than
> this.
>

Agree. I check the parsing format part of ref-filter.c, we just need to find the
atom's begin pos and end pos, then we can use memcmp() to know what's the
type of atom.

> But let's let it pass, as it was copy-pasted from existing code in
> ls-tree.c::expand_show_tree().
>

Yeah, maybe we can optimize it later.

> > +     else if (skip_prefix(start, "(eolinfo:index)", &p) &&
> > +              S_ISREG(data->ce->ce_mode))
> > +             strbuf_addstr(sb, get_cached_convert_stats_ascii(data->istate,
> > +                                                              data->ce->name));
>
> This is outright wrong, isn't it?
>
> It is unlikely to see such a trivial error in the 6th round of a
> series after other reviewers looked at it many times, so perhaps I
> am missing something?  Or perhaps this is a new code added in this
> round.
>
> If you ask for %(eolinfo:index) for an index entry that is not a
> regular file, this "else if" will not trigger, and the control will
> eventually fall through to hit "bad ls-files format" but what you
> detected is not a bad format at all.  Once the skip_prefix() hits,
> you should be committed to handle that "field" and never let the
> other choices in this if/elif/ cascade to see it.
>
> It is OK to interpolate %(eolinfo:index) to an empty string for a
> gitlink and a symbolic link, but the right way to do so would
> probably be:
>
>         else if (skip_prefix(start, "(eolinfo:index)", &p) {
>                 if (S_ISREG(data->ce->ce_mode))
>                         strbuf_addstr(...);
>         } else ...
>

Yeah, but we would use "{", "}" again, so just revert this code to v5,
which uses a
 wrap function.

> > +     else if (skip_prefix(start, "(eolinfo:worktree)", &p) &&
> > +              !lstat(data->pathname, &st) && S_ISREG(st.st_mode))
> > +             strbuf_addstr(sb, get_wt_convert_stats_ascii(data->pathname));
>
> Likewise.
>
> > +test_expect_success 'setup' '
> > +     echo o1 >o1 &&
> > +     echo o2 >o2 &&
> > +     git add o1 o2 &&
> > +     git add --chmod +x o1 &&
> > +     git commit -m base
> > +'
>
> Apparently, this set-up is too trivial to uncover the above bug that
> can be spotted in 10 seconds of staring at the code.  Perhaps add a
> symbolic link (use "git update-index --cacheinfo" and you do not
> have to worry about Windows), a subdirectory and a submodule?
>

Ah, Just looking at the c code, I took a long time (more than 10 minutes) to
find out where the mistake was. But yeah, use a subdirectory can quickly
meet the error,  so I need to add more cases here.

Thanks for your review.

ZheNing Hu

  reply	other threads:[~2022-07-12 13:54 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-15 13:45 [PATCH 0/2] ls-files: introduce "--format" and "--object-only" options ZheNing Hu via GitGitGadget
2022-06-15 13:45 ` [PATCH 1/2] ls-files: introduce "--format" option ZheNing Hu via GitGitGadget
2022-06-15 20:07   ` Ævar Arnfjörð Bjarmason
2022-06-18 10:50     ` ZheNing Hu
2022-06-15 13:45 ` [PATCH 2/2] ls-files: introduce "--object-only" option ZheNing Hu via GitGitGadget
2022-06-15 20:15   ` Ævar Arnfjörð Bjarmason
2022-06-18 10:59     ` ZheNing Hu
2022-06-19  9:13 ` [PATCH v2] ls-files: introduce "--format" option ZheNing Hu via GitGitGadget
2022-06-19 13:50   ` Phillip Wood
2022-06-20 13:32     ` ZheNing Hu
2022-06-21  2:05   ` [PATCH v3] " ZheNing Hu via GitGitGadget
2022-06-23 14:06     ` Phillip Wood
2022-06-23 15:57       ` Junio C Hamano
2022-06-24 10:16         ` Phillip Wood
2022-06-26 13:05           ` ZheNing Hu
2022-06-24 13:20         ` Ævar Arnfjörð Bjarmason
2022-06-24 15:28           ` Junio C Hamano
2022-06-26 13:01       ` ZheNing Hu
2022-06-24 13:25     ` Ævar Arnfjörð Bjarmason
2022-06-24 15:33       ` Junio C Hamano
2022-06-26 13:35         ` ZheNing Hu
2022-06-27  8:22           ` Junio C Hamano
2022-06-27 11:06             ` ZheNing Hu
2022-06-27 15:41               ` Junio C Hamano
2022-07-01 13:30                 ` ZheNing Hu
2022-06-26 13:34       ` ZheNing Hu
2022-06-26 15:29     ` [PATCH v4] " ZheNing Hu via GitGitGadget
2022-06-27  8:32       ` Junio C Hamano
2022-06-27 11:18         ` ZheNing Hu
2022-06-27 18:34       ` Ævar Arnfjörð Bjarmason
2022-07-01 12:42         ` ZheNing Hu
2022-06-28 15:19       ` Phillip Wood
2022-07-01 12:47         ` ZheNing Hu
2022-07-05  6:32       ` [PATCH v5] " ZheNing Hu via GitGitGadget
2022-07-05  8:39         ` Ævar Arnfjörð Bjarmason
2022-07-11 15:14           ` ZheNing Hu
2022-07-05 19:28         ` Torsten Bögershausen
2022-07-11 15:27           ` ZheNing Hu
2022-07-11 16:53         ` [PATCH v6] " ZheNing Hu via GitGitGadget
2022-07-11 22:11           ` Junio C Hamano
2022-07-12 13:53             ` ZheNing Hu [this message]
2022-07-12 14:34               ` Junio C Hamano
2022-07-13  6:07           ` [PATCH v7] " ZheNing Hu via GitGitGadget
2022-07-18  8:09             ` Ævar Arnfjörð Bjarmason
2022-07-19 16:19               ` ZheNing Hu
2022-07-19 16:47                 ` Junio C Hamano
2022-07-19 17:21                   ` ZheNing Hu
2022-07-20 16:36             ` [PATCH v8] " ZheNing Hu via GitGitGadget
2022-07-20 17:37               ` Junio C Hamano
2022-07-21 15:54                 ` Ævar Arnfjörð Bjarmason
2022-07-21 17:22                   ` Eric Sunshine
2022-07-21 17:23                   ` Junio C Hamano
2022-07-22  6:44                 ` ZheNing Hu
2022-07-23 18:40                   ` Junio C Hamano
2022-07-23 18:46                     ` Junio C Hamano
2022-07-24 11:08                     ` ZheNing Hu
2022-07-25  1:03                       ` Junio C Hamano
2022-07-25 11:00                         ` ZheNing Hu
2022-07-23  6:44               ` [PATCH v9] " ZheNing Hu via GitGitGadget
2022-09-08  2:01                 ` Jiang Xin
2022-09-11 11:01                   ` ZheNing Hu

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='CAOLTT8RSo83ZBXbT_MLigD946_xHjnX-aS76D_K7=ScbMR=nYw@mail.gmail.com' \
    --to=adlternative@gmail.com \
    --cc=avarab@gmail.com \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitgitgadget@gmail.com \
    --cc=gitster@pobox.com \
    --cc=phillip.wood123@gmail.com \
    --cc=tboegi@web.de \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.