Re: in_merge_bases() is too expensive for recent "pu" update
From: Nguyen Thai Ngoc Duy <hidden>
Date: 2016-06-15 22:54:34
On Thu, Aug 23, 2012 at 9:20 PM, Thomas Rast [off-list ref] wrote:
quoted hunk ↗ jump to hunk
At the very least it should be possible to change in_merge_bases() to not do any of the post-filtering; perhaps like the patch below. It passes the test suite. The whole "merge bases of A and a list of Bs" thing is blowing my overheated mind, though, so I'm not able to convince myself that it is correct in all cases.diff --git i/commit.c w/commit.c index 65a8485..70427ab 100644 --- i/commit.c +++ w/commit.c@@ -837,10 +837,13 @@ int in_merge_bases(struct commit *commit, struct commit **reference, int num) struct commit_list *bases, *b; int ret = 0; - if (num == 1) - bases = get_merge_bases(commit, *reference, 1); - else + if (num != 1) die("not yet"); + + bases = merge_bases_many(commit, 1, reference); + clear_commit_marks(commit, all_flags); + clear_commit_marks(*reference, all_flags); + for (b = bases; b; b = b->next) { if (!hashcmp(commit->object.sha1, b->item->object.sha1)) { ret = 1;
Without looking into detail (as I'm not familiar with this code), this patch does not help much. Without the patch: $ time ./git merge-base a4f2db3 b95a282 ed36e5bd41f7192e42e9b4c573875a343a9daf48 real 0m19.988s user 0m19.797s sys 0m0.082s With the patch: $ time ./git merge-base a4f2db3 b95a282 ed36e5bd41f7192e42e9b4c573875a343a9daf48 real 0m19.560s user 0m19.448s sys 0m0.037s -- Duy