summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/config_file.c2
-rw-r--r--tests/config/global.c30
2 files changed, 31 insertions, 1 deletions
diff --git a/src/config_file.c b/src/config_file.c
index a36c0aa02..48a9a26d4 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -1133,7 +1133,7 @@ static int config_write(diskfile_backend *cfg, const char *orig_key, const char
reader.file = &cfg->file;
if (cfg->locked) {
- result = git_buf_puts(&contents, git_buf_cstr(&cfg->locked_content));
+ result = git_buf_puts(&contents, git_buf_cstr(&cfg->locked_content) == NULL ? "" : git_buf_cstr(&cfg->locked_content));
} else {
/* Lock the file */
if ((result = git_filebuf_open(
diff --git a/tests/config/global.c b/tests/config/global.c
index 647a110e3..4517caeb1 100644
--- a/tests/config/global.c
+++ b/tests/config/global.c
@@ -75,6 +75,36 @@ void test_config_global__open_symlinked_global(void)
#endif
}
+void test_config_global__lock_missing_global_config(void)
+{
+ git_config *cfg;
+ git_config_entry *entry;
+ git_transaction *transaction;
+
+ p_unlink("home/.gitconfig"); /* No global config */
+
+ cl_git_pass(git_config_open_default(&cfg));
+ cl_git_pass(git_config_lock(&transaction, cfg));
+ cl_git_pass(git_config_set_string(cfg, "assertion.fail", "boom"));
+ cl_git_pass(git_transaction_commit(transaction));
+ git_transaction_free(transaction);
+
+ /* cfg is updated */
+ cl_git_pass(git_config_get_entry(&entry, cfg, "assertion.fail"));
+ cl_assert_equal_s("boom", entry->value);
+
+ git_config_entry_free(entry);
+ git_config_free(cfg);
+
+ /* We can reread the new value from the global config */
+ cl_git_pass(git_config_open_default(&cfg));
+ cl_git_pass(git_config_get_entry(&entry, cfg, "assertion.fail"));
+ cl_assert_equal_s("boom", entry->value);
+
+ git_config_entry_free(entry);
+ git_config_free(cfg);
+}
+
void test_config_global__open_xdg(void)
{
git_config *cfg, *xdg, *selected;