From 5907cda1b2e0bd7dc5c26466f60b9cbb60288cc5 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 30 Aug 2012 14:52:20 -0700 Subject: merge-base: "--is-ancestor A B" In many scripted Porcelain commands, we find this idiom: if test "$(git rev-parse --verify A)" = "$(git merge-base A B)" then ... A is an ancestor of B ... fi But you do not have to compute exact merge-base only to see if A is an ancestor of B. Give them a more direct way to use the underlying machinery. Signed-off-by: Junio C Hamano --- builtin/merge-base.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'builtin/merge-base.c') diff --git a/builtin/merge-base.c b/builtin/merge-base.c index 4f30f1b0c8..0568b07e1d 100644 --- a/builtin/merge-base.c +++ b/builtin/merge-base.c @@ -26,6 +26,7 @@ static const char * const merge_base_usage[] = { "git merge-base [-a|--all] ...", "git merge-base [-a|--all] --octopus ...", "git merge-base --independent ...", + "git merge-base --is-ancestor ", NULL }; @@ -70,6 +71,20 @@ static int handle_octopus(int count, const char **args, int reduce, int show_all return 0; } +static int handle_is_ancestor(int argc, const char **argv) +{ + struct commit *one, *two; + + if (argc != 2) + die("--is-ancestor takes exactly two commits"); + one = get_commit_reference(argv[0]); + two = get_commit_reference(argv[1]); + if (in_merge_bases(one, two)) + return 0; + else + return 1; +} + int cmd_merge_base(int argc, const char **argv, const char *prefix) { struct commit **rev; @@ -77,11 +92,14 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) int show_all = 0; int octopus = 0; int reduce = 0; + int is_ancestor = 0; struct option options[] = { OPT_BOOLEAN('a', "all", &show_all, "output all common ancestors"), OPT_BOOLEAN(0, "octopus", &octopus, "find ancestors for a single n-way merge"), OPT_BOOLEAN(0, "independent", &reduce, "list revs not reachable from others"), + OPT_BOOLEAN(0, "is-ancestor", &is_ancestor, + "is the first one ancestor of the other?"), OPT_END() }; @@ -89,6 +107,10 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0); if (!octopus && !reduce && argc < 2) usage_with_options(merge_base_usage, options); + if (is_ancestor && (show_all | octopus | reduce)) + die("--is-ancestor cannot be used with other options"); + if (is_ancestor) + return handle_is_ancestor(argc, argv); if (reduce && (show_all || octopus)) die("--independent cannot be used with other options"); -- cgit v1.2.3