[PATCH 1/2] merge-base: fix duplicates and not best ancestors in output
- From
Василий Макаров <einmalfel@gmail.com>
- Date
- Dec 28, 2013, 10:22 UTC
- Message-ID
- <CABEtfDFu=Fc0SXbyFctEyiMCJwqxP25K9mdVhAB0X_vKHxvW_A@mail.gmail.com>
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). Problem cause is algorithm used in get_octopus_merge_bases(), it iteratively concatenates merge bases, and don't care if there are duplicates or decsendants/ancestors in result. What I suggest as a solution is to simply reduce bases list after get_octopus_merge_bases().
Here is the fix:
--- builtin/merge-base.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/builtin/merge-base.c b/builtin/merge-base.c index e88eb93..d6ad330 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -44,19 +44,19 @@ static struct commit *get_commit_reference(const char *arg) return r; } -static int handle_octopus(int count, const char **args, int reduce, int show_all) +static int handle_octopus(int count, const char **args, int reduce_only, int show_all) { struct commit_list *revs = NULL; struct commit_list *result; int i; - if (reduce) + if (reduce_only) show_all = 1; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); - result = reduce ? reduce_heads(revs) : get_octopus_merge_bases(revs); + result = reduce_heads(reduce_only ? revs : get_octopus_merge_bases(revs)); if (!result) return 1;
-- 1.8.3.1