Commit a1ecddf01c5546b3f29cd546f4a469263cc6785e

Russell Belfer 2012-08-12T07:59:30

Fix config parser boundary logic The config file parser was not working right if there was no whitespace between the value name and the equals sign. This fixes that.

diff --git a/src/config_file.c b/src/config_file.c
index 80c63d2..4334235 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -1343,10 +1343,9 @@ static int parse_variable(diskfile_backend *cfg, char **var_name, char **var_val
 	else
 		value_start = var_end + 1;
 
-	if (git__isspace(var_end[-1])) {
-		do var_end--;
-		while (git__isspace(var_end[0]));
-	}
+	var_end--;
+	while (git__isspace(*var_end))
+		var_end--;
 
 	*var_name = git__strndup(line, var_end - line + 1);
 	GITERR_CHECK_ALLOC(*var_name);
diff --git a/tests-clar/config/read.c b/tests-clar/config/read.c
index 574ff81..fcd2246 100644
--- a/tests-clar/config/read.c
+++ b/tests-clar/config/read.c
@@ -266,6 +266,22 @@ void test_config_read__foreach_match(void)
 	git_config_free(cfg);
 }
 
+void test_config_read__whitespace_not_required_around_assignment(void)
+{
+	git_config *cfg;
+	const char *str;
+
+	cl_git_pass(git_config_open_ondisk(&cfg, cl_fixture("config/config14")));
+
+	cl_git_pass(git_config_get_string(&str, cfg, "a.b"));
+	cl_assert_equal_s(str, "c");
+
+	cl_git_pass(git_config_get_string(&str, cfg, "d.e"));
+	cl_assert_equal_s(str, "f");
+
+	git_config_free(cfg);
+}
+
 #if 0
 
 BEGIN_TEST(config10, "a repo's config overrides the global config")
diff --git a/tests-clar/resources/config/config14 b/tests-clar/resources/config/config14
new file mode 100644
index 0000000..ef2198c
--- /dev/null
+++ b/tests-clar/resources/config/config14
@@ -0,0 +1,4 @@
+[a]
+    b=c
+[d]
+    e = f