From fcd324c625d8be3f368c924d787e945e5812d8dd Mon Sep 17 00:00:00 2001 From: Russell Belfer <rb@github.com> Date: Fri, 6 Dec 2013 15:04:31 -0800 Subject: [PATCH] Add git_vector_free_all There are a lot of places that we call git__free on each item in a vector and then call git_vector_free on the vector itself. This just wraps that up into one convenient helper function. --- src/blame.c | 5 +---- src/checkout.c | 10 ++-------- src/diff.c | 9 +-------- src/diff_tform.c | 8 ++------ src/indexer.c | 20 +++++--------------- src/iterator.c | 7 +------ src/merge.c | 6 +----- src/pathspec.c | 10 +--------- src/push.c | 5 +---- src/remote.c | 14 ++------------ src/status.c | 8 +------- src/vector.c | 14 ++++++++++++++ src/vector.h | 1 + 13 files changed, 33 insertions(+), 84 deletions(-) diff --git a/src/blame.c b/src/blame.c index f732338..f10ed40 100644 --- a/src/blame.c +++ b/src/blame.c @@ -132,7 +132,6 @@ void git_blame_free(git_blame *blame) { size_t i; git_blame_hunk *hunk; - char *path; if (!blame) return; @@ -140,9 +139,7 @@ void git_blame_free(git_blame *blame) free_hunk(hunk); git_vector_free(&blame->hunks); - git_vector_foreach(&blame->paths, i, path) - git__free(path); - git_vector_free(&blame->paths); + git_vector_free_all(&blame->paths); git_array_clear(blame->line_index); diff --git a/src/checkout.c b/src/checkout.c index 4305d3e..e33ac2e 100644 --- a/src/checkout.c +++ b/src/checkout.c @@ -846,7 +846,7 @@ static int checkout_conflicts_coalesce_renames( /* Juggle entries based on renames */ names = git_index_name_entrycount(data->index); - + for (i = 0; i < names; i++) { name_entry = git_index_name_get_byindex(data->index, i); @@ -1760,9 +1760,6 @@ static int checkout_create_conflicts(checkout_data *data) static void checkout_data_clear(checkout_data *data) { - checkout_conflictdata *conflict; - size_t i; - if (data->opts_free_baseline) { git_tree_free(data->opts.baseline); data->opts.baseline = NULL; @@ -1771,10 +1768,7 @@ static void checkout_data_clear(checkout_data *data) git_vector_free(&data->removes); git_pool_clear(&data->pool); - git_vector_foreach(&data->conflicts, i, conflict) - git__free(conflict); - - git_vector_free(&data->conflicts); + git_vector_free_all(&data->conflicts); git__free(data->pfx); data->pfx = NULL; diff --git a/src/diff.c b/src/diff.c index ad058af..af47e86 100644 --- a/src/diff.c +++ b/src/diff.c @@ -483,14 +483,7 @@ static int diff_list_apply_options( static void diff_list_free(git_diff *diff) { - git_diff_delta *delta; - unsigned int i; - - git_vector_foreach(&diff->deltas, i, delta) { - git__free(delta); - diff->deltas.contents[i] = NULL; - } - git_vector_free(&diff->deltas); + git_vector_free_all(&diff->deltas); git_pathspec__vfree(&diff->pathspec); git_pool_clear(&diff->pool); diff --git a/src/diff_tform.c b/src/diff_tform.c index 2f94b2e..1618491 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -209,9 +209,7 @@ int git_diff_merge(git_diff *onto, const git_diff *from) git_pool_strdup_safe(&onto->pool, onto->opts.new_prefix); } - git_vector_foreach(&onto_new, i, delta) - git__free(delta); - git_vector_free(&onto_new); + git_vector_free_all(&onto_new); git_pool_clear(&onto_pool); return error; @@ -445,9 +443,7 @@ static int apply_splits_and_deletes( return 0; on_error: - git_vector_foreach(&onto, i, delta) - git__free(delta); - git_vector_free(&onto); + git_vector_free_all(&onto); return -1; } diff --git a/src/indexer.c b/src/indexer.c index 7312809..d3253cb 100644 --- a/src/indexer.c +++ b/src/indexer.c @@ -1005,30 +1005,20 @@ on_error: void git_indexer_free(git_indexer *idx) { - khiter_t k; - unsigned int i; - struct entry *e; - struct delta_info *delta; - if (idx == NULL) return; - git_vector_foreach(&idx->objects, i, e) - git__free(e); - git_vector_free(&idx->objects); + git_vector_free_all(&idx->objects); if (idx->pack) { - for (k = kh_begin(idx->pack->idx_cache); k != kh_end(idx->pack->idx_cache); k++) { - if (kh_exist(idx->pack->idx_cache, k)) - git__free(kh_value(idx->pack->idx_cache, k)); - } + struct git_pack_entry *pentry; + kh_foreach_value( + idx->pack->idx_cache, pentry, { git__free(pentry); }); git_oidmap_free(idx->pack->idx_cache); } - git_vector_foreach(&idx->deltas, i, delta) - git__free(delta); - git_vector_free(&idx->deltas); + git_vector_free_all(&idx->deltas); git_packfile_free(idx->pack); git_filebuf_cleanup(&idx->pack_file); git__free(idx); diff --git a/src/iterator.c b/src/iterator.c index c129222..118bbb8 100644 --- a/src/iterator.c +++ b/src/iterator.c @@ -920,12 +920,7 @@ static fs_iterator_frame *fs_iterator__alloc_frame(fs_iterator *fi) static void fs_iterator__free_frame(fs_iterator_frame *ff) { - size_t i; - git_path_with_stat *path; - - git_vector_foreach(&ff->entries, i, path) - git__free(path); - git_vector_free(&ff->entries); + git_vector_free_all(&ff->entries); git__free(ff); } diff --git a/src/merge.c b/src/merge.c index 0d89da5..d5bc6a3 100644 --- a/src/merge.c +++ b/src/merge.c @@ -2383,11 +2383,7 @@ done: git_index_set_caps(index_repo, index_repo_caps); git_index_free(index_repo); - - git_vector_foreach(&paths, i, path) - git__free(path); - - git_vector_free(&paths); + git_vector_free_all(&paths); return error; } diff --git a/src/pathspec.c b/src/pathspec.c index 1e7e65e..f16e19f 100644 --- a/src/pathspec.c +++ b/src/pathspec.c @@ -102,15 +102,7 @@ int git_pathspec__vinit( /* free data from the pathspec vector */ void git_pathspec__vfree(git_vector *vspec) { - git_attr_fnmatch *match; - unsigned int i; - - git_vector_foreach(vspec, i, match) { - git__free(match); - vspec->contents[i] = NULL; - } - - git_vector_free(vspec); + git_vector_free_all(vspec); } struct pathspec_match_context { diff --git a/src/push.c b/src/push.c index e592249..a314922 100644 --- a/src/push.c +++ b/src/push.c @@ -541,10 +541,7 @@ static int queue_objects(git_push *push) error = 0; on_error: - git_vector_foreach(&commits, i, oid) - git__free(oid); - - git_vector_free(&commits); + git_vector_free_all(&commits); return error; } diff --git a/src/remote.c b/src/remote.c index e9d079d..93d2430 100644 --- a/src/remote.c +++ b/src/remote.c @@ -1158,15 +1158,7 @@ int git_remote_list(git_strarray *remotes_list, git_repository *repo) error = giterr_restore(&data.error); if (error < 0) { - size_t i; - char *elem; - - git_vector_foreach(&data.list, i, elem) { - git__free(elem); - } - - git_vector_free(&data.list); - + git_vector_free_all(&data.list); return error; } @@ -1651,9 +1643,7 @@ static int copy_refspecs(git_strarray *array, git_remote *remote, unsigned int p return 0; on_error: - git_vector_foreach(&refspecs, i, dup) - git__free(dup); - git_vector_free(&refspecs); + git_vector_free_all(&refspecs); return -1; } diff --git a/src/status.c b/src/status.c index 777b796..ce571a2 100644 --- a/src/status.c +++ b/src/status.c @@ -376,19 +376,13 @@ const git_status_entry *git_status_byindex(git_status_list *status, size_t i) void git_status_list_free(git_status_list *status) { - git_status_entry *status_entry; - size_t i; - if (status == NULL) return; git_diff_free(status->head2idx); git_diff_free(status->idx2wd); - git_vector_foreach(&status->paired, i, status_entry) - git__free(status_entry); - - git_vector_free(&status->paired); + git_vector_free_all(&status->paired); git__memzero(status, sizeof(*status)); git__free(status); diff --git a/src/vector.c b/src/vector.c index 362e7b0..9e217b8 100644 --- a/src/vector.c +++ b/src/vector.c @@ -77,6 +77,20 @@ void git_vector_free(git_vector *v) v->_alloc_size = 0; } +void git_vector_free_all(git_vector *v) +{ + size_t i; + + assert(v); + + for (i = 0; i < v->length; ++i) { + git__free(v->contents[i]); + v->contents[i] = NULL; + } + + git_vector_free(v); +} + int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp) { assert(v); diff --git a/src/vector.h b/src/vector.h index 279f5c6..c6d3e9d 100644 --- a/src/vector.h +++ b/src/vector.h @@ -23,6 +23,7 @@ typedef struct git_vector { int git_vector_init(git_vector *v, size_t initial_size, git_vector_cmp cmp); void git_vector_free(git_vector *v); +void git_vector_free_all(git_vector *v); /* free each entry and self */ void git_vector_clear(git_vector *v); int git_vector_dup(git_vector *v, const git_vector *src, git_vector_cmp cmp); void git_vector_swap(git_vector *a, git_vector *b); -- libgit2 0.26.0