From: Patrick Steinhardt <ps@pks.im>
To: Junio C Hamano <gitster@pobox.com>
Cc: Karthik Nayak <karthik.188@gmail.com>,
Taylor Blau <me@ttaylorr.com>,
git@vger.kernel.org, christian.couder@gmail.com
Subject: Re: [PATCH 2/2] ref-filter: support filtering of operational refs
Date: Wed, 3 Jan 2024 16:50:52 +0100 [thread overview]
Message-ID: <ZZWCXFghtql4i4YE@tanuki> (raw)
In-Reply-To: <xmqqwmsqbhyt.fsf@gitster.g>
[-- Attachment #1: Type: text/plain, Size: 4047 bytes --]
On Wed, Jan 03, 2024 at 06:38:02AM -0800, Junio C Hamano wrote:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
> > The confusion was that I thought Junio was referring to using
> >
> > $ git for-each-ref ""
> >
> > to print all refs under $GIT_DIR, while he was actually talking about
> > "$GIT_DIR/refs/" directory.
>
> I do not think you misunderstood me here, though.
>
> When you have your master branch (refs/heads/master), your v1.0 tag
> (refs/tags/v1.0), and the usual pseudorefs, giving "refs" to "git
> for-each-ref" would yield refs/heads/master and refs/tags/v1.0 but
> not HEAD and others, simply because the pattern "refs" in
>
> $ git for-each-ref "refs"
>
> works as a hierarchy prefix match. You give "refs/heads" and you
> get only your master branch but not tags or HEAD in such a
> repository. As a natural extension to that behaviour, an empty
> string as a hierarchy prefix that matches everything would work
> well: you'd get HEAD, refs/heads/master, and refs/tags/v1.0 as an
> empty prefix would cover all of the hiearchies these three refs (and
> pseudorefs if you had ORIG_HEAD and MERGE_HEAD there) live in.
>
> In any case, it is not a very much interesting to define the syntax
> to tell for-each-ref not to limit itself under "refs/". My point
> was that you do not need a special option for that, as shown above.
I think you're just stating that "it's possible, but not necessarily a
good idea" (let me know if I'm misinterpreting, I'm not quite sure
whether I read this correctly). Anyway, let me add my 2c here, even
though it may ultimately be completely moot.
The downside of an empty prefix is that you wouldn't be able to filter
refs outside of the "refs/" hierarchy in case we'd use the empty prefix.
A better alternative would be to use "/" as an indicator that you want
to list refs outside of "refs/". That'd allow for more flexible queries:
- "/" prints all refs and pseudo refs, even those outside of the
"refs/" hierarchy.
- "/refs" prints your normal refs.
- "/something/else" prints refs in "$GIT_DIR/something/else".
I'm not sure whether it's a better idea than using a flag and I'd assume
that the implementation would be more complex in that case because the
respective backends would need to special-case leading slashes.
So in the end I'm still in the camp that a flag is likely a better idea.
> What is more interesting is what to do with refs that are specific
> to other worktrees, e.g.
>
> $ git rev-parse "worktrees/$name/refs/bisect/bad"
>
> would currently let you peek into (and worse yet, muck with, if you
> really wanted to, with something like "git update-ref") refs that
> should be only visible in another worktree. Should for-each-ref and
> friends learn a way to iterate over them? I have no answer to that
> question.
That's a good question indeed. I could certainly see an argument that
there should be the possibility to list them to get an allcompassing
view of the repository's refs. It's sure going to get more complex like
that though (which is not a good argument not to do this).
Currently, per-worktree refs are implemented as quasi-separate ref
stores (see `get_worktree_ref_store()`), and the reffiles backend will
indeed use completely separate stacks for each worktree. So ultimately
it makes me think that this is higher-level logic that the ref store
backend wouldn't need to be aware of, but that git-for-each-ref(1) or
related commands would need to handle.
So I'm not quite sure whether we should solve all these related problems
at once. If we were to implement these features via a flag then I could
see us using a value-flag with which you can control what exactly should
be included in the listing. So something like:
- `--with-refs=repository` includes all refs of the current
repository.
- `--with-refs=worktrees` includes refs of all worktrees.
I dunno. I feel like I start to overthink this.
Patrick
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-01-03 15:50 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-21 17:07 [RFC 0/2] Initial changes to support printing all refs Karthik Nayak
2023-12-21 17:07 ` [PATCH 1/2] refs: introduce the `refs_single_ref` function Karthik Nayak
2023-12-21 17:07 ` [PATCH 2/2] ref-filter: support filtering of operational refs Karthik Nayak
2023-12-21 20:40 ` Junio C Hamano
2023-12-22 14:05 ` Karthik Nayak
2023-12-26 17:01 ` Junio C Hamano
2024-01-02 15:18 ` Karthik Nayak
2024-01-02 16:49 ` Junio C Hamano
2024-01-02 18:47 ` Taylor Blau
2024-01-03 8:52 ` Patrick Steinhardt
2024-01-03 10:22 ` Karthik Nayak
2024-01-03 14:38 ` Junio C Hamano
2024-01-03 15:50 ` Patrick Steinhardt [this message]
2024-01-03 16:02 ` Junio C Hamano
2024-01-03 16:17 ` Patrick Steinhardt
2024-01-03 17:21 ` Junio C Hamano
2024-01-03 17:36 ` Patrick Steinhardt
2024-01-03 17:59 ` Junio C Hamano
2024-01-03 18:01 ` Patrick Steinhardt
2024-01-04 11:31 ` Karthik Nayak
2024-01-04 23:59 ` Junio C Hamano
2024-01-03 15:45 ` Taylor Blau
2024-01-03 15:52 ` Patrick Steinhardt
2024-01-03 17:00 ` Taylor Blau
2023-12-28 10:34 ` Patrick Steinhardt
2024-01-02 15:23 ` Karthik Nayak
2024-01-02 18:49 ` Taylor Blau
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=ZZWCXFghtql4i4YE@tanuki \
--to=ps@pks.im \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=karthik.188@gmail.com \
--cc=me@ttaylorr.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).