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