Hi Collin,

> Running this script:
> 
>     $ ./all-modules --version
>     ./all-modules: line 44: func_gnulib_dir: command not found
>     sed: can't read /ChangeLog: No such file or directory
>     ./all-modules: line 65: /build-aux/mdate-sh: No such file or directory
>     all-modules (GNU gnulib )
>     Copyright (C)  Free Software Foundation, Inc.
>     License GPLv3+: GNU GPL version 3 or later 
> <https://gnu.org/licenses/gpl.html>
>     This is free software: you are free to change and redistribute it.
>     There is NO WARRANTY, to the extent permitted by law.
> 
>     Written by Bruno Haible
> 
> The first patch copies the missing function from 'posix-modules'.

Thanks for this, but it is incomplete: func_gnulib_dir depends on a couple
of other functions, which need to be defined as well.

Also, it is useful to follow the function reordering in gnulib-tool.sh
from 2024-02-28. I'm therefore applying the two attached patches instead.

> The date output in both of those scripts is incorrect for me:
> 
>     posix-modules (GNU gnulib 2024-04-04 00:00:00) 0.1.7344-83a61
> 
> I remember we addressed this when I first started working on the
> Python version of gnulib-tool. There it caused an uncaught exception
> because of an out of bounds index, instead of an incorrect time 
> value. :)
> 
> The second patch just copies that change:

Thanks! Applied.

Bruno

>From 39c38e65e5d17593f4d9cd0ed597d7f7582f4b7f Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Apr 2024 04:11:22 +0200
Subject: [PATCH 1/4] posix-modules: Sync auxiliary functions from
 gnulib-tool.sh.

* posix-modules (func_exit, func_fatal_error, func_readlink,
func_gnulib_dir): Move before func_usage and func_version. Incorporate
improvements from gnulib-tool.sh.
---
 ChangeLog     |   7 +++
 posix-modules | 168 ++++++++++++++++++++++++++------------------------
 2 files changed, 96 insertions(+), 79 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 5a84f5a2c7..07e1e3088a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2024-04-04  Bruno Haible  <br...@clisp.org>
+
+	posix-modules: Sync auxiliary functions from gnulib-tool.sh.
+	* posix-modules (func_exit, func_fatal_error, func_readlink,
+	func_gnulib_dir): Move before func_usage and func_version. Incorporate
+	improvements from gnulib-tool.sh.
+
 2024-04-04  Collin Funk  <collin.fu...@gmail.com>
 
 	gnulib-tool.py: Ignore 'use-dict-literal' warnings.
diff --git a/posix-modules b/posix-modules
index 0da6942738..ae5fb90ffd 100755
--- a/posix-modules
+++ b/posix-modules
@@ -19,59 +19,6 @@
 progname=$0
 package=gnulib
 
-# func_usage
-# outputs to stdout the --help usage message.
-func_usage ()
-{
-  echo "\
-Usage: posix-modules [option]
-
-Lists the gnulib modules that implement POSIX interfaces.
-
-Options:
-
-      --for-mingw           list only modules that work on mingw
-      --for-msvc            list only modules that work on MSVC
-
-Report bugs to <bug-gnulib@gnu.org>."
-}
-
-# func_version
-# outputs to stdout the --version message.
-func_version ()
-{
-  func_gnulib_dir
-  if test -d "$gnulib_dir"/.git \
-     && (git --version) >/dev/null 2>/dev/null \
-     && (date --version) >/dev/null 2>/dev/null; then
-    # gnulib checked out from git.
-    sed_extract_first_date='/^Date/{
-s/^Date:[	 ]*//p
-q
-}'
-    date=`cd "$gnulib_dir" && git log ChangeLog | sed -n -e "$sed_extract_first_date"`
-    # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600".
-    sed_year_before_time='s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /'
-    date=`echo "$date" | sed -e "$sed_year_before_time"`
-    # Use GNU date to compute the time in GMT.
-    date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
-    version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
-  else
-    # gnulib copy without versioning information.
-    date=`sed -e 's/ .*//;q' "$gnulib_dir"/ChangeLog`
-    version=
-  fi
-  year=`"$gnulib_dir"/build-aux/mdate-sh "$self_abspathname" | sed 's,^.* ,,'`
-  echo "\
-posix-modules (GNU $package $date)$version
-Copyright (C) $year Free Software Foundation, Inc.
-License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
-This is free software: you are free to change and redistribute it.
-There is NO WARRANTY, to the extent permitted by law.
-
-Written by" "Bruno Haible"
-}
-
 # func_exit STATUS
 # exits with a given status.
 # This function needs to be used, rather than 'exit', when a 'trap' handler is
