Thread (3 messages) flat view 3 messages, 2 authors, 2016-06-15

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help