From ad8d932ad226cadb0e5c018c776c4e7df514f970 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=B6=20Fahlke?= <jorrit@jorrit.de>
Date: Thu, 27 Oct 2016 16:36:31 +0200
Subject: [PATCH] [dune.module] Remove half-support for ',' as a dependency
 list separator.

Also: Improve error message in case dependency list parsing ends up with some
weird module name (e.g. empty or ',') by quoting it in the diagnostic output.
---
 lib/dunemodules.lib | 57 +++++++++++++++++++++++++++++++--------------
 1 file changed, 40 insertions(+), 17 deletions(-)

diff --git a/lib/dunemodules.lib b/lib/dunemodules.lib
index ec07a3b62..7eb609931 100644
--- a/lib/dunemodules.lib
+++ b/lib/dunemodules.lib
@@ -309,6 +309,29 @@ sort_modules() {
   done
 }
 
+# strip any leading spaces, tabs, or newlines
+_ltrim()
+{
+  local val="$1"
+  local tab="	"
+  local nl="
+"
+  while :; do
+    case $val in
+      " "*|"$tab"*|"$nl"*)
+        val=${val#?}
+        ;;
+      *)
+        break
+        ;;
+    esac
+  done
+  # if this is used inside `...` or $(...), any trailing newlines will be
+  # stripped, no matter what we do.  Setting a variable to the result would
+  # work around this, but is not a common idiom.
+  printf "%s" "$val"
+}
+
 _check_deps()
 {
   local module="$1"
@@ -326,13 +349,12 @@ _check_deps()
   fi
   eval deps=\$${mode}_$module
   #initially remove leading space
-  deps=`echo ${deps//^[, ]}`
+  deps=$(_ltrim "$deps")
   while test -n "$deps"; do
-    #the end of the name is marked either by space, opening parenthesis,
-    #or comma
-    name="${deps%%[ (,]*}"
+    #the end of the name is marked either by space or opening parenthesis
+    name="${deps%%[ (]*}"
     #remove the name and adjacent whitespace
-    deps=`echo "$deps" | sed 's/^[^ (,]* *//'`
+    deps=$(_ltrim "${deps#"$name"}")
     #check whether there is a dependency version
     case "$deps" in
     '('*) deps="${deps#(}"
@@ -342,23 +364,24 @@ _check_deps()
     *)    depver=
           ;;
     esac
-    #remove any leading whitespace or commas for the next iteration
-    deps=`echo ${deps//^[, ]}`
+    #remove any leading whitespace for the next iteration
+    deps=$(_ltrim "$deps")
+
     dep=$(fix_variable_name $name)
     if ! check_modname $dep; then
-      echo "ERROR: invalid module name $name ($dependency of $module)" >&2
+      echo "ERROR: invalid module name '$name' ($dependency of '$module')" >&2
       exit 1
     fi
     if eval test x\$HAVE_$dep != "x"; then
       eval ver=\$VERS_$dep
       if test "$SKIPVERSIONCHECK" != "yes" && ! check_version "$ver" "$depver"; then
         echo "$report: version mismatch." >&2
-        echo "       $modname $requires $name $depver," >&2
-        echo "       but only $name = $ver is available." >&2
+        echo "       $modname $requires '$name $depver'," >&2
+        echo "       but only '$name' = '$ver' is available." >&2
         if test "x$mode" = "xDEPS"; then
           exit 1
         else
-          echo "Skipping $name!" >&2
+          echo "Skipping '$name'!" >&2
           continue
         fi
       fi
@@ -367,26 +390,26 @@ _check_deps()
       # perhaps this module is installed,
       # then it should be handled via pkg-config
       if ! pkg-config $name; then
-        echo "$report: could not find module $name," >&2
+        echo "$report: could not find module '$name'," >&2
         echo "       module is also unknown to pkg-config." >&2
         echo "       Maybe you need to adjust PKG_CONFIG_PATH!" >&2
-        echo "       $name is $required by $modname" >&2
+        echo "       '$name' is $required by $modname" >&2
         if test "x$mode" = "xDEPS"; then
           exit 1
         else
-          echo "Skipping $name!" >&2
+          echo "Skipping '$name'!" >&2
           continue
         fi
       else
         eval ver=$(pkg-config $name --modversion)
         if test "$SKIPVERSIONCHECK" != "yes" && ! check_version "$ver" "$depver"; then
           echo "$report: version mismatch." >&2
-          echo "       $modname $requires $name $depver," >&2
-          echo "       but only $name = $ver is installed." >&2
+          echo "       $modname $requires '$name $depver'," >&2
+          echo "       but only '$name' = '$ver' is installed." >&2
           if test "x$mode" = "xDEPS"; then
             exit 1
           else
-            echo "Skipping $name!" >&2
+            echo "Skipping '$name'!" >&2
             continue
           fi
         fi
-- 
GitLab