Re: [PATCH] [TCK] Convert scripts to also run with dash

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 11/15/2010 12:35 PM, Eric Blake wrote:
On 11/15/2010 08:33 AM, Stefan Berger wrote:
I am converting the shell-scripted tap tests to also run using the dash
shell, fixing some other problems on the way as well.

Two of the tests' data files contained '\\1' in an sed command. This
created char(1) with the dash, '\1' with the bash. I found it easier to
replace the sed command with a different one than figuring out how to
solve this escape problem so it works for both shells.



-function tap_fail() {
-  echo "not ok $1 - ${2:0:66}"
-  TAP_FAIL_LIST+="$1 "
-  ((TAP_FAIL_CTR++))
-  ((TAP_TOT_CTR++))
+tap_fail() {
+  txt=$(echo "$2" | gawk '{print substr($0,1,66)}')
+  echo "not ok $1 - ${txt}"
+  TAP_FAIL_LIST="$TAP_FAIL_LIST $1 "
+  TAP_FAIL_CTR=$((TAP_FAIL_CTR+1))
Older versions of dash have a bug where you have to pre-expand a
variable to get this to work:

TAP_FAIL_CTR=$(($TAP_FAIL_CTR + 1))

(throughout the patch)

Fixed.
@@ -112,8 +111,8 @@ function checkExpectedOutput() {

    exec 4<"${datafile}"

-  read<&4
-  line="${REPLY}"
+  IFS=""
Where do you restore IFS back to its original space-tab-newline setting?

Fixed.
      while :; do
-      read<&4
-      line="${REPLY}"
+      read line<&4
+
+      letter=$(echo ${line} | gawk '{print substr($1,1,1)}')

-      if [ "${line:0:1}" == "#" ] || [ "x${line}x" == "xx"  ]; then
+      if [ "x${letter}x" = "x#x" ] || [ "x${line}x" = "xx"  ]; then
Rather than wasting a $() and gawk subprocess to compute $letter, you
can use the much more efficient:

case $line in
   '#'*) # line started with #
     ;;
   *)    # line did not start with #
     ;;
esac

Ok, since it's faster.
@@ -327,13 +320,13 @@ function main() {
    fi

    if [ $((flags&  FLAG_LIBVIRT_TEST)) -ne 0 ]; then
-    pushd "${PWD}">  /dev/null
+    curdir="${PWD}"
      . ./test-lib.sh
      if [ $? -ne 0 ]; then
          exit 1
      fi
      test_intro $this_test
-    popd>  /dev/null
+    cd "${curdir}"
You really should check whether cd succeeds; as failure to return to the
parent directory deserves aborting the script to avoid corrupting
unintended files in a different directory.

Fixed.
Index: libvirt-tck/scripts/networks/100-apply-verify-host.t
===================================================================
--- libvirt-tck.orig/scripts/networks/100-apply-verify-host.t
+++ libvirt-tck/scripts/networks/100-apply-verify-host.t
@@ -1,10 +1,5 @@
-#!/bin/bash
+#!/bin/sh

  pwd=$(dirname $0)

-pushd ${PWD}>  /dev/null
-
-cd ${pwd}
-bash ./networkApplyTest.sh --tap-test
-
-popd>  /dev/null
+(cd ${pwd}; sh ./networkApplyTest.sh --tap-test)
To be robust to starting the script via a relative pathname that starts
with -, I'd write this as:

pwd=$(dirname -- "$0")
(cd -- "${pwd}"&&  sh ./networkApplyTest.sh --tap-test

Fixed.
Index: libvirt-tck/scripts/networks/networkxml2hostout/tck-testnet-1.dat
===================================================================
--- libvirt-tck.orig/scripts/networks/networkxml2hostout/tck-testnet-1.dat
+++ libvirt-tck/scripts/networks/networkxml2hostout/tck-testnet-1.dat
@@ -5,7 +5,7 @@ MASQUERADE  all  --  10.1.2.0/24
  #iptables -n -L FORWARD | grep ' 10\\.1\\.2\\.'
  ACCEPT     all  --  0.0.0.0/0            10.1.2.0/24         state RELATED,ESTABLISHED
  ACCEPT     all  --  10.1.2.0/24          0.0.0.0/0
-#ps aux | sed -n '/dnsmasq .*10\\.1\\.2\\./ s|.*\\(dnsmasq[[:print:]*]\\)|\\1|p'
+#ps aux | sed -n '/dnsmasq .*10\\.1\\.2\\./ s|.*dnsmasq|dnsmasq|p'
Hmm; you used 'read' to read in these lines, but unless you use 'read
-r', that means that backslash interpolation is taking place in the
shell.  'read -r' is portable to POSIX (and therefore dash), even if it
is not portable to generic /bin/sh (but we already have lots of other
things that are not portable to generic /bin/sh that aren't worth
fretting about, since we can assume that the nwfilter tests only make
sense on Linux where /bin/sh will mostly conform to POSIX).  Maybe it's
better to fix the driver scripts to use 'read -r', at which point these
lines could use single \, while at the same time working around the
problem you were seeing where dash interpolated \1 inside "" into char(1).

I tried this now and converted all \\ to \. I still get the same problem here with dash using 'read -r line' now. The same problem exists with

echo "\1"

or

echo '\1'

run via bash or dash. Bash prints out '\1' and dash (0.5.6-2.fc14) prints char(1) in both cases.

   Stefan

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]