MALLOC_CHECK: various clean-ups
[gitweb.git] / builtin / merge-base.c
index 4f30f1b0c8b14e78e272ec54a86584d66501f754..1bc79910481e6ee04b470620da5609c1c6fbcac4 100644 (file)
@@ -23,9 +23,10 @@ static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
 }
 
 static const char * const merge_base_usage[] = {
-       "git merge-base [-a|--all] <commit> <commit>...",
-       "git merge-base [-a|--all] --octopus <commit>...",
-       "git merge-base --independent <commit>...",
+       N_("git merge-base [-a|--all] <commit> <commit>..."),
+       N_("git merge-base [-a|--all] --octopus <commit>..."),
+       N_("git merge-base --independent <commit>..."),
+       N_("git merge-base --is-ancestor <commit> <commit>"),
        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('a', "all", &show_all, N_("output all common ancestors")),
+               OPT_BOOLEAN(0, "octopus", &octopus, N_("find ancestors for a single n-way merge")),
+               OPT_BOOLEAN(0, "independent", &reduce, N_("list revs not reachable from others")),
+               OPT_BOOLEAN(0, "is-ancestor", &is_ancestor,
+                           N_("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");