@@ -81,6 +28,34 @@ func_exit ()
   (exit $1); exit $1
 }
 
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname                 name of this program
+func_fatal_error ()
+{
+  echo "$progname: *** $1" 1>&2
+  echo "$progname: *** Stop." 1>&2
+  func_exit 1
+}
+
+# func_readlink SYMLINK
+# outputs the target of the given symlink.
+if (type readlink) > /dev/null 2>&1; then
+  func_readlink ()
+  {
+    # Use the readlink program from GNU coreutils.
+    readlink "$1"
+  }
+else
+  func_readlink ()
+  {
+    # Use two sed invocations. A single sed -n -e 's,^.* -> \(.*\)$,\1,p'
+    # would do the wrong thing if the link target contains " -> ".
+    LC_ALL=C ls -l "$1" | sed -e 's, -> ,#%%#,' | sed -n -e 's,^.*#%%#\(.*\)$,\1,p'
+  }
+fi
+
 # func_gnulib_dir
 # locates the directory where the gnulib repository lives
 # Input:
@@ -91,7 +66,7 @@ func_exit ()
 func_gnulib_dir ()
 {
   case "$progname" in
-    /*) self_abspathname="$progname" ;;
+    /* | ?:*) self_abspathname="$progname" ;;
     */*) self_abspathname=`pwd`/"$progname" ;;
     *)
       # Look in $PATH.
@@ -121,6 +96,16 @@ func_gnulib_dir ()
                  || PATH_SEPARATOR=';'
              }
       fi
+      if test "${PATH_SEPARATOR+set}" != set; then
+        # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+        # contains only /bin. Note that ksh looks also at the FPATH variable,
+        # so we have to set that as well for the test.
+        PATH_SEPARATOR=:
+        (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+          && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+                 || PATH_SEPARATOR=';'
+             }
+      fi
       if test "$PATH_SEPARATOR" = ";"; then
         # On Windows, programs are searched in "." before $PATH.
         pathx=".;$PATH"
@@ -154,7 +139,7 @@ func_gnulib_dir ()
     linkval=`func_readlink "$self_abspathname"`
     test -n "$linkval" || break
     case "$linkval" in
