From: kristofferhaugsbakk@fastmail.com
To: git@vger.kernel.org
Cc: Kristoffer Haugsbakk <code@khaugsbakk.name>
Subject: [PATCH v2 0/5] format-rev: add --abbrev, --color, and --date
Date: Tue, 18 Aug 2026 11:57:29 +0200 [thread overview]
Message-ID: <V2_CV_format-rev_three_more_opts.bd3@msgid.xyz> (raw)
In-Reply-To: <CV_format-rev_three_more_opts.b80@msgid.xyz>
From: Kristoffer Haugsbakk <code@khaugsbakk.name>
Topic name (applied): kh/format-rev-more-options
Topic summary: Add three more options for controlling the formatting. Also
do some minor refactoring and text fixes as preparatory steps.
§ Changes in v2
See the patch notes for details.
• Use designated initializer syntax. That’s more readable since you pair
the field with the value and you can omit zero-value fields.
https://lore.kernel.org/git/xmqqfr0hswxm.fsf@gitster.g/
• Fix useless `BUG` placements https://lore.kernel.org/git/xmqqfr0hswxm.fsf@gitster.g/
• Add preliminary patch “place BUG calls first in callback” for existing
`BUG` statement placement
• Based on the previous point
• Patch “learn --abbrev, --color, and --date”: test a few more options
[1/5] format-rev: use lower case for opts description
[2/5] format-rev: place BUG calls first in callback
[3/5] format-rev: factor option variables into a struct
[4/5] doc: rev-list-options.adoc: factor out --date alts
[5/5] format-rev: learn --abbrev, --color, and --date
Documentation/git-format-rev.adoc | 44 ++++++++-
.../rev-list-option-date-alternatives.adoc | 55 +++++++++++
Documentation/rev-list-options.adoc | 56 +----------
builtin/name-rev.c | 92 ++++++++++++-------
t/t6120-describe.sh | 58 ++++++++++++
5 files changed, 212 insertions(+), 93 deletions(-)
create mode 100644 Documentation/rev-list-option-date-alternatives.adoc
Interdiff against v1:
diff --git a/builtin/name-rev.c b/builtin/name-rev.c
index 0c9014ca594..fa20a2774be 100644
--- a/builtin/name-rev.c
+++ b/builtin/name-rev.c
@@ -788,10 +788,10 @@ static int format_nul_cb(const struct option *option,
int unset)
{
struct format_rev_data *data = option->value;
- data->nul_input = 1;
- data->nul_output = 1;
BUG_ON_OPT_NEG(unset);
BUG_ON_OPT_ARG(arg);
+ data->nul_input = 1;
+ data->nul_output = 1;
return 0;
}
@@ -800,9 +800,9 @@ static int date_cb(const struct option *option,
int unset)
{
struct rev_info *data = option->value;
+ BUG_ON_OPT_NEG(unset);
parse_date_format(arg, &data->date_mode);
data->date_mode_explicit = 1;
- BUG_ON_OPT_NEG(unset);
return 0;
}
@@ -830,8 +830,9 @@ int cmd_format_rev(int argc,
struct repository *repo UNUSED)
{
struct format_rev_data data = {
- NULL, NULL, 0, 0, STRING_LIST_INIT_NODUP,
- REV_INFO_INIT, GIT_COLOR_AUTO
+ .notes = STRING_LIST_INIT_NODUP,
+ .rev = REV_INFO_INIT,
+ .color = GIT_COLOR_AUTO,
};
enum stdin_mode stdin_mode;
char output_terminator;
@@ -953,6 +954,7 @@ int cmd_format_rev(int argc,
BUG("uncovered case: %d", stdin_mode);
}
+ date_mode_release(&data.rev.date_mode);
strbuf_release(&scratch_buf);
string_list_clear(&data.notes, 0);
release_display_notes(&format_notes_opt);
diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh
index 2621edb5937..a15da979abf 100755
--- a/t/t6120-describe.sh
+++ b/t/t6120-describe.sh
@@ -1026,9 +1026,9 @@ format_rev_cmp_log () {
first
EOF
git -C repo-format log --stdin --no-walk \
- "$opts" --format="$format" >expect <input &&
- git -C repo-format format-rev "$opts" \
- --stdin-mode=revs --format="$format" >actual <input &&
+ --format="$format" "$opts" >expect <input &&
+ git -C repo-format format-rev --stdin-mode=revs \
+ --format="$format" "$opts" >actual <input &&
test_cmp expect actual
}
@@ -1037,9 +1037,9 @@ format_rev_err_cmp_log () {
format=reference
# No input since we ought to fail while parsing options
test_must_fail git -C repo-format log --stdin --no-walk \
- "$opts" --format="$format" 2>expect &&
- test_must_fail git -C repo-format format-rev "$opts" \
- --stdin-mode=revs --format="$format" 2>actual &&
+ --format="$format" "$opts" 2>expect &&
+ test_must_fail git -C repo-format format-rev \
+ --stdin-mode=revs --format="$format" "$opts" 2>actual &&
test_cmp expect actual
}
@@ -1051,6 +1051,7 @@ test_expect_success 'format-rev --color' '
'
test_expect_success 'format-rev --abbrev' '
+ format_rev_cmp_log --abbrev &&
format_rev_cmp_log --abbrev=31 &&
format_rev_cmp_log --no-abbrev
'
@@ -1058,7 +1059,20 @@ test_expect_success 'format-rev --abbrev' '
test_expect_success 'format-rev --date' '
format_rev_cmp_log --date=relative &&
format_rev_cmp_log --date=iso-strict &&
- format_rev_err_cmp_log --date=not-valid
+ # This also tests the only case where we need to release
+ # the data for the parsed format
+ format_rev_cmp_log --date="format:%c" &&
+ format_rev_err_cmp_log --date=not-valid &&
+ # Test --date (no arg) next
+ # We cannot compare the output to git-log(1)
+ # because that command uses a slightly different
+ # error message (different library)
+ cat >expect <<-EOF &&
+ error: option \`date${SQ} requires a value
+ EOF
+ test_must_fail git -C repo-format format-rev \
+ --stdin-mode=revs --format="$format" --date 2>actual &&
+ test_cmp expect actual
'
test_done
Range-diff against v1:
1: eb84b1b6341 = 1: eb84b1b6341 format-rev: use lower case for opts description
-: ----------- > 2: 2cb12e3ce48 format-rev: place BUG calls first in callback
2: 278eb852121 ! 3: 0b653b1d218 format-rev: factor option variables into a struct
@@ builtin/name-rev.c: int cmd_name_rev(int argc,
{
- struct format_nul_data *data = option->value;
+ struct format_rev_data *data = option->value;
- data->nul_input = 1;
- data->nul_output = 1;
BUG_ON_OPT_NEG(unset);
+ BUG_ON_OPT_ARG(arg);
+ data->nul_input = 1;
@@ builtin/name-rev.c: int cmd_format_rev(int argc,
const char *prefix,
struct repository *repo UNUSED)
{
- const char *format = NULL;
+ struct format_rev_data data = {
-+ NULL, NULL, 0, 0, STRING_LIST_INIT_NODUP
++ .notes = STRING_LIST_INIT_NODUP,
+ };
enum stdin_mode stdin_mode;
- const char *stdin_mode_arg = NULL;
3: cb2cc772b31 = 4: 7556bf04462 doc: rev-list-options.adoc: factor out --date alts
4: e6d3e14c692 ! 5: d1bcad06e24 format-rev: learn --abbrev, --color, and --date
@@ builtin/name-rev.c: static int format_nul_cb(const struct option *option,
+ int unset)
+{
+ struct rev_info *data = option->value;
++ BUG_ON_OPT_NEG(unset);
+ parse_date_format(arg, &data->date_mode);
+ data->date_mode_explicit = 1;
-+ BUG_ON_OPT_NEG(unset);
+ return 0;
+}
+
@@ builtin/name-rev.c: static enum stdin_mode parse_stdin_mode(const char *stdin_mo
};
@@ builtin/name-rev.c: int cmd_format_rev(int argc,
- struct repository *repo UNUSED)
{
struct format_rev_data data = {
-- NULL, NULL, 0, 0, STRING_LIST_INIT_NODUP
-+ NULL, NULL, 0, 0, STRING_LIST_INIT_NODUP,
-+ REV_INFO_INIT, GIT_COLOR_AUTO
+ .notes = STRING_LIST_INIT_NODUP,
++ .rev = REV_INFO_INIT,
++ .color = GIT_COLOR_AUTO,
};
enum stdin_mode stdin_mode;
char output_terminator;
@@ builtin/name-rev.c: int cmd_format_rev(int argc,
userformat_find_requirements(data.format,
&format_pp.want);
+@@ builtin/name-rev.c: int cmd_format_rev(int argc,
+ BUG("uncovered case: %d", stdin_mode);
+ }
+
++ date_mode_release(&data.rev.date_mode);
+ strbuf_release(&scratch_buf);
+ string_list_clear(&data.notes, 0);
+ release_display_notes(&format_notes_opt);
## t/t6120-describe.sh ##
@@ t/t6120-describe.sh: do
@@ t/t6120-describe.sh: do
+ first
+ EOF
+ git -C repo-format log --stdin --no-walk \
-+ "$opts" --format="$format" >expect <input &&
-+ git -C repo-format format-rev "$opts" \
-+ --stdin-mode=revs --format="$format" >actual <input &&
++ --format="$format" "$opts" >expect <input &&
++ git -C repo-format format-rev --stdin-mode=revs \
++ --format="$format" "$opts" >actual <input &&
+ test_cmp expect actual
+}
+
@@ t/t6120-describe.sh: do
+ format=reference
+ # No input since we ought to fail while parsing options
+ test_must_fail git -C repo-format log --stdin --no-walk \
-+ "$opts" --format="$format" 2>expect &&
-+ test_must_fail git -C repo-format format-rev "$opts" \
-+ --stdin-mode=revs --format="$format" 2>actual &&
++ --format="$format" "$opts" 2>expect &&
++ test_must_fail git -C repo-format format-rev \
++ --stdin-mode=revs --format="$format" "$opts" 2>actual &&
+ test_cmp expect actual
+}
+
@@ t/t6120-describe.sh: do
+'
+
+test_expect_success 'format-rev --abbrev' '
++ format_rev_cmp_log --abbrev &&
+ format_rev_cmp_log --abbrev=31 &&
+ format_rev_cmp_log --no-abbrev
+'
@@ t/t6120-describe.sh: do
+test_expect_success 'format-rev --date' '
+ format_rev_cmp_log --date=relative &&
+ format_rev_cmp_log --date=iso-strict &&
-+ format_rev_err_cmp_log --date=not-valid
++ # This also tests the only case where we need to release
++ # the data for the parsed format
++ format_rev_cmp_log --date="format:%c" &&
++ format_rev_err_cmp_log --date=not-valid &&
++ # Test --date (no arg) next
++ # We cannot compare the output to git-log(1)
++ # because that command uses a slightly different
++ # error message (different library)
++ cat >expect <<-EOF &&
++ error: option \`date${SQ} requires a value
++ EOF
++ test_must_fail git -C repo-format format-rev \
++ --stdin-mode=revs --format="$format" --date 2>actual &&
++ test_cmp expect actual
+'
+
test_done
base-commit: 010afd3166ddc64c9863b1506f12cbcdda0d4ea1
--
2.55.0.13.g85d2d65e389
next prev parent reply other threads:[~2026-08-18 9:57 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-13 17:23 [PATCH 0/4] format-rev: add --abbrev, --color, and --date kristofferhaugsbakk
2026-08-13 17:23 ` [PATCH 1/4] format-rev: use lower case for opts description kristofferhaugsbakk
2026-08-13 17:23 ` [PATCH 2/4] format-rev: factor option variables into a struct kristofferhaugsbakk
2026-08-13 18:21 ` Junio C Hamano
2026-08-14 10:54 ` Kristoffer Haugsbakk
2026-08-13 17:23 ` [PATCH 3/4] doc: rev-list-options.adoc: factor out --date alts kristofferhaugsbakk
2026-08-13 17:24 ` [PATCH 4/4] format-rev: learn --abbrev, --color, and --date kristofferhaugsbakk
2026-08-15 2:17 ` Junio C Hamano
2026-08-17 14:48 ` Kristoffer Haugsbakk
2026-08-17 16:54 ` Junio C Hamano
2026-08-18 5:11 ` Kristoffer Haugsbakk
2026-08-18 9:57 ` kristofferhaugsbakk [this message]
2026-08-18 9:57 ` [PATCH v2 1/5] format-rev: use lower case for opts description kristofferhaugsbakk
2026-08-18 9:57 ` [PATCH v2 2/5] format-rev: place BUG calls first in callback kristofferhaugsbakk
2026-08-18 9:57 ` [PATCH v2 3/5] format-rev: factor option variables into a struct kristofferhaugsbakk
2026-08-18 9:57 ` [PATCH v2 4/5] doc: rev-list-options.adoc: factor out --date alts kristofferhaugsbakk
2026-08-18 9:57 ` [PATCH v2 5/5] format-rev: learn --abbrev, --color, and --date kristofferhaugsbakk
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=V2_CV_format-rev_three_more_opts.bd3@msgid.xyz \
--to=kristofferhaugsbakk@fastmail.com \
--cc=code@khaugsbakk.name \
--cc=git@vger.kernel.org \
/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