freebsd-ports/Tools/scripts/tindex
Kris Kennaway 310ce3b0a4 Remove some hardcoded values to hopefully stop random users from shooting
their feet off in public.

Suggested by:	adamw
2005-09-08 17:57:37 +00:00

179 lines
5.3 KiB
Bash
Executable file

#!/bin/sh
#
# INDEX build tinderbox script. Build an INDEX for all supported FreeBSD branches
# using the latest value of OSVERSION according to the src trees. If the build
# fails, yowl about it on ${REPORT_ADDRESS} If not, copy the index to www.freebsd.org so
# that 'make fetchindex' sees it.
#
# When INDEX is broken, assemble the list of committers who touched files
# on the most recent 'cvs update', and put those committers "on the hook".
# These committers all stay on the hook until INDEX is buildable again.
# --------------------------------------------------------
# Change these!
# Address for success/failure reports
REPORT_ADDRESS=root@localhost
# Address for script errors
ERROR_ADDRESS=root@localhost
# Where to scp the resulting indexes after build
SCP_DEST=root@localhost:/usr/local/www/ports
# Location of ports tree and source trees
export PORTSDIR=/vol/vol0/users/kris/ports.clean
export SRCDIR4=/vol/vol0/users/kris/src.4
export SRCDIR5=/vol/vol0/users/kris/src.5
export SRCDIR6=/vol/vol0/users/kris/src.6
# --------------------------------------------------------
blame() {
# Find out who is responsible for current version of file $1
# Fastest way to extract is from the $FreeBSD$ tag
ident=$(ident $1 2>/dev/null | grep '$FreeBSD')
who=$(echo $ident | awk '{print $6}')
if [ -z "$ident" ]; then
# No $FreeBSD$ tag, fall back to slower method of parsing cvs logs.
rev=$(cvs status $1 2>/dev/null | grep 'Working revision:' | awk '{print $3}')
if [ "$rev" != "No" ]; then # "No" means not under CVS control
ident=$(cvs -Rq log -r$rev $1 | grep "^date:" | head -1 | sed 's,;,,g')
who=$(echo $ident | awk '{print $5}')
fi
fi
echo $who
}
indexfail() {
BRANCH=$1
# Leave a cookie behind so that we know when the index is fixed
touch ${PORTSDIR}/broken.${BRANCH}
(
echo "INDEX build failed with errors:";
len=$(wc -l index.out | awk '{print $1}')
if [ "$len" -gt "40" ]; then
head -20 index.out
echo "[...]"
tail -20 index.out
else
cat index.out
fi
len=$(wc -l index.err | awk '{print $1}')
if [ "$len" -gt "40" ]; then
head -20 index.err
echo "[...]"
tail -20 index.err
else
cat index.err
fi
# Find out which committers are on the hook
commits=$(grep ^U ${PORTSDIR}/cvs.log | grep -v INDEX | awk '{print $2}')
for i in ${commits}; do
blame $i >> ${PORTSDIR}/hook
done
sort -u ${PORTSDIR}/hook > ${PORTSDIR}/hook.new
mv ${PORTSDIR}/hook.new ${PORTSDIR}/hook
echo
echo "Committers on the hook:"
tr -s '\n' ' ' < ${PORTSDIR}/hook
echo
echo
echo "Most recent CVS update was:";
grep -v '/work$' cvs.log | grep -v '^\?'
) | mail -s "INDEX build failed for ${BRANCH}" ${REPORT_ADDRESS}
exit 1
}
checkfixed() {
BRANCH=$1
# If the cookie exists that means that this is the first build for which the
# INDEX succeeded, so announce this.
if [ -e ${PORTSDIR}/broken.${BRANCH} ]; then
rm -f ${PORTSDIR}/broken.${BRANCH}
mail -s "INDEX now builds successfully on ${BRANCH}" ${REPORT_ADDRESS} < /dev/null
fi
}
# Sanitize the environment so that the indexes aren't customized by the
# local machine settinge
export __MAKE_CONF=/dev/null
export PORT_DBDIR=/nonexistent
export PKG_DBDIR=/nonexistent
# First update the source trees to get current OSVERSION
cd ${SRCDIR4}/sys/sys
cvs -Rq update -PdA -r RELENG_4 param.h
OSVERSION4=$(awk '/^#define __FreeBSD_version/ {print $3}' < ${SRCDIR4}/sys/sys/param.h)
cd ${SRCDIR5}/sys/sys
cvs -Rq update -PdA -r RELENG_5 param.h
OSVERSION5=$(awk '/^#define __FreeBSD_version/ {print $3}' < ${SRCDIR5}/sys/sys/param.h)
cd ${SRCDIR6}/sys/sys
cvs -Rq update -PdA param.h
OSVERSION6=$(awk '/^#define __FreeBSD_version/ {print $3}' < ${SRCDIR6}/sys/sys/param.h)
cd ${PORTSDIR}
rm -f INDEX INDEX.bz2 INDEX-5 INDEX-5.bz2 INDEX-6 INDEX-6.bz2
(cvs -Rq update -PdA 2>1 ) > cvs.log
if grep -q ^C cvs.log ; then
(echo "cvs update failed with conflicts:";
grep ^C cvs.log) | mail -s "Ports cvsup failed" ${PRIVATE_ADDRESS}
exit 1
fi
export INDEX_PRISTINE=1
export INDEX_JOBS=4
export INDEX_QUIET=1
export OSVERSION=${OSVERSION4}
BRANCH=4.x
echo "Building INDEX for ${BRANCH} with OSVERSION=${OSVERSION}"
cd ${PORTSDIR}
((make index 2> index.err) > index.out) || indexfail ${BRANCH}
if [ -s index.err ]; then
indexfail ${BRANCH}
fi
checkfixed ${BRANCH}
bzip2 -kf ${PORTSDIR}/INDEX
scp ${PORTSDIR}/INDEX ${PORTSDIR}/INDEX.bz2 ${SCP_DEST} || mail -s "Cannot copy INDEX" ${ERROR_ADDRESS} < /dev/null
BRANCH=5.x
export OSVERSION=${OSVERSION5}
echo "Building INDEX for ${BRANCH} with OSVERSION=${OSVERSION}"
cd ${PORTSDIR}
((make index 2> index.err) > index.out) || indexfail ${BRANCH}
if [ -s index.err ]; then
indexfail ${BRANCH}
fi
checkfixed ${BRANCH}
bzip2 -kf ${PORTSDIR}/INDEX-5
scp ${PORTSDIR}/INDEX-5 ${PORTSDIR}/INDEX-5.bz2 ${SCP_DEST} || mail -s "Cannot copy INDEX-5" ${ERROR_ADDRESS} < /dev/null
BRANCH=6.x
export OSVERSION=${OSVERSION6}
echo "Building INDEX for ${BRANCH} with OSVERSION=${OSVERSION}"
cd ${PORTSDIR}
((make index 2> index.err) > index.out) || indexfail ${BRANCH}
if [ -s index.err ]; then
indexfail ${BRANCH}
fi
checkfixed ${BRANCH}
bzip2 -kf ${PORTSDIR}/INDEX-6
scp ${PORTSDIR}/INDEX-6 ${PORTSDIR}/INDEX-6.bz2 ${SCP_DEST} || mail -s "Cannot copy INDEX-6" ${ERROR_ADDRESS} < /dev/null
# All indexes built successfully, clear the hook
rm -f ${PORTSDIR}/hook