config: format expiry dates quietly

Move the logic for formatting expiry date config values into a helper
method and use quiet parsing when needed.

Note that git_config_expiry_date() will show an error on a bad parse and
not die() like most other git_config...() parsers. Thus, we use
'quietly' here instead of 'gently'.

There is an unfortunate asymmetry in these two parsing methods, but we
need to treat a positive response from parse_expiry_date() as an error
or we will get incorrect values.

This updates the behavior of 'git config list --type=expiry-date' to be
quiet when attempting parsing on non-date values.

Signed-off-by: Derrick Stolee <stolee@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee
2026-02-23 12:26:51 +00:00
committed by Junio C Hamano
parent bcfb9128c9
commit 9cb4a5e1ba
2 changed files with 22 additions and 16 deletions

View File

@@ -3,6 +3,7 @@
#include "abspath.h"
#include "config.h"
#include "color.h"
#include "date.h"
#include "editor.h"
#include "environment.h"
#include "gettext.h"
@@ -333,6 +334,23 @@ static int format_config_path(struct strbuf *buf,
return 0;
}
static int format_config_expiry_date(struct strbuf *buf,
const char *key_,
const char *value_,
int quietly)
{
timestamp_t t;
if (quietly) {
if (parse_expiry_date(value_, &t))
return -1;
} else if (git_config_expiry_date(&t, key_, value_) < 0) {
return -1;
}
strbuf_addf(buf, "%"PRItime, t);
return 0;
}
/*
* Format the configuration key-value pair (`key_`, `value_`) and
* append it into strbuf `buf`. Returns a negative value on failure,
@@ -368,12 +386,9 @@ static int format_config(const struct config_display_options *opts,
res = format_config_bool_or_str(buf, value_);
else if (opts->type == TYPE_PATH)
res = format_config_path(buf, key_, value_, gently);
else if (opts->type == TYPE_EXPIRY_DATE) {
timestamp_t t;
if (git_config_expiry_date(&t, key_, value_) < 0)
return -1;
strbuf_addf(buf, "%"PRItime, t);
} else if (opts->type == TYPE_COLOR) {
else if (opts->type == TYPE_EXPIRY_DATE)
res = format_config_expiry_date(buf, key_, value_, gently);
else if (opts->type == TYPE_COLOR) {
char v[COLOR_MAXLEN];
if (git_config_color(v, key_, value_) < 0)
return -1;

View File

@@ -2562,15 +2562,6 @@ test_expect_success 'list --type=path shows only canonicalizable path values' '
'
test_expect_success 'list --type=expiry-date shows only canonicalizable dates' '
cat >expecterr <<-EOF &&
error: '\''True'\'' for '\''section.foo'\'' is not a valid timestamp
error: '\''~/dir'\'' for '\''section.path'\'' is not a valid timestamp
error: '\''red'\'' for '\''section.red'\'' is not a valid timestamp
error: '\''Blue'\'' for '\''section.blue'\'' is not a valid timestamp
error: '\'':(optional)no-such-path'\'' for '\''section.missing'\'' is not a valid timestamp
error: '\'':(optional)expect'\'' for '\''section.exists'\'' is not a valid timestamp
EOF
git config ${mode_prefix}list --type=expiry-date >actual 2>err &&
# section.number and section.big parse as relative dates that could
@@ -2578,7 +2569,7 @@ test_expect_success 'list --type=expiry-date shows only canonicalizable dates' '
test_grep section.big actual &&
test_grep section.number actual &&
test_grep "section.date=$(git config --type=expiry-date section.$key)" actual &&
test_cmp expecterr err
test_must_be_empty err
'
test_expect_success 'list --type=color shows only canonicalizable color values' '