#include "builtin.h"
#include "cache.h"
#include "commit.h"

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

	if (!result)
		return 1;

	while (result) {
		printf("%s\n", sha1_to_hex(result->item->object.sha1));
		if (!show_all)
			return 0;
		result = result->next;
	}

	return 0;
}

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

int cmd_merge_base(int argc, const char **argv, const char *prefix)
{
	struct commit *rev1, *rev2;
	unsigned char rev1key[20], rev2key[20];
	int show_all = 0;

	git_config(git_default_config);

	while (1 < argc && argv[1][0] == '-') {
		const char *arg = argv[1];
		if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))
			show_all = 1;
		else
			usage(merge_base_usage);
		argc--; argv++;
	}
	if (argc != 3)
		usage(merge_base_usage);
	if (get_sha1(argv[1], rev1key))
		die("Not a valid object name %s", argv[1]);
	if (get_sha1(argv[2], rev2key))
		die("Not a valid object name %s", argv[2]);
	rev1 = lookup_commit_reference(rev1key);
	rev2 = lookup_commit_reference(rev2key);
	if (!rev1 || !rev2)
		return 1;
	return show_merge_base(rev1, rev2, show_all);
}
