diff options
author | Carlos Martín Nieto <cmn@dwim.me> | 2014-03-31 08:32:45 +0200 |
---|---|---|
committer | Carlos Martín Nieto <cmn@dwim.me> | 2014-04-18 16:07:32 +0200 |
commit | 0500a1ef4e61449a7ad375c1f42d3bd25a4e36bd (patch) | |
tree | 3a71c3406f4abaaf5e1f4fe2c34cbd497014d022 /src/config_file.c | |
parent | bd95f836f51804011b8a8c532471733f92f3e119 (diff) | |
download | libgit2-0500a1ef4e61449a7ad375c1f42d3bd25a4e36bd.tar.gz |
config: use a snapshot for the iterator
Diffstat (limited to 'src/config_file.c')
-rw-r--r-- | src/config_file.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/src/config_file.c b/src/config_file.c index 24ace6039..81828ef23 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -113,6 +113,7 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p static char *escape_value(const char *ptr); int git_config_file__snapshot(git_config_backend **out, diskfile_backend *in); +static int config_snapshot(git_config_backend **out, git_config_backend *in); static void set_parse_error(struct reader *reader, int col, const char *error_str) { @@ -326,6 +327,7 @@ static void backend_free(git_config_backend *_backend) static void config_iterator_free( git_config_iterator* iter) { + iter->backend->free(iter->backend); git__free(iter); } @@ -360,15 +362,27 @@ static int config_iterator_new( git_config_iterator **iter, struct git_config_backend* backend) { - diskfile_header *h = (diskfile_header *)backend; - git_config_file_iter *it = git__calloc(1, sizeof(git_config_file_iter)); + diskfile_header *h; + git_config_file_iter *it; + git_config_backend *snapshot; + diskfile_backend *b = (diskfile_backend *) backend; + int error; + + if ((error = config_snapshot(&snapshot, backend)) < 0) + return error; + if ((error = snapshot->open(snapshot, b->level)) < 0) + return error; + + it = git__calloc(1, sizeof(git_config_file_iter)); GITERR_CHECK_ALLOC(it); + h = (diskfile_header *)snapshot; + /* strmap_begin() is currently a macro returning 0 */ GIT_UNUSED(h); - it->parent.backend = backend; + it->parent.backend = snapshot; it->iter = git_strmap_begin(h->values); it->next_var = NULL; |