Re: [HACKERS] pg_regress breaks on msys - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] pg_regress breaks on msys
Date
Msg-id 200607300145.k6U1jP829686@momjian.us
Whole thread Raw
In response to Re: [HACKERS] pg_regress breaks on msys  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-patches
Tom Lane wrote:
> Bruce Momjian <bruce@momjian.us> writes:
> > I modified pg_regress.c to use just the return code to determine if the
> > diff worked, but I added in a WIN32-specific test for the file size.  I
> > think that is the cleanest solution.  Attached.
>
> It really needs a comment, along the lines of
>
>     /*
>      * On Windows we'll get exit status 1 if the diff invocation
>      * failed; so we need a way to distinguish failure from "files
>      * are different".  Check to make sure that a diff file was
>      * created and is nonempty.
>      */
>
> Also the test ought to account for file_size returning -1 if file's
> not there, so
>
> + #ifdef WIN32
> +     if (WEXITSTATUS(r) == 1 && file_size(filename) <= 0)
> ...

I had already added a comment this morning, but didn't post the updated
patch.  I have made the adjustment for -1.

Patch attached and applied.

--
  Bruce Momjian   bruce@momjian.us
  EnterpriseDB    http://www.enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: src/include/port/win32.h
===================================================================
RCS file: /cvsroot/pgsql/src/include/port/win32.h,v
retrieving revision 1.53
diff -c -c -r1.53 win32.h
*** src/include/port/win32.h    16 Jul 2006 20:17:04 -0000    1.53
--- src/include/port/win32.h    30 Jul 2006 01:41:46 -0000
***************
*** 109,120 ****


  /*
!  * Signal stuff
   */
! #define WEXITSTATUS(w)    (((w) >> 8) & 0xff)
! #define WIFEXITED(w)    (((w) & 0xff) == 0)
! #define WIFSIGNALED(w)    (((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f))
! #define WTERMSIG(w)        ((w) & 0x7f)

  #define sigmask(sig) ( 1 << ((sig)-1) )

--- 109,125 ----


  /*
!  *    Signal stuff
!  *    WIN32 doesn't have wait(), so the return value for children
!  *    is simply the return value specified by the child, without
!  *    any additional information on whether the child terminated
!  *    on its own or via a signal.  These macros are also used
!  *    to interpret the return value of system().
   */
! #define WEXITSTATUS(w)    (w)
! #define WIFEXITED(w)    (true)
! #define WIFSIGNALED(w)    (false)
! #define WTERMSIG(w)        (0)

  #define sigmask(sig) ( 1 << ((sig)-1) )

Index: src/test/regress/pg_regress.c
===================================================================
RCS file: /cvsroot/pgsql/src/test/regress/pg_regress.c,v
retrieving revision 1.16
diff -c -c -r1.16 pg_regress.c
*** src/test/regress/pg_regress.c    27 Jul 2006 15:37:19 -0000    1.16
--- src/test/regress/pg_regress.c    30 Jul 2006 01:41:47 -0000
***************
*** 799,827 ****
  }

  /*
!  * Run a "diff" command and check that it didn't crash
   */
! static void
! run_diff(const char *cmd)
  {
      int r;

      r = system(cmd);
-     /*
-      * XXX FIXME: it appears that include/port/win32.h's definitions of
-      * WIFEXITED and related macros may be wrong.  They certainly don't
-      * work for inspecting the results of system().  For the moment,
-      * hard-wire the check on Windows.
-      */
- #ifndef WIN32
      if (!WIFEXITED(r) || WEXITSTATUS(r) > 1)
- #else
-     if (r != 0 && r != 1)
- #endif
      {
          fprintf(stderr, _("diff command failed with status %d: %s\n"), r, cmd);
          exit_nicely(2);
      }
  }

  /*
--- 799,830 ----
  }

  /*
!  * Run a "diff" command and also check that it didn't crash
   */
! static int
! run_diff(const char *cmd, const char *filename)
  {
      int r;

      r = system(cmd);
      if (!WIFEXITED(r) || WEXITSTATUS(r) > 1)
      {
          fprintf(stderr, _("diff command failed with status %d: %s\n"), r, cmd);
          exit_nicely(2);
      }
+ #ifdef WIN32
+     /*
+      *    On WIN32, if the 'diff' command cannot be found, system() returns
+      *    1, but produces nothing to stdout, so we check for that here.
+      */
+     if (WEXITSTATUS(r) == 1 && file_size(filename) <= 0)
+     {
+         fprintf(stderr, _("diff command not found: %s\n"), cmd);
+         exit_nicely(2);
+     }
+ #endif
+
+     return WEXITSTATUS(r);
  }

  /*
***************
*** 844,850 ****
      int best_line_count;
      int i;
      int l;
!
      /* Check in resultmap if we should be looking at a different file */
      expectname = testname;
      for (rm = resultmap; rm != NULL; rm = rm->next)
--- 847,853 ----
      int best_line_count;
      int i;
      int l;
!
      /* Check in resultmap if we should be looking at a different file */
      expectname = testname;
      for (rm = resultmap; rm != NULL; rm = rm->next)
***************
*** 872,883 ****
      snprintf(cmd, sizeof(cmd),
               SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
               basic_diff_opts, expectfile, resultsfile, diff);
-     run_diff(cmd);

      /* Is the diff file empty? */
!     if (file_size(diff) == 0)
      {
-         /* No diff = no changes = good */
          unlink(diff);
          return false;
      }
--- 875,884 ----
      snprintf(cmd, sizeof(cmd),
               SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
               basic_diff_opts, expectfile, resultsfile, diff);

      /* Is the diff file empty? */
!     if (run_diff(cmd, diff) == 0)
      {
          unlink(diff);
          return false;
      }
***************
*** 896,906 ****
          snprintf(cmd, sizeof(cmd),
                   SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
                   basic_diff_opts, expectfile, resultsfile, diff);
-         run_diff(cmd);

!         if (file_size(diff) == 0)
          {
-             /* No diff = no changes = good */
              unlink(diff);
              return false;
          }
--- 897,905 ----
          snprintf(cmd, sizeof(cmd),
                   SYSTEMQUOTE "diff %s \"%s\" \"%s\" > \"%s\"" SYSTEMQUOTE,
                   basic_diff_opts, expectfile, resultsfile, diff);

!         if (run_diff(cmd, diff) == 0)
          {
              unlink(diff);
              return false;
          }
***************
*** 921,927 ****
      snprintf(cmd, sizeof(cmd),
               SYSTEMQUOTE "diff %s \"%s\" \"%s\" >> \"%s\"" SYSTEMQUOTE,
               pretty_diff_opts, best_expect_file, resultsfile, difffilename);
!     run_diff(cmd);

      /* And append a separator */
      difffile = fopen(difffilename, "a");
--- 920,926 ----
      snprintf(cmd, sizeof(cmd),
               SYSTEMQUOTE "diff %s \"%s\" \"%s\" >> \"%s\"" SYSTEMQUOTE,
               pretty_diff_opts, best_expect_file, resultsfile, difffilename);
!     run_diff(cmd, difffilename);

      /* And append a separator */
      difffile = fopen(difffilename, "a");

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: New variable server_version_num
Next
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] putting CHECK_FOR_INTERRUPTS in