diff: futureproof "stop feeding the backend early" logic
Refactor the "do not stop feeding the backend early" logic into a small helper function and use it in both run_diff_files() and diff_tree() that has the stop-early optimization. We may later add other types of diffcore transformation that require to look at the whole result like diff-filter does, and having the logic in a single place is essential for longer term maintainability. Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									af7b41c923
								
							
						
					
					
						commit
						28b9264dd6
					
				|  | @ -73,9 +73,7 @@ int run_diff_files(struct rev_info *revs, unsigned int option) | ||||||
| 		struct cache_entry *ce = active_cache[i]; | 		struct cache_entry *ce = active_cache[i]; | ||||||
| 		int changed; | 		int changed; | ||||||
|  |  | ||||||
| 		if (DIFF_OPT_TST(&revs->diffopt, QUICK) && | 		if (diff_can_quit_early(&revs->diffopt)) | ||||||
| 		    !revs->diffopt.filter && |  | ||||||
| 		    DIFF_OPT_TST(&revs->diffopt, HAS_CHANGES)) |  | ||||||
| 			break; | 			break; | ||||||
|  |  | ||||||
| 		if (!ce_path_match(ce, revs->prune_data)) | 		if (!ce_path_match(ce, revs->prune_data)) | ||||||
|  |  | ||||||
							
								
								
									
										7
									
								
								diff.c
								
								
								
								
							
							
						
						
									
										7
									
								
								diff.c
								
								
								
								
							|  | @ -3513,6 +3513,13 @@ int diff_result_code(struct diff_options *opt, int status) | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int diff_can_quit_early(struct diff_options *opt) | ||||||
|  | { | ||||||
|  | 	return (DIFF_OPT_TST(opt, QUICK) && | ||||||
|  | 		!opt->filter && | ||||||
|  | 		DIFF_OPT_TST(opt, HAS_CHANGES)); | ||||||
|  | } | ||||||
|  |  | ||||||
| void diff_addremove(struct diff_options *options, | void diff_addremove(struct diff_options *options, | ||||||
| 		    int addremove, unsigned mode, | 		    int addremove, unsigned mode, | ||||||
| 		    const unsigned char *sha1, | 		    const unsigned char *sha1, | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								diff.h
								
								
								
								
							
							
						
						
									
										2
									
								
								diff.h
								
								
								
								
							|  | @ -170,6 +170,8 @@ extern void diff_tree_combined_merge(const unsigned char *sha1, int, struct rev_ | ||||||
|  |  | ||||||
| void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const char *b); | void diff_set_mnemonic_prefix(struct diff_options *options, const char *a, const char *b); | ||||||
|  |  | ||||||
|  | extern int diff_can_quit_early(struct diff_options *); | ||||||
|  |  | ||||||
| extern void diff_addremove(struct diff_options *, | extern void diff_addremove(struct diff_options *, | ||||||
| 			   int addremove, | 			   int addremove, | ||||||
| 			   unsigned mode, | 			   unsigned mode, | ||||||
|  |  | ||||||
|  | @ -286,9 +286,7 @@ int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, stru | ||||||
| 	int baselen = strlen(base); | 	int baselen = strlen(base); | ||||||
|  |  | ||||||
| 	for (;;) { | 	for (;;) { | ||||||
| 		if (DIFF_OPT_TST(opt, QUICK) && | 		if (diff_can_quit_early(opt)) | ||||||
| 		    !opt->filter && |  | ||||||
| 		    DIFF_OPT_TST(opt, HAS_CHANGES)) |  | ||||||
| 			break; | 			break; | ||||||
| 		if (opt->nr_paths) { | 		if (opt->nr_paths) { | ||||||
| 			skip_uninteresting(t1, base, baselen, opt); | 			skip_uninteresting(t1, base, baselen, opt); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano