summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2021-07-27 10:18:52 -0400
committerGitHub <noreply@github.com>2021-07-27 10:18:52 -0400
commit08c79128be38b6704cfdf01bca037f3fbaabf847 (patch)
tree223ae3e5cd541c58dcf8065914951604f5787804
parent2370e4910262f941a3bb0f70ce05ff7a90679fe1 (diff)
parent6f544140a097002fe5f15e43a4d3215c944140b7 (diff)
downloadlibgit2-08c79128be38b6704cfdf01bca037f3fbaabf847.tar.gz
Merge pull request #5766 from lhchavez/cgraph-generation-cmp
commit-graph: Introduce `git_commit_list_generation_cmp`
-rw-r--r--src/commit_list.c18
-rw-r--r--src/commit_list.h1
-rw-r--r--src/graph.c2
-rw-r--r--src/merge.c2
4 files changed, 21 insertions, 2 deletions
diff --git a/src/commit_list.c b/src/commit_list.c
index 11cc2e7d2..692b1495f 100644
--- a/src/commit_list.c
+++ b/src/commit_list.c
@@ -12,6 +12,24 @@
#include "odb.h"
#include "commit.h"
+int git_commit_list_generation_cmp(const void *a, const void *b)
+{
+ uint32_t generation_a = ((git_commit_list_node *) a)->generation;
+ uint32_t generation_b = ((git_commit_list_node *) b)->generation;
+
+ if (!generation_a || !generation_b) {
+ /* Fall back to comparing by timestamps if at least one commit lacks a generation. */
+ return git_commit_list_time_cmp(a, b);
+ }
+
+ if (generation_a < generation_b)
+ return 1;
+ if (generation_a > generation_b)
+ return -1;
+
+ return 0;
+}
+
int git_commit_list_time_cmp(const void *a, const void *b)
{
int64_t time_a = ((git_commit_list_node *) a)->time;
diff --git a/src/commit_list.h b/src/commit_list.h
index a32377030..aad39f351 100644
--- a/src/commit_list.h
+++ b/src/commit_list.h
@@ -46,6 +46,7 @@ typedef struct git_commit_list {
} git_commit_list;
git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk);
+int git_commit_list_generation_cmp(const void *a, const void *b);
int git_commit_list_time_cmp(const void *a, const void *b);
void git_commit_list_free(git_commit_list **list_p);
git_commit_list *git_commit_list_insert(git_commit_list_node *item, git_commit_list **list_p);
diff --git a/src/graph.c b/src/graph.c
index df82f0f71..45fae847e 100644
--- a/src/graph.c
+++ b/src/graph.c
@@ -43,7 +43,7 @@ static int mark_parents(git_revwalk *walk, git_commit_list_node *one,
return 0;
}
- if (git_pqueue_init(&list, 0, 2, git_commit_list_time_cmp) < 0)
+ if (git_pqueue_init(&list, 0, 2, git_commit_list_generation_cmp) < 0)
return -1;
if (git_commit_list_parse(walk, one) < 0)
diff --git a/src/merge.c b/src/merge.c
index c29b40e23..fe450b0e7 100644
--- a/src/merge.c
+++ b/src/merge.c
@@ -387,7 +387,7 @@ static int paint_down_to_common(
int error;
unsigned int i;
- if (git_pqueue_init(&list, 0, twos->length * 2, git_commit_list_time_cmp) < 0)
+ if (git_pqueue_init(&list, 0, twos->length * 2, git_commit_list_generation_cmp) < 0)
return -1;
one->flags |= PARENT1;