Source-Changes-HG archive

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

[src/trunk]: src/external/public-domain/tz Make this more automated - no long...



details:   https://anonhg.NetBSD.org/src/rev/f6848f84b68d
branches:  trunk
changeset: 360696:f6848f84b68d
user:      kre <kre%NetBSD.org@localhost>
date:      Sat Mar 24 01:54:48 2018 +0000

description:
Make this more automated - no longer requires editing the
script before use.   Also update to reflect a few changes
to procedures that have occurred here and there in the past.

diffstat:

 external/public-domain/tz/tzdata2netbsd |  354 ++++++++++++++++++++++++++-----
 1 files changed, 298 insertions(+), 56 deletions(-)

diffs (truncated from 453 to 300 lines):

diff -r e857b9aa6c87 -r f6848f84b68d external/public-domain/tz/tzdata2netbsd
--- a/external/public-domain/tz/tzdata2netbsd   Sat Mar 24 01:52:26 2018 +0000
+++ b/external/public-domain/tz/tzdata2netbsd   Sat Mar 24 01:54:48 2018 +0000
@@ -1,57 +1,239 @@
-# $NetBSD: tzdata2netbsd,v 1.11 2016/11/03 10:11:05 kre Exp $
+# $NetBSD: tzdata2netbsd,v 1.12 2018/03/24 01:54:48 kre Exp $
 
 # For use by NetBSD developers when updating to new versions of tzdata.
 #
 # 0. Be in an up-to-date checkout of src/external/public-domain/tz
 #    from NetBSD-current.
-# 1. Edit OLDVER and NEWVER below.
-# 2. Make sure that you have Paul Eggert's 4K RSA public key in your
-#    keyring (62AA7E34, eggert%cs.ucla.edu@localhost)
-# 3. Run this script.  You will be prompted for confirmation before
-#    anything major (such as a cvs operation).
-# 4. If something fails, abort the script and fix it.
-# 5. Re-run this script until you are happy.  It's designed to
+# 1. Make sure that you have Paul Eggert's 4K RSA public key in your
+#    keyring (62AA7E34, eggert%cs.ucla.edu@localhost)  It is not required that it be trusted.
+# 2. Run this script.  You will be prompted for confirmation before
+#    anything major (such as a cvs operation).  The tz versions can be
+#    specified as args (new version first, and the previous second) if
+#    needed to override the calculated values
+# 3. If something fails, abort the script and fix it.
+# 4. Re-run this script until you are happy.  It's designed to
 #    be re-run over and over, and later runs will try not to
 #    redo non-trivial work done by earlier runs.
 #
 
-OLDVER=2016h
-NEWVER=2016i
-
-# Uppercase variants of OLDVER and NEWVER
-OLDVER_UC="$( echo "${OLDVER}" | tr '[a-z]' '[A-Z]' )"
-NEWVER_UC="$( echo "${NEWVER}" | tr '[a-z]' '[A-Z]' )"
-
-# Tags for use with version control systems
-CVSOLDTAG="TZDATA${OLDVER_UC}"
-CVSNEWTAG="TZDATA${NEWVER_UC}"
-CVSBRANCHTAG="TZDATA"
-GITHUBTAG="${NEWVER}"
-
-# URLs for fetching distribution files, etc.
-DISTURL="ftp://ftp.iana.org/tz/releases/tzdata${NEWVER}.tar.gz";
-SIGURL="${DISTURL}.asc"
-NEWSURL="https://github.com/eggert/tz/raw/${GITHUBTAG}/NEWS";
+VERS_PATTERN='2[0-9][0-9][0-9][a-z]'
+# This needs to be updated twice every millennium to allow for the
+# new millenium's years.
+# First in the late xx90's sometime, allow the new one by changing the leading
+# digit from a specific value to the class containing the current and
+# following values (eg: in 2098 or so, change '2' to be '[23]').
+# Tnen in the following early xx00's sometime, delete the class, and insert
+# leave only the current value as valid (eg: in 3001 or 3002,
+# change '[23]' to be just '3'
+# Doing it this way helps guard against invalid specifications.
+# We could automate this, but it is (IMO) not worth the cost, to avoid a
+# twice a millenium edit requirement.
+# A more significant (and harder) change will be needed in the late 9990's
+# If this script lasts until then, send me a postcard, I'll be waiting for it!
+# Things get easier again after that until the late 99990's (etc.)
 
