Re: [PATCH 1/2] merge-base: fix duplicates and not best ancestors in output

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello, Junio!

>> Hi there!
>> First of all: I'm new to mailing-lists, sorry if I'm doing it wrong.
>>
>> I've found a bug in git merge-base, causing it to show not best common
>> ancestors and duplicates under some circumstances (example is given in
>> attached test case).
>
>Attached???

Sorry about this. I expected my first message to be sent back to me by
git@xxxxxxxxxxxxxxx. As I understand I should have replied to this
message with second patch (test). But I did not received first message
back, so I just sent second one to git@xxxxxxxxxxxxxxx. What am I
doing wrong?

> I think we should split that helper function
> handle_octopus().  It does two totally unrelated things

Agree! I have not done this in original patch because I wanted it to
be a minimal change.

> And assuming that deduping is the right thing to do here, here is a
> follow-up on top of the spliting patch.
>
> Scripts that use "merge-base --octopus" could do the reducing
> themselves, but most of them are expected to want to get the reduced
> results without having to do any work themselves.

Not sure what scripts you are talking about. Man git merge-base says:
"--octopus
           Compute the best common ancestors of all supplied commits"
Without deduping this option doesn't always work, so it is a right
thing to do here.

I've also tested changes you've sent, they are OK.

Happy new year!

2013/12/31 Junio C Hamano <gitster@xxxxxxxxx>:
> Junio C Hamano <gitster@xxxxxxxxx> writes:
>
>> I do not offhand remember if it was deliberate that we do not dedup
>> the result from the underlying get_octopus_merge_bases() (the most
>> likely reason for not deduping is because the caller is expected to
>> do that if it wants to).
>>
>> Whether it is an improvement to force deduping here or it is an
>> regression to do so, I think we should split that helper function
>> handle_octopus().  It does two totally unrelated things (one is only
>> to list independent heads without showing merge bases, the other is
>> to show one or more merge bases across all the heads given).
>> Perhaps if we split the "independent" codepath introduced by
>> a1e0ad78 (merge-base --independent to print reduced parent list in a
>> merge, 2010-08-17) into its own helper function, like this, it would
>> make it clear what is going on.
>
> And assuming that deduping is the right thing to do here, here is a
> follow-up on top of the spliting patch.
>
> -- >8 --
> Subject: [PATCH] merge-base --octopus: reduce the result from get_octopus_merge_bases()
>
> Scripts that use "merge-base --octopus" could do the reducing
> themselves, but most of them are expected to want to get the reduced
> results without having to do any work themselves.
>
> Tests are taken from a message by Василий Макаров
> <einmalfel@xxxxxxxxx>
>
> Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx>
> ---
>
>  We might want to vet the existing callers of the underlying
>  get_octopus_merge_bases() and find out if _all_ of them are doing
>  anything extra (like deduping) because the machinery can return
>  duplicate results. And if that is the case, then we may want to
>  move the dedupling down the callchain instead of having it here.
>
>  builtin/merge-base.c  |  2 +-
>  t/t6010-merge-base.sh | 39 +++++++++++++++++++++++++++++++++++++++
>  2 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/builtin/merge-base.c b/builtin/merge-base.c
> index daa96c7..87f4dbc 100644
> --- a/builtin/merge-base.c
> +++ b/builtin/merge-base.c
> @@ -73,7 +73,7 @@ static int handle_octopus(int count, const char **args, int show_all)
>         for (i = count - 1; i >= 0; i--)
>                 commit_list_insert(get_commit_reference(args[i]), &revs);
>
> -       result = get_octopus_merge_bases(revs);
> +       result = reduce_heads(get_octopus_merge_bases(revs));
>
>         if (!result)
>                 return 1;
> diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh
> index f80bba8..abb5728 100755
> --- a/t/t6010-merge-base.sh
> +++ b/t/t6010-merge-base.sh
> @@ -230,4 +230,43 @@ test_expect_success 'criss-cross merge-base for octopus-step' '
>         test_cmp expected.sorted actual.sorted
>  '
>
> +test_expect_success 'merge-base --octopus --all for complex tree' '
> +       # Best common ancestor for JE, JAA and JDD is JC
> +       #             JE
> +       #            / |
> +       #           /  |
> +       #          /   |
> +       #  JAA    /    |
> +       #   |\   /     |
> +       #   | \  | JDD |
> +       #   |  \ |/ |  |
> +       #   |   JC JD  |
> +       #   |    | /|  |
> +       #   |    |/ |  |
> +       #  JA    |  |  |
> +       #   |\  /|  |  |
> +       #   X JB |  X  X
> +       #   \  \ | /   /
> +       #    \__\|/___/
> +       #        J
> +       test_commit J &&
> +       test_commit JB &&
> +       git reset --hard J &&
> +       test_commit JC &&
> +       git reset --hard J &&
> +       test_commit JTEMP1 &&
> +       test_merge JA JB &&
> +       test_merge JAA JC &&
> +       git reset --hard J &&
> +       test_commit JTEMP2 &&
> +       test_merge JD JB &&
> +       test_merge JDD JC &&
> +       git reset --hard J &&
> +       test_commit JTEMP3 &&
> +       test_merge JE JC &&
> +       git rev-parse JC >expected &&
> +       git merge-base --all --octopus JAA JDD JE >actual &&
> +       test_cmp expected actual
> +'
> +
>  test_done
> --
> 1.8.5.2-311-g6427a96
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]