]>
Commit | Line | Data |
---|---|---|
b5039db6 | 1 | #include <stdlib.h> |
6683463e | 2 | #include "cache.h" |
b5039db6 | 3 | #include "commit.h" |
6683463e | 4 | |
e99d59ff | 5 | static 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 | ||
51 | int 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 | } |