Browse Source

merge-base: teach "git merge-base" to drive underlying merge_bases_many()

Even though the underlying function for get_merge_bases() can compute
a merge base between one existing commit and another (possibly
nonexistent) commit that would be created by merging many commits,
the facility was not available to git-merge-base.

Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Christian Couder 17 years ago committed by Junio C Hamano
parent
commit
53eda89b2f
  1. 24
      builtin-merge-base.c
  2. 1
      commit.h

24
builtin-merge-base.c

@ -2,9 +2,11 @@ @@ -2,9 +2,11 @@
#include "cache.h"
#include "commit.h"

static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_all)
static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
{
struct commit_list *result = get_merge_bases(rev1, rev2, 0);
struct commit_list *result;

result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1, 0);

if (!result)
return 1;
@ -20,7 +22,7 @@ static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_al @@ -20,7 +22,7 @@ static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_al
}

static const char merge_base_usage[] =
"git merge-base [--all] <commit-id> <commit-id>";
"git merge-base [--all] <commit-id> <commit-id>...";

static struct commit *get_commit_reference(const char *arg)
{
@ -38,7 +40,8 @@ static struct commit *get_commit_reference(const char *arg) @@ -38,7 +40,8 @@ static struct commit *get_commit_reference(const char *arg)

int cmd_merge_base(int argc, const char **argv, const char *prefix)
{
struct commit *rev1, *rev2;
struct commit **rev;
int rev_nr = 0;
int show_all = 0;

git_config(git_default_config, NULL);
@ -51,10 +54,15 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) @@ -51,10 +54,15 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)
usage(merge_base_usage);
argc--; argv++;
}
if (argc != 3)
if (argc < 3)
usage(merge_base_usage);
rev1 = get_commit_reference(argv[1]);
rev2 = get_commit_reference(argv[2]);

return show_merge_base(rev1, rev2, show_all);
rev = xmalloc((argc - 1) * sizeof(*rev));

do {
rev[rev_nr++] = get_commit_reference(argv[1]);
argc--; argv++;
} while (argc > 1);

return show_merge_base(rev, rev_nr, show_all);
}

1
commit.h

@ -121,6 +121,7 @@ int read_graft_file(const char *graft_file); @@ -121,6 +121,7 @@ int read_graft_file(const char *graft_file);
struct commit_graft *lookup_commit_graft(const unsigned char *sha1);

extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup);
extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup);
extern struct commit_list *get_octopus_merge_bases(struct commit_list *in);

extern int register_shallow(const unsigned char *sha1);

Loading…
Cancel
Save