The previous custom merge sort would drop duplicate entries as part of the sort. It would also die if the duplicate entries had different sha1 values. The standard library qsort doesn't do this, so we have to do it manually afterwards. Signed-off-by: Julian Phillips <julian@xxxxxxxxxxxxxxxxx> --- On Fri, 30 Sep 2011 09:38:54 -0700, Junio C Hamano wrote: > Michael Haggerty <mhagger@xxxxxxxxxxxx> writes: > >> On 09/30/2011 01:48 AM, Junio C Hamano wrote: >>> This version looks sane, although I have a suspicion that it may >>> have >>> some interaction with what Michael may be working on. >> >> Indeed, I have almost equivalent changes in the giant patch series >> that >> I am working on [1]. > > Good; that was the primary thing I wanted to know. I want to take > Julian's patch early but if the approach and data structures were > drastically different from what you are cooking, that would force > unnecessary reroll on your part, which I wanted to avoid. > > Thanks. I had a quick look at Michael's code, and it reminded me that I had missed one thing out. If we want to keep the duplicate detection & removal from the original merge sort then this patch is needed on top of v3 of the binary search. Though I never could figure out how duplicate refs were supposed to appear ... I tested by editing packed-refs, but I assume that isn't "supported". refs.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/refs.c b/refs.c index 4c01d79..cf080ee 100644 --- a/refs.c +++ b/refs.c @@ -77,7 +77,29 @@ static int ref_entry_cmp(const void *a, const void *b) static void sort_ref_array(struct ref_array *array) { + int i = 0, j = 1; + + /* Nothing to sort unless there are at least two entries */ + if (array->nr < 2) + return; + qsort(array->refs, array->nr, sizeof(*array->refs), ref_entry_cmp); + + /* Remove any duplicates from the ref_array */ + for (; j < array->nr; j++) { + struct ref_entry *a = array->refs[i]; + struct ref_entry *b = array->refs[j]; + if (!strcmp(a->name, b->name)) { + if (hashcmp(a->sha1, b->sha1)) + die("Duplicated ref, and SHA1s don't match: %s", + a->name); + warning("Duplicated ref: %s", a->name); + continue; + } + i++; + array->refs[i] = array->refs[j]; + } + array->nr = i + 1; } static struct ref_entry *search_ref_array(struct ref_array *array, const char *name) -- 1.7.6.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html