Module Name: src Committed By: apb Date: Fri Aug 8 09:08:19 UTC 2014
Added Files: src/external/public-domain/tz: tzdata2netbsd Log Message: Copy src/share/zoneinfo/tzdata2netbsd (revision 1.5) to src/external/public-domain/tz/tzdata2netbsd. This is a verbatim copy, as part of moving the zoneinfo sources in the NetBSD tree. It will need to be edited before it works. To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 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.
Added files: Index: src/external/public-domain/tz/tzdata2netbsd diff -u /dev/null src/external/public-domain/tz/tzdata2netbsd:1.1 --- /dev/null Fri Aug 8 09:08:19 2014 +++ src/external/public-domain/tz/tzdata2netbsd Fri Aug 8 09:08:19 2014 @@ -0,0 +1,336 @@ +# $NetBSD: tzdata2netbsd,v 1.1 2014/08/08 09:08:19 apb Exp $ + +# For use by NetBSD developers when updating to new versions of tzdata. +# +# 0. Be in an up-to-date checkout of src/share/zoneinfo from NetBSD-current. +# 1. Edit OLDVER and NEWVER below. +# 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 +# be re-run over and over, and later runs will try not to +# redo non-trivial work done by earlier runs. +# + +OLDVER=2014e +NEWVER=2014f + +# 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/share/zoneinfo" # relative to the NetSBD CVS repository +WORKDIR="$(pwd)/update-work/${NEWVER}" +EXTRACTDIR="${WORKDIR}/extract" + +# Files in the work directory +DISTFILE="${WORKDIR}/${DISTURL##*/}" +SIGFILE="${DISTFILE}.sig" +NEWSFILE="${WORKDIR}/NEWS" +NEWSTRIMFILE="${WORKDIR}/NEWS.trimmed" +IMPORTMSGFILE="${WORKDIR}/import.msg" +MERGSMSGFILE="${WORKDIR}/merge.msg" +PGPVERIFYLOG="${WORKDIR}/pgpverify.log" + +DOIT() +{ + local really_do_it=false + local reply + + echo "ABOUT TO DO:" "$(shell_quote "$@")" + read -p "Really do it? [yes/no/quit] " reply + case "${reply}" in + [yY]*) really_do_it=true ;; + [nN]*) really_do_it=false ;; + [qQ]*) + echo "Aborting" + return 1 + ;; + esac + if $really_do_it; then + echo "REALLY DOING IT NOW..." + "$@" + else + echo "NOT REALLY DOING THE ABOVE COMMAND" + fi +} + +# Quote args to make them safe in the shell. +# Usage: quotedlist="$(shell_quote args...)" +# +# After building up a quoted list, use it by evaling it inside +# double quotes, like this: +# eval "set -- $quotedlist" +# or like this: +# 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 + for arg in "$@" ; do + case "${arg}" in + '') + qarg="''" + ;; + *[!-./a-zA-Z0-9]*) + # Convert each embedded ' to '\'', + # then insert ' at the beginning of the first line, + # and append ' at the end of the last line. + # Finally, elide unnecessary '' pairs at the + # 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" | \ + ${SED:-sed} -e "s/'/'\\\\''/g" \ + -e "1s/^/'/" -e "\$s/\$/'/" \ + -e "1s/^''//" -e "\$s/''\$//" \ + -e "s/'''/'/g" + )" + ;; + *) + # Arg is not the empty string, and does not contain + # any unsafe characters. Leave it unchanged for + # readability. + qarg="${arg}" + ;; + esac + result="${result}${result:+ }${qarg}" + done + printf "%s\n" "$result" +)} + +findcvsroot() +{ + [ -n "${CVSROOT}" ] && return 0 + CVSROOT="$( cat ./CVS/Root )" + [ -n "${CVSROOT}" ] && return 0 + echo >&2 "Failed to set CVSROOT value" + return 1 +} + +mkworkdir() +{ + mkdir -p "${WORKDIR}" +} + +fetch() +{ + [ -f "${DISTFILE}" ] || ftp -o "${DISTFILE}" "${DISTURL}" + [ -f "${SIGFILE}" ] || ftp -o "${SIGFILE}" "${SIGURL}" + [ -f "${NEWSFILE}" ] || ftp -o "${NEWSFILE}" "${NEWSURL}" +} + +checksig() +{ + { gpg --verify "${SIGFILE}" "${DISTFILE}" + echo gpg exit status $? + } 2>&1 | tee "${PGPVERIFYLOG}" + + # The output should contain lines that match all the following regexps + # + while read line; do + if ! grep -q -e "^${line}\$" "${PGPVERIFYLOG}"; then + echo >&2 "Failed to verify signature: ${line}" + return 1 + fi + done <<'EOF' +gpg: Signature made .* using RSA key ID 62AA7E34 +gpg: Good signature from "Paul Eggert <egg...@cs.ucla.edu>" +Primary key fingerprint: 7E37 92A9 D8AC F7D6 33BC 1588 ED97 E90E 62AA 7E34 +gpg exit status 0 +EOF +} + +extract() +{ + [ -f "${EXTRACTDIR}/zone.tab" ] && return + mkdir -p "${EXTRACTDIR}" + tar -z -xf "${DISTFILE}" -C "${EXTRACTDIR}" +} + +# Find the relevant part of the NEWS file for all releases between +# OLDVER and NEWVER, and save them to NEWSTRIMFILE. +# +trimnews() +{ + [ -s "${NEWSTRIMFILE}" ] && return + awk -v oldver="${OLDVER}" -v newver="${NEWVER}" \ + ' + BEGIN {inrange = 0} + /^Release [0-9]+[a-z]+ - .*/ { + # "Release <version> - <date>" + inrange = ($2 > oldver && $2 <= newver) + } + // { if (inrange) print; } + ' \ + <"${NEWSFILE}" >"${NEWSTRIMFILE}" +} + +# Create IMPORTMSGFILE from NEWSTRIMFILE, by ignoring some sections, +# keeping only the first sentence from paragraphs in other sections, +# and changing the format. +# +# The result should be edited by hand before performing a cvs commit. +# A message to that effect is inserted at the beginning of the file. +# +mkimportmsg() +{ + [ -s "${IMPORTMSGFILE}" ] && return + { cat <<EOF +EDIT ME: Edit this file and then delete the lines marked "EDIT ME". +EDIT ME: This file will be used as a log message for the "cvs commit" that +EDIT ME: imports tzdata${NEWVER}. The initial contents of this file were +EDIT ME: generated from ${NEWSFILE}. +EDIT ME: +EOF + awk -v oldver="${OLDVER}" -v newver="${NEWVER}" \ + -v disturl="${DISTURL}" \ + ' + BEGIN { + bullet = " * "; + indent = " "; + blankline = 0; + goodsection = 0; + havesentence = 0; + print "Import tzdata"newver" from "disturl; + } + /^Release/ { + # "Release <version> - <date>" + ver = $2; + date = gensub(".* - ", "", 1, $0); + print ""; + print "Summary of changes in tzdata"ver \ + " ("date"):"; + } + /^$/ { blankline = 1; havesentence = 0; } + /^ Changes affecting/ { goodsection = 0; } + /^ Changes affecting.*time/ { goodsection = 1; } + /^ Changes affecting.*data format/ { goodsection = 1; } + /^ Changes affecting.*documentation/ || \ + /^ Changes affecting.*commentary/ { + t = gensub("^ *", "", 1, $0); + t = gensub("\\.*$", ".", 1, t); + print bullet t; + goodsection = 0; + } + /^ .*/ && goodsection { + # In a paragraph in a "good" section. + # Ignore leading spaces, and ignore anything + # after the first sentence. + # First line of paragraph gets a bullet. + t = gensub("^ *", "", 1, $0); + t = gensub("\\. .*", ".", 1, t); + if (blankline) print bullet t; + else if (! havesentence) print indent t; + havesentence = (havesentence || (t ~ "\\.$")); + } + /./ { blankline = 0; } + ' \ + <"${NEWSTRIMFILE}" + } >"${IMPORTMSGFILE}" +} + +editimportmsg() +{ + if [ -s "${IMPORTMSGFILE}" ] \ + && ! grep -q '^EDIT' "${IMPORTMSGFILE}" + then + return 0 # file has already been edited + fi + # Pass both IMPORTMSGFILE and NEWSFILE to the editor, so that the + # user can easily consult NEWSFILE while editing IMPORTMSGFILE. + vi "${IMPORTMSGFILE}" "${NEWSFILE}" +} + +cvsimport() +{ + if ! [ -s "${IMPORTMSGFILE}" ] \ + || grep -q '^EDIT' "${IMPORTMSGFILE}" + then + cat >&2 <<EOF +The message file ${IMPORTMSGFILE} +has not been properly edited. +Not performing cvs import. +EOF + return 1 + fi + ( cd "${EXTRACTDIR}" && + DOIT cvs -d "${CVSROOT}" import -m "$(cat "${IMPORTMSGFILE}")" \ + "${REPODIR}" "${CVSBRANCHTAG}" "${CVSNEWTAG}" + ) +} + +cvsmerge() +{ + DOIT cvs -d "${CVSROOT}" update -j"${CVSOLDTAG}" -j"${CVSNEWTAG}" +} + +resolveconflicts() +{ + cat <<EOF +Resolve conflicts resulting from the cvs merge. +exit 0 when done. exit 1 to abort. +EOF + nl=' +' + PS1="[inside ${0##*/}]${nl}${PS1}" sh -i +} + +cvscommitmerge() +{ + if grep -l '^[<=>][<=>][<=>]' * + then + cat >&2 <<EOF +There still appear to be conflicts in the files listed above. +Not performing cvs commit. +EOF + return 1 + fi + DOIT cvs -d "${CVSROOT}" commit -m "Merge tzdata${NEWVER}" +} + +extra() +{ + cat <<EOF +Also do the following: + * Edit src/doc/3RDPARTY + * Edit src/doc/CHANGES + * Edit src/distrib/sets/base/mi if the set of installed files has changed. + * Submit pullup requests for all active release branches. + * rm -rf ${WORKDIR} +EOF +} + +main() +{ + set -e + findcvsroot + mkworkdir + fetch + checksig + extract + trimnews + mkimportmsg + editimportmsg + cvsimport + cvsmerge + resolveconflicts + cvscommitmerge + extra +} + +main "$@"