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 2008-07-30 07:04:14 +02:00 committed by Junio C Hamano
parent 1ce4790bf5
commit 53eda89b2f
2 changed files with 17 additions and 8 deletions

View File

@ -2,9 +2,11 @@
#include "cache.h" #include "cache.h"
#include "commit.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) if (!result)
return 1; return 1;
@ -20,7 +22,7 @@ static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_al
} }


static const char merge_base_usage[] = 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) 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) 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; int show_all = 0;


git_config(git_default_config, NULL); git_config(git_default_config, NULL);
@ -51,10 +54,15 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix)
usage(merge_base_usage); usage(merge_base_usage);
argc--; argv++; argc--; argv++;
} }
if (argc != 3) if (argc < 3)
usage(merge_base_usage); 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);
} }

View File

@ -121,6 +121,7 @@ int read_graft_file(const char *graft_file);
struct commit_graft *lookup_commit_graft(const unsigned char *sha1); 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(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 struct commit_list *get_octopus_merge_bases(struct commit_list *in);


extern int register_shallow(const unsigned char *sha1); extern int register_shallow(const unsigned char *sha1);