]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: format expiry dates quietly
authorDerrick Stolee <stolee@gmail.com>
Mon, 23 Feb 2026 12:26:51 +0000 (12:26 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 23 Feb 2026 21:23:41 +0000 (13:23 -0800)
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>
builtin/config.c
t/t1300-config.sh

index 2828b6dcf178148bbbc3fb7f0f0d5d53c81f39d0..ee77ddc87c629cdb1d4774d685a0a4c4a0e2c112 100644 (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;
index 48d9c554d815bf75c512b000f4c92dd490dcd244..72bdd6ab03fd75c9d4fd073a5d926bca14409f49 100755 (executable)
@@ -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' '