tech-userlevel archive

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

Binary patch generation script (initial version)



Salut,

Find appended the configure'd version of a preliminary script to
faciliate patch generation following the methods defined earlier
in conversations. It's probably ugly, but it's one more quick
thing, and hey, it works!

The system variables are mostly determined by the running system,
which may not always be right - but some build.sh-like flags can
be passed to overcome this. The OpenSSL key has a default in
/etc/openssl/private/$OS.pem - e.g. NetBSD.pem - and also doesn't
need to be passed. The plist file is generated using diff if
not given; for that to work, the builddir must be kept in the
same location for both builds.

The pullup ID is required to retrieve the message. I'm not sure
there's a better way.

An example would be:

mkpatch /usr/oobj/destdir /usr/obj/destdir 423

It is certainly still going to undergo a lot of work, and your
input is really valued.

Now toast. ;-)

                                Tonnerre
#!/bin/sh
#
# (c) 2009, Tonnerre Lombard <tonnerre%NetBSD.org@localhost>,
#           The NetBSD Foundation. All rights reserved.
#
# Redistribution and use  in source and binary forms,  with or without
# modification, are  permitted provided that  the following conditions
# are met:
#
# * Redistributions  of source  code must  retain the  above copyright
#   notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form  must reproduce the above copyright
#   notice, this  list of conditions  and the following  disclaimer in
#   the  documentation  and/or   other  materials  provided  with  the
#   distribution.
# * Neither the name of the The NetBSD  Foundation nor the name of its
#   contributors may  be used to  endorse or promote  products derived
#   from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED  BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS FOR A  PARTICULAR PURPOSE ARE DISCLAIMED. IN  NO EVENT SHALL
# THE  COPYRIGHT  OWNER OR  CONTRIBUTORS  BE  LIABLE  FOR ANY  DIRECT,
# INDIRECT, INCIDENTAL,  SPECIAL, EXEMPLARY, OR  CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT  NOT LIMITED TO, PROCUREMENT OF  SUBSTITUTE GOODS OR
# SERVICES; LOSS  OF USE, DATA, OR PROFITS;  OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY  THEORY OF LIABILITY, WHETHER IN CONTRACT,
# STRICT  LIABILITY,  OR  TORT  (INCLUDING  NEGLIGENCE  OR  OTHERWISE)
# ARISING IN ANY WAY OUT OF  THE USE OF THIS SOFTWARE, EVEN IF ADVISED
# OF THE POSSIBILITY OF SUCH DAMAGE.
#
# $patchadd$
#

## Basic definitions

OPENSSL="/usr/bin/openssl"
TAR="/bin/tar"
OSABI=`uname -s`
OSVERS=`uname -r`
OSARCH=`uname -m`
BSPATCH="/usr/pkg/bin/bspatch"
BASENAME="/usr/bin/basename"
BSDIFF="/usr/pkg/bin/bsdiff"
CP="/bin/cp"
MV="/bin/mv"
RM="/bin/rm"
MKDIR="/bin/mkdir"
AWK="gawk"
LYNX="/usr/pkg/bin/lynx"
PULLUP_TRACKER_BASE="http://releng.netbsd.org/cgi-bin/req-{}.cgi";

exitcode=0

## Actual code

usage() {
        echo "$0 [-p <plist-file>] [-m <machine-arch>] [-r <release>]" 1>&2
        echo "        [-k <keyfile>] <olddir> <builddir> <pullup-id>" 1>&2
        echo 1>&2
        echo "    -p plist-file" 1>&2
        echo "        PLIST file containing a list of files to diff." 1>&2
        echo "    -k keyfile" 1>&2
        echo "        Path to the patch signing key." 1>&2
        echo "    -s os-abi" 1>&2
        echo "        The OS ABI of the build, if differing." 1>&2
        echo "    -m machine-arch" 1>&2
        echo "        The architecture of the build, if differing." 1>&2
        echo "    -r release" 1>&2
        echo "        The release of the build, if differing." 1>&2
        exit 1
}

