merge-base.con commit Merge git://git.kernel.org/pub/scm/gitk/gitk (659db3f)
   1#include <stdlib.h>
   2#include "cache.h"
   3#include "commit.h"
   4
   5static int show_all;
   6
   7static int merge_base(struct commit *rev1, struct commit *rev2)
   8{
   9        struct commit_list *result = get_merge_bases(rev1, rev2, 0);
  10
  11        if (!result)
  12                return 1;
  13
  14        while (result) {
  15                printf("%s\n", sha1_to_hex(result->item->object.sha1));
  16                if (!show_all)
  17                        return 0;
  18                result = result->next;
  19        }
  20
  21        return 0;
  22}
  23
  24static const char merge_base_usage[] =
  25"git-merge-base [--all] <commit-id> <commit-id>";
  26
  27int main(int argc, char **argv)
  28{
  29        struct commit *rev1, *rev2;
  30        unsigned char rev1key[20], rev2key[20];
  31
  32        setup_git_directory();
  33        git_config(git_default_config);
  34
  35        while (1 < argc && argv[1][0] == '-') {
  36                char *arg = argv[1];
  37                if (!strcmp(arg, "-a") || !strcmp(arg, "--all"))
  38                        show_all = 1;
  39                else
  40                        usage(merge_base_usage);
  41                argc--; argv++;
  42        }
  43        if (argc != 3)
  44                usage(merge_base_usage);
  45        if (get_sha1(argv[1], rev1key))
  46                die("Not a valid object name %s", argv[1]);
  47        if (get_sha1(argv[2], rev2key))
  48                die("Not a valid object name %s", argv[2]);
  49        rev1 = lookup_commit_reference(rev1key);
  50        rev2 = lookup_commit_reference(rev2key);
  51        if (!rev1 || !rev2)
  52                return 1;
  53        return merge_base(rev1, rev2);
  54}