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

[PATCH v3 5/5] do not die when error in config parsing of buf occurs

From
Heiko Voigt <hvoigt@hvoigt.net>
Date
May 9, 2013, 16:21 UTC
Message-ID
<20130509162102.GG3526@book-mint>
In-Reply-To
<20130509154020.GA26423@book-mint>

If a config parsing error in a file occurs we can die and let the user fix the issue. This is different for the buf parsing function since it can be used to parse blobs of .gitmodules files. If a parsing error occurs here we should proceed since otherwise a database containing such an error in a single revision could be rendered unuseable.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
---
 builtin/config.c       | 10 +++++++---
 config.c               | 10 ++++++++--
 t/t1307-config-blob.sh |  9 +++++++--
 3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/builtin/config.c b/builtin/config.c
index 8d01b7a..de32977 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -219,9 +219,11 @@ static int get_value(const char *key_, const char *regex_)
 		}
 	}
 
-	git_config_with_options(collect_config, &values,
+	ret = git_config_with_options(collect_config, &values,
 				given_config_file, given_config_blob,
 				respect_includes);
+	if (ret < 0)
+		goto free_values;
 
 	ret = !values.nr;
 
@@ -231,6 +233,7 @@ static int get_value(const char *key_, const char *regex_)
 			fwrite(buf->buf, 1, buf->len, stdout);
 		strbuf_release(buf);
 	}
+free_values:
 	free(values.items);
 
 free_strings:
@@ -333,9 +336,10 @@ static int get_colorbool(int print)
 {
 	get_colorbool_found = -1;
 	get_diff_color_found = -1;
-	git_config_with_options(git_get_colorbool_config, NULL,
+	if (git_config_with_options(git_get_colorbool_config, NULL,
 				given_config_file, given_config_blob,
-				respect_includes);
+				respect_includes) < 0)
+		return -1;
 
 	if (get_colorbool_found < 0) {
 		if (!strcmp(get_colorbool_slot, "color.diff"))
diff --git a/config.c b/config.c
index 50c762a..8a8408d 100644
--- a/config.c
+++ b/config.c
@@ -21,6 +21,7 @@ struct config_source {
 		} buf;
 	};
 	const char *name;
+	int die_on_error;
 	int linenr;
 	int eof;
 	struct strbuf value;
@@ -442,7 +443,10 @@ static int git_parse_source(config_fn_t fn, void *data)
 		if (get_value(fn, data, var) < 0)
 			break;
 	}
-	die("bad config file line %d in %s", cf->linenr, cf->name);
+	if (cf->die_on_error)
+		die("bad config file line %d in %s", cf->linenr, cf->name);
+	else
+		return error("bad config file line %d in %s", cf->linenr, cf->name);
 }
 
 static int parse_unit_factor(const char *end, uintmax_t *val)
@@ -940,7 +944,7 @@ int git_default_config(const char *var, const char *value, void *dummy)
 }
 
 /*
- * All source specific fields in the union, name and the callbacks
+ * All source specific fields in the union, die_on_error, name and the callbacks
  * fgetc, ungetc, ftell of top need to be initialized before calling
  * this function.
  */
@@ -977,6 +981,7 @@ int git_config_from_file(config_fn_t fn, const char *filename, void *data)
 
 		top.file = f;
 		top.name = filename;
+		top.die_on_error = 1;
 		top.fgetc = config_file_fgetc;
 		top.ungetc = config_file_ungetc;
 		top.ftell = config_file_ftell;
@@ -996,6 +1001,7 @@ int git_config_from_buf(config_fn_t fn, const char *name, const char *buf,
 	top.buf.buf = buf;
 	top.buf.pos = 0;
 	top.name = name;
+	top.die_on_error = 0;
 	top.fgetc = config_buf_fgetc;
 	top.ungetc = config_buf_ungetc;
 	top.ftell = config_buf_ftell;
diff --git a/t/t1307-config-blob.sh b/t/t1307-config-blob.sh
index fdc257e..a4929eb 100755
--- a/t/t1307-config-blob.sh
+++ b/t/t1307-config-blob.sh
@@ -55,12 +55,17 @@ test_expect_success 'editing a blob is an error' '
 test_expect_success 'parse errors in blobs are properly attributed' '
 	cat >config <<-\EOF &&
 	[some]
-		value = "
+		value = 1
+		error = "
 	EOF
 	git add config &&
 	git commit -m broken &&
 
-	test_must_fail git config --blob=HEAD:config some.value 2>err &&
+	test_must_fail git config --blob=HEAD:config some.value 1>out 2>err &&
+
+	# Make sure there is no output of values on stdout
+	touch out.expect &&
+	test_cmp out.expect out &&
 
 	# just grep for our token as the exact error message is likely to
 	# change or be internationalized
-- 
1.8.3.rc1.40.gba374ae
Previous: Heiko VoigtNext: Eric Sunshine
Message 9 of 14 in “config: factor out config file stack management”
  1. 1/5 config: factor out config file stack managementHeiko Voigt, May 9, 2013
  2. 2/5 config: drop cf validity check in get_next_char()Heiko Voigt, May 9, 2013
  3. 3/5 config: make parsing stack struct independent from actual data sourceHeiko Voigt, May 9, 2013
  4. Jeff KingMay 9, 2013
  5. 4/5 teach config --blob option to parse config from databaseHeiko Voigt, May 9, 2013
  6. Eric SunshineMay 9, 2013
  7. Jeff KingMay 9, 2013
  8. Heiko VoigtMay 10, 2013
  9. 5/5 do not die when error in config parsing of buf occursHeiko Voigt, May 9, 2013
  10. Eric SunshineMay 9, 2013
  11. Jeff KingMay 9, 2013
  12. Heiko VoigtMay 11, 2013
  13. Jeff KingMay 11, 2013
  14. Heiko VoigtMay 11, 2013

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.