revision.c: treat A...B merge bases as if manually specified
The documentation assures users that "A...B" is defined as "A B --not $(git merge-base --all A B)". This wasn't in fact quite true, because the calculated merge bases were not sent to add_rev_cmdline(). The main effect of this was that although git rev-list --ancestry-path A B --not $(git merge-base --all A B) worked, the simpler form git rev-list --ancestry-path A...B failed with a "no bottom commits" error. Other potential users of bottom commits could also be affected by this problem, if they examine revs->cmdline_info; I came across the issue in my proposed history traversal refinements series. So ensure that the calculated merge bases are sent to add_rev_cmdline(), flagged with new 'whence' enum value REV_CMD_MERGE_BASE. Signed-off-by: Kevin Bracey <kevin@bracey.fi> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
		
				
					committed by
					
						
						Junio C Hamano
					
				
			
			
				
	
			
			
			
						parent
						
							f659031c1c
						
					
				
				
					commit
					a765499a08
				
			
							
								
								
									
										17
									
								
								revision.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								revision.c
									
									
									
									
									
								
							@ -915,6 +915,19 @@ static void add_rev_cmdline(struct rev_info *revs,
 | 
			
		||||
	info->nr++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void add_rev_cmdline_list(struct rev_info *revs,
 | 
			
		||||
				 struct commit_list *commit_list,
 | 
			
		||||
				 int whence,
 | 
			
		||||
				 unsigned flags)
 | 
			
		||||
{
 | 
			
		||||
	while (commit_list) {
 | 
			
		||||
		struct object *object = &commit_list->item->object;
 | 
			
		||||
		add_rev_cmdline(revs, object, sha1_to_hex(object->sha1),
 | 
			
		||||
				whence, flags);
 | 
			
		||||
		commit_list = commit_list->next;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct all_refs_cb {
 | 
			
		||||
	int all_flags;
 | 
			
		||||
	int warned_bad_reflog;
 | 
			
		||||
@ -1092,6 +1105,7 @@ static void prepare_show_merge(struct rev_info *revs)
 | 
			
		||||
	add_pending_object(revs, &head->object, "HEAD");
 | 
			
		||||
	add_pending_object(revs, &other->object, "MERGE_HEAD");
 | 
			
		||||
	bases = get_merge_bases(head, other, 1);
 | 
			
		||||
	add_rev_cmdline_list(revs, bases, REV_CMD_MERGE_BASE, UNINTERESTING);
 | 
			
		||||
	add_pending_commit_list(revs, bases, UNINTERESTING);
 | 
			
		||||
	free_commit_list(bases);
 | 
			
		||||
	head->object.flags |= SYMMETRIC_LEFT;
 | 
			
		||||
@ -1179,6 +1193,9 @@ int handle_revision_arg(const char *arg_, struct rev_info *revs, int flags, unsi
 | 
			
		||||
 | 
			
		||||
			if (symmetric) {
 | 
			
		||||
				exclude = get_merge_bases(a, b, 1);
 | 
			
		||||
				add_rev_cmdline_list(revs, exclude,
 | 
			
		||||
						     REV_CMD_MERGE_BASE,
 | 
			
		||||
						     flags_exclude);
 | 
			
		||||
				add_pending_commit_list(revs, exclude,
 | 
			
		||||
							flags_exclude);
 | 
			
		||||
				free_commit_list(exclude);
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ struct rev_cmdline_info {
 | 
			
		||||
			REV_CMD_PARENTS_ONLY,
 | 
			
		||||
			REV_CMD_LEFT,
 | 
			
		||||
			REV_CMD_RIGHT,
 | 
			
		||||
			REV_CMD_MERGE_BASE,
 | 
			
		||||
			REV_CMD_REV
 | 
			
		||||
		} whence;
 | 
			
		||||
		unsigned flags;
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ test_expect_success 'rev-list F...I' '
 | 
			
		||||
	test_cmp expect actual
 | 
			
		||||
'
 | 
			
		||||
 | 
			
		||||
test_expect_failure 'rev-list --ancestry-path F...I' '
 | 
			
		||||
test_expect_success 'rev-list --ancestry-path F...I' '
 | 
			
		||||
	for c in F H I; do echo $c; done >expect &&
 | 
			
		||||
	git rev-list --ancestry-path --format=%s F...I |
 | 
			
		||||
	sed -e "/^commit /d" |
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user