On Mon, Aug 22, 2022 at 09:44:42AM -0400, Andrew Dunstan wrote: > On 2022-08-21 Su 20:40, Noah Misch wrote: > > This (commit 13d856e of 2015-07-29) added the following: > > > > --- a/src/test/perl/TestLib.pm > > +++ b/src/test/perl/TestLib.pm > > @@ -242,7 +288,17 @@ sub command_exit_is > > print("# Running: " . join(" ", @{$cmd}) ."\n"); > > my $h = start $cmd; > > $h->finish(); > > - is($h->result(0), $expected, $test_name); > > + > > + # On Windows, the exit status of the process is returned directly as the > > + # process's exit code, while on Unix, it's returned in the high bits > > + # of the exit code (see WEXITSTATUS macro in the standard <sys/wait.h> > > + # header file). IPC::Run's result function always returns exit code >> > > 8, > > + # assuming the Unix convention, which will always return 0 on Windows as > > + # long as the process was not terminated by an exception. To work around > > + # that, use $h->full_result on Windows instead. > > + my $result = ($Config{osname} eq "MSWin32") ? > > + ($h->full_results)[0] : $h->result(0); > > + is($result, $expected, $test_name); > > } > > > > That behavior came up again in the context of a newer IPC::Run test case. > > I'm > > considering changing the IPC::Run behavior such that the above would have > > been > > unnecessary. However, if I do, the above code would want to adapt to handle > > pre-change and post-change IPC::Run versions. If you have an opinion on > > whether or how IPC::Run should change, I welcome comments on > > https://github.com/toddr/IPC-Run/issues/161. > > Assuming it changes, we'll have to have a version test here. I don't > think we can have a flag day where we suddenly require IPC::Run's > bleeding edge on Windows. So changing it is a good thing, but it won't > help us much.
IPC::Run git now has the change, and we may release soon. Here's what I plan to push to make PostgreSQL cope.
Author: Noah Misch <n...@leadboat.com> Commit: Noah Misch <n...@leadboat.com> Account for IPC::Run::result() Windows behavior change. This restores compatibility with the not-yet-released successor of version 20220807.0. Back-patch to 9.4, which introduced this code. Reviewed by FIXME. Discussion: https://postgr.es/m/FIXME diff --git a/src/test/perl/PostgreSQL/Test/Utils.pm b/src/test/perl/PostgreSQL/Test/Utils.pm index 99d3345..b139190 100644 --- a/src/test/perl/PostgreSQL/Test/Utils.pm +++ b/src/test/perl/PostgreSQL/Test/Utils.pm @@ -782,15 +782,11 @@ sub command_exit_is my $h = IPC::Run::start $cmd; $h->finish(); - # On Windows, the exit status of the process is returned directly as the - # process's exit code, while on Unix, it's returned in the high bits - # of the exit code (see WEXITSTATUS macro in the standard <sys/wait.h> - # header file). IPC::Run's result function always returns exit code >> 8, - # assuming the Unix convention, which will always return 0 on Windows as - # long as the process was not terminated by an exception. To work around - # that, use $h->full_results on Windows instead. + # Normally, if the child called exit(N), IPC::Run::result() returns N. On + # Windows, with IPC::Run v20220807.0 and earlier, full_results() is the + # method that returns N (https://github.com/toddr/IPC-Run/issues/161). my $result = - ($Config{osname} eq "MSWin32") + ($Config{osname} eq "MSWin32" && $IPC::Run::VERSION <= 20220807.0) ? ($h->full_results)[0] : $h->result(0); is($result, $expected, $test_name);