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 /object-name.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 'object-name.c')
| -rw-r--r-- | object-name.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/object-name.c b/object-name.c index ddafe7f9b1..41930609e3 100644 --- a/object-name.c +++ b/object-name.c @@ -28,6 +28,7 @@ #include "commit-reach.h" #include "date.h" #include "object-file-convert.h" +#include "prio-queue.h" static int get_oid_oneline(struct repository *r, const char *, struct object_id *, const struct commit_list *); @@ -1461,7 +1462,7 @@ static int get_oid_oneline(struct repository *r, const char *prefix, struct object_id *oid, const struct commit_list *list) { - struct commit_list *copy = NULL, **copy_tail = © + struct prio_queue copy = { compare_commits_by_commit_date }; const struct commit_list *l; int found = 0; int negative = 0; @@ -1483,9 +1484,9 @@ static int get_oid_oneline(struct repository *r, for (l = list; l; l = l->next) { l->item->object.flags |= ONELINE_SEEN; - copy_tail = &commit_list_insert(l->item, copy_tail)->next; + prio_queue_put(©, l->item); } - while (copy) { + while (copy.nr) { const char *p, *buf; struct commit *commit; int matches; @@ -1507,7 +1508,7 @@ static int get_oid_oneline(struct repository *r, regfree(®ex); for (l = list; l; l = l->next) clear_commit_marks(l->item, ONELINE_SEEN); - free_commit_list(copy); + clear_prio_queue(©); return found ? 0 : -1; } @@ -2061,7 +2062,6 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo, cb.list = &list; refs_for_each_ref(get_main_ref_store(repo), handle_one_ref, &cb); refs_head_ref(get_main_ref_store(repo), handle_one_ref, &cb); - commit_list_sort_by_date(&list); ret = get_oid_oneline(repo, name + 2, oid, list); free_commit_list(list); |
