git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 02/12] send-email: avoid creating more than one Term::ReadLine object

From
DSDragan Simic <dsimic@manjaro.org>
Date
May 22, 2024, 08:15 UTC
Message-ID
<c55528b5c08e722fff8b6109e42a7752@manjaro.org>
In-Reply-To
<20240521195659.870714-3-gitster@pobox.com>
On 2024-05-21 21:56, Junio C Hamano wrote:
Show 31 quoted lines
> From: Jeff King <peff@peff.net>
> 
> Every time git-send-email calls its ask() function to prompt the user,
> we call term(), which instantiates a new Term::ReadLine object. But in
> v1.46 of Term::ReadLine::Gnu (which provides the Term::ReadLine
> interface on some platforms), its constructor refuses to create a 
> second
> instance[1]. So on systems with that version of the module, most
> git-send-email instances will fail (as we usually prompt for both "to"
> and "in-reply-to" unless the user provided them on the command line).
> 
> We can fix this by keeping a single instance variable and returning it
> for each call to term(). In perl 5.10 and up, we could do that with a
> "state" variable. But since we only require 5.008, we'll do it the
> old-fashioned way, with a lexical "my" in its own scope.
> 
> Note that the tests in t9001 detect this problem as-is, since the
> failure mode is for the program to die. But let's also beef up the
> "Prompting works" test to check that it correctly handles multiple
> inputs (if we had chosen to keep our FakeTerm hack in the previous
> commit, then the failure mode would be incorrectly ignoring prompts
> after the first).
> 
> [1] For discussion of why multiple instances are forbidden, see:
>     https://github.com/hirooih/perl-trg/issues/16
> 
> [jc: cherry-picked from v2.42.0-rc2~6^2]
> 
> Signed-off-by: Jeff King <peff@peff.net>
> Acked-by: Taylor Blau <me@ttaylorr.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Looking good to me.  Thanks for taking care of this issue.
Reviewed-by: Dragan Simic <dsimic@manjaro.org>
Show 55 quoted lines
> ---
>  git-send-email.perl   | 18 +++++++++++++-----
>  t/t9001-send-email.sh |  5 +++--
>  2 files changed, 16 insertions(+), 7 deletions(-)
> 
> diff --git a/git-send-email.perl b/git-send-email.perl
> index 72d876f0a0..ad51508790 100755
> --- a/git-send-email.perl
> +++ b/git-send-email.perl
> @@ -917,11 +917,19 @@ sub get_patch_subject {
>  	do_edit(@files);
>  }
> 
> -sub term {
> -	require Term::ReadLine;
> -	return $ENV{"GIT_SEND_EMAIL_NOTTY"}
> -			? Term::ReadLine->new('git-send-email', \*STDIN, \*STDOUT)
> -			: Term::ReadLine->new('git-send-email');
> +{
> +	# Only instantiate one $term per program run, since some
> +	# Term::ReadLine providers refuse to create a second instance.
> +	my $term;
> +	sub term {
> +		require Term::ReadLine;
> +		if (!defined $term) {
> +			$term = $ENV{"GIT_SEND_EMAIL_NOTTY"}
> +				? Term::ReadLine->new('git-send-email', \*STDIN, \*STDOUT)
> +				: Term::ReadLine->new('git-send-email');
> +		}
> +		return $term;
> +	}
>  }
> 
>  sub ask {
> diff --git a/t/t9001-send-email.sh b/t/t9001-send-email.sh
> index 1130ef21b3..0f08a9542b 100755
> --- a/t/t9001-send-email.sh
> +++ b/t/t9001-send-email.sh
> @@ -337,13 +337,14 @@ test_expect_success $PREREQ 'Show all headers' '
>  test_expect_success $PREREQ 'Prompting works' '
>  	clean_fake_sendmail &&
>  	(echo "to@example.com" &&
> -	 echo ""
> +	 echo "my-message-id@example.com"
>  	) | GIT_SEND_EMAIL_NOTTY=1 git send-email \
>  		--smtp-server="$(pwd)/fake.sendmail" \
>  		$patches \
>  		2>errors &&
>  		grep "^From: A U Thor <author@example.com>\$" msgtxt1 &&
> -		grep "^To: to@example.com\$" msgtxt1
> +		grep "^To: to@example.com\$" msgtxt1 &&
> +		grep "^In-Reply-To: <my-message-id@example.com>" msgtxt1
>  '
> 
>  test_expect_success $PREREQ,AUTOIDENT 'implicit ident is allowed' '
Previous: Junio C HamanoNext: Junio C Hamano
Message 3 of 36 in “Fix various overly aggressive protections in 2.45.1 and friends”
  1. 00/12 Fix various overly aggressive protections in 2.45.1 and friendsJunio C Hamano, May 21, 2024
  2. 02/12 send-email: avoid creating more than one Term::ReadLine objectJunio C Hamano, May 21, 2024
  3. Dragan SimicMay 22, 2024
  4. 03/12 ci: drop mention of BREW_INSTALL_PACKAGES variableJunio C Hamano, May 21, 2024
  5. 01/12 send-email: drop FakeTerm hackJunio C Hamano, May 21, 2024
  6. Dragan SimicMay 22, 2024
  7. 04/12 ci: avoid bare "gcc" for osx-gcc jobJunio C Hamano, May 21, 2024
  8. 05/12 ci: stop installing "gcc-13" for osx-gccJunio C Hamano, May 21, 2024
  9. 06/12 hook: plug a new memory leakJunio C Hamano, May 21, 2024
  10. 07/12 init: use the correct path of the templates directory againJunio C Hamano, May 21, 2024
  11. 08/12 Revert "core.hooksPath: add some protection while cloning"Junio C Hamano, May 21, 2024
  12. 09/12 tests: verify that `clone -c core.hooksPath=/dev/null` works againJunio C Hamano, May 21, 2024
  13. Brooke KuhlmannMay 21, 2024
  14. 10/12 clone: drop the protections where hooks aren't runJunio C Hamano, May 21, 2024
  15. 11/12 Revert "Add a helper function to compare file contents"Junio C Hamano, May 21, 2024
  16. 12/12 Revert "fetch/clone: detect dubious ownership of local repositories"Junio C Hamano, May 21, 2024
  17. Junio C HamanoMay 21, 2024
  18. Johannes SchindelinMay 22, 2024
  19. Junio C HamanoMay 22, 2024
  20. 13/12 Merge branch 'jc/fix-aggressive-protection-2.39'Junio C Hamano, May 21, 2024
  21. Reviewing merge commits, was Re: [rPATCH 13/12] Merge branch 'jc/fix-aggressive-protection-2.39'Johannes Schindelin, May 23, 2024
  22. Junio C HamanoMay 23, 2024
  23. 14/12 Merge branch 'jc/fix-aggressive-protection-2.40'Junio C Hamano, May 21, 2024
  24. Junio C HamanoMay 21, 2024
  25. Johannes SchindelinMay 21, 2024
  26. Junio C HamanoMay 21, 2024
  27. Junio C HamanoMay 21, 2024
  28. Joey HessMay 22, 2024
  29. Junio C HamanoMay 23, 2024
  30. Joey HessMay 23, 2024
  31. Johannes SchindelinMay 27, 2024
  32. Joey HessMay 28, 2024
  33. Phillip WoodMay 28, 2024
  34. Junio C HamanoMay 28, 2024
  35. Junio C HamanoMay 28, 2024
  36. Junio C HamanoMay 23, 2024

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.