checkflist revision 1.34
11.3Smikel#! /bin/sh --
21.3Smikel#
31.34Sapb#	$NetBSD: checkflist,v 1.34 2009/04/23 09:30:56 apb Exp $
41.3Smikel#
51.30Sapb# Verify output of makeflist against contents of ${DESTDIR} and ${metalog}.
61.1Scgd
71.29Sapbif [ -z "${DESTDIR}" ]; then
81.15Slukem	echo "DESTDIR must be set"
91.1Scgd	exit 1
101.15Slukemfi
111.15Slukem
121.29Sapbprog="${0##*/}"
131.27Sapbrundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
141.27Sapb. "${rundir}/sets.subr"
151.1Scgd
161.29SapbSDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
171.20Slukem
181.20Slukemes=0
191.20Slukemcleanup()
201.20Slukem{
211.29Sapb	/bin/rm -rf "${SDIR}"
221.32Sapb	if [ ${es} -gt 255 ]; then
231.20Slukem		es=255
241.20Slukem	fi
251.29Sapb	exit ${es}
261.20Slukem}
271.20Slukemtrap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
281.20Slukem
291.9Srossorigin=.
301.10Sperryxargs=""
311.10Sperrydargs=""
321.15Slukemmetalog=
331.22Slukemallowextra=false
341.22Slukemallowmissing=false
351.10Sperry
361.10Sperry# handle args
371.24Slukemwhile getopts xbM:em ch; do
381.24Slukem	case ${ch} in
391.24Slukem	x)
401.10Sperry		xargs="-x"
411.18Stron		origin="./etc/X11 ./etc/fonts ./usr/X11R6"
421.10Sperry		;;
431.24Slukem	b)
441.10Sperry		xargs="-b"
451.10Sperry		;;
461.24Slukem	M)
471.29Sapb		metalog="${OPTARG}"
481.15Slukem		;;
491.24Slukem	e)
501.22Slukem		allowextra=true
511.22Slukem		;;
521.24Slukem	m)
531.22Slukem		allowmissing=true
541.22Slukem		;;
551.24Slukem	*)
561.10Sperry		cat 1>&2 <<USAGE
571.24SlukemUsage: ${prog} [-x|-b] [-M metalog] [-e] [-m]
581.24Slukem	-x		check only x11 lists
591.24Slukem	-b		check netbsd + x11 lists
601.15Slukem	-M metalog	metalog file
611.22Slukem	-e		extra files are not considered an error
621.22Slukem	-m		missing files are not considered an error
631.10SperryUSAGE
641.10Sperry		exit 1
651.10Sperry		;;
661.10Sperry	esac
671.10Sperrydone
681.24Slukemshift $((${OPTIND} - 1))
691.10Sperry
701.30Sapb#
711.30Sapb# Exceptions to flist checking (all begin with "./"):
721.30Sapb#
731.30Sapb# * ignore var/db/syspkg and its contents
741.34Sapb# * ignore METALOG and METALOG.*
751.30Sapb# * ignore etc/mtree/set.*
761.30Sapb#
771.30SapbIGNORE_REGEXP="^\./var/db/syspkg(\$|/)"
781.34SapbIGNORE_REGEXP="${IGNORE_REGEXP}|^\./METALOG(\..*)?\$"
791.34SapbIGNORE_REGEXP="${IGNORE_REGEXP}|^\./etc/mtree/set\.[a-z]*\$"
801.15Slukem
811.30Sapb#
821.30Sapb# Here would be a good place to add custom exceptions to flist checking.
831.30Sapb#
841.15Slukem
851.30Sapb#
861.30Sapb# Make three lists:
871.30Sapb# * ${SDIR}/files: files present in DESTDIR.
881.30Sapb# * ${SDIR}/flist: files mentioned in flist;
891.30Sapb# * ${SDIR}/mlist: files mentioned in metalog;
901.30Sapb#
911.34Sapb# All three lists are filtered against ${IGNORE_REGEXP}.
921.34Sapb#
931.30Sapb( cd "${DESTDIR}" && ${FIND} ${origin} \
941.30Sapb	\( -type d -o -type f -o -type l \) -print ) \
951.30Sapb	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/files"
961.30Sapb${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \
971.30Sapb	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/flist"
981.30Sapbif [ -n "${metalog}" ]; then
991.30Sapb	${AWK} '{print $1}' <"${metalog}" \
1001.30Sapb	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/mlist"
1011.30Sapbfi
1021.10Sperry
1031.30Sapb#
1041.30Sapb# compare DESTDIR with METALOG, and report on differences.
1051.30Sapb#
1061.31Sapb# XXX: Temporarily disabled due to problems with obsolete files in metalog
1071.31Sapb#
1081.31Sapbif false && [ -n "${metalog}" ]; then
1091.30Sapb    ${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing"
1101.30Sapb    ${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra"
1111.15Slukem
1121.33Sdbj    # Handle case insensitive filesystems
1131.33Sdbj    mv -f "${SDIR}/extra" "${SDIR}/extra.all"
1141.33Sdbj    while read f; do
1151.33Sdbj	[ -f "${DESTDIR}/${f}" ] || \
1161.33Sdbj	    [ -d "${DESTDIR}/${f}" ] || \
1171.33Sdbj	    [ -L "${DESTDIR}/${f}" ] || echo "$f"
1181.33Sdbj    done < "${SDIR}/extra.all" > "${SDIR}/extra"
1191.33Sdbj
1201.30Sapb    if [ -s "${SDIR}/extra" ]; then
1211.30Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
1221.30Sapb	echo ""
1231.30Sapb	echo "=======  ${count} extra files in METALOG  ========="
1241.30Sapb	echo "Files in METALOG but missing from DESTDIR."
1251.30Sapb	echo "File was deleted after installation ?"
1261.30Sapb	echo "------------------------------------------"
1271.30Sapb	cat "${SDIR}/extra"
1281.30Sapb	echo "=========  end of ${count} extra files  ==========="
1291.30Sapb	echo ""
1301.30Sapb	es=1 # this is fatal even if ${allowextra} is true
1311.30Sapb    fi
1321.30Sapb
1331.30Sapb    if [ -s "${SDIR}/missing" ]; then
1341.30Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
1351.30Sapb	echo ""
1361.30Sapb	echo "======  ${count} missing files in METALOG  ========"
1371.30Sapb	echo "Files in DESTDIR but missing from METALOG."
1381.30Sapb	echo "File installed but not registered in METALOG ?"
1391.30Sapb	echo "------------------------------------------"
1401.30Sapb	cat "${SDIR}/missing"
1411.30Sapb	echo "========  end of ${count} missing files  =========="
1421.30Sapb	echo ""
1431.30Sapb	es=1 # this is fatal even if ${allowmissing} is true
1441.30Sapb    fi
1451.30Sapbfi
1461.30Sapb
1471.30Sapb#
1481.30Sapb# compare flist with DESTDIR, and report on differences.
1491.30Sapb#
1501.30Sapb${COMM} -23 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/missing"
1511.30Sapb${COMM} -13 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/extra"
1521.15Slukem
1531.33Sdbj# Handle case insensitive filesystems
1541.33Sdbjmv -f "${SDIR}/missing" "${SDIR}/missing.all"
1551.33Sdbjwhile read f; do
1561.33Sdbj    [ -f "${DESTDIR}/${f}" ] || \
1571.33Sdbj	[ -d "${DESTDIR}/${f}" ] || \
1581.33Sdbj	[ -L "${DESTDIR}/${f}" ] || echo "$f"
1591.33Sdbjdone < "${SDIR}/missing.all" > "${SDIR}/missing"
1601.33Sdbj
1611.29Sapbif [ -s "${SDIR}/extra" ]; then
1621.29Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
1631.20Slukem	echo ""
1641.30Sapb	echo "=======  ${count} extra files in DESTDIR  ========="
1651.20Slukem	echo "Files in DESTDIR but missing from flist."
1661.20Slukem	echo "File is obsolete or flist is out of date ?"
1671.22Slukem	if ${allowextra}; then
1681.30Sapb		echo "This is non-fatal, due to '-e' option."
1691.22Slukem	else
1701.22Slukem		es=1
1711.22Slukem	fi
1721.20Slukem	echo "------------------------------------------"
1731.29Sapb	cat "${SDIR}/extra"
1741.25Slukem	echo "=========  end of ${count} extra files  ==========="
1751.20Slukem	echo ""
1761.20Slukemfi
1771.20Slukem
1781.29Sapbif [ -s "${SDIR}/missing" ]; then
1791.29Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
1801.20Slukem	echo ""
1811.30Sapb	echo "======  ${count} missing files in DESTDIR  ========"
1821.20Slukem	echo "Files in flist but missing from DESTDIR."
1831.20Slukem	echo "File wasn't installed ?"
1841.22Slukem	if ${allowmissing}; then
1851.30Sapb		echo "This is non-fatal, due to '-m' option."
1861.22Slukem	else
1871.22Slukem		es=1
1881.22Slukem	fi
1891.20Slukem	echo "------------------------------------------"
1901.29Sapb	cat "${SDIR}/missing"
1911.25Slukem	echo "========  end of ${count} missing files  =========="
1921.20Slukem	echo ""
1931.15Slukemfi
1941.20Slukem
1951.29Sapbexit 0		# cleanup will exit with ${es}
196