Peter Hagervall | baffc0e | 2007-07-15 01:14:45 +0200 | [diff] [blame] | 1 | #include "builtin.h" |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 2 | #include "cache.h" |
Daniel Barkalow | b5039db | 2005-04-18 11:39:48 -0700 | [diff] [blame] | 3 | #include "commit.h" |
Pierre Habouzit | e5d1a4d | 2008-10-02 14:59:19 +0200 | [diff] [blame] | 4 | #include "parse-options.h" |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 5 | |
Christian Couder | 53eda89 | 2008-07-30 07:04:14 +0200 | [diff] [blame] | 6 | static int show_merge_base(struct commit **rev, int rev_nr, int show_all) |
Johannes Schindelin | 52cab8a | 2006-06-29 15:16:46 +0200 | [diff] [blame] | 7 | { |
Christian Couder | 53eda89 | 2008-07-30 07:04:14 +0200 | [diff] [blame] | 8 | struct commit_list *result; |
| 9 | |
| 10 | result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1, 0); |
Johannes Schindelin | 52cab8a | 2006-06-29 15:16:46 +0200 | [diff] [blame] | 11 | |
| 12 | if (!result) |
| 13 | return 1; |
| 14 | |
Junio C Hamano | 9585e40 | 2005-08-23 21:08:59 -0700 | [diff] [blame] | 15 | while (result) { |
Johannes Schindelin | 52cab8a | 2006-06-29 15:16:46 +0200 | [diff] [blame] | 16 | printf("%s\n", sha1_to_hex(result->item->object.sha1)); |
Junio C Hamano | 9585e40 | 2005-08-23 21:08:59 -0700 | [diff] [blame] | 17 | if (!show_all) |
| 18 | return 0; |
Johannes Schindelin | 52cab8a | 2006-06-29 15:16:46 +0200 | [diff] [blame] | 19 | result = result->next; |
Junio C Hamano | 9585e40 | 2005-08-23 21:08:59 -0700 | [diff] [blame] | 20 | } |
Johannes Schindelin | 52cab8a | 2006-06-29 15:16:46 +0200 | [diff] [blame] | 21 | |
Junio C Hamano | 9585e40 | 2005-08-23 21:08:59 -0700 | [diff] [blame] | 22 | return 0; |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 23 | } |
| 24 | |
Pierre Habouzit | e5d1a4d | 2008-10-02 14:59:19 +0200 | [diff] [blame] | 25 | static const char * const merge_base_usage[] = { |
Michael J Gruber | 995bdc7 | 2009-08-05 09:59:19 +0200 | [diff] [blame] | 26 | "git merge-base [-a|--all] <commit> <commit>...", |
Pierre Habouzit | e5d1a4d | 2008-10-02 14:59:19 +0200 | [diff] [blame] | 27 | NULL |
| 28 | }; |
Junio C Hamano | 9585e40 | 2005-08-23 21:08:59 -0700 | [diff] [blame] | 29 | |
Christian Couder | df57acc | 2008-07-29 07:42:53 +0200 | [diff] [blame] | 30 | static struct commit *get_commit_reference(const char *arg) |
| 31 | { |
| 32 | unsigned char revkey[20]; |
| 33 | struct commit *r; |
| 34 | |
| 35 | if (get_sha1(arg, revkey)) |
| 36 | die("Not a valid object name %s", arg); |
| 37 | r = lookup_commit_reference(revkey); |
| 38 | if (!r) |
| 39 | die("Not a valid commit name %s", arg); |
| 40 | |
| 41 | return r; |
| 42 | } |
| 43 | |
Junio C Hamano | 71dfbf2 | 2007-01-09 00:50:02 -0800 | [diff] [blame] | 44 | int cmd_merge_base(int argc, const char **argv, const char *prefix) |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 45 | { |
Christian Couder | 53eda89 | 2008-07-30 07:04:14 +0200 | [diff] [blame] | 46 | struct commit **rev; |
| 47 | int rev_nr = 0; |
Junio C Hamano | 71dfbf2 | 2007-01-09 00:50:02 -0800 | [diff] [blame] | 48 | int show_all = 0; |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 49 | |
Pierre Habouzit | e5d1a4d | 2008-10-02 14:59:19 +0200 | [diff] [blame] | 50 | struct option options[] = { |
| 51 | OPT_BOOLEAN('a', "all", &show_all, "outputs all common ancestors"), |
| 52 | OPT_END() |
| 53 | }; |
| 54 | |
Johannes Schindelin | ef90d6d | 2008-05-14 18:46:53 +0100 | [diff] [blame] | 55 | git_config(git_default_config, NULL); |
Stephen Boyd | 3778292 | 2009-05-23 11:53:12 -0700 | [diff] [blame] | 56 | argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0); |
Pierre Habouzit | e5d1a4d | 2008-10-02 14:59:19 +0200 | [diff] [blame] | 57 | if (argc < 2) |
| 58 | usage_with_options(merge_base_usage, options); |
| 59 | rev = xmalloc(argc * sizeof(*rev)); |
| 60 | while (argc-- > 0) |
| 61 | rev[rev_nr++] = get_commit_reference(*argv++); |
Christian Couder | 53eda89 | 2008-07-30 07:04:14 +0200 | [diff] [blame] | 62 | return show_merge_base(rev, rev_nr, show_all); |
Linus Torvalds | 6683463 | 2005-04-17 12:18:17 -0700 | [diff] [blame] | 63 | } |