unpack_trees(): fix diff-index regression.
When skip_unmerged option is not given, unpack_trees() should not just skip unmerged cache entries but keep them in the result for the caller to sort them out. For callers other than diff-index, the incoming index should never be unmerged, but diff-index is a special case caller. Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									542c264b01
								
							
						
					
					
						commit
						20a16eb33e
					
				
							
								
								
									
										18
									
								
								diff-lib.c
								
								
								
								
							
							
						
						
									
										18
									
								
								diff-lib.c
								
								
								
								
							|  | @ -641,6 +641,21 @@ static void do_oneway_diff(struct unpack_trees_options *o, | |||
| 	show_modified(revs, tree, idx, 1, cached, match_missing); | ||||
| } | ||||
|  | ||||
| static inline void skip_same_name(struct cache_entry *ce, struct unpack_trees_options *o) | ||||
| { | ||||
| 	int len = ce_namelen(ce); | ||||
| 	const struct index_state *index = o->src_index; | ||||
|  | ||||
| 	while (o->pos < index->cache_nr) { | ||||
| 		struct cache_entry *next = index->cache[o->pos]; | ||||
| 		if (len != ce_namelen(next)) | ||||
| 			break; | ||||
| 		if (memcmp(ce->name, next->name, len)) | ||||
| 			break; | ||||
| 		o->pos++; | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * The unpack_trees() interface is designed for merging, so | ||||
|  * the different source entries are designed primarily for | ||||
|  | @ -662,6 +677,9 @@ static int oneway_diff(struct cache_entry **src, struct unpack_trees_options *o) | |||
| 	struct cache_entry *tree = src[1]; | ||||
| 	struct rev_info *revs = o->unpack_data; | ||||
|  | ||||
| 	if (idx && ce_stage(idx)) | ||||
| 		skip_same_name(idx, o); | ||||
|  | ||||
| 	/* | ||||
| 	 * Unpack-trees generates a DF/conflict entry if | ||||
| 	 * there was a directory in the index and a tree | ||||
|  |  | |||
|  | @ -116,7 +116,6 @@ static int unpack_index_entry(struct cache_entry *ce, struct unpack_trees_option | |||
| 			add_entry(o, ce, 0, 0); | ||||
| 			return 0; | ||||
| 		} | ||||
| 		return 0; | ||||
| 	} | ||||
| 	return call_unpack_fn(src, o); | ||||
| } | ||||
|  | @ -286,7 +285,6 @@ static int unpack_callback(int n, unsigned long mask, unsigned long dirmask, str | |||
| 						add_entry(o, ce, 0, 0); | ||||
| 						return mask; | ||||
| 					} | ||||
| 					continue; | ||||
| 				} | ||||
| 				src[0] = ce; | ||||
| 			} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Linus Torvalds
						Linus Torvalds