Commit e8162fd091bbfd49fc5aaa60794a0a3558e895bb

nulltoken 2013-11-05T12:01:14

Propagate ELOCKED error when updating the config

diff --git a/src/config_file.c b/src/config_file.c
index 40dcc5a..9b4a7c1 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -385,10 +385,10 @@ static int config_set(git_config_backend *cfg, const char *name, const char *val
 		GITERR_CHECK_ALLOC(esc_value);
 	}
 
-	if (config_write(b, key, NULL, esc_value) < 0) {
+	if ((ret = config_write(b, key, NULL, esc_value)) < 0) {
 		git__free(esc_value);
 		cvar_free(var);
-		return -1;
+		return ret;
 	}
 
 	git__free(esc_value);
@@ -1210,8 +1210,8 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p
 	write_start = data_start;
 
 	/* Lock the file */
-	if (git_filebuf_open(&file, cfg->file_path, 0, GIT_CONFIG_FILE_MODE) < 0)
-		return -1;
+	if ((result = git_filebuf_open(&file, cfg->file_path, 0, GIT_CONFIG_FILE_MODE)) < 0)
+		return result;
 
 	skip_bom(reader);
 	ldot = strrchr(key, '.');
diff --git a/tests-clar/config/write.c b/tests-clar/config/write.c
index 57b02a7..309fef6 100644
--- a/tests-clar/config/write.c
+++ b/tests-clar/config/write.c
@@ -259,3 +259,16 @@ void test_config_write__can_set_an_empty_value(void)
 	git_config_free(config);
 	cl_git_sandbox_cleanup();
 }
+
+void test_config_write__updating_a_locked_config_file_returns_ELOCKED(void)
+{
+	git_config *cfg;
+
+	cl_git_pass(git_config_open_ondisk(&cfg, "config9"));
+
+	cl_git_mkfile("config9.lock", "[core]\n");
+
+	cl_git_fail_with(git_config_set_string(cfg, "core.dump", "boom"), GIT_ELOCKED);
+
+	git_config_free(cfg);
+}