[meta-oe][PATCH 3/9] postgresql: drop bashisms from ptest runner

Khem Raj <[email protected]>
Newsgroups org.openembedded.lists.openembedded-devel
Message-ID <[email protected]>
From: Khem Raj <[email protected]>

run-ptest has a #!/bin/sh shebang but used two constructs that are not
available in the target /bin/sh (dash), so the suite died immediately
after starting the server and reported no test results at all:

  run-ptest: line 54: stdbuf: not found
  run-ptest: line 58: syntax error: bad substitution
  ERROR: Exit status is 2

${PIPESTATUS[0]} is a bash array reference; dash has no PIPESTATUS and
fails with "bad substitution". stdbuf is coreutils-only and is not
guaranteed to be installed on the target.

Capture pg_regress output to a temporary file and use $? directly
instead of piping live into sed, which removes the need for both
PIPESTATUS and stdbuf while keeping the same PASS:/FAIL: translation.

Signed-off-by: Khem Raj <[email protected]>
---
 .../recipes-dbs/postgresql/files/run-ptest    | 21 ++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/meta-oe/recipes-dbs/postgresql/files/run-ptest b/meta-oe/recipes-dbs/postgresql/files/run-ptest
index 4cb8e5c7e1..31f2116a7e 100644
--- a/meta-oe/recipes-dbs/postgresql/files/run-ptest
+++ b/meta-oe/recipes-dbs/postgresql/files/run-ptest
@@ -37,24 +37,31 @@ mkdir -p "${TESTDIR}/testtablespace"
 chmod 0700 "${TESTDIR}/testtablespace"
 chown postgres:postgres "${TESTDIR}/testtablespace"
 
-# Disable set -e before the pipe so we can capture PIPESTATUS
+# Disable set -e so we can capture the regression run's exit status
 set +e
 
-# Run the regression tests.
+# Run the regression tests, capturing output to a plain file instead of
+# piping live into sed: ${PIPESTATUS[0]} is a bashism this script's
+# "#!/bin/sh" shebang can't rely on (target /bin/sh is dash, which has no
+# PIPESTATUS array and fails with "bad substitution"), and batching
+# through a file avoids needing stdbuf, which isn't guaranteed installed.
 # --dlpath points to the standard PostgreSQL package library directory
 # where regress.so and contrib modules (autoinc.so, refint.so, etc.)
 # are installed, so that CREATE FUNCTION ... AS tests can locate them.
+REGRESS_LOG=$(mktemp /tmp/postgresql-ptest.XXXXXX)
 su - postgres -c "cd ${TESTDIR} && \
     ${TESTDIR}/pg_regress \
         --inputdir=. \
         --bindir=${PGBIN} \
         --dlpath=${PKGLIBDIR} \
         --max-concurrent-tests=20 \
-        --schedule=parallel_schedule" 2>&1 | \
-    stdbuf -oL sed -n \
-        -e 's/^ok [0-9]\+\s\+[+* ]\?\s*/PASS: /p' \
-        -e 's/^not ok [0-9]\+\s\+[+* ]\?\s*/FAIL: /p'
-RESULT=${PIPESTATUS[0]}
+        --schedule=parallel_schedule" > "${REGRESS_LOG}" 2>&1
+RESULT=$?
+
+sed -n \
+    -e 's/^ok [0-9]\+\s\+[+* ]\?\s*/PASS: /p' \
+    -e 's/^not ok [0-9]\+\s\+[+* ]\?\s*/FAIL: /p' "${REGRESS_LOG}"
+rm -f "${REGRESS_LOG}"
 
 if [ "${RESULT}" = "0" ]; then
     echo "PASS: all tests passed"
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.