From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, ps@pks.im, phillip.wood123@gmail.com,
Karthik Nayak <karthik.188@gmail.com>
Subject: [PATCH v4 0/5] for-each-ref: add '--include-root-refs' option
Date: Sun, 11 Feb 2024 19:39:18 +0100 [thread overview]
Message-ID: <20240211183923.131278-1-karthik.188@gmail.com> (raw)
In-Reply-To: <20240119142705.139374-1-karthik.188@gmail.com>
This is the forth version of my patch series to print root refs
in git-for-each-ref(1).
With the introduction of the reftable backend, it becomes ever
so important to provide the necessary tooling for printing all refs
associated with a worktree.
While regular refs stored within the "refs/" namespace are currently
supported by multiple commands like git-for-each-ref(1),
git-show-ref(1). Neither support printing root refs within the worktree.
This patch series is a follow up to the RFC/discussion we had earlier on
the list [1].
The first 4 commits add the required functionality to ensure we can print
all refs (regular, pseudo, HEAD). The 5th commit modifies the
git-for-each-ref(1) command to add the "--include-root-refs" command which
will include HEAD and pseudorefs with regular "refs/" refs.
[1]: https://lore.kernel.org/git/20231221170715.110565-1-karthik.188@gmail.com/#t
Changes from v3:
1. Move from using 'git for-each-ref ""' to print root refs to adding
the '--include-root-refs' option for git-for-each-ref(1). This provides better
UX for users.
2. Modify `is_pseudoref()` to use `refs_resolve_ref_unsafe`.
3. Includes reftable-backend changes and is now rebased on top of next (ed35d3359).
Range-diff:
1: 2141a2a62b ! 1: 98130a7ad7 refs: introduce `is_pseudoref()` and `is_headref()`
@@ Commit message
related files like 'BISECT_START' to a new directory similar to the
'rebase-merge' directory.
+ Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## refs.c ##
@@ refs.c: static int is_pseudoref_syntax(const char *refname)
+ return 0;
+
+ if (ends_with(refname, "_HEAD")) {
-+ read_ref_full(refname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
-+ &oid, NULL);
-+ return !is_null_oid(&oid);
++ refs_resolve_ref_unsafe(refs, refname,
++ RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
++ &oid, NULL);
++ return !is_null_oid(&oid);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(irregular_pseudorefs); i++)
+ if (!strcmp(refname, irregular_pseudorefs[i])) {
-+ read_ref_full(refname, RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
-+ &oid, NULL);
++ refs_resolve_ref_unsafe(refs, refname,
++ RESOLVE_REF_READING | RESOLVE_REF_NO_RECURSE,
++ &oid, NULL);
+ return !is_null_oid(&oid);
+ }
+
2: c96f0a9c83 = 2: 060ab08af5 refs: extract out `loose_fill_ref_dir_regular_file()`
3: d165358b83 ! 3: 40d2375ad9 refs: introduce `refs_for_each_all_refs()`
@@ Metadata
Author: Karthik Nayak <karthik.188@gmail.com>
## Commit message ##
- refs: introduce `refs_for_each_all_refs()`
+ refs: introduce `refs_for_each_include_root_refs()`
- Introduce a new ref iteration flag `DO_FOR_EACH_INCLUDE_ALL_REFS`, which
- will be used to iterate over all refs. In the files backend this is
- limited to regular refs, pseudorefs and HEAD. For other backends like
- the reftable this is the universal set of all refs stored in the
- backend.
+ Introduce a new ref iteration flag `DO_FOR_EACH_INCLUDE_ROOT_REFS`,
+ which will be used to iterate over regular refs plus pseudorefs and
+ HEAD.
Refs which fall outside the `refs/` and aren't either pseudorefs or HEAD
are more of a grey area. This is because we don't block the users from
- creating such refs but they are not officially supported. In the files
- backend, we can isolate such files from other files.
+ creating such refs but they are not officially supported.
- Introduce `refs_for_each_all_refs()` which calls `do_for_each_ref()`
- with this newly introduced flag.
+ Introduce `refs_for_each_include_root_refs()` which calls
+ `do_for_each_ref()` with this newly introduced flag.
In `refs/files-backend.c`, introduce a new function
`add_pseudoref_and_head_entries()` to add pseudorefs and HEAD to the
`ref_dir`. We then finally call `add_pseudoref_and_head_entries()`
- whenever the `DO_FOR_EACH_INCLUDE_ALL_REFS` flag is set. Any new ref
+ whenever the `DO_FOR_EACH_INCLUDE_ROOT_REFS` flag is set. Any new ref
backend will also have to implement similar changes on its end.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
@@ refs.c: int for_each_rawref(each_ref_fn fn, void *cb_data)
return refs_for_each_rawref(get_main_ref_store(the_repository), fn, cb_data);
}
-+int refs_for_each_all_refs(struct ref_store *refs, each_ref_fn fn,
-+ void *cb_data)
++int refs_for_each_include_root_refs(struct ref_store *refs, each_ref_fn fn,
++ void *cb_data)
+{
+ return do_for_each_ref(refs, "", NULL, fn, 0,
-+ DO_FOR_EACH_INCLUDE_ALL_REFS, cb_data);
++ DO_FOR_EACH_INCLUDE_ROOT_REFS, cb_data);
+}
+
static int qsort_strcmp(const void *va, const void *vb)
@@ refs.h: int for_each_namespaced_ref(const char **exclude_patterns,
int for_each_rawref(each_ref_fn fn, void *cb_data);
+/*
-+ * Iterates over all ref types, regular, pseudorefs and HEAD.
++ * Iterates over all refs including root refs, i.e. pseudorefs and HEAD.
+ */
-+int refs_for_each_all_refs(struct ref_store *refs, each_ref_fn fn,
-+ void *cb_data);
++int refs_for_each_include_root_refs(struct ref_store *refs, each_ref_fn fn,
++ void *cb_data);
+
/*
* Normalizes partial refs to their fully qualified form.
@@ refs/files-backend.c: static struct ref_cache *get_loose_ref_cache(struct files_
+ dir = get_ref_dir(refs->loose->root);
+
-+ if (flags & DO_FOR_EACH_INCLUDE_ALL_REFS)
++ if (flags & DO_FOR_EACH_INCLUDE_ROOT_REFS)
+ add_pseudoref_and_head_entries(dir->cache->ref_store, dir,
-+ refs->loose->root->name);
++ refs->loose->root->name);
+
/*
* Add an incomplete entry for "refs/" (to be filled
@@ refs/refs-internal.h: enum do_for_each_ref_flags {
DO_FOR_EACH_OMIT_DANGLING_SYMREFS = (1 << 2),
+
+ /*
-+ * Include all refs in the $GIT_DIR in contrast to generally only listing
-+ * references having the "refs/" prefix. In the files-backend this is
-+ * limited to regular refs, pseudorefs and HEAD.
++ * Include root refs i.e. HEAD and pseudorefs along with the regular
++ * refs.
+ */
-+ DO_FOR_EACH_INCLUDE_ALL_REFS = (1 << 3),
++ DO_FOR_EACH_INCLUDE_ROOT_REFS = (1 << 3),
};
/*
4: a17983d0ba < -: ---------- for-each-ref: avoid filtering on empty pattern
-: ---------- > 4: b4b9435505 ref-filter: rename 'FILTER_REFS_ALL' to 'FILTER_REFS_REGULAR'
-: ---------- > 5: ee99ac41ae for-each-ref: add new option to include root refs
Karthik Nayak (5):
refs: introduce `is_pseudoref()` and `is_headref()`
refs: extract out `loose_fill_ref_dir_regular_file()`
refs: introduce `refs_for_each_include_root_refs()`
ref-filter: rename 'FILTER_REFS_ALL' to 'FILTER_REFS_REGULAR'
for-each-ref: add new option to include root refs
Documentation/git-for-each-ref.txt | 5 +-
builtin/for-each-ref.c | 11 ++-
ref-filter.c | 29 ++++++-
ref-filter.h | 7 +-
refs.c | 48 +++++++++++
refs.h | 9 ++
refs/files-backend.c | 127 +++++++++++++++++++++--------
refs/refs-internal.h | 6 ++
refs/reftable-backend.c | 11 ++-
t/t6302-for-each-ref-filter.sh | 31 +++++++
10 files changed, 238 insertions(+), 46 deletions(-)
--
2.43.GIT
next prev parent reply other threads:[~2024-02-11 18:39 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-19 14:27 [PATCH 0/5] for-each-ref: print all refs on empty string pattern Karthik Nayak
2024-01-19 14:27 ` [PATCH 1/5] refs: expose `is_pseudoref_syntax()` Karthik Nayak
2024-01-19 20:37 ` Junio C Hamano
2024-01-22 15:40 ` Karthik Nayak
2024-01-19 14:27 ` [PATCH 2/5] refs: make `is_pseudoref_syntax()` stricter Karthik Nayak
2024-01-19 20:44 ` Junio C Hamano
2024-01-22 20:13 ` Phillip Wood
2024-01-22 20:22 ` Junio C Hamano
2024-01-23 11:03 ` Phillip Wood
2024-01-23 12:49 ` Karthik Nayak
2024-01-23 16:40 ` phillip.wood123
2024-01-23 17:46 ` Junio C Hamano
2024-01-23 17:38 ` Junio C Hamano
2024-01-23 11:16 ` Patrick Steinhardt
2024-01-23 16:30 ` Phillip Wood
2024-01-23 17:44 ` Junio C Hamano
2024-01-24 8:51 ` Patrick Steinhardt
2024-01-19 14:27 ` [PATCH 3/5] refs: extract out `loose_fill_ref_dir_regular_file()` Karthik Nayak
2024-01-19 14:27 ` [PATCH 4/5] refs: introduce `refs_for_each_all_refs()` Karthik Nayak
2024-01-19 20:57 ` Junio C Hamano
2024-01-22 15:48 ` Karthik Nayak
2024-01-22 17:45 ` Junio C Hamano
2024-01-19 14:27 ` [PATCH 5/5] for-each-ref: avoid filtering on empty pattern Karthik Nayak
2024-01-24 15:27 ` [PATCH v2 0/4] for-each-ref: print all refs on empty string pattern Karthik Nayak
2024-01-24 15:27 ` [PATCH v2 1/4] refs: introduce `is_pseudoref()` and `is_headref()` Karthik Nayak
2024-01-24 19:09 ` Junio C Hamano
2024-01-25 16:20 ` Karthik Nayak
2024-01-25 16:28 ` Junio C Hamano
2024-01-25 21:48 ` Karthik Nayak
2024-01-24 15:27 ` [PATCH v2 2/4] refs: extract out `loose_fill_ref_dir_regular_file()` Karthik Nayak
2024-01-24 15:27 ` [PATCH v2 3/4] refs: introduce `refs_for_each_all_refs()` Karthik Nayak
2024-01-24 15:27 ` [PATCH v2 4/4] for-each-ref: avoid filtering on empty pattern Karthik Nayak
2024-01-29 11:35 ` [PATCH v3 0/4] for-each-ref: print all refs on empty string pattern Karthik Nayak
2024-01-29 11:35 ` [PATCH v3 1/4] refs: introduce `is_pseudoref()` and `is_headref()` Karthik Nayak
2024-02-07 1:48 ` Jeff King
2024-02-07 9:27 ` Karthik Nayak
2024-01-29 11:35 ` [PATCH v3 2/4] refs: extract out `loose_fill_ref_dir_regular_file()` Karthik Nayak
2024-01-29 11:35 ` [PATCH v3 3/4] refs: introduce `refs_for_each_all_refs()` Karthik Nayak
2024-01-29 11:35 ` [PATCH v3 4/4] for-each-ref: avoid filtering on empty pattern Karthik Nayak
2024-02-05 18:48 ` Phillip Wood
2024-02-06 5:33 ` Patrick Steinhardt
2024-02-06 10:49 ` Phillip Wood
2024-02-06 8:52 ` Karthik Nayak
2024-02-06 13:55 ` Phillip Wood
2024-02-06 15:30 ` Karthik Nayak
2024-02-06 17:03 ` Junio C Hamano
2024-02-06 18:47 ` Junio C Hamano
2024-02-06 22:10 ` Karthik Nayak
2024-02-06 22:16 ` Junio C Hamano
2024-02-07 14:10 ` Karthik Nayak
2024-02-07 16:00 ` Junio C Hamano
2024-02-07 16:18 ` Karthik Nayak
2024-02-07 16:46 ` Junio C Hamano
2024-02-07 17:02 ` Karthik Nayak
2024-02-08 8:50 ` Patrick Steinhardt
2024-02-08 17:04 ` Junio C Hamano
2024-02-08 17:24 ` Patrick Steinhardt
2024-02-08 17:53 ` Junio C Hamano
2024-02-09 8:08 ` Patrick Steinhardt
2024-02-09 17:15 ` Junio C Hamano
2024-02-09 18:27 ` Karthik Nayak
2024-02-12 6:51 ` Patrick Steinhardt
2024-02-08 10:28 ` Phillip Wood
2024-02-08 17:07 ` Junio C Hamano
2024-02-07 7:48 ` Patrick Steinhardt
2024-02-07 16:01 ` Junio C Hamano
2024-01-29 20:37 ` [PATCH v3 0/4] for-each-ref: print all refs on empty string pattern Junio C Hamano
2024-02-11 18:39 ` Karthik Nayak [this message]
2024-02-11 18:39 ` [PATCH v4 1/5] refs: introduce `is_pseudoref()` and `is_headref()` Karthik Nayak
2024-02-12 12:47 ` Patrick Steinhardt
2024-02-12 17:01 ` Junio C Hamano
2024-02-13 15:48 ` Karthik Nayak
2024-02-13 19:42 ` Junio C Hamano
2024-02-14 10:28 ` Karthik Nayak
2024-02-14 16:59 ` Junio C Hamano
2024-02-14 18:15 ` Karthik Nayak
2024-02-12 18:05 ` Junio C Hamano
2024-02-11 18:39 ` [PATCH v4 2/5] refs: extract out `loose_fill_ref_dir_regular_file()` Karthik Nayak
2024-02-11 18:39 ` [PATCH v4 3/5] refs: introduce `refs_for_each_include_root_refs()` Karthik Nayak
2024-02-11 18:39 ` [PATCH v4 4/5] ref-filter: rename 'FILTER_REFS_ALL' to 'FILTER_REFS_REGULAR' Karthik Nayak
2024-02-11 18:39 ` [PATCH v4 5/5] for-each-ref: add new option to include root refs Karthik Nayak
2024-02-22 8:46 ` Patrick Steinhardt
2024-02-22 12:57 ` Karthik Nayak
2024-02-22 13:17 ` Patrick Steinhardt
2024-02-23 10:01 ` [PATCH v5 0/5] for-each-ref: add '--include-root-refs' option Karthik Nayak
2024-02-23 10:01 ` [PATCH v5 1/5] refs: introduce `is_pseudoref()` and `is_headref()` Karthik Nayak
2024-02-23 10:01 ` [PATCH v5 2/5] refs: extract out `loose_fill_ref_dir_regular_file()` Karthik Nayak
2024-02-23 10:01 ` [PATCH v5 3/5] refs: introduce `refs_for_each_include_root_refs()` Karthik Nayak
2024-02-23 10:01 ` [PATCH v5 4/5] ref-filter: rename 'FILTER_REFS_ALL' to 'FILTER_REFS_REGULAR' Karthik Nayak
2024-02-23 10:01 ` [PATCH v5 5/5] for-each-ref: add new option to include root refs Karthik Nayak
2024-02-23 18:41 ` [PATCH v5 0/5] for-each-ref: add '--include-root-refs' option Junio C Hamano
2024-02-23 20:13 ` Junio C Hamano
2024-02-27 7:39 ` Patrick Steinhardt
2024-02-27 16:54 ` 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=20240211183923.131278-1-karthik.188@gmail.com \
--to=karthik.188@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=phillip.wood123@gmail.com \
--cc=ps@pks.im \
/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).