diff options
author | Patrick Steinhardt <ps@pks.im> | 2018-08-10 18:49:38 +0200 |
---|---|---|
committer | Patrick Steinhardt <ps@pks.im> | 2018-09-28 11:14:13 +0200 |
commit | 5a7e0b3c380652e666f0bf0d0c5ff6cd3c846419 (patch) | |
tree | f20b12d7884c538d00bf8644147a9a240c4e12f1 | |
parent | 60ebc137bc38a5cff67cf86023447111b96f7d4d (diff) | |
download | libgit2-5a7e0b3c380652e666f0bf0d0c5ff6cd3c846419.tar.gz |
config_entries: abstract away iteration over entries
The nice thing about our `git_config_iterator` interfaces is that nobody
needs to know anything about the implementation details. All that is
required is to obtain the iterator via any backend and then use it by
executing generic functions. We can thus completely internalize all the
implementation details of how to iterate over entries into the config
entries store and simply create such an iterator in our config file
backend when we want to iterate its entries. This further decouples the
config file backend from the config entries store.
-rw-r--r-- | src/config_entries.c | 23 | ||||
-rw-r--r-- | src/config_entries.h | 10 | ||||
-rw-r--r-- | src/config_file.c | 16 |
3 files changed, 24 insertions, 25 deletions
diff --git a/src/config_entries.c b/src/config_entries.c index a852045f6..ef05d7f6c 100644 --- a/src/config_entries.c +++ b/src/config_entries.c @@ -7,6 +7,11 @@ #include "config_entries.h" +typedef struct config_entries_iterator { + git_config_iterator parent; + config_entry_list *head; +} config_entries_iterator; + static void config_entry_list_free(config_entry_list *list) { config_entry_list *next; @@ -174,7 +179,7 @@ int config_iterator_next( git_config_entry **entry, git_config_iterator *iter) { - git_config_file_iter *it = (git_config_file_iter *) iter; + config_entries_iterator *it = (config_entries_iterator *) iter; if (!it->head) return GIT_ITEROVER; @@ -184,3 +189,19 @@ int config_iterator_next( return 0; } + +int git_config_entries_iterator_new(git_config_iterator **out, git_config_backend *backend, git_config_entries *entries) +{ + config_entries_iterator *it; + + it = git__calloc(1, sizeof(config_entries_iterator)); + GITERR_CHECK_ALLOC(it); + it->parent.backend = backend; + it->head = entries->list; + it->parent.next = config_iterator_next; + it->parent.free = config_iterator_free; + + *out = &it->parent; + + return 0; +} diff --git a/src/config_entries.h b/src/config_entries.h index 555f9bec5..674b7a808 100644 --- a/src/config_entries.h +++ b/src/config_entries.h @@ -22,18 +22,10 @@ typedef struct { config_entry_list *list; } git_config_entries; -typedef struct git_config_file_iter { - git_config_iterator parent; - config_entry_list *head; -} git_config_file_iter; - int git_config_entries_new(git_config_entries **out); void git_config_entries_free(git_config_entries *entries); /* Add or append the new config option */ int git_config_entries_append(git_config_entries *entries, git_config_entry *entry); int git_config_entries_get(git_config_entry **out, git_config_entries *entries, const char *key); int git_config_entries_get_unique(git_config_entry **out, git_config_entries *entries, const char *key); - -void config_iterator_free(git_config_iterator* iter); -int config_iterator_next(git_config_entry **entry, - git_config_iterator *iter); +int git_config_entries_iterator_new(git_config_iterator **out, git_config_backend *backend, git_config_entries *entries); diff --git a/src/config_file.c b/src/config_file.c index 71de2b626..8c05fd973 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -229,8 +229,6 @@ static int config_iterator_new( git_config_iterator **iter, struct git_config_backend* backend) { - diskfile_header *h; - git_config_file_iter *it; git_config_backend *snapshot; diskfile_header *bh = (diskfile_header *) backend; int error; @@ -241,19 +239,7 @@ static int config_iterator_new( if ((error = snapshot->open(snapshot, bh->level, bh->repo)) < 0) return error; - it = git__calloc(1, sizeof(git_config_file_iter)); - GITERR_CHECK_ALLOC(it); - - h = (diskfile_header *)snapshot; - - it->parent.backend = snapshot; - it->head = h->entries->list; - it->parent.next = config_iterator_next; - it->parent.free = config_iterator_free; - - *iter = (git_config_iterator *) it; - - return 0; + return git_config_entries_iterator_new(iter, snapshot, bh->entries); } static int config_set(git_config_backend *cfg, const char *name, const char *value) |