Merge pull request #2622 from libgit2/refresh-config-snapshot Refresh git configuration before looking for the tracking branch redux.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
diff --git a/src/config_file.c b/src/config_file.c
index 8f55c42..1f73e7e 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -767,12 +767,17 @@ static int config_readonly_open(git_config_backend *cfg, git_config_level_t leve
{
diskfile_readonly_backend *b = (diskfile_readonly_backend *) cfg;
diskfile_backend *src = b->snapshot_from;
+ diskfile_header *src_header = &src->header;
refcounted_strmap *src_map;
+ int error;
+
+ if (!src_header->readonly && (error = config_refresh(&src_header->parent)) < 0)
+ return error;
/* We're just copying data, don't care about the level */
GIT_UNUSED(level);
- src_map = refcounted_strmap_take(&src->header);
+ src_map = refcounted_strmap_take(src_header);
b->header.values = src_map;
return 0;
diff --git a/tests/config/snapshot.c b/tests/config/snapshot.c
index c9f1592..e47e252 100644
--- a/tests/config/snapshot.c
+++ b/tests/config/snapshot.c
@@ -3,7 +3,7 @@
void test_config_snapshot__create_snapshot(void)
{
int32_t tmp;
- git_config *cfg, *snapshot;
+ git_config *cfg, *snapshot, *new_snapshot;
const char *filename = "config-ext-change";
cl_git_mkfile(filename, "[old]\nvalue = 5\n");
@@ -23,6 +23,19 @@ void test_config_snapshot__create_snapshot(void)
cl_git_pass(git_config_get_int32(&tmp, snapshot, "old.value"));
cl_assert_equal_i(5, tmp);
+
+ /* Change the value on the file itself (simulate external process) */
+ cl_git_mkfile(filename, "[old]\nvalue = 999\n");
+
+ cl_git_pass(git_config_snapshot(&new_snapshot, cfg));
+
+ /* New snapshot should see new value */
+ cl_git_pass(git_config_get_int32(&tmp, new_snapshot, "old.value"));
+ cl_assert_equal_i(999, tmp);
+
+ /* Old snapshot should still have the old value */
+ cl_git_pass(git_config_get_int32(&tmp, snapshot, "old.value"));
+ cl_assert_equal_i(5, tmp);
git_config_free(snapshot);
git_config_free(cfg);