From 7ae0fd9ed86e0b9f8359a7fbbc5d45001acb6ff6 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 18 Oct 2016 16:25:53 -0700 Subject: merge-base: WIP finish integrating major-only --- builtin/merge-base.c | 15 ++++++++++++--- commit.c | 11 ++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/builtin/merge-base.c b/builtin/merge-base.c index c0d1822eb3..16f3f3d15a 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -6,11 +6,14 @@ #include "revision.h" #include "parse-options.h" -static int show_merge_base(struct commit **rev, int rev_nr, int show_all) +static int show_merge_base(struct commit **rev, int rev_nr, int show_all, + int show_major) { struct commit_list *result; - result = get_merge_bases_many_dirty(rev[0], rev_nr - 1, rev + 1); + result = (show_major + ? get_major_merge_bases(rev[0], rev[1]) + : get_merge_bases_many_dirty(rev[0], rev_nr - 1, rev + 1)); if (!result) return 1; @@ -208,10 +211,13 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) struct commit **rev; int rev_nr = 0; int show_all = 0; + int show_major = 0; int cmdmode = 0; struct option options[] = { OPT_BOOL('a', "all", &show_all, N_("output all common ancestors")), + OPT_BOOL(0, "major-base-only", &show_major, + N_("show only merge bases on first-parent chain")), OPT_CMDMODE(0, "octopus", &cmdmode, N_("find ancestors for a single n-way merge"), 'o'), OPT_CMDMODE(0, "independent", &cmdmode, @@ -255,5 +261,8 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) ALLOC_ARRAY(rev, argc); while (argc-- > 0) rev[rev_nr++] = get_commit_reference(*argv++); - return show_merge_base(rev, rev_nr, show_all); + + if (show_major && rev_nr != 2) + die("--major-base-only can be used only with two commits"); + return show_merge_base(rev, rev_nr, show_all, show_major); } diff --git a/commit.c b/commit.c index bf2432fae8..5792c1c4ca 100644 --- a/commit.c +++ b/commit.c @@ -957,6 +957,7 @@ static struct commit_list *get_merge_bases_many_0(struct commit *one, struct commit **rslt; struct commit_list *result; int cnt, i; + char *major; result = merge_bases_many(one, n, twos); @@ -981,16 +982,14 @@ static struct commit_list *get_merge_bases_many_0(struct commit *one, /* There are more than one */ cnt = commit_list_count(result); rslt = xcalloc(cnt, sizeof(*rslt)); + major = xcalloc(cnt, sizeof(*major)); for (list = result, i = 0; list; list = list->next) rslt[i++] = list->item; free_commit_list(result); if (major_only) { - /* debug */ for (i = 0; i < cnt; i++) - fprintf(stderr, "%c %s\n", - (rslt[i]->object.flags & FPCHAIN) ? '+' : '-', - oid_to_hex(&rslt[i]->object.oid)); + major[i] = !!(rslt[i]->object.flags & FPCHAIN); } clear_commit_marks(one, all_flags); @@ -999,11 +998,13 @@ static struct commit_list *get_merge_bases_many_0(struct commit *one, mark_redundant(rslt, cnt); result = NULL; for (i = 0; i < cnt; i++) - if (!(rslt[i]->object.flags & STALE)) + if (!(rslt[i]->object.flags & STALE) && + (!major_only || major[i])) commit_list_insert_by_date(rslt[i], &result); else rslt[i]->object.flags &= ~STALE; free(rslt); + free(major); return result; } -- cgit v1.2.1