-      /* ) self_abspathname="$linkval" ;;
+      /* | ?:* ) self_abspathname="$linkval" ;;
       * ) self_abspathname=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
     esac
   done
@@ -194,33 +179,58 @@ func_tmpdir ()
   }
 }
 
-# func_fatal_error message
-# outputs to stderr a fatal error message, and terminates the program.
-# Input:
-# - progname                 name of this program
-func_fatal_error ()
+# func_usage
+# outputs to stdout the --help usage message.
+func_usage ()
 {
-  echo "$progname: *** $1" 1>&2
-  echo "$progname: *** Stop." 1>&2
-  func_exit 1
+  echo "\
+Usage: posix-modules [option]
+
+Lists the gnulib modules that implement POSIX interfaces.
+
+Options:
+
+      --for-mingw           list only modules that work on mingw
+      --for-msvc            list only modules that work on MSVC
+
+Report bugs to <bug-gnulib@gnu.org>."
 }
 
-# func_readlink SYMLINK
-# outputs the target of the given symlink.
-if (type -p readlink) > /dev/null 2>&1; then
-  func_readlink ()
-  {
-    # Use the readlink program from GNU coreutils.
-    readlink "$1"
-  }
-else
-  func_readlink ()
-  {
-    # Use two sed invocations. A single sed -n -e 's,^.* -> \(.*\)$,\1,p'
-    # would do the wrong thing if the link target contains " -> ".
-    LC_ALL=C ls -l "$1" | sed -e 's, -> ,#%%#,' | sed -n -e 's,^.*#%%#\(.*\)$,\1,p'
-  }
-fi
+# func_version
+# outputs to stdout the --version message.
+func_version ()
+{
+  func_gnulib_dir
+  if test -d "$gnulib_dir"/.git \
+     && (git --version) >/dev/null 2>/dev/null \
+     && (date --version) >/dev/null 2>/dev/null; then
+    # gnulib checked out from git.
+    sed_extract_first_date='/^Date/{
+s/^Date:[	 ]*//p
+q
+}'
+    date=`cd "$gnulib_dir" && git log ChangeLog | sed -n -e "$sed_extract_first_date"`
+    # Turn "Fri Mar 21 07:16:51 2008 -0600" into "Mar 21 2008 07:16:51 -0600".
+    sed_year_before_time='s/^[^ ]* \([^ ]*\) \([0-9]*\) \([0-9:]*\) \([0-9]*\) /\1 \2 \4 \3 /'
+    date=`echo "$date" | sed -e "$sed_year_before_time"`
+    # Use GNU date to compute the time in GMT.
+    date=`date -d "$date" -u +"%Y-%m-%d %H:%M:%S"`
+    version=' '`cd "$gnulib_dir" && ./build-aux/git-version-gen /dev/null | sed -e 's/-dirty/-modified/'`
+  else
+    # gnulib copy without versioning information.
+    date=`sed -e 's/ .*//;q' "$gnulib_dir"/ChangeLog`
+    version=
+  fi
+  year=`"$gnulib_dir"/build-aux/mdate-sh "$self_abspathname" | sed 's,^.* ,,'`
+  echo "\
+posix-modules (GNU $package $date)$version
+Copyright (C) $year Free Software Foundation, Inc.
+License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
+This is free software: you are free to change and redistribute it.
+There is NO WARRANTY, to the extent permitted by law.
+
+Written by" "Bruno Haible"
+}
 
 # Excludes for mingw.
 exclude_for_mingw=
-- 
2.34.1

>From ce6070e4292b38eba7dc77d39c1db9d1bdd32246 Mon Sep 17 00:00:00 2001
From: Bruno Haible <br...@clisp.org>
Date: Fri, 5 Apr 2024 04:17:56 +0200
Subject: [PATCH 2/4] all-modules: Fix errors during './all-modules --version'
 execution.

Reported by Collin Funk in
<https://lists.gnu.org/archive/html/bug-gnulib/2024-04/msg00050.html>.

* all-modules (func_exit, func_fatal_error, func_readlink,
func_gnulib_dir): Include auxiliary functions from gnulib-tool.sh.
---
 ChangeLog   |   8 ++++
 all-modules | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 135 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 07e1e3088a..9ed30f85f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2024-04-04  Bruno Haible  <br...@clisp.org>
+
+	all-modules: Fix errors during './all-modules --version' execution.
+	Reported by Collin Funk in
+	<https://lists.gnu.org/archive/html/bug-gnulib/2024-04/msg00050.html>.
+	* all-modules (func_exit, func_fatal_error, func_readlink,
+	func_gnulib_dir): Include auxiliary functions from gnulib-tool.sh.
+
 2024-04-04  Bruno Haible  <br...@clisp.org>
 
 	posix-modules: Sync auxiliary functions from gnulib-tool.sh.
diff --git a/all-modules b/all-modules
index 4d22f7fc47..8646a8bad8 100755
--- a/all-modules
+++ b/all-modules
@@ -19,6 +19,133 @@
 progname=$0
 package=gnulib
 
