Re: in_merge_bases() is too expensive for recent "pu" update
- From
Nguyen Thai Ngoc Duy <pclouds@gmail.com>
- Date
- Aug 24, 2012, 11:42 UTC
- Message-ID
- <CACsJy8DJLmNWDNhGczk_0qDngHxDgQMh7zskxJXTqLGQ8gwugw@mail.gmail.com>
- In-Reply-To
- <878vd5k7uu.fsf@thomas.inf.ethz.ch>
On Thu, Aug 23, 2012 at 9:20 PM, Thomas Rast <trast@student.ethz.ch> wrote:
Show 27 quoted lines
> 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