git diff: support "-U" and "--unified" options properly
We used to parse "-U" and "--unified" as part of the GIT_DIFF_OPTS environment variable, but strangely enough we would _not_ parse them as part of the normal diff command line (where we only accepted "-u"). This adds parsing of -U and --unified, both with an optional numeric argument. So now you can just say git diff --unified=5 to get a unified diff with a five-line context, instead of having to do something silly like GIT_DIFF_OPTS="--unified=5" git diff -u (that silly format does continue to still work, of course). Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
975bf9cf5a
commit
ee1e5412a7
@ -608,6 +608,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent,
|
|||||||
int abbrev = opt->full_index ? 40 : DEFAULT_ABBREV;
|
int abbrev = opt->full_index ? 40 : DEFAULT_ABBREV;
|
||||||
mmfile_t result_file;
|
mmfile_t result_file;
|
||||||
|
|
||||||
|
context = opt->context;
|
||||||
/* Read the result of merge first */
|
/* Read the result of merge first */
|
||||||
if (!working_tree_file)
|
if (!working_tree_file)
|
||||||
result = grab_blob(elem->sha1, &result_size);
|
result = grab_blob(elem->sha1, &result_size);
|
||||||
|
52
diff.c
52
diff.c
@ -558,7 +558,7 @@ static void builtin_diff(const char *name_a,
|
|||||||
|
|
||||||
ecbdata.label_path = lbl;
|
ecbdata.label_path = lbl;
|
||||||
xpp.flags = XDF_NEED_MINIMAL;
|
xpp.flags = XDF_NEED_MINIMAL;
|
||||||
xecfg.ctxlen = 3;
|
xecfg.ctxlen = o->context;
|
||||||
xecfg.flags = XDL_EMIT_FUNCNAMES;
|
xecfg.flags = XDL_EMIT_FUNCNAMES;
|
||||||
if (!diffopts)
|
if (!diffopts)
|
||||||
;
|
;
|
||||||
@ -1182,6 +1182,7 @@ void diff_setup(struct diff_options *options)
|
|||||||
options->line_termination = '\n';
|
options->line_termination = '\n';
|
||||||
options->break_opt = -1;
|
options->break_opt = -1;
|
||||||
options->rename_limit = -1;
|
options->rename_limit = -1;
|
||||||
|
options->context = 3;
|
||||||
|
|
||||||
options->change = diff_change;
|
options->change = diff_change;
|
||||||
options->add_remove = diff_addremove;
|
options->add_remove = diff_addremove;
|
||||||
@ -1222,11 +1223,60 @@ int diff_setup_done(struct diff_options *options)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
|
||||||
|
{
|
||||||
|
char c, *eq;
|
||||||
|
int len;
|
||||||
|
|
||||||
|
if (*arg != '-')
|
||||||
|
return 0;
|
||||||
|
c = *++arg;
|
||||||
|
if (!c)
|
||||||
|
return 0;
|
||||||
|
if (c == arg_short) {
|
||||||
|
c = *++arg;
|
||||||
|
if (!c)
|
||||||
|
return 1;
|
||||||
|
if (val && isdigit(c)) {
|
||||||
|
char *end;
|
||||||
|
int n = strtoul(arg, &end, 10);
|
||||||
|
if (*end)
|
||||||
|
return 0;
|
||||||
|
*val = n;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (c != '-')
|
||||||
|
return 0;
|
||||||
|
arg++;
|
||||||
|
eq = strchr(arg, '=');
|
||||||
|
if (eq)
|
||||||
|
len = eq - arg;
|
||||||
|
else
|
||||||
|
len = strlen(arg);
|
||||||
|
if (!len || strncmp(arg, arg_long, len))
|
||||||
|
return 0;
|
||||||
|
if (eq) {
|
||||||
|
int n;
|
||||||
|
char *end;
|
||||||
|
if (!isdigit(*++eq))
|
||||||
|
return 0;
|
||||||
|
n = strtoul(eq, &end, 10);
|
||||||
|
if (*end)
|
||||||
|
return 0;
|
||||||
|
*val = n;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
int diff_opt_parse(struct diff_options *options, const char **av, int ac)
|
||||||
{
|
{
|
||||||
const char *arg = av[0];
|
const char *arg = av[0];
|
||||||
if (!strcmp(arg, "-p") || !strcmp(arg, "-u"))
|
if (!strcmp(arg, "-p") || !strcmp(arg, "-u"))
|
||||||
options->output_format = DIFF_FORMAT_PATCH;
|
options->output_format = DIFF_FORMAT_PATCH;
|
||||||
|
else if (opt_arg(arg, 'U', "unified", &options->context))
|
||||||
|
options->output_format = DIFF_FORMAT_PATCH;
|
||||||
else if (!strcmp(arg, "--patch-with-raw")) {
|
else if (!strcmp(arg, "--patch-with-raw")) {
|
||||||
options->output_format = DIFF_FORMAT_PATCH;
|
options->output_format = DIFF_FORMAT_PATCH;
|
||||||
options->with_raw = 1;
|
options->with_raw = 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user