summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlos Martín Nieto <cmn@dwim.me>2014-03-31 08:32:45 +0200
committerCarlos Martín Nieto <cmn@dwim.me>2014-04-18 16:07:32 +0200
commit0500a1ef4e61449a7ad375c1f42d3bd25a4e36bd (patch)
tree3a71c3406f4abaaf5e1f4fe2c34cbd497014d022
parentbd95f836f51804011b8a8c532471733f92f3e119 (diff)
downloadlibgit2-0500a1ef4e61449a7ad375c1f42d3bd25a4e36bd.tar.gz
config: use a snapshot for the iterator
-rw-r--r--src/config_file.c20
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;