1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-05-04 08:56:13 +02:00

Merge branch 'jc/diff-s-with-other-options' into next

The "-s" (silent, squelch) option of the "diff" family of commands
did not interact with other options that specify the output format
well.  This has been cleaned up so that it will clear all the
formatting options given before.

* jc/diff-s-with-other-options:
  diff: fix interaction between the "-s" option and other options
This commit is contained in:
Junio C Hamano 2023-05-20 05:36:43 +09:00
commit dda3826a68
3 changed files with 51 additions and 14 deletions

View File

@ -35,8 +35,11 @@ endif::git-diff[]
-s:: -s::
--no-patch:: --no-patch::
Suppress diff output. Useful for commands like `git show` that Suppress all output from the diff machinery. Useful for
show the patch by default, or to cancel the effect of `--patch`. commands like `git show` that show the patch by default to
squelch their output, or to cancel the effect of options like
`--patch`, `--stat` earlier on the command line in an alias.
endif::git-format-patch[] endif::git-format-patch[]
ifdef::git-log[] ifdef::git-log[]

24
diff.c
View File

@ -4936,6 +4936,7 @@ static int diff_opt_stat(const struct option *opt, const char *value, int unset)
} else } else
BUG("%s should not get here", opt->long_name); BUG("%s should not get here", opt->long_name);
options->output_format &= ~DIFF_FORMAT_NO_OUTPUT;
options->output_format |= DIFF_FORMAT_DIFFSTAT; options->output_format |= DIFF_FORMAT_DIFFSTAT;
options->stat_name_width = name_width; options->stat_name_width = name_width;
options->stat_graph_width = graph_width; options->stat_graph_width = graph_width;
@ -4955,6 +4956,7 @@ static int parse_dirstat_opt(struct diff_options *options, const char *params)
* The caller knows a dirstat-related option is given from the command * The caller knows a dirstat-related option is given from the command
* line; allow it to say "return this_function();" * line; allow it to say "return this_function();"
*/ */
options->output_format &= ~DIFF_FORMAT_NO_OUTPUT;
options->output_format |= DIFF_FORMAT_DIRSTAT; options->output_format |= DIFF_FORMAT_DIRSTAT;
return 1; return 1;
} }
@ -5154,6 +5156,7 @@ static int diff_opt_compact_summary(const struct option *opt,
options->flags.stat_with_summary = 0; options->flags.stat_with_summary = 0;
} else { } else {
options->flags.stat_with_summary = 1; options->flags.stat_with_summary = 1;
options->output_format &= ~DIFF_FORMAT_NO_OUTPUT;
options->output_format |= DIFF_FORMAT_DIFFSTAT; options->output_format |= DIFF_FORMAT_DIFFSTAT;
} }
return 0; return 0;
@ -5499,9 +5502,8 @@ struct option *add_diff_options(const struct option *opts,
OPT_BITOP('p', "patch", &options->output_format, OPT_BITOP('p', "patch", &options->output_format,
N_("generate patch"), N_("generate patch"),
DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT), DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
OPT_BIT_F('s', "no-patch", &options->output_format, OPT_SET_INT('s', "no-patch", &options->output_format,
N_("suppress diff output"), N_("suppress diff output"), DIFF_FORMAT_NO_OUTPUT),
DIFF_FORMAT_NO_OUTPUT, PARSE_OPT_NONEG),
OPT_BITOP('u', NULL, &options->output_format, OPT_BITOP('u', NULL, &options->output_format,
N_("generate patch"), N_("generate patch"),
DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT), DIFF_FORMAT_PATCH, DIFF_FORMAT_NO_OUTPUT),
@ -5510,9 +5512,9 @@ struct option *add_diff_options(const struct option *opts,
PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_unified), PARSE_OPT_NONEG | PARSE_OPT_OPTARG, diff_opt_unified),
OPT_BOOL('W', "function-context", &options->flags.funccontext, OPT_BOOL('W', "function-context", &options->flags.funccontext,
N_("generate diffs with <n> lines context")), N_("generate diffs with <n> lines context")),
OPT_BIT_F(0, "raw", &options->output_format, OPT_BITOP(0, "raw", &options->output_format,
N_("generate the diff in raw format"), N_("generate the diff in raw format"),
DIFF_FORMAT_RAW, PARSE_OPT_NONEG), DIFF_FORMAT_RAW, DIFF_FORMAT_NO_OUTPUT),
OPT_BITOP(0, "patch-with-raw", &options->output_format, OPT_BITOP(0, "patch-with-raw", &options->output_format,
N_("synonym for '-p --raw'"), N_("synonym for '-p --raw'"),
DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW, DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW,
@ -5521,12 +5523,12 @@ struct option *add_diff_options(const struct option *opts,
N_("synonym for '-p --stat'"), N_("synonym for '-p --stat'"),
DIFF_FORMAT_PATCH | DIFF_FORMAT_DIFFSTAT, DIFF_FORMAT_PATCH | DIFF_FORMAT_DIFFSTAT,
DIFF_FORMAT_NO_OUTPUT), DIFF_FORMAT_NO_OUTPUT),
OPT_BIT_F(0, "numstat", &options->output_format, OPT_BITOP(0, "numstat", &options->output_format,
N_("machine friendly --stat"), N_("machine friendly --stat"),
DIFF_FORMAT_NUMSTAT, PARSE_OPT_NONEG), DIFF_FORMAT_NUMSTAT, DIFF_FORMAT_NO_OUTPUT),
OPT_BIT_F(0, "shortstat", &options->output_format, OPT_BITOP(0, "shortstat", &options->output_format,
N_("output only the last line of --stat"), N_("output only the last line of --stat"),
DIFF_FORMAT_SHORTSTAT, PARSE_OPT_NONEG), DIFF_FORMAT_SHORTSTAT, DIFF_FORMAT_NO_OUTPUT),
OPT_CALLBACK_F('X', "dirstat", options, N_("<param1,param2>..."), OPT_CALLBACK_F('X', "dirstat", options, N_("<param1,param2>..."),
N_("output the distribution of relative amount of changes for each sub-directory"), N_("output the distribution of relative amount of changes for each sub-directory"),
PARSE_OPT_NONEG | PARSE_OPT_OPTARG, PARSE_OPT_NONEG | PARSE_OPT_OPTARG,
@ -5542,9 +5544,9 @@ struct option *add_diff_options(const struct option *opts,
OPT_BIT_F(0, "check", &options->output_format, OPT_BIT_F(0, "check", &options->output_format,
N_("warn if changes introduce conflict markers or whitespace errors"), N_("warn if changes introduce conflict markers or whitespace errors"),
DIFF_FORMAT_CHECKDIFF, PARSE_OPT_NONEG), DIFF_FORMAT_CHECKDIFF, PARSE_OPT_NONEG),
OPT_BIT_F(0, "summary", &options->output_format, OPT_BITOP(0, "summary", &options->output_format,
N_("condensed summary such as creations, renames and mode changes"), N_("condensed summary such as creations, renames and mode changes"),
DIFF_FORMAT_SUMMARY, PARSE_OPT_NONEG), DIFF_FORMAT_SUMMARY, DIFF_FORMAT_NO_OUTPUT),
OPT_BIT_F(0, "name-only", &options->output_format, OPT_BIT_F(0, "name-only", &options->output_format,
N_("show only names of changed files"), N_("show only names of changed files"),
DIFF_FORMAT_NAME, PARSE_OPT_NONEG), DIFF_FORMAT_NAME, PARSE_OPT_NONEG),

View File

@ -5,6 +5,9 @@
test_description='Test built-in diff output engine. test_description='Test built-in diff output engine.
We happen to know that all diff plumbing and diff Porcelain share the
same command line parser, so testing one should be sufficient; pick
diff-files as a representative.
' '
TEST_PASSES_SANITIZE_LEAK=true TEST_PASSES_SANITIZE_LEAK=true
@ -16,9 +19,11 @@ Line 2
line 3' line 3'
cat path0 >path1 cat path0 >path1
chmod +x path1 chmod +x path1
mkdir path2
>path2/path3
test_expect_success 'update-index --add two files with and without +x.' ' test_expect_success 'update-index --add two files with and without +x.' '
git update-index --add path0 path1 git update-index --add path0 path1 path2/path3
' '
mv path0 path0- mv path0 path0-
@ -91,4 +96,31 @@ test_expect_success 'git diff-files --patch --no-patch does not show the patch'
test_must_be_empty err test_must_be_empty err
' '
# Smudge path2/path3 so that dirstat has something to show
date >path2/path3
for format in stat raw numstat shortstat summary \
dirstat cumulative dirstat-by-file \
patch-with-raw patch-with-stat compact-summary
do
test_expect_success "--no-patch in 'git diff-files --no-patch --$format' is a no-op" '
git diff-files --no-patch "--$format" >actual &&
git diff-files "--$format" >expect &&
test_cmp expect actual
'
test_expect_success "--no-patch clears all previous ones" '
git diff-files --$format -s -p >actual &&
git diff-files -p >expect &&
test_cmp expect actual
'
test_expect_success "--no-patch in 'git diff --no-patch --$format' is a no-op" '
git diff --no-patch "--$format" >actual &&
git diff "--$format" >expect &&
test_cmp expect actual
'
done
test_done test_done