diff options
Diffstat (limited to 'diff.c')
| -rw-r--r-- | diff.c | 71 | 
1 files changed, 50 insertions, 21 deletions
@@ -123,6 +123,17 @@ static int parse_dirstat_params(struct diff_options *options, const char *params  	return ret;  } +static int parse_submodule_params(struct diff_options *options, const char *value) +{ +	if (!strcmp(value, "log")) +		DIFF_OPT_SET(options, SUBMODULE_LOG); +	else if (!strcmp(value, "short")) +		DIFF_OPT_CLR(options, SUBMODULE_LOG); +	else +		return -1; +	return 0; +} +  static int git_config_rename(const char *var, const char *value)  {  	if (!value) @@ -178,6 +189,13 @@ int git_diff_ui_config(const char *var, const char *value, void *cb)  	if (!strcmp(var, "diff.ignoresubmodules"))  		handle_ignore_submodules_arg(&default_diff_options, value); +	if (!strcmp(var, "diff.submodule")) { +		if (parse_submodule_params(&default_diff_options, value)) +			warning(_("Unknown value for 'diff.submodule' config variable: '%s'"), +				value); +		return 0; +	} +  	if (git_color_config(var, value, cb) < 0)  		return -1; @@ -1309,6 +1327,7 @@ struct diffstat_t {  		unsigned is_unmerged:1;  		unsigned is_binary:1;  		unsigned is_renamed:1; +		unsigned is_interesting:1;  		uintmax_t added, deleted;  	} **files;  }; @@ -1478,7 +1497,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)  	for (i = 0; (i < count) && (i < data->nr); i++) {  		struct diffstat_file *file = data->files[i];  		uintmax_t change = file->added + file->deleted; -		if (!data->files[i]->is_renamed && +		if (!data->files[i]->is_interesting &&  			 (change == 0)) {  			count++; /* not shown == room for one more */  			continue; @@ -1599,7 +1618,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)  		uintmax_t deleted = data->files[i]->deleted;  		int name_len; -		if (!data->files[i]->is_renamed && +		if (!data->files[i]->is_interesting &&  			 (added + deleted == 0)) {  			total_files--;  			continue; @@ -1678,7 +1697,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)  	for (i = count; i < data->nr; i++) {  		uintmax_t added = data->files[i]->added;  		uintmax_t deleted = data->files[i]->deleted; -		if (!data->files[i]->is_renamed && +		if (!data->files[i]->is_interesting &&  			 (added + deleted == 0)) {  			total_files--;  			continue; @@ -1706,7 +1725,7 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option  		if (data->files[i]->is_unmerged)  			continue; -		if (!data->files[i]->is_renamed && (added + deleted == 0)) { +		if (!data->files[i]->is_interesting && (added + deleted == 0)) {  			total_files--;  		} else if (!data->files[i]->is_binary) { /* don't count bytes */  			adds += added; @@ -2222,7 +2241,7 @@ static void builtin_diff(const char *name_a,  	mmfile_t mf1, mf2;  	const char *lbl[2];  	char *a_one, *b_two; -	const char *set = diff_get_color_opt(o, DIFF_METAINFO); +	const char *meta = diff_get_color_opt(o, DIFF_METAINFO);  	const char *reset = diff_get_color_opt(o, DIFF_RESET);  	const char *a_prefix, *b_prefix;  	struct userdiff_driver *textconv_one = NULL; @@ -2243,7 +2262,7 @@ static void builtin_diff(const char *name_a,  		const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);  		show_submodule_summary(o->file, one ? one->path : two->path,  				one->sha1, two->sha1, two->dirty_submodule, -				del, add, reset); +				meta, del, add, reset);  		return;  	} @@ -2269,24 +2288,24 @@ static void builtin_diff(const char *name_a,  	b_two = quote_two(b_prefix, name_b + (*name_b == '/'));  	lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";  	lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null"; -	strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, set, a_one, b_two, reset); +	strbuf_addf(&header, "%s%sdiff --git %s %s%s\n", line_prefix, meta, a_one, b_two, reset);  	if (lbl[0][0] == '/') {  		/* /dev/null */ -		strbuf_addf(&header, "%s%snew file mode %06o%s\n", line_prefix, set, two->mode, reset); +		strbuf_addf(&header, "%s%snew file mode %06o%s\n", line_prefix, meta, two->mode, reset);  		if (xfrm_msg)  			strbuf_addstr(&header, xfrm_msg);  		must_show_header = 1;  	}  	else if (lbl[1][0] == '/') { -		strbuf_addf(&header, "%s%sdeleted file mode %06o%s\n", line_prefix, set, one->mode, reset); +		strbuf_addf(&header, "%s%sdeleted file mode %06o%s\n", line_prefix, meta, one->mode, reset);  		if (xfrm_msg)  			strbuf_addstr(&header, xfrm_msg);  		must_show_header = 1;  	}  	else {  		if (one->mode != two->mode) { -			strbuf_addf(&header, "%s%sold mode %06o%s\n", line_prefix, set, one->mode, reset); -			strbuf_addf(&header, "%s%snew mode %06o%s\n", line_prefix, set, two->mode, reset); +			strbuf_addf(&header, "%s%sold mode %06o%s\n", line_prefix, meta, one->mode, reset); +			strbuf_addf(&header, "%s%snew mode %06o%s\n", line_prefix, meta, two->mode, reset);  			must_show_header = 1;  		}  		if (xfrm_msg) @@ -2406,13 +2425,20 @@ static void builtin_diffstat(const char *name_a, const char *name_b,  			     struct diff_filespec *two,  			     struct diffstat_t *diffstat,  			     struct diff_options *o, -			     int complete_rewrite) +			     struct diff_filepair *p)  {  	mmfile_t mf1, mf2;  	struct diffstat_file *data;  	int same_contents; +	int complete_rewrite = 0; + +	if (!DIFF_PAIR_UNMERGED(p)) { +		if (p->status == DIFF_STATUS_MODIFIED && p->score) +			complete_rewrite = 1; +	}  	data = diffstat_add(diffstat, name_a, name_b); +	data->is_interesting = p->status != 0;  	if (!one || !two) {  		data->is_unmerged = 1; @@ -3123,11 +3149,10 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,  {  	const char *name;  	const char *other; -	int complete_rewrite = 0;  	if (DIFF_PAIR_UNMERGED(p)) {  		/* unmerged */ -		builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, 0); +		builtin_diffstat(p->one->path, NULL, NULL, NULL, diffstat, o, p);  		return;  	} @@ -3140,9 +3165,7 @@ static void run_diffstat(struct diff_filepair *p, struct diff_options *o,  	diff_fill_sha1_info(p->one);  	diff_fill_sha1_info(p->two); -	if (p->status == DIFF_STATUS_MODIFIED && p->score) -		complete_rewrite = 1; -	builtin_diffstat(name, other, p->one, p->two, diffstat, o, complete_rewrite); +	builtin_diffstat(name, other, p->one, p->two, diffstat, o, p);  }  static void run_checkdiff(struct diff_filepair *p, struct diff_options *o) @@ -3475,6 +3498,14 @@ static int parse_dirstat_opt(struct diff_options *options, const char *params)  	return 1;  } +static int parse_submodule_opt(struct diff_options *options, const char *value) +{ +	if (parse_submodule_params(options, value)) +		die(_("Failed to parse --submodule option parameter: '%s'"), +			value); +	return 1; +} +  int diff_opt_parse(struct diff_options *options, const char **av, int ac)  {  	const char *arg = av[0]; @@ -3655,10 +3686,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)  		handle_ignore_submodules_arg(options, arg + 20);  	} else if (!strcmp(arg, "--submodule"))  		DIFF_OPT_SET(options, SUBMODULE_LOG); -	else if (!prefixcmp(arg, "--submodule=")) { -		if (!strcmp(arg + 12, "log")) -			DIFF_OPT_SET(options, SUBMODULE_LOG); -	} +	else if (!prefixcmp(arg, "--submodule=")) +		return parse_submodule_opt(options, arg + 12);  	/* misc options */  	else if (!strcmp(arg, "-z"))  | 
