summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-10-18 16:25:53 -0700
committerJunio C Hamano <gitster@pobox.com>2016-10-18 16:25:53 -0700
commit7ae0fd9ed86e0b9f8359a7fbbc5d45001acb6ff6 (patch)
treebe76d1d586be9473b6ad32b8c5f5ac6b497e71f4
parent2cd944df190f3c5c82461b4859547527376f7aa9 (diff)
downloadgit-jc/merge-base-major.tar.gz
merge-base: WIP finish integrating major-onlyjc/merge-base-major
-rw-r--r--builtin/merge-base.c15
-rw-r--r--commit.c11
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;
}