From: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>, "Jeff King" <peff@peff.net>,
"Carlo Arenas" <carenas@gmail.com>,
"Paul-Sebastian Ungureanu" <ungureanupaulsebastian@gmail.com>,
"Alexandr Miloslavskiy" <alexandr.miloslavskiy@syntevo.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Subject: [PATCH v2] stash: print the correct usage on "git stash [push] --invalid-option"
Date: Tue, 21 Sep 2021 15:46:07 +0200 [thread overview]
Message-ID: <patch-v2-1.1-d1b9790904c-20210921T134436Z-avarab@gmail.com> (raw)
In-Reply-To: <patch-1.1-47c582f1218-20210901T111930Z-avarab@gmail.com>
Change the usage message emitted by "git stash --invalid-option" to
emit usage information for "git stash" in general, and not just for
the "push" command. I.e. before:
$ git stash --blah
error: unknown option `blah'
usage: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[--] [<pathspec>...]]
[...]
After:
$ git stash --blah
error: unknown option `blah'
usage: git stash list [<options>]
or: git stash show [<options>] [<stash>]
or: git stash drop [-q|--quiet] [<stash>]
or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
or: git stash branch <branchname> [<stash>]
or: git stash clear
or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[--pathspec-from-file=<file> [--pathspec-file-nul]]
[--] [<pathspec>...]]
or: git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]
[...]
We'll only emit the former on the likes of "git stash push --blah"
now.
That we emitted the usage for just "push" in the case of the
subcommand not being explicitly specified was an unintentional
side-effect of how it was implemented. When it was converted to C in
d553f538b8a (stash: convert push to builtin, 2019-02-25) the pattern
of having per-subcommand usage information was rightly continued. The
Git-stash.sh shellscript did not have that, and always printed the
equivalent of "git_stash_usage".
But in doing so the case of push being implicit and explicit was
conflated. A variable was added to track this in 8c3713cede7 (stash:
eliminate crude option parsing, 2020-02-17), but it did not update the
usage output accordingly.
This still leaves e.g. "git stash push -h" emitting the
"git_stash_usage" output, instead of "git_stash_push_usage". That
should be fixed, but is a much deeper misbehavior in parse_options()
not being aware of subcommands at all. I.e. in how
PARSE_OPT_KEEP_UNKNOWN and PARSE_OPT_NO_INTERNAL_HELP combine in
commands such as "git stash".
Perhaps PARSE_OPT_KEEP_UNKNOWN should imply
PARSE_OPT_NO_INTERNAL_HELP, or better yet parse_options() should be
extended to fully handle these subcommand cases that we handle
manually in "git stash", "git commit-graph", "git multi-pack-index"
etc. All of those musings would be a much bigger change than this
isolated fix though, so let's leave that for some other time.
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
---
A trivial patch for a small issue in "git stash" usage, unrelated and
non-conflicting with my other series to improve usage output alignment
at
https://lore.kernel.org/git/cover-v5-0.4-00000000000-20210921T132350Z-avarab@gmail.com/
Range-diff against v1:
1: 47c582f1218 ! 1: d1b9790904c stash: print the correct usage on "git stash [push] --invalid-option"
@@ Commit message
Change the usage message emitted by "git stash --invalid-option" to
emit usage information for "git stash" in general, and not just for
- the "push" command.
+ the "push" command. I.e. before:
+
+ $ git stash --blah
+ error: unknown option `blah'
+ usage: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
+ [-u|--include-untracked] [-a|--all] [-m|--message <message>]
+ [--] [<pathspec>...]]
+ [...]
+
+ After:
+
+ $ git stash --blah
+ error: unknown option `blah'
+ usage: git stash list [<options>]
+ or: git stash show [<options>] [<stash>]
+ or: git stash drop [-q|--quiet] [<stash>]
+ or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
+ or: git stash branch <branchname> [<stash>]
+ or: git stash clear
+ or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
+ [-u|--include-untracked] [-a|--all] [-m|--message <message>]
+ [--pathspec-from-file=<file> [--pathspec-file-nul]]
+ [--] [<pathspec>...]]
+ or: git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
+ [-u|--include-untracked] [-a|--all] [<message>]
+ [...]
+
+ We'll only emit the former on the likes of "git stash push --blah"
+ now.
That we emitted the usage for just "push" in the case of the
subcommand not being explicitly specified was an unintentional
@@ Commit message
But in doing so the case of push being implicit and explicit was
conflated. A variable was added to track this in 8c3713cede7 (stash:
eliminate crude option parsing, 2020-02-17), but it did not update the
- usage output accordingly. Let's do that.
+ usage output accordingly.
This still leaves e.g. "git stash push -h" emitting the
"git_stash_usage" output, instead of "git_stash_push_usage". That
@@ t/t3903-stash.sh: export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./test-lib.sh
-+test_expect_success 'usage' '
-+ test_expect_code 129 git stash -h >out &&
-+ grep "or: git stash" out &&
++test_expect_success 'usage on cmd and subcommand invalid option' '
++ test_expect_code 129 git stash --invalid-option 2>usage &&
++ grep "or: git stash" usage &&
+
-+ test_expect_code 129 git stash --invalid-option >out 2>err &&
-+ grep "or: git stash" err &&
++ test_expect_code 129 git stash push --invalid-option 2>usage &&
++ ! grep "or: git stash" usage
++'
++
++test_expect_success 'usage on main command -h emits a summary of subcommands' '
++ test_expect_code 129 git stash -h >usage &&
++ grep -F "usage: git stash list" usage &&
++ grep -F "or: git stash show" usage
++'
+
-+ test_expect_code 129 git stash push --invalid-option >out 2>err &&
-+ ! grep "or: git stash" err
++test_expect_failure 'usage for subcommands should emit subcommand usage' '
++ test_expect_code 129 git stash push -h >usage &&
++ grep -F "usage: git stash [push" usage
+'
+
diff_cmp () {
builtin/stash.c | 1 +
t/t3903-stash.sh | 19 +++++++++++++++++++
2 files changed, 20 insertions(+)
diff --git a/builtin/stash.c b/builtin/stash.c
index 8f42360ca91..cf62c3b3cd8 100644
--- a/builtin/stash.c
+++ b/builtin/stash.c
@@ -1608,6 +1608,7 @@ static int push_stash(int argc, const char **argv, const char *prefix,
if (argc) {
force_assume = !strcmp(argv[0], "-p");
argc = parse_options(argc, argv, prefix, options,
+ push_assumed ? git_stash_usage :
git_stash_push_usage,
PARSE_OPT_KEEP_DASHDASH);
}
diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
index 873aa56e359..655f9be4352 100755
--- a/t/t3903-stash.sh
+++ b/t/t3903-stash.sh
@@ -10,6 +10,25 @@ export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./test-lib.sh
+test_expect_success 'usage on cmd and subcommand invalid option' '
+ test_expect_code 129 git stash --invalid-option 2>usage &&
+ grep "or: git stash" usage &&
+
+ test_expect_code 129 git stash push --invalid-option 2>usage &&
+ ! grep "or: git stash" usage
+'
+
+test_expect_success 'usage on main command -h emits a summary of subcommands' '
+ test_expect_code 129 git stash -h >usage &&
+ grep -F "usage: git stash list" usage &&
+ grep -F "or: git stash show" usage
+'
+
+test_expect_failure 'usage for subcommands should emit subcommand usage' '
+ test_expect_code 129 git stash push -h >usage &&
+ grep -F "usage: git stash [push" usage
+'
+
diff_cmp () {
for i in "$1" "$2"
do
--
2.33.0.1098.gf02a64c1a2d
next prev parent reply other threads:[~2021-09-21 13:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-01 11:19 [PATCH] stash: print the correct usage on "git stash [push] --invalid-option" Ævar Arnfjörð Bjarmason
2021-09-21 13:46 ` Ævar Arnfjörð Bjarmason [this message]
2021-12-16 12:54 ` [PATCH v3] stash: don't show "git stash push" usage on bad "git stash" usage Ævar Arnfjörð Bjarmason
2021-12-16 22:03 ` Junio C Hamano
2021-12-16 22:05 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=patch-v2-1.1-d1b9790904c-20210921T134436Z-avarab@gmail.com \
--to=avarab@gmail.com \
--cc=alexandr.miloslavskiy@syntevo.com \
--cc=carenas@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=peff@peff.net \
--cc=ungureanupaulsebastian@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).