Show 71 quoted lines
> In preparation for callers constructing their own ref_array
> structs, let's move our own internal push operation into its
> own function.
>
> While we're at it, we can replace REALLOC_ARRAY() with
> ALLOC_GROW(), which should give the growth operation
> amortized linear complexity (as opposed to growing by one,
> which is potentially quadratic, though in-place realloc
> growth often makes this faster in practice).
>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
> ref-filter.c | 16 +++++++++++++---
> ref-filter.h | 8 ++++++++
> 2 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/ref-filter.c b/ref-filter.c
> index c1c3cc9480..6e9328b274 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -1840,6 +1840,18 @@ static struct ref_array_item *new_ref_array_item(const char *refname,
> return ref;
> }
>
> +struct ref_array_item *ref_array_push(struct ref_array *array,
> + const char *refname,
> + const struct object_id *oid)
> +{
> + struct ref_array_item *ref = new_ref_array_item(refname, oid);
> +
> + ALLOC_GROW(array->items, array->nr + 1, array->alloc);
> + array->items[array->nr++] = ref;
> +
> + return ref;
> +}
> +
> static int ref_kind_from_refname(const char *refname)
> {
> unsigned int i;
> @@ -1930,13 +1942,11 @@ static int ref_filter_handler(const char *refname, const struct object_id *oid,
> * to do its job and the resulting list may yet to be pruned
> * by maxcount logic.
> */
> - ref = new_ref_array_item(refname, oid);
> + ref = ref_array_push(ref_cbdata->array, refname, oid);
> ref->commit = commit;
> ref->flag = flag;
> ref->kind = kind;
>
> - REALLOC_ARRAY(ref_cbdata->array->items, ref_cbdata->array->nr + 1);
> - ref_cbdata->array->items[ref_cbdata->array->nr++] = ref;
> return 0;
> }
>
> diff --git a/ref-filter.h b/ref-filter.h
> index 68268f9ebc..76cf87cb6c 100644
> --- a/ref-filter.h
> +++ b/ref-filter.h
> @@ -135,4 +135,12 @@ void setup_ref_filter_porcelain_msg(void);
> void pretty_print_ref(const char *name, const struct object_id *oid,
> const struct ref_format *format);
>
> +/*
> + * Push a single ref onto the array; this can be used to construct your own
> + * ref_array without using filter_refs().
> + */
> +struct ref_array_item *ref_array_push(struct ref_array *array,
> + const char *refname,
> + const struct object_id *oid);
> +
> #endif /* REF_FILTER_H */The three patches in this series look good to me.
Reviewed-by: Derrick Stolee <dstolee@microsoft.com>