merge-base: teach "git merge-base" to drive underlying merge_bases_many()
Even though the underlying function for get_merge_bases() can compute a merge base between one existing commit and another (possibly nonexistent) commit that would be created by merging many commits, the facility was not available to git-merge-base. Signed-off-by: Christian Couder <chriscool@tuxfamily.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									1ce4790bf5
								
							
						
					
					
						commit
						53eda89b2f
					
				|  | @ -2,9 +2,11 @@ | |||
| #include "cache.h" | ||||
| #include "commit.h" | ||||
|  | ||||
| static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_all) | ||||
| static int show_merge_base(struct commit **rev, int rev_nr, int show_all) | ||||
| { | ||||
| 	struct commit_list *result = get_merge_bases(rev1, rev2, 0); | ||||
| 	struct commit_list *result; | ||||
|  | ||||
| 	result = get_merge_bases_many(rev[0], rev_nr - 1, rev + 1, 0); | ||||
|  | ||||
| 	if (!result) | ||||
| 		return 1; | ||||
|  | @ -20,7 +22,7 @@ static int show_merge_base(struct commit *rev1, struct commit *rev2, int show_al | |||
| } | ||||
|  | ||||
| static const char merge_base_usage[] = | ||||
| "git merge-base [--all] <commit-id> <commit-id>"; | ||||
| "git merge-base [--all] <commit-id> <commit-id>..."; | ||||
|  | ||||
| static struct commit *get_commit_reference(const char *arg) | ||||
| { | ||||
|  | @ -38,7 +40,8 @@ static struct commit *get_commit_reference(const char *arg) | |||
|  | ||||
| int cmd_merge_base(int argc, const char **argv, const char *prefix) | ||||
| { | ||||
| 	struct commit *rev1, *rev2; | ||||
| 	struct commit **rev; | ||||
| 	int rev_nr = 0; | ||||
| 	int show_all = 0; | ||||
|  | ||||
| 	git_config(git_default_config, NULL); | ||||
|  | @ -51,10 +54,15 @@ int cmd_merge_base(int argc, const char **argv, const char *prefix) | |||
| 			usage(merge_base_usage); | ||||
| 		argc--; argv++; | ||||
| 	} | ||||
| 	if (argc != 3) | ||||
| 	if (argc < 3) | ||||
| 		usage(merge_base_usage); | ||||
| 	rev1 = get_commit_reference(argv[1]); | ||||
| 	rev2 = get_commit_reference(argv[2]); | ||||
|  | ||||
| 	return show_merge_base(rev1, rev2, show_all); | ||||
| 	rev = xmalloc((argc - 1) * sizeof(*rev)); | ||||
|  | ||||
| 	do { | ||||
| 		rev[rev_nr++] = get_commit_reference(argv[1]); | ||||
| 		argc--; argv++; | ||||
| 	} while (argc > 1); | ||||
|  | ||||
| 	return show_merge_base(rev, rev_nr, show_all); | ||||
| } | ||||
|  |  | |||
							
								
								
									
										1
									
								
								commit.h
								
								
								
								
							
							
						
						
									
										1
									
								
								commit.h
								
								
								
								
							|  | @ -121,6 +121,7 @@ int read_graft_file(const char *graft_file); | |||
| struct commit_graft *lookup_commit_graft(const unsigned char *sha1); | ||||
|  | ||||
| extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup); | ||||
| extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup); | ||||
| extern struct commit_list *get_octopus_merge_bases(struct commit_list *in); | ||||
|  | ||||
| extern int register_shallow(const unsigned char *sha1); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Christian Couder
						Christian Couder