]> git.ipfire.org Git - thirdparty/git.git/commitdiff
config: add git_config_key_is_valid() for quiet validation
authorHarald Nordgren <haraldnordgren@gmail.com>
Tue, 2 Jun 2026 18:43:27 +0000 (18:43 +0000)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Jun 2026 23:39:54 +0000 (08:39 +0900)
Move the body of git_config_parse_key() into a static helper
do_parse_config_key() that takes a "quiet" flag and treats
store_key as optional.  git_config_parse_key() becomes a thin
wrapper.

Add git_config_key_is_valid() for callers that only need to
know whether a key is well-formed.

Signed-off-by: Harald Nordgren <haraldnordgren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
config.c
config.h

index 156f2a24fa00271c6d6adafac16527e674f5ccd4..7ae356ccaa4b3f2315cdcc16f5932c328738d2c6 100644 (file)
--- a/config.c
+++ b/config.c
@@ -536,11 +536,14 @@ static inline int iskeychar(int c)
  * -2 if there is no section name in the key.
  *
  * store_key - pointer to char* which will hold a copy of the key with
- *             lowercase section and variable name
+ *             lowercase section and variable name, can be NULL to skip
+ *             allocation when only validation is needed
  * baselen - pointer to size_t which will hold the length of the
  *           section + subsection part, can be NULL
+ * quiet - when non-zero, suppress error() reports on rejection
  */
-int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
+static int do_parse_config_key(const char *key, char **store_key,
+                              size_t *baselen_, int quiet)
 {
        size_t i, baselen;
        int dot;
@@ -552,12 +555,14 @@ int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
         */
 
        if (last_dot == NULL || last_dot == key) {
-               error(_("key does not contain a section: %s"), key);
+               if (!quiet)
+                       error(_("key does not contain a section: %s"), key);
                return -CONFIG_NO_SECTION_OR_NAME;
        }
 
        if (!last_dot[1]) {
-               error(_("key does not contain variable name: %s"), key);
+               if (!quiet)
+                       error(_("key does not contain variable name: %s"), key);
                return -CONFIG_NO_SECTION_OR_NAME;
        }
 
@@ -568,7 +573,8 @@ int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
        /*
         * Validate the key and while at it, lower case it for matching.
         */
-       *store_key = xmallocz(strlen(key));
+       if (store_key)
+               *store_key = xmallocz(strlen(key));
 
        dot = 0;
        for (i = 0; key[i]; i++) {
@@ -579,24 +585,38 @@ int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
                if (!dot || i > baselen) {
                        if (!iskeychar(c) ||
                            (i == baselen + 1 && !isalpha(c))) {
-                               error(_("invalid key: %s"), key);
+                               if (!quiet)
+                                       error(_("invalid key: %s"), key);
                                goto out_free_ret_1;
                        }
                        c = tolower(c);
                } else if (c == '\n') {
-                       error(_("invalid key (newline): %s"), key);
+                       if (!quiet)
+                               error(_("invalid key (newline): %s"), key);
                        goto out_free_ret_1;
                }
-               (*store_key)[i] = c;
+               if (store_key)
+                       (*store_key)[i] = c;
        }
 
        return 0;
 
 out_free_ret_1:
-       FREE_AND_NULL(*store_key);
+       if (store_key)
+               FREE_AND_NULL(*store_key);
        return -CONFIG_INVALID_KEY;
 }
 
+int git_config_parse_key(const char *key, char **store_key, size_t *baselen_)
+{
+       return do_parse_config_key(key, store_key, baselen_, 0);
+}
+
+int git_config_key_is_valid(const char *key)
+{
+       return !do_parse_config_key(key, NULL, NULL, 1);
+}
+
 static int config_parse_pair(const char *key, const char *value,
                             struct key_value_info *kvi,
                             config_fn_t fn, void *data)
index ba426a960af9f4c10ea7102cea34384920270cb8..26a2850d15afedbdc1dac1a2636dcb1c23c040bc 100644 (file)
--- a/config.h
+++ b/config.h
@@ -337,6 +337,8 @@ void repo_config_set(struct repository *, const char *, const char *);
 
 int git_config_parse_key(const char *, char **, size_t *);
 
+int git_config_key_is_valid(const char *);
+
 /*
  * The following macros specify flag bits that alter the behavior
  * of the repo_config_set_multivar*() methods.