* [PATCH] send-email: disable option auto-abbreviation @ 2022-11-24 2:00 Kyle Meyer 2022-11-25 7:11 ` Junio C Hamano 0 siblings, 1 reply; 7+ messages in thread From: Kyle Meyer @ 2022-11-24 2:00 UTC (permalink / raw) To: git send-email supports specifying format-patch options. However, some valid format-patch short options trigger an error because Getopt's default auto-abbreviation is enabled. For example, with git send-email -v 3 @{u} the -v is consumed as send-email's --validate, and 3 is passed on to the format-patch call, leading to fatal: ambiguous argument '3': unknown revision or path not in the working tree. [...] Disable Getopt's auto-abbreviation feature so that such options are properly relayed to format-patch. With this change, there is some risk of breaking external scripts that rely on the abbreviation, but that is hopefully unlikely given that Git does not advertise support for auto-abbreviation and most subcommands do not support it. Signed-off-by: Kyle Meyer <kyle@kyleam.com> --- git-send-email.perl | 2 +- t/t9001-send-email.sh | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/git-send-email.perl b/git-send-email.perl index 5861e99a6e..1e6d5d7677 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -24,7 +24,7 @@ use Git; use Git::I18N; -Getopt::Long::Configure qw/ pass_through /; +Getopt::Long::Configure qw/ pass_through no_auto_abbrev /; package FakeTerm; sub new { diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 01c74b8b07..c2ebf19ec6 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -2334,6 +2334,12 @@ test_expect_success $PREREQ 'test that send-email works outside a repo' ' "$(pwd)/0001-add-main.patch" ' +test_expect_success $PREREQ 'send-email relays -v 4' ' + test_when_finished "rm -f out" && + git send-email --dry-run -v 4 -1 >out && + grep "PATCH v4" out +' + test_expect_success $PREREQ 'test that sendmail config is rejected' ' test_config sendmail.program sendmail && test_must_fail git send-email \ base-commit: e7e5c6f715b2de7bea0d39c7d2ba887335b40aa0 -- 2.38.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] send-email: disable option auto-abbreviation 2022-11-24 2:00 [PATCH] send-email: disable option auto-abbreviation Kyle Meyer @ 2022-11-25 7:11 ` Junio C Hamano 2022-11-25 17:31 ` Kyle Meyer 0 siblings, 1 reply; 7+ messages in thread From: Junio C Hamano @ 2022-11-25 7:11 UTC (permalink / raw) To: Kyle Meyer; +Cc: git Kyle Meyer <kyle@kyleam.com> writes: > send-email supports specifying format-patch options. However, some > valid format-patch short options trigger an error because Getopt's > default auto-abbreviation is enabled. For example, with > > git send-email -v 3 @{u} > > the -v is consumed as send-email's --validate, and 3 is passed on to > the format-patch call, leading to > > fatal: ambiguous argument '3': unknown revision or path not in the > working tree. [...] > > Disable Getopt's auto-abbreviation feature so that such options are > properly relayed to format-patch. With this change, there is some > risk of breaking external scripts that rely on the abbreviation, but > that is hopefully unlikely given that Git does not advertise support > for auto-abbreviation and most subcommands do not support it. I personally have no sympathy to those who drive "format-patch" from inside "send-email". Having said that. Many subcommands of "git" do take uniquely abbreviated double-dashed option names, but it is true that we do not allow --vanything to be given as -v even when there is no other double-dashed option that begins with 'v', so "git send-email -v" that stands for "git send-email --validate" indeed is an odd thing. But robbing "git send-email --val" that expands to "--validate" from the users is going a bit too far, I am afraid. The right solution for allowing "-v 3" given to "format-patch" I think is to make send-email understand it and pass that through. The presence of both ("validate" => \$validate) and ("v" => \$reroll_count) in the GetOptions() argument would prevent "-v" to be taken as "--validate" while still allowing "--val" to be used as an abbrevatiion, no? By the way, do we advertise support for any and all options to format-patch when the feature to drive it from send-email is used? Some of the options (e.g. "-o <directory>") do not make any sense in the context I would suspect. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] send-email: disable option auto-abbreviation 2022-11-25 7:11 ` Junio C Hamano @ 2022-11-25 17:31 ` Kyle Meyer 2022-11-26 20:21 ` [PATCH v2] send-email: relay '-v N' to format-patch Kyle Meyer 0 siblings, 1 reply; 7+ messages in thread From: Kyle Meyer @ 2022-11-25 17:31 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano writes: > Kyle Meyer <kyle@kyleam.com> writes: [...] >> fatal: ambiguous argument '3': unknown revision or path not in the >> working tree. [...] >> >> Disable Getopt's auto-abbreviation feature so that such options are >> properly relayed to format-patch. With this change, there is some >> risk of breaking external scripts that rely on the abbreviation, but >> that is hopefully unlikely given that Git does not advertise support >> for auto-abbreviation and most subcommands do not support it. > > I personally have no sympathy to those who drive "format-patch" from > inside "send-email". I'm not one of those users myself, but I was prompted to look into this by a report of the above error on another mailing list [*]. I do sympathize with "skip the explicit format-patch" users that find that error confusing. [*] https://yhetil.org/guix-patches/20221123190710.26517-1-paren@disroot.org > Many subcommands of "git" do take uniquely abbreviated double-dashed > option names, but it is true that we do not allow --vanything to be > given as -v even when there is no other double-dashed option that > begins with 'v', so "git send-email -v" that stands for "git > send-email --validate" indeed is an odd thing. Thanks for the correction. I didn't realize that many subcommands supported abbreviated options. I expected it to be, at most, the remaining ones written in Perl. When I tried out a couple of commands, I convinced myself that auto-abbreviation wasn't generally supported: $ git log --onelin fatal: unrecognized argument: --onelin $ git diff --histog error: invalid option: --histog But I didn't look hard enough. Trying again, I stumbled onto a few counterexamples (e.g., `git status --shor` works and so does `git range-diff --le ...`). And my claim in the commit message that "Git does not advertise support for auto-abbreviation" is wrong. I've now found this bit in gitcli(7): Abbreviating long options ~~~~~~~~~~~~~~~~~~~~~~~~~ Commands that support the enhanced option parser accepts unique prefix of a long option as if it is fully spelled out, but use this with a caution. For example, `git commit --amen` behaves as if you typed `git commit --amend`, but that is true only until a later version of Git introduces another option that shares the same prefix, e.g. `git commit --amenity` option. > But robbing "git send-email --val" that expands to "--validate" from > the users is going a bit too far, I am afraid. Fair enough. For the reasons above, the last sentence I wrote in the commit message is invalid and can't justify the change. > The right solution for allowing "-v 3" given to "format-patch" I think > is to make send-email understand it and pass that through. The > presence of both ("validate" => \$validate) and ("v" => > \$reroll_count) in the GetOptions() argument would prevent "-v" to be > taken as "--validate" while still allowing "--val" to be used as an > abbrevatiion, no? I'd think that would work, yes. I'll look more into going this route. With that approach, there are other cases of abbreviation intercepting valid format patch options. For example, send-email doesn't have the short option -n while format-patch does, but that doesn't make it through to format-patch: $ git send-email --dry-run -n @{u} | grep Subj Subject: [PATCH] send-email: disable option auto-abbreviation $ git send-email --dry-run --numbered @{u} | grep Subj Subject: [PATCH 1/1] send-email: disable option auto-abbreviation > By the way, do we advertise support for any and all options to > format-patch when the feature to drive it from send-email is used? > Some of the options (e.g. "-o <directory>") do not make any sense in > the context I would suspect. Passing an -o to send-email would cause its format-patch call to fail because send-email uses -o internally: $ git send-email --dry-run -o . @{u} fatal: two output directories? format-patch -o /tmp/W1ZGCr0hwv -o @{u}: command returned error: 128 In any case, here's the only relevant part I spot from git-send-email(1): Patches can be specified as files, directories (which will send all files in the directory), or directly as a revision list. In the last case, any format accepted by linkgit:git-format-patch[1] can be passed to git send-email, as well as options understood by linkgit:git-format-patch[1]. So, there's no mention that some options like -o do not make sense in the send-email context, but perhaps that's obvious enough (at least in my view it's much more obvious than '-v 3' and -n not being valid). Thanks for the review. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v2] send-email: relay '-v N' to format-patch 2022-11-25 17:31 ` Kyle Meyer @ 2022-11-26 20:21 ` Kyle Meyer 2022-11-27 1:25 ` Junio C Hamano 2022-11-28 9:41 ` Junio C Hamano 0 siblings, 2 replies; 7+ messages in thread From: Kyle Meyer @ 2022-11-26 20:21 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Kyle Meyer writes: > Junio C Hamano writes: > >> The right solution for allowing "-v 3" given to "format-patch" I think >> is to make send-email understand it and pass that through. The >> presence of both ("validate" => \$validate) and ("v" => >> \$reroll_count) in the GetOptions() argument would prevent "-v" to be >> taken as "--validate" while still allowing "--val" to be used as an >> abbrevatiion, no? > > I'd think that would work, yes. I'll look more into going this route. > > With that approach, there are other cases of abbreviation intercepting > valid format patch options. [...] Here's a patch handling the -v case. I don't plan on working on a more complete fix for the other cases (as I mentioned before, I don't use send-email to drive format-patch), but in my opinion the -v fix by itself is still valuable. -- >8 -- Subject: [PATCH v2] send-email: relay '-v N' to format-patch send-email relays unrecognized arguments to its format-patch call. Passing '-v N' leads to an error because -v is consumed as send-email's --validate. For example, git send-email -v 3 @{u} fails with fatal: ambiguous argument '3': unknown revision or path not in the working tree. [...] To prevent this, add the short --reroll-count option to send-email's main option list and explicitly provide it to the format-patch call. There other format-patch options that send-email doesn't relay properly, including at least -n, -N, and the diff option -D. Punt on these because dealing with them is more complicated: * they would require configuring send-email to not ignore option case * send-email makes three GetOptions() calls with different sets of options, the last being the main set of options. Unlike -v, which is consumed by the last GetOptions call, the -n, -N, and -D options are consumed as abbreviations by the earlier calls. Signed-off-by: Kyle Meyer <kyle@kyleam.com> --- git-send-email.perl | 9 ++++++++- t/t9001-send-email.sh | 6 ++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/git-send-email.perl b/git-send-email.perl index 5861e99a6e..07f2a0cbea 100755 --- a/git-send-email.perl +++ b/git-send-email.perl @@ -220,6 +220,10 @@ sub format_2822_time { my $force = 0; my $dump_aliases = 0; +# Variables to prevent short format-patch options from being captured +# as abbreviated send-email options +my $reroll_count; + # Handle interactive edition of files. my $multiedit; my $editor; @@ -542,6 +546,7 @@ sub config_regexp { "batch-size=i" => \$batch_size, "relogin-delay=i" => \$relogin_delay, "git-completion-helper" => \$git_completion_helper, + "v=s" => \$reroll_count, ); $rc = GetOptions(%options); @@ -782,7 +787,9 @@ sub is_format_patch_arg { die __("Cannot run git format-patch from outside a repository\n") unless $repo; require File::Temp; - push @files, $repo->command('format-patch', '-o', File::Temp::tempdir(CLEANUP => 1), @rev_list_opts); + push @files, $repo->command('format-patch', '-o', File::Temp::tempdir(CLEANUP => 1), + defined $reroll_count ? ('-v', $reroll_count) : (), + @rev_list_opts); } @files = handle_backup_files(@files); diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh index 01c74b8b07..152bd2c697 100755 --- a/t/t9001-send-email.sh +++ b/t/t9001-send-email.sh @@ -2334,6 +2334,12 @@ test_expect_success $PREREQ 'test that send-email works outside a repo' ' "$(pwd)/0001-add-main.patch" ' +test_expect_success $PREREQ 'send-email relays -v 3 to format-patch' ' + test_when_finished "rm -f out" && + git send-email --dry-run -v 3 -1 >out && + grep "PATCH v3" out +' + test_expect_success $PREREQ 'test that sendmail config is rejected' ' test_config sendmail.program sendmail && test_must_fail git send-email \ base-commit: e7e5c6f715b2de7bea0d39c7d2ba887335b40aa0 -- 2.38.1 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v2] send-email: relay '-v N' to format-patch 2022-11-26 20:21 ` [PATCH v2] send-email: relay '-v N' to format-patch Kyle Meyer @ 2022-11-27 1:25 ` Junio C Hamano 2022-11-28 12:34 ` Ævar Arnfjörð Bjarmason 2022-11-28 9:41 ` Junio C Hamano 1 sibling, 1 reply; 7+ messages in thread From: Junio C Hamano @ 2022-11-27 1:25 UTC (permalink / raw) To: Kyle Meyer; +Cc: git Kyle Meyer <kyle@kyleam.com> writes: > Here's a patch handling the -v case. I don't plan on working on a more > complete fix for the other cases (as I mentioned before, I don't use > send-email to drive format-patch), but in my opinion the -v fix by > itself is still valuable. Yup, I think it is a good place to stop for the first patch. Other people can add more when they discover the need, and anything more complex [*] is probably not worth the effort, I would think. Side note: [*] we could imagine running "git format-patch -h" (or a new variant of it), parse its output and populate the %options dynamically, for example. Will queue. Thanks. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] send-email: relay '-v N' to format-patch 2022-11-27 1:25 ` Junio C Hamano @ 2022-11-28 12:34 ` Ævar Arnfjörð Bjarmason 0 siblings, 0 replies; 7+ messages in thread From: Ævar Arnfjörð Bjarmason @ 2022-11-28 12:34 UTC (permalink / raw) To: Junio C Hamano; +Cc: Kyle Meyer, git On Sun, Nov 27 2022, Junio C Hamano wrote: > Kyle Meyer <kyle@kyleam.com> writes: > >> Here's a patch handling the -v case. I don't plan on working on a more >> complete fix for the other cases (as I mentioned before, I don't use >> send-email to drive format-patch), but in my opinion the -v fix by >> itself is still valuable. > > Yup, I think it is a good place to stop for the first patch. Other > people can add more when they discover the need, and anything more > complex [*] is probably not worth the effort, I would think. > > Side note: [*] we could imagine running "git format-patch -h" > (or a new variant of it), parse its output and populate the > %options dynamically, for example. > > Will queue. Thanks. This is just a comment on the #leftoverbits: I've looked at this option parsing in "git-send-email" before, and IMO the right long-term fix is to split out the *.perl code into a "git send-email--helper", and do the option parsing in C using our parse_options(). Some of it will be a bit of a hassle, but it should be much easier after 8de2e2e41b2 (Merge branch 'ab/send-email-optim', 2021-07-22) (and the subsquent regression fix). ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v2] send-email: relay '-v N' to format-patch 2022-11-26 20:21 ` [PATCH v2] send-email: relay '-v N' to format-patch Kyle Meyer 2022-11-27 1:25 ` Junio C Hamano @ 2022-11-28 9:41 ` Junio C Hamano 1 sibling, 0 replies; 7+ messages in thread From: Junio C Hamano @ 2022-11-28 9:41 UTC (permalink / raw) To: Kyle Meyer; +Cc: git, Ævar Arnfjörð Bjarmason Kyle Meyer <kyle@kyleam.com> writes: > diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh > index 01c74b8b07..152bd2c697 100755 > --- a/t/t9001-send-email.sh > +++ b/t/t9001-send-email.sh > @@ -2334,6 +2334,12 @@ test_expect_success $PREREQ 'test that send-email works outside a repo' ' > "$(pwd)/0001-add-main.patch" > ' > > +test_expect_success $PREREQ 'send-email relays -v 3 to format-patch' ' > + test_when_finished "rm -f out" && > + git send-email --dry-run -v 3 -1 >out && > + grep "PATCH v3" out > +' > + > test_expect_success $PREREQ 'test that sendmail config is rejected' ' > test_config sendmail.program sendmail && > test_must_fail git send-email \ > > base-commit: e7e5c6f715b2de7bea0d39c7d2ba887335b40aa0 It seems that this new test, by invoking format-patch, makes a leaks check at GitHub CI fail. https://github.com/git/git/actions/runs/3562362890/jobs/5984036422 Dropping PASSES_SANITIZE_LEAK from the test script would certainly be a short-term workaround, though, but it is a rather broad mechanism. There should be a better way to control the leak checker, but that is what we currently have X-<. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2022-11-28 12:40 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2022-11-24 2:00 [PATCH] send-email: disable option auto-abbreviation Kyle Meyer 2022-11-25 7:11 ` Junio C Hamano 2022-11-25 17:31 ` Kyle Meyer 2022-11-26 20:21 ` [PATCH v2] send-email: relay '-v N' to format-patch Kyle Meyer 2022-11-27 1:25 ` Junio C Hamano 2022-11-28 12:34 ` Ævar Arnfjörð Bjarmason 2022-11-28 9:41 ` Junio C Hamano
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).