tree-diff: do not assume we use only one pathspec
The way tree-diff was set up assumed we would use only one set of pathspec during the entire life of the program. Move the pathspec related static variables out to diff_options structure so that we can filter commits with one set of paths while show the actual diffs using different set of paths. I suspect this breaks blame.c, and makes "git log paths..." to default to the --full-diff, the latter of which is dealt with the next commit. Signed-off-by: Junio C Hamano <junkio@cox.net>maint
							parent
							
								
									6d46a23bf6
								
							
						
					
					
						commit
						a8baa7b9f5
					
				|  | @ -120,7 +120,7 @@ int main(int argc, const char **argv) | ||||||
| 	if (opt->diffopt.output_format == DIFF_FORMAT_PATCH) | 	if (opt->diffopt.output_format == DIFF_FORMAT_PATCH) | ||||||
| 		opt->diffopt.recursive = 1; | 		opt->diffopt.recursive = 1; | ||||||
|  |  | ||||||
| 	diff_tree_setup_paths(get_pathspec(prefix, argv)); | 	diff_tree_setup_paths(get_pathspec(prefix, argv), opt); | ||||||
| 	diff_setup_done(&opt->diffopt); | 	diff_setup_done(&opt->diffopt); | ||||||
|  |  | ||||||
| 	switch (nr_sha1) { | 	switch (nr_sha1) { | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								diff.h
								
								
								
								
							
							
						
						
									
										6
									
								
								diff.h
								
								
								
								
							|  | @ -38,11 +38,15 @@ struct diff_options { | ||||||
| 	int setup; | 	int setup; | ||||||
| 	int abbrev; | 	int abbrev; | ||||||
|  |  | ||||||
|  | 	int nr_paths; | ||||||
|  | 	const char **paths; | ||||||
|  | 	int *pathlens; | ||||||
| 	change_fn_t change; | 	change_fn_t change; | ||||||
| 	add_remove_fn_t add_remove; | 	add_remove_fn_t add_remove; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| extern void diff_tree_setup_paths(const char **paths); | extern void diff_tree_setup_paths(const char **paths, struct diff_options *); | ||||||
|  | extern void diff_tree_release_paths(struct diff_options *); | ||||||
| extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2, | extern int diff_tree(struct tree_desc *t1, struct tree_desc *t2, | ||||||
| 		     const char *base, struct diff_options *opt); | 		     const char *base, struct diff_options *opt); | ||||||
| extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, | extern int diff_tree_sha1(const unsigned char *old, const unsigned char *new, | ||||||
|  |  | ||||||
|  | @ -707,7 +707,7 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch | ||||||
| 		revs->limited = 1; | 		revs->limited = 1; | ||||||
|  |  | ||||||
| 	if (revs->prune_data) { | 	if (revs->prune_data) { | ||||||
| 		diff_tree_setup_paths(revs->prune_data); | 		diff_tree_setup_paths(revs->prune_data, &diff_opt); | ||||||
| 		revs->prune_fn = try_to_simplify_commit; | 		revs->prune_fn = try_to_simplify_commit; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										46
									
								
								tree-diff.c
								
								
								
								
							
							
						
						
									
										46
									
								
								tree-diff.c
								
								
								
								
							|  | @ -5,11 +5,6 @@ | ||||||
| #include "diff.h" | #include "diff.h" | ||||||
| #include "tree.h" | #include "tree.h" | ||||||
|  |  | ||||||
| // What paths are we interested in? |  | ||||||
| static int nr_paths = 0; |  | ||||||
| static const char **paths = NULL; |  | ||||||
| static int *pathlens = NULL; |  | ||||||
|  |  | ||||||
| static char *malloc_base(const char *base, const char *path, int pathlen) | static char *malloc_base(const char *base, const char *path, int pathlen) | ||||||
| { | { | ||||||
| 	int baselen = strlen(base); | 	int baselen = strlen(base); | ||||||
|  | @ -72,14 +67,14 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| static int interesting(struct tree_desc *desc, const char *base) | static int interesting(struct tree_desc *desc, const char *base, struct diff_options *opt) | ||||||
| { | { | ||||||
| 	const char *path; | 	const char *path; | ||||||
| 	unsigned mode; | 	unsigned mode; | ||||||
| 	int i; | 	int i; | ||||||
| 	int baselen, pathlen; | 	int baselen, pathlen; | ||||||
|  |  | ||||||
| 	if (!nr_paths) | 	if (!opt->nr_paths) | ||||||
| 		return 1; | 		return 1; | ||||||
|  |  | ||||||
| 	(void)tree_entry_extract(desc, &path, &mode); | 	(void)tree_entry_extract(desc, &path, &mode); | ||||||
|  | @ -87,9 +82,9 @@ static int interesting(struct tree_desc *desc, const char *base) | ||||||
| 	pathlen = strlen(path); | 	pathlen = strlen(path); | ||||||
| 	baselen = strlen(base); | 	baselen = strlen(base); | ||||||
|  |  | ||||||
| 	for (i=0; i < nr_paths; i++) { | 	for (i=0; i < opt->nr_paths; i++) { | ||||||
| 		const char *match = paths[i]; | 		const char *match = opt->paths[i]; | ||||||
| 		int matchlen = pathlens[i]; | 		int matchlen = opt->pathlens[i]; | ||||||
|  |  | ||||||
| 		if (baselen >= matchlen) { | 		if (baselen >= matchlen) { | ||||||
| 			/* If it doesn't match, move along... */ | 			/* If it doesn't match, move along... */ | ||||||
|  | @ -129,7 +124,7 @@ static int interesting(struct tree_desc *desc, const char *base) | ||||||
| static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base) | static void show_tree(struct diff_options *opt, const char *prefix, struct tree_desc *desc, const char *base) | ||||||
| { | { | ||||||
| 	while (desc->size) { | 	while (desc->size) { | ||||||
| 		if (interesting(desc, base)) | 		if (interesting(desc, base, opt)) | ||||||
| 			show_entry(opt, prefix, desc, base); | 			show_entry(opt, prefix, desc, base); | ||||||
| 		update_tree_entry(desc); | 		update_tree_entry(desc); | ||||||
| 	} | 	} | ||||||
|  | @ -167,11 +162,11 @@ static int show_entry(struct diff_options *opt, const char *prefix, struct tree_ | ||||||
| int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt) | int diff_tree(struct tree_desc *t1, struct tree_desc *t2, const char *base, struct diff_options *opt) | ||||||
| { | { | ||||||
| 	while (t1->size | t2->size) { | 	while (t1->size | t2->size) { | ||||||
| 		if (nr_paths && t1->size && !interesting(t1, base)) { | 		if (opt->nr_paths && t1->size && !interesting(t1, base, opt)) { | ||||||
| 			update_tree_entry(t1); | 			update_tree_entry(t1); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
| 		if (nr_paths && t2->size && !interesting(t2, base)) { | 		if (opt->nr_paths && t2->size && !interesting(t2, base, opt)) { | ||||||
| 			update_tree_entry(t2); | 			update_tree_entry(t2); | ||||||
| 			continue; | 			continue; | ||||||
| 		} | 		} | ||||||
|  | @ -229,19 +224,28 @@ static int count_paths(const char **paths) | ||||||
| 	return i; | 	return i; | ||||||
| } | } | ||||||
|  |  | ||||||
| void diff_tree_setup_paths(const char **p) | void diff_tree_release_paths(struct diff_options *opt) | ||||||
| { | { | ||||||
|  | 	free(opt->pathlens); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void diff_tree_setup_paths(const char **p, struct diff_options *opt) | ||||||
|  | { | ||||||
|  | 	opt->nr_paths = 0; | ||||||
|  | 	opt->pathlens = NULL; | ||||||
|  | 	opt->paths = NULL; | ||||||
|  |  | ||||||
| 	if (p) { | 	if (p) { | ||||||
| 		int i; | 		int i; | ||||||
|  |  | ||||||
| 		paths = p; | 		opt->paths = p; | ||||||
| 		nr_paths = count_paths(paths); | 		opt->nr_paths = count_paths(p); | ||||||
| 		if (nr_paths == 0) { | 		if (opt->nr_paths == 0) { | ||||||
| 			pathlens = NULL; | 			opt->pathlens = NULL; | ||||||
| 			return; | 			return; | ||||||
| 		} | 		} | ||||||
| 		pathlens = xmalloc(nr_paths * sizeof(int)); | 		opt->pathlens = xmalloc(opt->nr_paths * sizeof(int)); | ||||||
| 		for (i=0; i<nr_paths; i++) | 		for (i=0; i < opt->nr_paths; i++) | ||||||
| 			pathlens[i] = strlen(paths[i]); | 			opt->pathlens[i] = strlen(p[i]); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano