diff: remove parseopts member from struct diff_options
repo_diff_setup() builds the struct option array with git diff's command line options and stores a pointer to it in the parseopts member of struct diff_options. The array is freed by diff_setup_done(), but not by release_revisions(). Thus calling only repo_diff_setup() and release_revisions() leaks that array. We could free it in release_revisions() as well to plug that leak, but there is a better way: Only build it when needed. Absorb prep_parse_options() into the last place that uses the parseopts member of struct diff_options, add_diff_parseopts(), and get rid of said member. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
							parent
							
								
									6c6048fa7f
								
							
						
					
					
						commit
						189e97bc4b
					
				
							
								
								
									
										15
									
								
								diff.c
								
								
								
								
							
							
						
						
									
										15
									
								
								diff.c
								
								
								
								
							|  | @ -4593,8 +4593,6 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o) | ||||||
| 	builtin_checkdiff(name, other, attr_path, p->one, p->two, o); | 	builtin_checkdiff(name, other, attr_path, p->one, p->two, o); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void prep_parse_options(struct diff_options *options); |  | ||||||
|  |  | ||||||
| void repo_diff_setup(struct repository *r, struct diff_options *options) | void repo_diff_setup(struct repository *r, struct diff_options *options) | ||||||
| { | { | ||||||
| 	memcpy(options, &default_diff_options, sizeof(*options)); | 	memcpy(options, &default_diff_options, sizeof(*options)); | ||||||
|  | @ -4640,8 +4638,6 @@ void repo_diff_setup(struct repository *r, struct diff_options *options) | ||||||
|  |  | ||||||
| 	options->color_moved = diff_color_moved_default; | 	options->color_moved = diff_color_moved_default; | ||||||
| 	options->color_moved_ws_handling = diff_color_moved_ws_default; | 	options->color_moved_ws_handling = diff_color_moved_ws_default; | ||||||
|  |  | ||||||
| 	prep_parse_options(options); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static const char diff_status_letters[] = { | static const char diff_status_letters[] = { | ||||||
|  | @ -4799,8 +4795,6 @@ void diff_setup_done(struct diff_options *options) | ||||||
| 			options->filter = ~filter_bit[DIFF_STATUS_FILTER_AON]; | 			options->filter = ~filter_bit[DIFF_STATUS_FILTER_AON]; | ||||||
| 		options->filter &= ~options->filter_not; | 		options->filter &= ~options->filter_not; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	FREE_AND_NULL(options->parseopts); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int parse_long_opt(const char *opt, const char **argv, | int parse_long_opt(const char *opt, const char **argv, | ||||||
|  | @ -5399,11 +5393,6 @@ static int diff_opt_rotate_to(const struct option *opt, const char *arg, int uns | ||||||
|  |  | ||||||
| struct option *add_diff_options(const struct option *opts, | struct option *add_diff_options(const struct option *opts, | ||||||
| 				struct diff_options *options) | 				struct diff_options *options) | ||||||
| { |  | ||||||
| 	return parse_options_concat(opts, options->parseopts); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void prep_parse_options(struct diff_options *options) |  | ||||||
| { | { | ||||||
| 	struct option parseopts[] = { | 	struct option parseopts[] = { | ||||||
| 		OPT_GROUP(N_("Diff output format options")), | 		OPT_GROUP(N_("Diff output format options")), | ||||||
|  | @ -5673,8 +5662,7 @@ static void prep_parse_options(struct diff_options *options) | ||||||
| 		OPT_END() | 		OPT_END() | ||||||
| 	}; | 	}; | ||||||
|  |  | ||||||
| 	ALLOC_ARRAY(options->parseopts, ARRAY_SIZE(parseopts)); | 	return parse_options_concat(opts, parseopts); | ||||||
| 	memcpy(options->parseopts, parseopts, sizeof(parseopts)); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| int diff_opt_parse(struct diff_options *options, | int diff_opt_parse(struct diff_options *options, | ||||||
|  | @ -6497,7 +6485,6 @@ void diff_free(struct diff_options *options) | ||||||
| 	diff_free_file(options); | 	diff_free_file(options); | ||||||
| 	diff_free_ignore_regex(options); | 	diff_free_ignore_regex(options); | ||||||
| 	clear_pathspec(&options->pathspec); | 	clear_pathspec(&options->pathspec); | ||||||
| 	FREE_AND_NULL(options->parseopts); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void diff_flush(struct diff_options *options) | void diff_flush(struct diff_options *options) | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								diff.h
								
								
								
								
							
							
						
						
									
										1
									
								
								diff.h
								
								
								
								
							|  | @ -394,7 +394,6 @@ struct diff_options { | ||||||
| 	unsigned color_moved_ws_handling; | 	unsigned color_moved_ws_handling; | ||||||
|  |  | ||||||
| 	struct repository *repo; | 	struct repository *repo; | ||||||
| 	struct option *parseopts; |  | ||||||
| 	struct strmap *additional_path_headers; | 	struct strmap *additional_path_headers; | ||||||
|  |  | ||||||
| 	int no_free; | 	int no_free; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 René Scharfe
						René Scharfe