format-patch: Always generate a patch

Jeff King recently reinstated -p to suppress the default diffstat
(as -p used to work before 68daa64, about 14 months ago).

However, -p is also needed in combination with certain options
(e.g. --stat or --numstat) in order to produce any patch at all.
The documentation does not mention this.

Since the purpose of format-patch is to produce a patch that
can be emailed, it does not make sense that certain combination
of options will suppress the generation of the patch itself.

Therefore:

* Update 'git format-patch' to always generate a patch.

* Since the --name-only, --name-status, and --check suppresses
  the generation of the patch, disallow those options,
  and remove the description of them in the documentation.

* Remove the reference to -p in the description of -U.

* Remove the descriptions of the options that are synonyms for -p
  plus another option (--patch-with-raw and --patch-with-stat).

* While at it, slightly tweak the description of -p itself
  to say that it generates "plain patches", so that you can
  think of -p as "plain patch" as an mnemonic aid.

Signed-off-by: Björn Gustavsson <bgustavsson@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Björn Gustavsson 2009-11-07 10:51:56 +01:00 committed by Junio C Hamano
parent 1d46f2ea14
commit 02bc5b03f5
3 changed files with 47 additions and 10 deletions

View File

@ -14,7 +14,7 @@ endif::git-format-patch[]
ifdef::git-format-patch[] ifdef::git-format-patch[]
-p:: -p::
Generate patches without diffstat. Generate plain patches without any diffstats.
endif::git-format-patch[] endif::git-format-patch[]
ifndef::git-format-patch[] ifndef::git-format-patch[]
@ -27,14 +27,19 @@ endif::git-format-patch[]
-U<n>:: -U<n>::
--unified=<n>:: --unified=<n>::
Generate diffs with <n> lines of context instead of Generate diffs with <n> lines of context instead of
the usual three. Implies "-p". the usual three.
ifndef::git-format-patch[]
Implies "-p".
endif::git-format-patch[]
--raw:: --raw::
Generate the raw format. Generate the raw format.
{git-diff-core? This is the default.} {git-diff-core? This is the default.}
ifndef::git-format-patch[]
--patch-with-raw:: --patch-with-raw::
Synonym for "-p --raw". Synonym for "-p --raw".
endif::git-format-patch[]
--patience:: --patience::
Generate a diff using the "patience diff" algorithm. Generate a diff using the "patience diff" algorithm.
@ -71,21 +76,24 @@ endif::git-format-patch[]
Output a condensed summary of extended header information Output a condensed summary of extended header information
such as creations, renames and mode changes. such as creations, renames and mode changes.
ifndef::git-format-patch[]
--patch-with-stat:: --patch-with-stat::
Synonym for "-p --stat". Synonym for "-p --stat".
{git-format-patch? This is the default.} endif::git-format-patch[]
-z:: -z::
NUL-line termination on output. This affects the --raw NUL-line termination on output. This affects the --raw
output field terminator. Also output from commands such output field terminator. Also output from commands such
as "git-log" will be delimited with NUL between commits. as "git-log" will be delimited with NUL between commits.
ifndef::git-format-patch[]
--name-only:: --name-only::
Show only names of changed files. Show only names of changed files.
--name-status:: --name-status::
Show only names and status of changed files. See the description Show only names and status of changed files. See the description
of the `--diff-filter` option on what the status letters mean. of the `--diff-filter` option on what the status letters mean.
endif::git-format-patch[]
--color:: --color::
Show colored diff. Show colored diff.
@ -115,11 +123,13 @@ override configuration settings.
Turn off rename detection, even when the configuration Turn off rename detection, even when the configuration
file gives the default to do so. file gives the default to do so.
ifndef::git-format-patch[]
--check:: --check::
Warn if changes introduce trailing whitespace Warn if changes introduce trailing whitespace
or an indent that uses a space before a tab. Exits with or an indent that uses a space before a tab. Exits with
non-zero status if problems are found. Not compatible with non-zero status if problems are found. Not compatible with
--exit-code. --exit-code.
endif::git-format-patch[]
--full-index:: --full-index::
Instead of the first handful of characters, show the full Instead of the first handful of characters, show the full

View File

@ -921,10 +921,10 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback }, PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
OPT_BOOLEAN(0, "no-binary", &no_binary_diff, OPT_BOOLEAN(0, "no-binary", &no_binary_diff,
"don't output binary diffs"), "don't output binary diffs"),
OPT_BOOLEAN('p', NULL, &use_patch_format,
"show patch format instead of default (patch + stat)"),
OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream, OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
"don't include a patch matching a commit upstream"), "don't include a patch matching a commit upstream"),
OPT_BOOLEAN('p', NULL, &use_patch_format,
"show patch format instead of default (patch + stat)"),
OPT_GROUP("Messaging"), OPT_GROUP("Messaging"),
{ OPTION_CALLBACK, 0, "add-header", NULL, "header", { OPTION_CALLBACK, 0, "add-header", NULL, "header",
"add email header", PARSE_OPT_NONEG, "add email header", PARSE_OPT_NONEG,
@ -1030,11 +1030,20 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)
if (argc > 1) if (argc > 1)
die ("unrecognized argument: %s", argv[1]); die ("unrecognized argument: %s", argv[1]);
if (use_patch_format) if (rev.diffopt.output_format & DIFF_FORMAT_NAME)
die("--name-only does not make sense");
if (rev.diffopt.output_format & DIFF_FORMAT_NAME_STATUS)
die("--name-status does not make sense");
if (rev.diffopt.output_format & DIFF_FORMAT_CHECKDIFF)
die("--check does not make sense");
if (!use_patch_format &&
(!rev.diffopt.output_format ||
rev.diffopt.output_format == DIFF_FORMAT_PATCH))
rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY;
/* Always generate a patch */
rev.diffopt.output_format |= DIFF_FORMAT_PATCH; rev.diffopt.output_format |= DIFF_FORMAT_PATCH;
else if (!rev.diffopt.output_format ||
rev.diffopt.output_format == DIFF_FORMAT_PATCH)
rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_SUMMARY | DIFF_FORMAT_PATCH;
if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff) if (!DIFF_OPT_TST(&rev.diffopt, TEXT) && !no_binary_diff)
DIFF_OPT_SET(&rev.diffopt, BINARY); DIFF_OPT_SET(&rev.diffopt, BINARY);

View File

@ -536,4 +536,22 @@ test_expect_success 'format-patch --signoff' '
grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
' '
echo "fatal: --name-only does not make sense" > expect.name-only
echo "fatal: --name-status does not make sense" > expect.name-status
echo "fatal: --check does not make sense" > expect.check
test_expect_success 'options no longer allowed for format-patch' '
test_must_fail git format-patch --name-only 2> output &&
test_cmp expect.name-only output &&
test_must_fail git format-patch --name-status 2> output &&
test_cmp expect.name-status output &&
test_must_fail git format-patch --check 2> output &&
test_cmp expect.check output'
test_expect_success 'format-patch --numstat should produce a patch' '
git format-patch --numstat --stdout master..side |
grep "^diff --git a/" |
wc -l |
xargs test 6 = '
test_done test_done