Source-Changes-HG archive

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

[src/trunk]: src/share/zoneinfo Many changes to tzdata2netbsd.



details:   https://anonhg.NetBSD.org/src/rev/5abb52e506e8
branches:  trunk
changeset: 329299:5abb52e506e8
user:      apb <apb%NetBSD.org@localhost>
date:      Sun May 18 16:53:56 2014 +0000

description:
Many changes to tzdata2netbsd.
This has been tested in a private repository.

* Use set -e
* Pass -d ${CVSROOT} to all cvs invocations.  cvs import needs it.
* cvs import needs to be done in the directory where the tarball
  was extracted.
* cvs import does not take a "-F messagefile" option (as cvs commit does);
  it needs "-m messagestring".
* The DOIT function now prompts for a yes/no/quit response, and quotes
  complex arguments when printing the command.
* When checking the PGP signature, require the correct key to have been used.
* Usability improvements when editing the cvs log message.
* More error checking.

diffstat:

 share/zoneinfo/tzdata2netbsd |  164 +++++++++++++++++++++++++++++++++++-------
 1 files changed, 135 insertions(+), 29 deletions(-)

diffs (270 lines):

diff -r 96f7d4c72967 -r 5abb52e506e8 share/zoneinfo/tzdata2netbsd
--- a/share/zoneinfo/tzdata2netbsd      Sun May 18 15:45:08 2014 +0000
+++ b/share/zoneinfo/tzdata2netbsd      Sun May 18 16:53:56 2014 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: tzdata2netbsd,v 1.1 2014/05/17 19:53:22 apb Exp $
+# $NetBSD: tzdata2netbsd,v 1.2 2014/05/18 16:53:56 apb Exp $
 #
 # For use by NetBSD developers when updating to new versions of tzdata.
 #
@@ -33,18 +33,72 @@
 NEWSTRIMFILE="${WORKDIR}/NEWS.trimmed"
 IMPORTMSGFILE="${WORKDIR}/import.msg"
 MERGSMSGFILE="${WORKDIR}/merge.msg"
+PGPVERIFYLOG="${WORKDIR}/pgpverify.log"
 
 DOIT()
 {
-       really_do_it=false
+       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:" "$@"
        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
+       for arg in "$@" ; do
+               case "${arg}" in
+               ''|*[!-./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.
+                       qarg="$(printf "%s\n" "$arg" | \
+                           sed -e "s/'/'\\\\''/g" -e "1s/^/'/" -e "\$s/\$/'/")"
+                       ;;
+               *)
+                       # Arg is not the empty string, and does not contain
+                       # any unsafe characters.
+                       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}"
@@ -59,7 +113,23 @@
 
 checksig()
 {
-       gpg --verify "${SIGFILE}" "${DISTFILE}"
+       { 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 <eggert%cs.ucla.edu@localhost>"
+Primary key fingerprint: 7E37 92A9 D8AC F7D6 33BC  1588 ED97 E90E 62AA 7E34
+gpg exit status 0
+EOF
 }
 
 extract()
@@ -68,10 +138,8 @@
        tar -z -xf "${DISTFILE}" -C "${EXTRACTDIR}"
 }
 
-# Each release has a heading in the NEWS file, like
-# "Release <version> - <date>".
-# Find the relevant part of the NEWS file for all release between
-# OLDVAR and NEWVER, and save them to NEWSTRIMFILE.
+# Find the relevant part of the NEWS file for all releases between
+# OLDVER and NEWVER, and save them to NEWSTRIMFILE.
 #
 trimnews()
 {
@@ -79,6 +147,7 @@
            '
                BEGIN {inrange = 0}
                /^Release [0-9]+[a-z]+ - .*/ {
+                       # "Release <version> - <date>"
                        inrange = ($2 > oldver && $2 <= newver)
                }
                // { if (inrange) print; }
@@ -88,12 +157,21 @@
 
 # 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.
+# 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}" \
            '
@@ -106,6 +184,7 @@
                        print "Import tzdata"newver" from "disturl;
                }
                /^Release/ {
+                       # "Release <version> - <date>"
                        ver = $2;
                        date = gensub(".* - ", "", 1, $0);
                        print "";
@@ -135,27 +214,43 @@
                }
                /./ { blankline = 0; }
                ' \
-               <"${NEWSTRIMFILE}" >"${IMPORTMSGFILE}"
+               <"${NEWSTRIMFILE}"
+       } >"${IMPORTMSGFILE}"
 }
 
 editimportmsg()
 {
-       cat <<EOF
-Edit ${IMPORTMSGFILE##%/}, which will be used as a log message
-for "cvs import".  A template has been prepared from the NEWS file.
-EOF
+       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()
 {
-       DOIT cvs import -F "${IMPORTMSGFILE}" \
+       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 update -j"${CVSOLDTAG}" -j"${CVSNEWTAG}"
+       DOIT cvs -d "${CVSROOT}" update -j"${CVSOLDTAG}" -j"${CVSNEWTAG}"
 }
 
 resolveconflicts()
@@ -171,7 +266,15 @@
 
 cvscommitmerge()
 {
-       DOIT cvs commit -m "Merge tzdata${NEWVER}"
+       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()
@@ -180,6 +283,7 @@
 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
@@ -187,18 +291,20 @@
 
 main()
 {
-       mkworkdir || exit $?
-       fetch || exit $?
-       checksig || exit $?
-       extract || exit $?
-       trimnews || exit $?
-       mkimportmsg || exit $?
-       editimportmsg || exit $?
-       cvsimport || exit $?
-       cvsmerge || exit $?
-       resolveconflicts || exit $?
-       cvscommitmerge || exit $?
-       extra || exit $?
+       set -e
+       findcvsroot
+       mkworkdir
+       fetch
+       checksig
+       extract
+       trimnews
+       mkimportmsg
+       editimportmsg
+       cvsimport
+       cvsmerge
+       resolveconflicts
+       cvscommitmerge
+       extra
 }
 
 main "$@"



Home | Main Index | Thread Index | Old Index