+# func_exit STATUS
+# exits with a given status.
+# This function needs to be used, rather than 'exit', when a 'trap' handler is
+# in effect that refers to $?.
+func_exit ()
+{
+  (exit $1); exit $1
+}
+
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+# Input:
+# - progname                 name of this program
+func_fatal_error ()
+{
+  echo "$progname: *** $1" 1>&2
+  echo "$progname: *** Stop." 1>&2
+  func_exit 1
+}
+
+# func_readlink SYMLINK
+# outputs the target of the given symlink.
+if (type readlink) > /dev/null 2>&1; then
+  func_readlink ()
+  {
+    # Use the readlink program from GNU coreutils.
+    readlink "$1"
+  }
+else
+  func_readlink ()
+  {
+    # Use two sed invocations. A single sed -n -e 's,^.* -> \(.*\)$,\1,p'
+    # would do the wrong thing if the link target contains " -> ".
+    LC_ALL=C ls -l "$1" | sed -e 's, -> ,#%%#,' | sed -n -e 's,^.*#%%#\(.*\)$,\1,p'
+  }
+fi
+
+# func_gnulib_dir
+# locates the directory where the gnulib repository lives
+# Input:
+# - progname                 name of this program
+# Sets variables
+# - self_abspathname         absolute pathname of this program
+# - gnulib_dir               absolute pathname of gnulib repository
+func_gnulib_dir ()
+{
+  case "$progname" in
+    /* | ?:*) self_abspathname="$progname" ;;
+    */*) self_abspathname=`pwd`/"$progname" ;;
+    *)
+      # Look in $PATH.
+      # Iterate through the elements of $PATH.
+      # We use IFS=: instead of
+      #   for d in `echo ":$PATH:" | sed -e 's/:::*/:.:/g' | sed -e 's/:/ /g'`
+      # because the latter does not work when some PATH element contains spaces.
+      # We use a canonicalized $pathx instead of $PATH, because empty PATH
+      # elements are by definition equivalent to '.', however field splitting
+      # according to IFS=: loses empty fields in many shells:
+      #   - /bin/sh on OSF/1 and Solaris loses all empty fields (at the
+      #     beginning, at the end, and in the middle),
+      #   - /bin/sh on IRIX and /bin/ksh on IRIX and OSF/1 lose empty fields
+      #     at the beginning and at the end,
+      #   - GNU bash, /bin/sh on AIX and HP-UX, and /bin/ksh on AIX, HP-UX,
+      #     Solaris lose empty fields at the end.
+      # The 'case' statement is an optimization, to avoid evaluating the
+      # explicit canonicalization command when $PATH contains no empty fields.
+      self_abspathname=
+      if test "${PATH_SEPARATOR+set}" != set; then
+        # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+        # contains only /bin. Note that ksh looks also at the FPATH variable,
+        # so we have to set that as well for the test.
+        PATH_SEPARATOR=:
+        (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+          && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+                 || PATH_SEPARATOR=';'
+             }
+      fi
+      if test "${PATH_SEPARATOR+set}" != set; then
+        # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which
+        # contains only /bin. Note that ksh looks also at the FPATH variable,
+        # so we have to set that as well for the test.
+        PATH_SEPARATOR=:
+        (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+          && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \
+                 || PATH_SEPARATOR=';'
+             }
+      fi
+      if test "$PATH_SEPARATOR" = ";"; then
+        # On Windows, programs are searched in "." before $PATH.
+        pathx=".;$PATH"
+      else
+        # On Unix, we have to convert empty PATH elements to ".".
+        pathx="$PATH"
+        case :$PATH: in
+          *::*)
+            pathx=`echo ":$PATH:" | sed -e 's/:::*/:.:/g' -e 's/^://' -e 's/:\$//'`
+            ;;
+        esac
+      fi
+      saved_IFS="$IFS"
+      IFS="$PATH_SEPARATOR"
+      for d in $pathx; do
+        IFS="$saved_IFS"
+        test -z "$d" && d=.
+        if test -x "$d/$progname" && test ! -d "$d/$progname"; then
+          self_abspathname="$d/$progname"
+          break
+        fi
+      done
+      IFS="$saved_IFS"
+      if test -z "$self_abspathname"; then
+        func_fatal_error "could not locate the all-modules program - how did you invoke it?"
+      fi
+      ;;
+  esac
+  while test -h "$self_abspathname"; do
+    # Resolve symbolic link.
+    linkval=`func_readlink "$self_abspathname"`
+    test -n "$linkval" || break
+    case "$linkval" in
+      /* | ?:* ) self_abspathname="$linkval" ;;
+      * ) self_abspathname=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`/"$linkval" ;;
+    esac
+  done
+  gnulib_dir=`echo "$self_abspathname" | sed -e 's,/[^/]*$,,'`
+}
+
 # func_usage
 # outputs to stdout the --help usage message.
 func_usage ()
-- 
2.34.1

Reply via email to