Skip to content

Commit

Permalink
commit: use mergesort() in commit_list_sort_by_date()
Browse files Browse the repository at this point in the history
Replace the insertion sort in commit_list_sort_by_date() with a
call to the generic mergesort function.  This sets the stage for
using commit_list_sort_by_date() for larger lists, as shown in
the next patch.

Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
René Scharfe authored and Junio C Hamano committed Apr 11, 2012
1 parent 0db71e0 commit 4690589
Showing 1 changed file with 23 additions and 6 deletions.
29 changes: 23 additions & 6 deletions commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "revision.h"
#include "notes.h"
#include "gpg-interface.h"
#include "mergesort.h"

int save_commit_buffer = 1;

Expand Down Expand Up @@ -390,15 +391,31 @@ struct commit_list * commit_list_insert_by_date(struct commit *item, struct comm
return commit_list_insert(item, pp);
}

static int commit_list_compare_by_date(const void *a, const void *b)
{
unsigned long a_date = ((const struct commit_list *)a)->item->date;
unsigned long b_date = ((const struct commit_list *)b)->item->date;
if (a_date < b_date)
return 1;
if (a_date > b_date)
return -1;
return 0;
}

static void *commit_list_get_next(const void *a)
{
return ((const struct commit_list *)a)->next;
}

static void commit_list_set_next(void *a, void *next)
{
((struct commit_list *)a)->next = next;
}

void commit_list_sort_by_date(struct commit_list **list)
{
struct commit_list *ret = NULL;
while (*list) {
commit_list_insert_by_date((*list)->item, &ret);
*list = (*list)->next;
}
*list = ret;
*list = mergesort(*list, commit_list_get_next, commit_list_set_next,
commit_list_compare_by_date);
}

struct commit *pop_most_recent_commit(struct commit_list **list,
Expand Down

0 comments on commit 4690589

Please sign in to comment.