format-patch: Make implementation and documentation agree
PATCH 1/3 format-patch: Make implementation and documentation agree
The documentation for the -p option for format-patch says:
"Generate patches without diffstat."
Starting with commit 68daa64d, however, -p no longer suppresses the diffstat and is a no-op *most* of the time. It is still needed when --stat (or one of the other 'stat' options) is given in order to produce a patch at all.
Since no-one seems to have noticed (or cared) that -p no longer suppresses the diffstat (after more than a year), it makes most sense to fix the documentation (rather than the implementation). The trouble is that -p is still sometimes needed, so to simplify the documentation, it would be best to change the implementation as well.
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. They don't make sense for format-patch anyway.
* Remove the description of -p from 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).
* Remove the description of the options that are no longer allowed (--name-only, --name-status, and --check).
--- Documentation/diff-options.txt | 19 ++++++++++++------- builtin-log.c | 12 +++++++++++- t/t4014-format-patch.sh | 18 ++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-)
Documentation/diff-options.txt +12 -7
@@ -12,11 +12,6 @@ endif::git-log[] endif::git-diff[] endif::git-format-patch[] -ifdef::git-format-patch[] --p:: - Generate patches without diffstat. -endif::git-format-patch[] - ifndef::git-format-patch[] -p:: -u::
@@ -27,14 +22,19 @@ endif::git-format-patch[] -U<n>:: --unified=<n>:: 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:: Generate the raw format. {git-diff-core? This is the default.} +ifndef::git-format-patch[] --patch-with-raw:: Synonym for "-p --raw". +endif::git-format-patch[] --patience:: Generate a diff using the "patience diff" algorithm.
@@ -71,21 +71,24 @@ endif::git-format-patch[] Output a condensed summary of extended header information such as creations, renames and mode changes. +ifndef::git-format-patch[] --patch-with-stat:: Synonym for "-p --stat". - {git-format-patch? This is the default.} +endif::git-format-patch[] -z:: NUL-line termination on output. This affects the --raw output field terminator. Also output from commands such as "git-log" will be delimited with NUL between commits. +ifndef::git-format-patch[] --name-only:: Show only names of changed files. --name-status:: Show only names and status of changed files. See the description of the `--diff-filter` option on what the status letters mean. +endif::git-format-patch[] --color:: Show colored diff.
@@ -115,11 +118,13 @@ override configuration settings. Turn off rename detection, even when the configuration file gives the default to do so. +ifndef::git-format-patch[] --check:: Warn if changes introduce trailing whitespace or an indent that uses a space before a tab. Exits with non-zero status if problems are found. Not compatible with --exit-code. +endif::git-format-patch[] --full-index:: Instead of the first handful of characters, show the full
builtin-log.c +11 -1
@@ -1027,9 +1027,19 @@ int cmd_format_patch(int argc, const char **argv, const char *prefix)if (argc >1 )die ("unrecognized argument: %s" , argv[1 ]); +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 (!rev.diffopt.output_format || rev.diffopt.output_format ==DIFF_FORMAT_PATCH ) - rev.diffopt.output_format =DIFF_FORMAT_DIFFSTAT |DIFF_FORMAT_SUMMARY |DIFF_FORMAT_PATCH ; + rev.diffopt.output_format =DIFF_FORMAT_DIFFSTAT |DIFF_FORMAT_SUMMARY ; + +/* Always generate a patch */ + rev.diffopt.output_format |=DIFF_FORMAT_PATCH ;if (!DIFF_OPT_TST (&rev.diffopt,TEXT ) && !no_binary_diff)DIFF_OPT_SET (&rev.diffopt,BINARY );
t/t4014-format-patch.sh +18 -0
@@ -515,4 +515,22 @@ test_expect_success 'format-patch --signoff' ' 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
Signature · 1 line
1.6.5.1.69.g36942