diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2021-07-27 10:18:52 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-07-27 10:18:52 -0400 |
commit | 08c79128be38b6704cfdf01bca037f3fbaabf847 (patch) | |
tree | 223ae3e5cd541c58dcf8065914951604f5787804 | |
parent | 2370e4910262f941a3bb0f70ce05ff7a90679fe1 (diff) | |
parent | 6f544140a097002fe5f15e43a4d3215c944140b7 (diff) | |
download | libgit2-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.c | 18 | ||||
-rw-r--r-- | src/commit_list.h | 1 | ||||
-rw-r--r-- | src/graph.c | 2 | ||||
-rw-r--r-- | src/merge.c | 2 |
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; |