-# Directories
-REPODIR="src/external/public-domain/tz/dist" # relative to the NetBSD CVS repo
-TZDISTDIR="$(pwd)/dist" # should be .../external/public-domain/tz/dist
-WORKDIR="$(pwd)/update-work/${NEWVER}"
-EXTRACTDIR="${WORKDIR}/extract"
+# Note the pattern is used on both the old and new version specifiers,
+# so it must be able to cope with the shift from one form (eg 2999g)
+# to the new one (eg: 3000a) without failing (or the code that uses it
+# below needs to be updated).
 
-# Files in the work directory
-DISTFILE="${WORKDIR}/${DISTURL##*/}"
-SIGFILE="${DISTFILE}.sig"
-PGPVERIFYLOG="${WORKDIR}/pgpverify.log"
-NEWSFILE="${WORKDIR}/NEWS"
-NEWSTRIMFILE="${WORKDIR}/NEWS.trimmed"
-IMPORTMSGFILE="${WORKDIR}/import.msg"
-IMPORTDONEFILE="${WORKDIR}/import.done"
-MERGSMSGFILE="${WORKDIR}/merge.msg"
-MERGEDONEFILE="${WORKDIR}/merge.done"
-COMMITMERGEDONEFILE="${WORKDIR}/commitmerge.done"
+# Also note that the option of having a second alpha (1997aa or something)
+# to handle years with much activity is handled below, the pattern does not
+# need to match those.
+# If that convention changes (as of date of writing, it has never been
+# exercised) then code changes below will be required.
+
+DIST_HOST=ftp.iana.org
+DIST_PATH=tz
+DIST_FILES=releases
 
 EDITOR=${EDITOR:-vi}
