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);

Reply via email to