[PATCH 3/5] add sorting infrastructure for list refs
- From
Jeff King <peff@peff.net>
- Date
- May 21, 2012, 22:19 UTC
- Message-ID
- <20120521221928.GC22914@sigill.intra.peff.net>
- In-Reply-To
- <20120521221417.GA22664@sigill.intra.peff.net>
Since we store lists of refs as linked lists, we can use llist_mergesort to efficiently sort them.
Signed-off-by: Jeff King <peff@peff.net> --- Many thanks to René for the llist_mergesort code.
remote.c | 22 ++++++++++++++++++++++ remote.h | 2 ++ 2 files changed, 24 insertions(+)
diff --git a/remote.c b/remote.c index b296d17..6833538 100644 --- a/remote.c +++ b/remote.c @@ -7,6 +7,7 @@ #include "dir.h" #include "tag.h" #include "string-list.h" +#include "mergesort.h" enum map_direction { FROM_SRC, FROM_DST }; @@ -918,6 +919,27 @@ void free_refs(struct ref *ref) } } +int ref_compare_name(const void *va, const void *vb) +{ + const struct ref *a = va, *b = vb; + return strcmp(a->name, b->name); +} + +static void *ref_list_get_next(const void *a) +{ + return ((const struct ref *)a)->next; +} + +static void ref_list_set_next(void *a, void *next) +{ + ((struct ref *)a)->next = next; +} + +void sort_ref_list(struct ref **l, int (*cmp)(const void *, const void *)) +{ + *l = llist_mergesort(*l, ref_list_get_next, ref_list_set_next, cmp); +} + static int count_refspec_match(const char *pattern, struct ref *refs, struct ref **matched_ref) diff --git a/remote.h b/remote.h index 9ad8eb6..251d8fd 100644 --- a/remote.h +++ b/remote.h @@ -72,6 +72,8 @@ extern const struct refspec *tag_refspec; struct ref *alloc_ref(const char *name); struct ref *copy_ref(const struct ref *ref); struct ref *copy_ref_list(const struct ref *ref); +void sort_ref_list(struct ref **, int (*cmp)(const void *, const void *)); +int ref_compare_name(const void *, const void *); int check_ref_type(const struct ref *ref, int flags);
-- 1.7.10.1.19.g711d603