args=`getopt p:k:s:m:r: $*`
[ $? -eq 0 ] || usage

set -- $args

PLIST=''
KEYFILE=''

while [ $# -gt 0 ]
do
        case "$1" in
                -p)
                        PLIST="$2"
                        shift
                        ;;
                -s)
                        OSABI="$2"
                        shift
                        ;;
                -m)
                        OSARCH="$2"
                        shift
                        ;;
                -r)
                        OSVERS="$2"
                        shift
                        ;;
                -k)
                        KEYFILE="$2"
                        shift
                        ;;
                --)
                        shift; break
                        ;;
        esac
        shift
done

if [ "$#" -lt 3 ]
then
        echo "Too few arguments." 1>&2
        usage
fi

OSMAJ=`echo "${OSVERS}" | awk -F. '{ print $1 }'`
OSFULL=`echo "${OSVERS}" | awk -F_ '{ print $1 }'`
PULLUP_TRACKER=`echo "${PULLUP_TRACKER_BASE}" | sed -e"s@{}@${OSMAJ}@g"`
ORIGDIR="$1"
BUILDDIR="$2"
PULLUP="$3"
shift; shift; shift

if [ -z "${KEYFILE}" ]
then
        KEYFILE="/etc/openssl/private/${OSABI}.pem"
fi

if [ ! -f "${KEYFILE}" ]
then
        echo "Key file ${KEYFILE} not found." 1>&2
        usage
fi

if [ -z "${PLIST}" ]
then
        PLIST=`mktemp /tmp/mkpatch-XXXXXX`
        diff -rq "${ORIGDIR}" "${BUILDDIR}" | sed -e's/^Files //g'      \
                -e's@ and .* differ$@@g' -e"s@${ORIGDIR}@@g" > "${PLIST}"
fi

WRKDIR=`mktemp -d /tmp/mkpatch-XXXXXX`
OUTDIR=`pwd`

"${LYNX}" -dump "${PULLUP_TRACKER}?show=${PULLUP}" |    \
        sed -e '1,/Modified Files:/d' -e                \
        '/To generate a diff of this commit/,$d' |      \
        sed -e'1,3d' > "${WRKDIR}/+COMMENT"
SHORTCOMMENT=`head -1 "${WRKDIR}/+COMMENT"`

cat << EOT > "${WRKDIR}/+INFO"
ABI=${OSABI}
OS_VERSION=${OSFULL}
MACHINE_ARCH=${OSARCH}
PATCHTOOLS=0.1
NAME=${OSFULL}-${PULLUP}
COMMENT=${SHORTCOMMENT}
EOT

(while read file
do
        PFILE=`echo "${file}" | tr '/' '_' | sed -e's/^_//'`
        OSUM=`sha1 -n "${ORIGDIR}/${file}" | awk '{ print $1 }'`
        NSUM=`sha1 -n "${BUILDDIR}/${file}" | awk '{ print $1 }'`

        "${BSDIFF}" "${ORIGDIR}/${file}" "${BUILDDIR}/${file}" \
                "${WRKDIR}/${PFILE}"
        echo "${file}" "${PFILE}" "${OSUM}" "${NSUM}" "${OSUM}" >>      \
                "${WRKDIR}/+CONTENTS"
done) < "${PLIST}"

(cd "${WRKDIR}"; "${TAR}" cjvf "${OUTDIR}/${OSFULL}-${PULLUP}.tbz" *)
"${OPENSSL}" smime -sign -binary -outform PEM -signer "${KEYFILE}"      \
        -in "${OUTDIR}/${OSFULL}-${PULLUP}.tbz" -out                    \
        "${OUTDIR}/${OSFULL}-${PULLUP}.tbz.sig"

exit $exitcode

Attachment: pgpODwLyeg8is.pgp
Description: PGP signature



Home | Main Index | Thread Index | Old Index