diff options
| author | Junio C Hamano <gitster@pobox.com> | 2025-07-21 14:45:01 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-07-21 14:45:01 -0700 |
| commit | 03dce625bff6598e7f77d9f4a4a25d0288e5e5a8 (patch) | |
| tree | 6df2d5acf8ba19ff8894e9a6a6ee58b5a8743a4e /walker.c | |
| parent | Merge branch 'bc/contribution-under-non-real-names' into next (diff) | |
| parent | prio-queue: add prio_queue_replace() (diff) | |
| download | git-03dce625bff6598e7f77d9f4a4a25d0288e5e5a8.tar.gz git-03dce625bff6598e7f77d9f4a4a25d0288e5e5a8.zip | |
Merge branch 'rs/pop-recent-commit-with-prio-queue' into next
The pop_most_recent_commit() function can have quite expensive
worst case performance characteristics, which has been optimized by
using prio-queue data structure.
* rs/pop-recent-commit-with-prio-queue:
prio-queue: add prio_queue_replace()
commit: use prio_queue_replace() in pop_most_recent_commit(),MIME-Version: 1.0
commit: convert pop_most_recent_commit() to prio_queue
Diffstat (limited to 'walker.c')
| -rw-r--r-- | walker.c | 11 |
1 files changed, 7 insertions, 4 deletions
@@ -14,6 +14,7 @@ #include "blob.h" #include "refs.h" #include "progress.h" +#include "prio-queue.h" static struct object_id current_commit_oid; @@ -78,7 +79,7 @@ static int process_tree(struct walker *walker, struct tree *tree) #define SEEN (1U << 1) #define TO_SCAN (1U << 2) -static struct commit_list *complete = NULL; +static struct prio_queue complete = { compare_commits_by_commit_date }; static int process_commit(struct walker *walker, struct commit *commit) { @@ -87,7 +88,10 @@ static int process_commit(struct walker *walker, struct commit *commit) if (repo_parse_commit(the_repository, commit)) return -1; - while (complete && complete->item->date >= commit->date) { + while (complete.nr) { + struct commit *item = prio_queue_peek(&complete); + if (item->date < commit->date) + break; pop_most_recent_commit(&complete, COMPLETE); } @@ -233,7 +237,7 @@ static int mark_complete(const char *path UNUSED, if (commit) { commit->object.flags |= COMPLETE; - commit_list_insert(commit, &complete); + prio_queue_put(&complete, commit); } return 0; } @@ -302,7 +306,6 @@ int walker_fetch(struct walker *walker, int targets, char **target, if (!walker->get_recover) { refs_for_each_ref(get_main_ref_store(the_repository), mark_complete, NULL); - commit_list_sort_by_date(&complete); } for (i = 0; i < targets; i++) { |
