Module Name: src
Committed By: kre
Date: Sat Mar 24 01:54:48 UTC 2018
Modified Files:
src/external/public-domain/tz: tzdata2netbsd
Log Message:
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.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/external/public-domain/tz/tzdata2netbsd
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/external/public-domain/tz/tzdata2netbsd
diff -u src/external/public-domain/tz/tzdata2netbsd:1.11 src/external/public-domain/tz/tzdata2netbsd:1.12
--- src/external/public-domain/tz/tzdata2netbsd:1.11 Thu Nov 3 10:11:05 2016
+++ src/external/public-domain/tz/tzdata2netbsd Sat Mar 24 01:54:48 2018
@@ -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, [email protected])
-# 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, [email protected]) 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"
-
-# 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"
-
-# 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"
+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.)
+
+# 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).
+
+# 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 @@ DOIT()
echo "Aborting"
return 1
;;
+ *) echo "Huh?"
+ return 1
+ ;;
esac
if $really_do_it; then
echo "REALLY DOING IT NOW..."
@@ -87,7 +272,7 @@ DOIT()
# eval "\$command $quotedlist \$filename"
#
shell_quote()
-{(
+(
local result=''
local arg qarg
LC_COLLATE=C ; export LC_COLLATE # so [a-zA-Z0-9] works in ASCII
@@ -104,7 +289,7 @@ shell_quote()
# beginning and end of the result and as part of
# '\'''\'' sequences that result from multiple
# adjacent quotes in he input.
- qarg="$(printf "%s\n" "$arg" | \
+ qarg="$(printf '%s\n' "$arg" | \
${SED:-sed} -e "s/'/'\\\\''/g" \
-e "1s/^/'/" -e "\$s/\$/'/" \
-e "1s/^''//" -e "\$s/''\$//" \
@@ -120,8 +305,43 @@ shell_quote()
esac
result="${result}${result:+ }${qarg}"
done
- printf "%s\n" "$result"
-)}
+ printf '%s\n' "$result"
+)
+
+validate_pwd()
+{
+ local P="$(pwd)" || return 1
+
+ test -d "${P}" &&
+ test -d "${P}/CVS" &&
+ test -d "${P}/dist" &&
+ test -f "${P}/dist/zone.tab" &&
+ test -f "${P}/tzdata2netbsd" || {
+ printf >&2 '%s\n' "Please change to the correct directory"
+ return 1
+ }
+
+ test -f "${P}/CVS/Tag" && {
+
+ # Here (for local use only) if needed for private branch work
+ # insert tests for the value of $(cat "${P}/CVS/Tag") and
+ # allow your private branch tag to pass. Eg:
+
+ # case "$(cat "${P}/CVS/Tag")" in
+ # my-branch-name) return 0;;
+ # esac
+
+ # Do not commit a version of this script modified that way,
+ # (not even on the private branch) - keep it as a local
+ # modified file. (This script will not commit it.)
+
+ printf >&2 '%s\n' \
+ "This script should be run in a checkout of HEAD only"
+ return 1
+ }
+
+ return 0
+}
findcvsroot()
{
@@ -132,16 +352,23 @@ findcvsroot()
return 1
}
+mkworkpfx()
+{
+ mkdir -p "${WORK_PFX}" || fail "Unable to make missing ${WORK_PFX}"
+}
mkworkdir()
{
- mkdir -p "${WORKDIR}"
+ mkdir -p "${WORKDIR}" || fail "Unable to make missing ${WORKDIR}"
}
fetch()
{
- [ -f "${DISTFILE}" ] || ftp -o "${DISTFILE}" "${DISTURL}"
- [ -f "${SIGFILE}" ] || ftp -o "${SIGFILE}" "${SIGURL}"
- [ -f "${NEWSFILE}" ] || ftp -o "${NEWSFILE}" "${NEWSURL}"
+ [ -f "${DISTFILE}" ] || ftp -o "${DISTFILE}" "${DISTURL}" ||
+ fail "fetch of ${DISTFILE} failed"
+ [ -f "${SIGFILE}" ] || ftp -o "${SIGFILE}" "${SIGURL}" ||
+ fail "fetch of ${SIGFILE} failed"
+ [ -f "${NEWSFILE}" ] || ftp -o "${NEWSFILE}" "${NEWSURL}" ||
+ fail "fetch of ${NEWSFILE} failed"
}
checksig()
@@ -188,10 +415,16 @@ trimnews()
BEGIN {inrange = 0}
/^Release [0-9]+[a-z]+ - .*/ {
# "Release <version> - <date>"
- inrange = ($2 > oldver && $2 <= newver)
+ # Note: must handle transition from 2018z to 2018aa
+ # Assumptions: OLDVER and NEWVER have been sanitized,
+ # and format of NEWS file does not alter (and
+ # contains valid data)
+ inrange = ((length($2) > length(oldver) || \
+ $2 > oldver) && \
+ (length($2) < newver || $2 <= newver))
}
// { if (inrange) print; }
- ' \
+ ' \
<"${NEWSFILE}" >"${NEWSTRIMFILE}"
echo "tzdata-${NEWVER}" > ${TZDISTDIR}/TZDATA_VERSION
}
@@ -256,7 +489,7 @@ EOF
havesentence = (havesentence || (t ~ "\\.$"));
}
/./ { blankline = 0; }
- ' \
+ ' \
<"${NEWSTRIMFILE}"
} >"${IMPORTMSGFILE}"
}
@@ -349,18 +582,26 @@ extra()
{
cat <<EOF
Also do the following:
- * Edit src/doc/3RDPARTY
- * Edit src/doc/CHANGES
- * Edit src/distrib/sets/lists/base/mi if the set of installed files altered.
+ * Edit and commit src/doc/3RDPARTY
+ * Edit and commit src/doc/CHANGES
+ * Edit and commit src/distrib/sets/lists/base/mi
+ * if the set of installed files altered.
* Submit pullup requests for all active release branches.
- * rm -rf ${WORKDIR}
+ * rm -rf ${WORK_PFX} (optional)
+ * Verify that
+ ${UPDATE_FROM}
+ * no longer exists.
EOF
}
main()
{
set -e
+ validate_pwd
findcvsroot
+ mkworkpfx
+ argparse "$@"
+ setup_versions
mkworkdir
fetch
checksig
@@ -373,6 +614,7 @@ main()
cvsmerge
resolveconflicts
cvscommitmerge
+ rm -f "${UPDATE_FROM}"
extra
}