]> git.ipfire.org Git - thirdparty/git.git/blame - merge-base.c
Merge with gitk.
[thirdparty/git.git] / merge-base.c
CommitLineData
b5039db6 1#include <stdlib.h>
6683463e 2#include "cache.h"
b5039db6 3#include "commit.h"
6683463e 4
e99d59ff 5static struct commit *common_ancestor(struct commit *rev1, struct commit *rev2)
6683463e 6{
4f7eb2e5
LT
7 struct commit_list *list = NULL;
8 struct commit_list *result = NULL;
b5039db6 9
4f7eb2e5
LT
10 if (rev1 == rev2)
11 return rev1;
6683463e 12
b6b15db3
DB
13 parse_commit(rev1);
14 parse_commit(rev2);
6683463e 15
4f7eb2e5
LT
16 rev1->object.flags |= 1;
17 rev2->object.flags |= 2;
18 insert_by_date(rev1, &list);
19 insert_by_date(rev2, &list);
20
21 while (list) {
22 struct commit *commit = list->item;
23 struct commit_list *tmp = list, *parents;
24 int flags = commit->object.flags & 3;
25
26 list = list->next;
27 free(tmp);
28 switch (flags) {
29 case 3:
30 insert_by_date(commit, &result);
31 continue;
32 case 0:
33 die("git-merge-base: commit without either parent?");
b5039db6 34 }
4f7eb2e5
LT
35 parents = commit->parents;
36 while (parents) {
37 struct commit *p = parents->item;
38 parents = parents->next;
39 if ((p->object.flags & flags) == flags)
40 continue;
41 parse_commit(p);
42 p->object.flags |= flags;
43 insert_by_date(p, &list);
6683463e 44 }
6683463e 45 }
4f7eb2e5
LT
46 if (!result)
47 return NULL;
48 return result->item;
6683463e
LT
49}
50
51int main(int argc, char **argv)
52{
b5039db6
DB
53 struct commit *rev1, *rev2, *ret;
54 unsigned char rev1key[20], rev2key[20];
6683463e 55
b5039db6 56 if (argc != 3 ||
3c249c95
LT
57 get_sha1(argv[1], rev1key) ||
58 get_sha1(argv[2], rev2key)) {
667bb59b 59 usage("git-merge-base <commit-id> <commit-id>");
b5039db6 60 }
9b632be3
LT
61 rev1 = lookup_commit_reference(rev1key);
62 rev2 = lookup_commit_reference(rev2key);
4f7eb2e5
LT
63 if (!rev1 || !rev2)
64 return 1;
b5039db6 65 ret = common_ancestor(rev1, rev2);
b51ad431 66 if (!ret)
b5039db6 67 return 1;
b51ad431 68 printf("%s\n", sha1_to_hex(ret->object.sha1));
6683463e
LT
69 return 0;
70}