changeset 30187:74714af7b913

Copy --version support from gnulib-tool to posix-modules.
author Bruno Haible <bruno@clisp.org>
date Fri, 26 Sep 2008 20:35:36 +0200
parents c77350457755
children 351557079be5
files ChangeLog posix-modules
diffstat 2 files changed, 184 insertions(+), 72 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Fri Sep 26 20:31:48 2008 +0200
+++ b/ChangeLog	Fri Sep 26 20:35:36 2008 +0200
@@ -1,3 +1,11 @@
+2008-09-26  Bruno Haible  <bruno@clisp.org>
+
+	* posix-modules (cvsdatestamp, last_checkin_date, version): Remove
+	variables.
+	(func_version): Essentially copied from gnulib-tool.
+	(func_exit, func_gnulib_dir, func_tmpdir, func_fatal_error,
+	func_readlink): Copied from gnulib-tool.
+
 2008-09-26  Bruno Haible  <bruno@clisp.org>
 
 	* gnulib-tool (func_version): Change directory to $gnulib_dir before
--- a/posix-modules	Fri Sep 26 20:31:48 2008 +0200
+++ b/posix-modules	Fri Sep 26 20:35:36 2008 +0200
@@ -18,9 +18,6 @@
 
 progname=$0
 package=gnulib
-cvsdatestamp='$Date: 2007-09-11 00:40:16 $'
-last_checkin_date=`echo "$cvsdatestamp" | sed -e 's,^\$[D]ate: ,,'`
-version=`echo "$last_checkin_date" | sed -e 's/ .*$//' -e 's,/,-,g'`
 
 # func_usage
 # outputs to stdout the --help usage message.
@@ -36,85 +33,192 @@
 # outputs to stdout the --version message.
 func_version ()
 {
-  year=`echo "$last_checkin_date" | sed -e 's,/.*$,,'`
+  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
+    if test -d "$gnulib_dir"/CVS \
+       && (cvs --version) >/dev/null 2>/dev/null; then
+      # gnulib checked out from CVS.
+      sed_extract_first_date='/^date: /{
+s/^date: \([0-9][0-9][0-9][0-9]\).\([0-9][0-9]\).\([0-9][0-9]\) \([0-9][0-9]:[0-9][0-9]:[0-9][0-9]\).*/\1-\2-\3 \4/p
+q
+}'
+      date=`cd "$gnulib_dir" && cvs log -N ChangeLog 2>/dev/null | sed -n -e "$sed_extract_first_date"`
+    else
+      # gnulib copy without versioning information.
+      date=`sed -e 's/ .*//;q' "$gnulib_dir"/ChangeLog`
+    fi
+    version=
+  fi
+  year=`"$gnulib_dir"/build-aux/mdate-sh "$self_abspathname" | sed 's,^.* ,,'`
   echo "\
-$progname (GNU $package) $version
+gnulib-tool (GNU $package $date)$version
 Copyright (C) $year Free Software Foundation, Inc.
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+License GPLv3+: GNU GPL version 3 or later <http://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"
 }
 
-case "$0" in
-  /*) self_abspathname="$0" ;;
-  */*) self_abspathname=`pwd`/"$0" ;;
-  *)
-    # 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
-      func_tmpdir
-      { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
-      chmod +x "$tmp"/conf.sh
-      if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
-        PATH_SEPARATOR=';'
+# 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_gnulib_dir
+# locates the directory where the gnulib repository lives
+# Sets variables
+# - self_abspathname         absolute pathname of gnulib-tool
+# - gnulib_dir               absolute pathname of gnulib repository
+func_gnulib_dir ()
+{
+  case "$0" in
+    /*) self_abspathname="$0" ;;
+    */*) self_abspathname=`pwd`/"$0" ;;
+    *)
+      # 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
+        func_tmpdir
+        { echo "#! /bin/sh"; echo "exit 0"; } > "$tmp"/conf.sh
+        chmod +x "$tmp"/conf.sh
+        if (PATH="/nonexistent;$tmp"; conf.sh) >/dev/null 2>&1; then
+          PATH_SEPARATOR=';'
+        else
+          PATH_SEPARATOR=:
+        fi
+        rm -rf "$tmp"
+      fi
+      if test "$PATH_SEPARATOR" = ";"; then
+        # On Windows, programs are searched in "." before $PATH.
+        pathx=".;$PATH"
       else
-        PATH_SEPARATOR=:
+        # 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
-      rm -rf "$tmp"
-    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
-    save_IFS="$IFS"
-    IFS="$PATH_SEPARATOR"
-    for d in $pathx; do
+      save_IFS="$IFS"
+      IFS="$PATH_SEPARATOR"
+      for d in $pathx; do
+        IFS="$save_IFS"
+        test -z "$d" && d=.
+        if test -x "$d/$0" && test ! -d "$d/$0"; then
+          self_abspathname="$d/$0"
+          break
+        fi
+      done
       IFS="$save_IFS"
-      test -z "$d" && d=.
-      if test -x "$d/$0" && test ! -d "$d/$0"; then
-        self_abspathname="$d/$0"
-        break
+      if test -z "$self_abspathname"; then
+        func_fatal_error "could not locate the gnulib-tool program - how did you invoke it?"
       fi
-    done
-    IFS="$save_IFS"
-    if test -z "$self_abspathname"; then
-      func_fatal_error "could not locate the posix-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,/[^/]*$,,'`
+  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_tmpdir
+# creates a temporary directory.
+# Sets variable
+# - tmp             pathname of freshly created temporary directory
+func_tmpdir ()
+{
+  # Use the environment variable TMPDIR, falling back to /tmp. This allows
+  # users to specify a different temporary directory, for example, if their
+  # /tmp is filled up or too small.
+  : ${TMPDIR=/tmp}
+  {
+    # Use the mktemp program if available. If not available, hide the error
+    # message.
+    tmp=`(umask 077 && mktemp -d "$TMPDIR/glXXXXXX") 2>/dev/null` &&
+    test -n "$tmp" && test -d "$tmp"
+  } ||
+  {
+    # Use a simple mkdir command. It is guaranteed to fail if the directory
+    # already exists.  $RANDOM is bash specific and expands to empty in shells
+    # other than bash, ksh and zsh.  Its use does not increase security;
+    # rather, it minimizes the probability of failure in a very cluttered /tmp
+    # directory.
+    tmp=$TMPDIR/gl$$-$RANDOM
+    (umask 077 && mkdir "$tmp")
+  } ||
+  {
+    echo "$0: cannot create a temporary directory in $TMPDIR" >&2
+    func_exit 1
+  }
+}
+
+# func_fatal_error message
+# outputs to stderr a fatal error message, and terminates the program.
+func_fatal_error ()
+{
+  echo "gnulib-tool: *** $1" 1>&2
+  echo "gnulib-tool: *** Stop." 1>&2
+  func_exit 1
+}
+
+# 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
 
 # Command-line option processing.
 while test $# -gt 0; do