diff options
Diffstat (limited to 'source/buildlist-from-changelog.sh')
-rwxr-xr-x | source/buildlist-from-changelog.sh | 307 |
1 files changed, 307 insertions, 0 deletions
diff --git a/source/buildlist-from-changelog.sh b/source/buildlist-from-changelog.sh new file mode 100755 index 00000000..0c2b2a0a --- /dev/null +++ b/source/buildlist-from-changelog.sh @@ -0,0 +1,307 @@ +#!/bin/bash + +# Copyright 2018 Patrick J. Volkerding, Sebeka, Minnesota, USA +# All rights reserved. +# +# Redistribution and use of this script, with or without modification, is +# permitted provided that the following conditions are met: +# +# 1. Redistributions of this script must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +# EVENT SHALL THE AUTHOR 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. + +# Create a buildlist for make_world.sh from the most recent ChangeLog entry. +# Optionally pass the SECTIONS= variable to build the list from more sections +# than just the most recent one. For example, create a buildlist for the top +# two sections: +# +# CHANGELOG=/my/slackware/directory/ChangeLog.txt SECTIONS=2 buildlist-from-changelog.sh > buildlist +# +# Or, you can make a buildlist containing everything that is more recent than +# a certain timestamp in the ChangeLog. For example, to build everything that +# appears in the ChangeLog above the timestamp "Thu Apr 19 01:04:06 UTC 2018": +# +# CHANGELOG=/my/slackware/directory/ChangeLog.txt NEWERTHAN="Thu Apr 19 01:04:06 UTC 2018" buildlist-from-changelog.sh > buildlist +# +# If you've already upgraded to the official binaries listed in the ChangeLog, +# you should be able to recompile them locally in one pass without errors. +# Otherwise, if you are bootstrapping these updates it is recommended to build +# from the buildlist until everything is successfully built, and then one more +# time using FORCE_BUILD=yes. + +# This should be the only option that you'll need to set to use a different +# ChangeLog. However, if the ChangeLog is not sitting in a full Slackware +# directory, you will need to provide a valid $SLACKROOT. +CHANGELOG=${CHANGELOG:-../ChangeLog.txt} + +# Figure out the SLACKROOT from the ChangeLog path: +SLACKROOT=${SLACKROOT:-$(dirname $CHANGELOG)} + +# Set the SLACKSRC directory: +SLACKSRC=${SLACKSRC:-${SLACKROOT}/source} + +# Set the SLACKPKGS directory: +if [ -d ${SLACKROOT}/slackware64 ]; then + SLACKPKGS=${SLACKPKGS:-${SLACKROOT}/slackware64} +elif [ -d ${SLACKROOT}/slackware ]; then + SLACKPKGS=${SLACKPKGS:-${SLACKROOT}/slackware} +else + echo "FATAL: package directory not found." + exit 1 +fi + +# How many sections of the ChangeLog to output: +SECTIONS=${SECTIONS:-1} + +# If we have $NEWERTHAN, we'll consider up to 30 sections before giving up if +# we don't see that timestamp: +if [ ! -z "$NEWERTHAN" ]; then + SECTIONS=30 +fi + +# Find the short package name of a package or packages: +pkgname() { + for package in $* ; do + echo $(basename $package) | sed 's?-[^-]*-[^-]*-[^-]*$??' + done +} + +# Find a .txz package under $SLACKROOT, given a (possibly short) package name: +findpkg() { + PKG_FOUND=false + for testpkg in $SLACKPKGS/*/$(pkgname $1)*.txz ; do + if [ "$(pkgname $1)" = "$(basename $testpkg | sed 's?-[^-]*-[^-]*-[^-]*$??')" ]; then + echo $testpkg + PKG_FOUND=true + break + fi + done + if [ "$PKG_FOUND" = "false" ]; then + exit 1 + fi +} + +# Make a temporary directory: +TMPDIR=$(mktemp -d) + +# Output buildlist header: +if head -n 1 $CHANGELOG | grep -q " UTC 20" ; then + if [ "$SECTIONS" = "1" ]; then + echo "# buildlist generated from ChangeLog: $(head -n 1 $CHANGELOG)" > $TMPDIR/header + else + if [ -z "$NEWERTHAN" ]; then + echo "# buildlist generated from ChangeLog ($SECTIONS sections): $(head -n 1 $CHANGELOG)" > $TMPDIR/header + else + echo "# buildlist generated from ChangeLog: $(head -n 1 $CHANGELOG), until timestamp $NEWERTHAN found" > $TMPDIR/header + fi + fi +else + echo "# buildlist generated from ChangeLog (no timestamp - unclosed)" > $TMPDIR/header +fi +echo "#" >> $TMPDIR/header + +SECFOUND=0 +cat $CHANGELOG | while IFS= read -r line ; do + if [ ! -z "$NEWERTHAN" ]; then + if [ "$line" = "$NEWERTHAN" ]; then + break + fi + fi + echo "$line" + if [ "$line" = "+--------------------------+" ]; then + SECFOUND=$(expr $SECFOUND + 1) + if [ "$SECTIONS" = "$SECFOUND" ]; then + break + fi + fi +done | tac | while IFS= read -r line ; do + #if echo "$line" | grep -q -e "^extra/" -e "^isolinux/" -e "^usb-and-pxe-installers/" -e "^kernels/" -e "^a/kernel-generic" -e "^a/kernel-huge" -e "^a/kernel-modules" -e "^d/kernel-headers" -e "^k/kernel-source" ; then + if echo "$line" | grep -q -e "^extra/" -e "^isolinux/" -e "^usb-and-pxe-installers/" -e "^kernels/" ; then + # We don't handle these files, but output it anyway (commented out): + echo "# $line" >> $TMPDIR/packages + if [ -r $TMPDIR/blurbcollect ]; then + cat $TMPDIR/blurbcollect | tac >> $TMPDIR/packages + rm -f $TMPDIR/blurbcollect + fi + elif echo "$line" | grep -q -e ": Upgraded.$" -e ": Rebuilt.$" -e ": Added.$" ; then + # Output the name of the matching built package under ${SLACKPKGS}. + PACKAGE=$(findpkg $(echo $line | cut -f 1 -d :) | rev | cut -f 1,2 -d / | rev) + if echo $PACKAGE | grep -q "^a/aaa_elflibs" ; then + # The aaa_elflibs package must be build last, so put it in its own list: + LISTPKG=aaa_elflibs + elif echo $PACKAGE | grep -q "^kde/" ; then + # KDE packages should be built after all sobumps and normal packages: + LISTPKG=kde + elif echo $PACKAGE | grep -q "^d/perl" ; then + # If we see perl, build it right after any sobumps: + LISTPKG=perl + elif echo $PACKAGE | grep -q -e "^a/kernel-generic" -e "^a/kernel-huge" -e "^a/kernel-modules" -e "^d/kernel-headers" -e "^k/kernel-source" ; then + # All these kernel packages are no-ops for make_world.sh. + LISTPKG=kernel + else + # All other packages go in the "packages" list: + LISTPKG=packages + fi + # If the blurb mentions an .so-version bump, but that in a list to be + # built first: + if [ -r $TMPDIR/blurbcollect ]; then + if cat $TMPDIR/blurbcollect | grep -q "Shared library .so-version bump." ; then + # This package needs to be build first since others might depend on it. + # Send it to the sobumps list: + LISTPKG=sobumps + fi + fi + if [ ! -z $PACKAGE ]; then + echo "# $line" >> $TMPDIR/$LISTPKG + if [ -r $TMPDIR/blurbcollect ]; then + cat $TMPDIR/blurbcollect | tac >> $TMPDIR/$LISTPKG + rm -f $TMPDIR/blurbcollect + fi + echo $PACKAGE >> $TMPDIR/$LISTPKG + else + echo "# NOT FOUND: $line" >> $TMPDIR/packages + if [ -r $TMPDIR/blurbcollect ]; then + cat $TMPDIR/blurbcollect | tac >> $TMPDIR/packages + rm -f $TMPDIR/blurbcollect + fi + fi + elif echo "$line" | grep -q ": Removed.$" ; then + # If the line is for a : Removed. package, then output it to the list, + # commented out: + echo "# $line" >> $TMPDIR/packages + if [ -r $TMPDIR/blurbcollect ]; then + cat $TMPDIR/blurbcollect | tac >> $TMPDIR/packages + rm -f $TMPDIR/blurbcollect + fi + elif echo "$line" | grep -q "^ " ; then + echo "# $line" >> $TMPDIR/blurbcollect + fi +done + +# If $TMPDIR/kernel exists, put a header at the top and then comment the +# rest of it out: +if [ -r $TMPDIR/kernel ]; then + cat << EOF > $TMPDIR/kernel.tmp +# Kernel packages are not handled by make_world.sh. +# To build these kernel packages, go to the source/k directory and run: +# ./build-all-kernels.sh +# If glibc appears in this buildlist, you may want to build the kernels +# before building this list to make sure that glibc is built against the +# kernel headers. This doesn't really matter most of the time, though. +# if gcc appears in this buildlist, then you *absolutely must* build the +# kernels after this buildlist is complete so that they are built with +# the new compiler. +EOF + cat $TMPDIR/kernel | while IFS= read -r line ; do + if [ ! "$(echo $line | cut -b 1)" = "#" ]; then + echo "# $line" >> $TMPDIR/kernel.tmp + else + echo "$line" >> $TMPDIR/kernel.tmp + fi + done + echo "#" >> $TMPDIR/kernel.tmp + mv $TMPDIR/kernel.tmp $TMPDIR/kernel +fi + +# Convert the buildlist from *.txz packages to SlackBuilds: +cat $TMPDIR/header $TMPDIR/kernel $TMPDIR/sobumps $TMPDIR/perl $TMPDIR/packages $TMPDIR/kde $TMPDIR/aaa_elflibs 2> /dev/null | while IFS= read -r line ; do + if echo "$line" | grep -q "^#" ; then + # Commented out line: + echo "$line" >> $TMPDIR/output + continue + fi + SERIES=$(dirname $line) + PACKAGE=$(pkgname $line) + # Handle special case of KDE package: + if [ "$SERIES" = "kde" ]; then + if [ -x $SLACKSRC/kde/kde.SlackBuild ]; then + KDESB=kde/kde.SlackBuild + elif [ -x $SLACKSRC/kde/kde/kde.SlackBuild ]; then + KDESB=kde/kde/kde.SlackBuild + else + echo "# UNHANDLED: $line" >> $TMPDIR/output + continue + fi + BUILDOPT="$(grep "^${PACKAGE}$" $(dirname $SLACKSRC/$KDESB)/modules/* | rev | cut -f 1 -d / | rev)" + echo "$KDESB $BUILDOPT" >> $TMPDIR/output + continue + fi + # Search SlackBuilds that start with that name: + SEARCHFOUND=false + for searchdir in $SLACKSRC/*/$(echo $PACKAGE | cut -f 1 -d -)* ; do + testbuild=$searchdir/$(basename $searchdir).SlackBuild + if [ ! -x $testbuild ]; then + continue + else + for packagecompare in $(pkgname $(PRINT_PACKAGE_NAME=yes $testbuild | tr " " "\n")) ; do + if [ "$PACKAGE" = "$packagecompare" ]; then + SEARCHFOUND=true + OUTPUTLINE=$(echo $testbuild | rev | cut -f 1-3 -d / | rev) + if grep -q "^${OUTPUTLINE}$" $TMPDIR/output ; then + echo "#${OUTPUTLINE}" >> $TMPDIR/output + else + echo "$OUTPUTLINE" >> $TMPDIR/output + fi + continue + fi + done + fi + if [ "$SEARCHFOUND" = "true" ]; then + break + fi + done + if [ "$SEARCHFOUND" = "true" ]; then + continue + fi + # Handle special case of aspell-en: + if [ "$PACKAGE" = "aspell-en" ]; then + echo "# To rebuild aspell-en, see:" >> $TMPDIR/output + echo "#../extra/source/aspell-word-lists/aspell-dict.SlackBuild" >> $TMPDIR/output + continue + fi + # If the package is xorg-server-*, output commented buildscripts. We'll let + # the next test handle the main xorg-server package. + if [ "$PACKAGE" = "xorg-server-xnest" -o \ + "$PACKAGE" = "xorg-server-xvfb" -o \ + "$PACKAGE" = "xorg-server-xephyr" ]; then + echo "#x/x11/x11.SlackBuild xserver xorg-server" >> $TMPDIR/output + continue + fi + # If we got here, it's either something built by x11.SlackBuild or it won't be found. + # Handle special case of package built by x11.SlackBuild: + if [ "$SERIES" = "x" ]; then + SEARCHFOUND=false + SRCDIR=$(basename $(dirname $(/bin/ls $SLACKSRC/x/x11/src/*/${PACKAGE}-* | head -n 1))) + for packagecompare in $(pkgname $(PRINT_PACKAGE_NAME=yes $SLACKSRC/x/x11/x11.SlackBuild $SRCDIR $PACKAGE | tr " " "\n")) ; do + if [ "$PACKAGE" = "$packagecompare" ]; then + SEARCHFOUND=true + OUTPUTLINE=$(echo $SLACKSRC/x/x11/x11.SlackBuild $SRCDIR $PACKAGE | rev | cut -f 1-3 -d / | rev) + if grep -q "^${OUTPUTLINE}$" $TMPDIR/output ; then + echo "#${OUTPUTLINE}" >> $TMPDIR/output + else + echo "$OUTPUTLINE" >> $TMPDIR/output + fi + continue + fi + done + fi + # A build script to build this package could not be found: + if [ "$SEARCHFOUND" = "false" ]; then + echo "# ERROR: NO BUILD SCRIPT FOUND FOR: $line" >> $TMPDIR/output + fi +done + +# Output: +cat $TMPDIR/output + +rm -rf $TMPDIR |