+WORK_PFX=$(pwd)/update-work || fail "Cannot obtain PWD"
+UPDATE_FROM=${WORK_PFX}/updating.from.version
+
+usage()
+{
+       printf >&2 '%s\n'                                               \
+               "Usage: $0 [new-version-id [old-version-id]]"           \
+               "     where a version-id is of the form YYYYx (eg: 2018c)" \
+               "     or '' for new-version-id (to specify only the old)"
+       exit 2
+}
+
+fail()
+{
+       local IFS=' '
+
+       printf >&2 '%s\n'       "Error detected:" "   $*" "Aborting."
+       exit 1
+}
+
+valid_vers()
+{
+       case "$2" in
+       ${VERS_PATTERN} | ${VERS_PATTERN}[a-z] )
+               ;;
+       *)      printf >&2 '%s: %s\n' \
+                   "Bad form for $1 version specifier '$2'" \
+                   "should (usually) be 'YYYYx'"
+               return 1
+               ;;
+       esac
+       return 0
+}
+
+get_curvers()
+{
+       local LF=''
+       local LIST=iana-listing
+       local SED_SCRIPT='
+               /tzdata-latest.*-> /{
+                       s/^.*-> //
+                       s/\..*$//
+                       s;^releases/tzdata;;p
+                       q
+               }
+               d'
+
+       test -d "${WORK_PFX}" &&
+               test -s "${WORK_PFX}/${LIST}" &&
+               test "${WORK_PFX}/${LIST}" -nt dist/CVS &&
+               LF=$(find "${WORK_PFX}" -name "${LIST}" -mtime -1 -print) &&
+               test -n "${LF}" &&
+               NEWVER=$(sed -n < "${LF}" "${SED_SCRIPT}") &&
+               valid_vers new "${NEWVER}"                              ||
+
+       ftp >/dev/null 2>&1 -ia "${DIST_HOST}" <<- EOF &&
+                                       dir ${DIST_PATH} ${WORK_PFX}/${LIST}
+                                       quit
+                                       EOF
+               test -s "${WORK_PFX}/${LIST}" &&
+               NEWVER=$(sed -n < "${WORK_PFX}/${LIST}" "${SED_SCRIPT}") &&
+               valid_vers new "${NEWVER}"                              ||
+
+       {
+               rm -f "${WORK_PFX}/${LIST}"
+               fail "Cannot fetch current tzdata version from ${DIST_HOST}"
+       }
+
+       printf '%s\n' "Updating from ${OLDVER} to ${NEWVER}"
+}
+
+argparse()
+{
+       local OVF
+
+       if OVF=$(find "${WORK_PFX}" -name "${UPDATE_FROM##*/}" -mtime +2 -print)
+       then
+               # delete anything old
+               test -n "${OVF}" && rm -f "${OVF}"
+       fi
+
+       case "$#" in
+       0|1)
+               # once we have obtained OLDVER once, never guess it again.
+               test -f "${UPDATE_FROM}" && OLDVER=$(cat "${UPDATE_FROM}") ||
+
+               OLDVER=$(cat dist/version) || {
+                       printf >&2 '%s\n'  \
+                           "Cannot determine current installed version"  \
+                           "Specify it on the command line."  \
+                           ""
+                       usage
+               }
+
+               valid_vers old "${OLDVER}" ||
+                       fail "Calculated bad OLDVER, give as 2nd arg"
+               ;;
+
+       2)      valid_vers old "$2" && OLDVER="$2" || usage
+               ;;
+
+       *)      usage
+               ;;
+       esac
+
+       case "$#:$1" in
+       0: | 1: | 2: )
+               ;;
+       1:?*|2:?*)      
+               valid_vers new "$1" && NEWVER="$1" || usage
+               ;;
+       *)      usage
+               ;;
+       esac
+
+       test -z "${NEWVER}" && get_curvers
+
+       test "${NEWVER}" = "${OLDVER}" && {
+               printf '%s\n' \
+                    "New and old versions both ${NEWVER}: nothing to do"
+               exit 0
+
+       }
+
+       printf '%s\n' "${OLDVER}" > "${UPDATE_FROM}" ||
+           fail "Unable to preserve old version ${OLDVER} in ${UPDATE_FROM}"
+
+       test "${#NEWVER}" -gt "${#OLDVER}" ||
+               test "${NEWVER}" '>' "${OLDVER}" ||
+               {
+                       local reply
+
+                       printf '%s\n' \
+                           "Update would revert ${OLDVER} to ${NEWVER}"
+                       read -p "Is reversion intended? " reply
+                       case "${reply}" in
+                       [Yy]*)  ;;
+                       *)      printf '%s\n' OK. Aborted.
+                               rm -f "${UPDATE_FROM}"
+                               exit 1
+                               ;;
+                       esac
+               }
+
+       return 0
+}
+
+setup_versions()
+{
+       # Uppercase variants of OLDVER and NEWVER
+       OLDVER_UC="$( echo "${OLDVER}" | tr '[a-z]' '[A-Z]' )"
+       NEWVER_UC="$( echo "${NEWVER}" | tr '[a-z]' '[A-Z]' )"
+
+       # Tags for use with version control systems
+       CVSOLDTAG="TZDATA${OLDVER_UC}"
+       CVSNEWTAG="TZDATA${NEWVER_UC}"
+       CVSBRANCHTAG="TZDATA"
+       GITHUBTAG="${NEWVER}"
+
+       # URLs for fetching distribution files, etc.
+       DISTURL="ftp://${DIST_HOST}/${DIST_PATH}/${DIST_FILES}";
+       DISTURL="${DISTURL}/tzdata${NEWVER}.tar.gz"
+       SIGURL="${DISTURL}.asc"
+       NEWSURL="https://github.com/eggert/tz/raw/${GITHUBTAG}/NEWS";
+
+       # Directories
+       REPODIR="src/external/public-domain/tz/dist"
+                               # relative to the NetBSD CVS repo
+       TZDISTDIR="$(pwd)/dist" # should be .../external/public-domain/tz/dist
+       WORKDIR="${WORK_PFX}/${NEWVER}"
+       EXTRACTDIR="${WORKDIR}/extract"
+
+       # Files in the work directory
+       DISTFILE="${WORKDIR}/${DISTURL##*/}"
+       SIGFILE="${DISTFILE}.asc"
+       PGPVERIFYLOG="${WORKDIR}/pgpverify.log"
+       NEWSFILE="${WORKDIR}/NEWS"
+       NEWSTRIMFILE="${WORKDIR}/NEWS.trimmed"
+       IMPORTMSGFILE="${WORKDIR}/import.msg"
+       IMPORTDONEFILE="${WORKDIR}/import.done"
+       MERGSMSGFILE="${WORKDIR}/merge.msg"
+       MERGEDONEFILE="${WORKDIR}/merge.done"
+       COMMITMERGEDONEFILE="${WORKDIR}/commitmerge.done"
+
+       printf '%s\n' "${CVSOLDTAG}"  > "${WORK_PFX}/updating_from"
+}
 
 DOIT()
 {
@@ -68,6 +250,9 @@
                echo "Aborting"
                return 1
                ;;
+       *)      echo "Huh?"
+               return 1
+               ;;
        esac
        if $really_do_it; then
                echo "REALLY DOING IT NOW..."
@@ -87,7 +272,7 @@
 #    eval "\$command $quotedlist \$filename"
 #
 shell_quote()
-{(
+(



Home | Main Index | Thread Index | Old Index