git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 5/6] config: add `git_die_config()` to the config-set API

From
Tanay Abhra <tanayabh@gmail.com>
Date
Jul 29, 2014, 11:28 UTC
Message-ID
<1406633302-23144-6-git-send-email-tanayabh@gmail.com>
In-Reply-To
<1406633302-23144-1-git-send-email-tanayabh@gmail.com>

Add `git_die_config` that dies printing the line number and the file name of the highest priority value for the configuration variable `key`.

It has usage in non-callback based config value retrieval where we can raise an error and die if there is a semantic error. For example,

	if (!git_config_get_value(key, &value)) {
		/* NULL values not allowed */
		if (!value)
			git_config_die(key);
		else
			/* do work */
	}
Signed-off-by: Tanay Abhra <tanayabh@gmail.com>
---
 Documentation/technical/api-config.txt |  5 +++++
 cache.h                                |  1 +
 config.c                               | 27 +++++++++++++++++++++++++--
 3 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/Documentation/technical/api-config.txt b/Documentation/technical/api-config.txt
index 815c1ee..e7ec7cc 100644
--- a/Documentation/technical/api-config.txt
+++ b/Documentation/technical/api-config.txt
@@ -155,6 +155,11 @@ as well as retrieval for the queried variable, including:
 	Similar to `git_config_get_string`, but expands `~` or `~user` into
 	the user's home directory when found at the beginning of the path.
 
+`void git_die_config(const char *key)`::
+
+	Dies printing the line number and the file name of the highest
+	priority value for the configuration variable `key`.
+
 See test-config.c for usage examples.
 
 Value Parsing Helpers
diff --git a/cache.h b/cache.h
index 93bdbab..8512225 100644
--- a/cache.h
+++ b/cache.h
@@ -1406,6 +1406,7 @@ extern int git_config_get_bool(const char *key, int *dest);
 extern int git_config_get_bool_or_int(const char *key, int *is_bool, int *dest);
 extern int git_config_get_maybe_bool(const char *key, int *dest);
 extern int git_config_get_pathname(const char *key, const char **dest);
+extern void git_die_config(const char *key);
 
 extern int committer_ident_sufficiently_given(void);
 extern int author_ident_sufficiently_given(void);
diff --git a/config.c b/config.c
index 1134741..16e99bf 100644
--- a/config.c
+++ b/config.c
@@ -1506,8 +1506,12 @@ const struct string_list *git_config_get_value_multi(const char *key)
 
 int git_config_get_string_const(const char *key, const char **dest)
 {
+	int ret;
 	git_config_check_init();
-	return git_configset_get_string_const(&the_config_set, key, dest);
+	ret = git_configset_get_string_const(&the_config_set, key, dest);
+	if (ret < 0)
+		git_die_config(key);
+	return ret;
 }
 
 int git_config_get_string(const char *key, char **dest)
@@ -1548,10 +1552,29 @@ int git_config_get_maybe_bool(const char *key, int *dest)
 
 int git_config_get_pathname(const char *key, const char **dest)
 {
+	int ret;
 	git_config_check_init();
-	return git_configset_get_pathname(&the_config_set, key, dest);
+	ret = git_configset_get_pathname(&the_config_set, key, dest);
+	if (ret < 0)
+		git_die_config(key);
+	return ret;
 }
 
+void git_die_config(const char *key)
+{
+	const struct string_list *values;
+	struct key_value_info *kv_info;
+	values = git_config_get_value_multi(key);
+	kv_info = values->items[values->nr - 1].util;
+	if (!kv_info->linenr)
+		die("unable to parse '%s' from command-line config", key);
+	else
+		die("bad config variable '%s' at file line %d in %s",
+			key,
+			kv_info->linenr,
+			kv_info->filename);
+ }
+
 /*
  * Find all the stuff for git_config_set() below.
  */
-- 
1.9.0.GIT
Previous: Tanay AbhraNext: Tanay Abhra
Message 12 of 13 in “Rewrite `git_config()` using config-set API”
  1. 0/6 Rewrite `git_config()` using config-set APITanay Abhra, Jul 29, 2014
  2. 1/6 config.c: fix accuracy of line number in errorsTanay Abhra, Jul 29, 2014
  3. 2/6 add line number and file name info to `config_set`Tanay Abhra, Jul 29, 2014
  4. 3/6 rewrite git_config() to use the config-set APITanay Abhra, Jul 29, 2014
  5. Tanay AbhraJul 29, 2014
  6. Matthieu MoyJul 29, 2014
  7. Matthieu MoyJul 29, 2014
  8. Tanay AbhraJul 29, 2014
  9. Matthieu MoyJul 29, 2014
  10. Tanay AbhraJul 29, 2014
  11. 4/6 add a test for semantic errors in config filesTanay Abhra, Jul 29, 2014
  12. 5/6 config: add `git_die_config()` to the config-set APITanay Abhra, Jul 29, 2014
  13. 6/6 add tests for `git_config_get_string_const()`Tanay Abhra, Jul 29, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.