From: Meet Soni <meetsoni3017@gmail.com>
To: git@vger.kernel.org
Cc: ps@pks.im, shejialuo@gmail.com, karthik.188@gmail.com,
gitster@pobox.com, Meet Soni <meetsoni3017@gmail.com>
Subject: [GSoC][RFC PATCH v2 0/2] Add refs list subcommand
Date: Thu, 17 Jul 2025 13:20:07 +0530 [thread overview]
Message-ID: <20250717075009.26262-1-meetsoni3017@gmail.com> (raw)
In-Reply-To: <20250627074934.1761897-1-meetsoni3017@gmail.com>
Hello everyone,
This is the second version of the patch series that introduces the `git
refs list` subcommand as a modern alternative to `git for-each-ref`.
Thank you to everyone who provided valuable feedback on the first
version. This new version incorporates the suggestions, improving both
the code's implementation and the documentation's structure.
Changes in v2:
- Refactored the implementation of `refs list`. Instead of duplicating
the logic from `for-each-ref`, it is now a thin wrapper that
calls the original command. This avoids code duplication while
maintaining identical behavior.
- Refactored the documentation by moving the common command options
shared by `refs list` and `for-each-ref` into a new standalone
file (`ref-list-options.adoc`).
- Both man pages now use the AsciiDoc `include::` macro to embed these
shared options, ensuring documentation stays consistent.
---
(v1 cover-letter text)
This patch series introduces `git refs list` as a modern replacement for
`git for-each-ref`, as part of an effort to consolidate ref-related
functionality under a unified `git refs` command.
Git's ref-related operations are currently handled by several distinct
commands, such as `git show-ref`, `git for-each-ref`, `git update-ref`,
`git pack-refs`, etc. This distribution has a few practical drawbacks:
- Users need to rely on multiple commands for related tasks involving
refs.
- The commands may differ slightly in behavior and option syntax,
leading to inconsistency.
We propose a long-term consolidation effort to bring ref-related
subcommands under the umbrella of a single command: `git refs`.
The implementation of `git refs list` is functionally identical to `git
for-each-ref`. It reuses the same internal logic (cmd_for_each_ref) to
ensure complete backward compatibility. The purpose of this patch is not
to introduce new behavior but to provide an alternate entry point under
the consolidated `git refs` namespace.
The motivation behind this change is twofold:
- Consolidation: Centralizing ref-related operations makes them easier
to discover, use, and maintain.
- Evolution: While the initial goal is parity with existing commands,
this consolidation allows for careful reconsideration of which
features are essential. Over time, we can:
- Remove legacy or obscure options that are no longer needed.
- Add improvements that wouldn't make sense to bolt onto legacy
commands.
- Offering a more consistent and user-friendly surface.
To verify backward compatibility, this patch also includes a test
`t/t1461-refs-list.sh`, which runs the full `t6300-for-each-ref.sh` test
using `git refs list`. The test uses ${GIT_REFS_LIST_CMD:-for-each-ref}
to allow substitution without duplicating tests.
This patch is deliberately conservative: it introduces no behavioral
changes and leaves `for-each-ref` untouched. The goal is to lay
groundwork and demonstrate viability of ref consolidation within `git
refs`.
Going forward, I'd like to initiate a discussion on what the ideal
surface of `git refs list` should look like. Which options and features
from `for-each-ref` should be carried over? Are there any that are
obsolete or overly niche? What improvements might be worth considering
now that we have a new, consolidated interface?
Feedback on this, especially from those who rely on `for-each-ref` in
scripts or tooling would be very helpful.
Meet Soni (2):
builtin/refs: add list subcommand
t: add test for git refs list subcommand
Documentation/git-for-each-ref.adoc | 80 +------
Documentation/git-refs.adoc | 16 ++
Documentation/refs-list-options.adoc | 80 +++++++
builtin/for-each-ref.c | 24 +-
builtin/refs.c | 35 +++
t/meson.build | 1 +
t/t1461-refs-list.sh | 8 +
t/t6300-for-each-ref.sh | 333 ++++++++++++++-------------
8 files changed, 331 insertions(+), 246 deletions(-)
create mode 100644 Documentation/refs-list-options.adoc
create mode 100755 t/t1461-refs-list.sh
Range-diff against v1:
1: e7b19c71eb ! 1: b2d3026520 builtin/refs: add list subcommand
@@ Commit message
instead of duplicating its logic. Forward all arguments to the existing
function to ensure behavior is identical.
- This prevents code duplication and allows `refs list` to benefit from
- any future fixes to the underlying `for-each-ref` machinery.
+ Add documentation for the new command. To keep the documentation DRY and
+ consistent with `git-for-each-ref(1)`, refactor the shared command
+ options into a standalone file. Use the AsciiDoc `include::` macro to
+ embed these options in both man pages.
+
+ This prevents duplication in both code and documentation, ensuring that
+ `refs list` benefits from any future fixes to the underlying
+ `for-each-ref` machinery and its shared documentation.
Mentored-by: Patrick Steinhardt <ps@pks.im>
Mentored-by: shejialuo <shejialuo@gmail.com>
Mentored-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Meet Soni <meetsoni3017@gmail.com>
+ ## Documentation/git-for-each-ref.adoc ##
+@@ Documentation/git-for-each-ref.adoc: host language allowing their direct evaluation in that language.
+
+ OPTIONS
+ -------
+-<pattern>...::
+- If one or more patterns are given, only refs are shown that
+- match against at least one pattern, either using fnmatch(3) or
+- literally, in the latter case matching completely or from the
+- beginning up to a slash.
+-
+---stdin::
+- If `--stdin` is supplied, then the list of patterns is read from
+- standard input instead of from the argument list.
+-
+---count=<count>::
+- By default the command shows all refs that match
+- `<pattern>`. This option makes it stop after showing
+- that many refs.
+-
+---sort=<key>::
+- A field name to sort on. Prefix `-` to sort in
+- descending order of the value. When unspecified,
+- `refname` is used. You may use the --sort=<key> option
+- multiple times, in which case the last key becomes the primary
+- key.
+-
+---format=<format>::
+- A string that interpolates `%(fieldname)` from a ref being shown and
+- the object it points at. In addition, the string literal `%%`
+- renders as `%` and `%xx` - where `xx` are hex digits - renders as
+- the character with hex code `xx`. For example, `%00` interpolates to
+- `\0` (NUL), `%09` to `\t` (TAB), and `%0a` to `\n` (LF).
+-+
+-When unspecified, `<format>` defaults to `%(objectname) SPC %(objecttype)
+-TAB %(refname)`.
+-
+---color[=<when>]::
+- Respect any colors specified in the `--format` option. The
+- `<when>` field must be one of `always`, `never`, or `auto` (if
+- `<when>` is absent, behave as if `always` was given).
+-
+---shell::
+---perl::
+---python::
+---tcl::
+- If given, strings that substitute `%(fieldname)`
+- placeholders are quoted as string literals suitable for
+- the specified host language. This is meant to produce
+- a scriptlet that can directly be `eval`ed.
+-
+---points-at=<object>::
+- Only list refs which points at the given object.
+-
+---merged[=<object>]::
+- Only list refs whose tips are reachable from the
+- specified commit (HEAD if not specified).
+-
+---no-merged[=<object>]::
+- Only list refs whose tips are not reachable from the
+- specified commit (HEAD if not specified).
+-
+---contains[=<object>]::
+- Only list refs which contain the specified commit (HEAD if not
+- specified).
+-
+---no-contains[=<object>]::
+- Only list refs which don't contain the specified commit (HEAD
+- if not specified).
+-
+---ignore-case::
+- Sorting and filtering refs are case insensitive.
+-
+---omit-empty::
+- Do not print a newline after formatted refs where the format expands
+- to the empty string.
+-
+---exclude=<pattern>::
+- If one or more patterns are given, only refs which do not match
+- any excluded pattern(s) are shown. Matching is done using the
+- same rules as `<pattern>` above.
+-
+---include-root-refs::
+- List root refs (HEAD and pseudorefs) apart from regular refs.
++include::refs-list-options.adoc[]
+
+ FIELD NAMES
+ -----------
+
## Documentation/git-refs.adoc ##
@@ Documentation/git-refs.adoc: SYNOPSIS
[synopsis]
@@ Documentation/git-refs.adoc: migrate::
Verify reference database consistency.
+list::
-+ List references in the repository with support for filtering, formatting,
-+ and sorting. This subcommand uses the same core logic as
-+ linkgit:git-for-each-ref[1] and offers equivalent functionality.
++ List references in the repository with support for filtering,
++ formatting, and sorting. This subcommand is an alias for
++ linkgit:git-for-each-ref[1] and offers identical functionality.
+
OPTIONS
-------
@@ Documentation/git-refs.adoc: The following options are specific to 'git refs ver
+The following options are specific to 'git refs list':
+
++include::refs-list-options.adoc[]
++
+ KNOWN LIMITATIONS
+ -----------------
+
+
+ ## Documentation/refs-list-options.adoc (new) ##
+@@
++// Shared options for for-each-ref and refs list
+<pattern>...::
+ If one or more patterns are given, only refs are shown that
+ match against at least one pattern, either using fnmatch(3) or
@@ Documentation/git-refs.adoc: The following options are specific to 'git refs ver
+
+--include-root-refs::
+ List root refs (HEAD and pseudorefs) apart from regular refs.
-+
-+
- KNOWN LIMITATIONS
- -----------------
-
## builtin/for-each-ref.c ##
@@ builtin/for-each-ref.c: static char const * const for_each_ref_usage[] = {
2: 8ce521880c = 2: 2d6534841f t: add test for git refs list subcommand
--
2.34.1
next prev parent reply other threads:[~2025-07-17 7:50 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-27 7:49 [GSoC][RFC PATCH 0/2] Add refs list subcommand Meet Soni
2025-06-27 7:49 ` [GSoC][RFC PATCH 1/2] builtin/refs: add " Meet Soni
2025-06-27 16:27 ` Jean-Noël Avila
2025-06-27 18:13 ` Junio C Hamano
2025-06-30 4:28 ` Meet Soni
2025-06-29 11:05 ` [PATCH] doc:git-for-each-ref: fix styling and typos Jean-Noël Avila
2025-06-30 15:48 ` Junio C Hamano
2025-06-30 18:55 ` Jean-Noël AVILA
2025-06-27 7:49 ` [GSoC][RFC PATCH 2/2] t: add test for git refs list subcommand Meet Soni
2025-06-27 18:03 ` [GSoC][RFC PATCH 0/2] Add " Junio C Hamano
2025-06-28 8:05 ` shejialuo
2025-06-30 14:05 ` Junio C Hamano
2025-07-06 12:58 ` shejialuo
2025-06-30 3:53 ` Meet Soni
2025-06-30 20:10 ` Junio C Hamano
2025-07-09 13:36 ` Patrick Steinhardt
2025-07-17 7:50 ` Meet Soni [this message]
2025-07-17 7:50 ` [GSoC][RFC PATCH v2 1/2] builtin/refs: add " Meet Soni
2025-07-17 16:48 ` Eric Sunshine
2025-07-23 5:01 ` Meet Soni
2025-07-17 7:50 ` [GSoC][RFC PATCH v2 2/2] t: add test for git refs " Meet Soni
2025-07-17 21:01 ` Junio C Hamano
2025-07-23 5:17 ` Meet Soni
2025-07-23 15:03 ` Junio C Hamano
2025-07-23 6:43 ` [GSoC][RFC PATCH v3 0/3] Add " Meet Soni
2025-07-23 6:43 ` [GSoC][RFC PATCH v3 1/3] builtin/refs: add " Meet Soni
2025-07-24 5:58 ` Patrick Steinhardt
2025-07-24 16:01 ` Junio C Hamano
2025-07-25 11:10 ` Meet Soni
2025-07-23 6:43 ` [GSoC][RFC PATCH v3 2/3] t6300: refactor tests to be shareable Meet Soni
2025-07-23 6:43 ` [GSoC][RFC PATCH v3 3/3] t: add test for git refs list subcommand Meet Soni
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 0/5] Add " Meet Soni
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 1/5] doc: factor out common option Meet Soni
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 2/5] builtin/for-each-ref: factor out core logic into a helper Meet Soni
2025-08-01 5:54 ` Patrick Steinhardt
2025-08-04 6:34 ` Meet Soni
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 3/5] builtin/refs: add list subcommand Meet Soni
2025-08-01 13:27 ` Phillip Wood
2025-08-01 14:43 ` Junio C Hamano
2025-08-01 15:49 ` Phillip Wood
2025-08-01 17:14 ` Junio C Hamano
2025-08-04 9:28 ` Phillip Wood
2025-08-04 6:32 ` Meet Soni
2025-08-04 9:27 ` Phillip Wood
2025-08-04 15:35 ` Junio C Hamano
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 4/5] t6300: refactor tests to be shareable Meet Soni
2025-07-31 9:00 ` [GSoC][RFC PATCH v4 5/5] t: add test for git refs list subcommand Meet Soni
2025-08-01 5:54 ` [GSoC][RFC PATCH v4 0/5] Add " Patrick Steinhardt
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 0/6] " Meet Soni
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 1/6] doc: factor out common option Meet Soni
2025-08-04 18:34 ` Junio C Hamano
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 2/6] builtin/for-each-ref: align usage string with the man page Meet Soni
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 3/6] builtin/for-each-ref: factor out core logic into a helper Meet Soni
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 4/6] builtin/refs: add list subcommand Meet Soni
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 5/6] t6300: refactor tests to be shareable Meet Soni
2025-08-04 9:22 ` [GSoC][RFC PATCH v5 6/6] t: add test for git refs list subcommand Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 0/6] Add " Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 1/6] doc: factor out common option Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 2/6] builtin/for-each-ref: align usage string with the man page Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 3/6] builtin/for-each-ref: factor out core logic into a helper Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 4/6] builtin/refs: add list subcommand Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 5/6] t6300: refactor tests to be shareable Meet Soni
2025-08-05 9:27 ` [GSoC][PATCH v6 6/6] t: add test for git refs list subcommand Meet Soni
2025-08-05 13:07 ` [GSoC][PATCH v6 0/6] Add " Patrick Steinhardt
2025-08-05 16:12 ` 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=20250717075009.26262-1-meetsoni3017@gmail.com \
--to=meetsoni3017@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=karthik.188@gmail.com \
--cc=ps@pks.im \
--cc=shejialuo@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).