checkflist revision 1.41
11.3Smikel#! /bin/sh --
21.3Smikel#
31.35Suebayasi#	$NetBSD: checkflist,v 1.41 2009/12/10 17:18:33 uebayasi 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.35Suebayasiwhile getopts xybL:M: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.35Suebayasi	y)
441.35Suebayasi		xargs="-y"
451.35Suebayasi		origin="./etc/ext ./usr/ext"
461.35Suebayasi		;;
471.35Suebayasi	# backward compat
481.24Slukem	b)
491.10Sperry		xargs="-b"
501.10Sperry		;;
511.35Suebayasi	L)
521.35Suebayasi		xargs="-L ${OPTARG}"
531.35Suebayasi		;;
541.24Slukem	M)
551.29Sapb		metalog="${OPTARG}"
561.15Slukem		;;
571.24Slukem	e)
581.22Slukem		allowextra=true
591.22Slukem		;;
601.24Slukem	m)
611.22Slukem		allowmissing=true
621.22Slukem		;;
631.24Slukem	*)
641.10Sperry		cat 1>&2 <<USAGE
651.35SuebayasiUsage: ${prog} [-x|-y|-b|-L lists] [-M metalog] [-e] [-m]
661.24Slukem	-x		check only x11 lists
671.35Suebayasi	-y		check only extsrc lists
681.24Slukem	-b		check netbsd + x11 lists
691.35Suebayasi	-L base,x,ext	check specified lists
701.15Slukem	-M metalog	metalog file
711.22Slukem	-e		extra files are not considered an error
721.22Slukem	-m		missing files are not considered an error
731.10SperryUSAGE
741.10Sperry		exit 1
751.10Sperry		;;
761.10Sperry	esac
771.10Sperrydone
781.24Slukemshift $((${OPTIND} - 1))
791.10Sperry
801.30Sapb#
811.30Sapb# Exceptions to flist checking (all begin with "./"):
821.30Sapb#
831.30Sapb# * ignore var/db/syspkg and its contents
841.34Sapb# * ignore METALOG and METALOG.*
851.30Sapb# * ignore etc/mtree/set.*
861.30Sapb#
871.36Suebayasiignore_exceptions()
881.36Suebayasi{
891.40SuebayasiIGNORE_REGEXP_SYSPKG="^\./var/db/syspkg(\$|/)"
901.40SuebayasiIGNORE_REGEXP_METALOG="^\./METALOG(\..*)?\$"
911.40SuebayasiIGNORE_REGEXP_MTREE="^\./etc/mtree/set\.[a-z]*\$"
921.40Suebayasi
931.40Suebayasi	${EGREP} -v \
941.40Suebayasi		-e "${IGNORE_REGEXP_SYSPKG}" \
951.40Suebayasi		-e "${IGNORE_REGEXP_METALOG}" \
961.40Suebayasi		-e "${IGNORE_REGEXP_MTREE}"
971.36Suebayasi}
981.15Slukem
991.30Sapb#
1001.30Sapb# Here would be a good place to add custom exceptions to flist checking.
1011.30Sapb#
1021.15Slukem
1031.30Sapb#
1041.30Sapb# Make three lists:
1051.30Sapb# * ${SDIR}/files: files present in DESTDIR.
1061.30Sapb# * ${SDIR}/flist: files mentioned in flist;
1071.30Sapb# * ${SDIR}/mlist: files mentioned in metalog;
1081.30Sapb#
1091.34Sapb# All three lists are filtered against ${IGNORE_REGEXP}.
1101.34Sapb#
1111.36Suebayasi
1121.36Suebayasigenerate_files()
1131.36Suebayasi{
1141.30Sapb( cd "${DESTDIR}" && ${FIND} ${origin} \
1151.30Sapb	\( -type d -o -type f -o -type l \) -print ) \
1161.36Suebayasi	| ${SORT} -u | ignore_exceptions >"${SDIR}/files"
1171.36Suebayasi}
1181.36Suebayasi
1191.36Suebayasigenerate_flist()
1201.36Suebayasi{
1211.30Sapb${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \
1221.36Suebayasi	| ${SORT} -u | ignore_exceptions >"${SDIR}/flist"
1231.36Suebayasi}
1241.36Suebayasi
1251.36Suebayasigenerate_mlist()
1261.36Suebayasi{
1271.30Sapbif [ -n "${metalog}" ]; then
1281.30Sapb	${AWK} '{print $1}' <"${metalog}" \
1291.36Suebayasi	| ${SORT} -u | ignore_exceptions >"${SDIR}/mlist"
1301.30Sapbfi
1311.36Suebayasi}
1321.36Suebayasi
1331.41Suebayasigenerate_mlist_missing()
1341.36Suebayasi{
1351.36Suebayasi	${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing"
1361.36Suebayasi}
1371.36Suebayasi
1381.41Suebayasigenerate_mlist_extra()
1391.36Suebayasi{
1401.36Suebayasi	${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra"
1411.36Suebayasi}
1421.36Suebayasi
1431.41Suebayasigenerate_files_missing()
1441.41Suebayasi{
1451.41Suebayasi	${COMM} -23 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/missing"
1461.41Suebayasi}
1471.41Suebayasi
1481.41Suebayasigenerate_files_extra()
1491.41Suebayasi{
1501.41Suebayasi	${COMM} -13 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/extra"
1511.41Suebayasi}
1521.41Suebayasi
1531.39Suebayasiexist_case_insensitive()
1541.39Suebayasi{
1551.39Suebayasi	while read f; do
1561.39Suebayasi		[ -f "${DESTDIR}/${f}" ] || \
1571.39Suebayasi		[ -d "${DESTDIR}/${f}" ] || \
1581.39Suebayasi		[ -L "${DESTDIR}/${f}" ] || \
1591.39Suebayasi		echo "$f"
1601.39Suebayasi	done
1611.39Suebayasi}
1621.39Suebayasi
1631.30Sapb#
1641.30Sapb# compare DESTDIR with METALOG, and report on differences.
1651.30Sapb#
1661.37Suebayasicompare_metalog()
1671.37Suebayasi{
1681.33Sdbj    # Handle case insensitive filesystems
1691.33Sdbj    mv -f "${SDIR}/extra" "${SDIR}/extra.all"
1701.39Suebayasi    exist_case_insensitive < "${SDIR}/extra.all" > "${SDIR}/extra"
1711.33Sdbj
1721.37Suebayasi    check_metalog_extra
1731.37Suebayasi    check_metalog_missing
1741.37Suebayasi}
1751.37Suebayasi
1761.37Suebayasicheck_metalog_extra()
1771.37Suebayasi{
1781.30Sapb    if [ -s "${SDIR}/extra" ]; then
1791.30Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
1801.30Sapb	echo ""
1811.30Sapb	echo "=======  ${count} extra files in METALOG  ========="
1821.30Sapb	echo "Files in METALOG but missing from DESTDIR."
1831.30Sapb	echo "File was deleted after installation ?"
1841.30Sapb	echo "------------------------------------------"
1851.30Sapb	cat "${SDIR}/extra"
1861.30Sapb	echo "=========  end of ${count} extra files  ==========="
1871.30Sapb	echo ""
1881.30Sapb	es=1 # this is fatal even if ${allowextra} is true
1891.30Sapb    fi
1901.37Suebayasi}
1911.30Sapb
1921.37Suebayasicheck_metalog_missing()
1931.37Suebayasi{
1941.30Sapb    if [ -s "${SDIR}/missing" ]; then
1951.30Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
1961.30Sapb	echo ""
1971.30Sapb	echo "======  ${count} missing files in METALOG  ========"
1981.30Sapb	echo "Files in DESTDIR but missing from METALOG."
1991.30Sapb	echo "File installed but not registered in METALOG ?"
2001.30Sapb	echo "------------------------------------------"
2011.30Sapb	cat "${SDIR}/missing"
2021.30Sapb	echo "========  end of ${count} missing files  =========="
2031.30Sapb	echo ""
2041.30Sapb	es=1 # this is fatal even if ${allowmissing} is true
2051.30Sapb    fi
2061.37Suebayasi}
2071.37Suebayasi
2081.30Sapb#
2091.30Sapb# compare flist with DESTDIR, and report on differences.
2101.30Sapb#
2111.37Suebayasicompare_destdir()
2121.37Suebayasi{
2131.33Sdbj# Handle case insensitive filesystems
2141.33Sdbjmv -f "${SDIR}/missing" "${SDIR}/missing.all"
2151.39Suebayasiexist_case_insensitive < "${SDIR}/missing.all" > "${SDIR}/missing"
2161.33Sdbj
2171.37Suebayasicheck_destdir_extra
2181.37Suebayasicheck_destdir_missing
2191.37Suebayasi}
2201.37Suebayasi
2211.37Suebayasicheck_destdir_extra()
2221.37Suebayasi{
2231.29Sapbif [ -s "${SDIR}/extra" ]; then
2241.29Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
2251.20Slukem	echo ""
2261.30Sapb	echo "=======  ${count} extra files in DESTDIR  ========="
2271.20Slukem	echo "Files in DESTDIR but missing from flist."
2281.20Slukem	echo "File is obsolete or flist is out of date ?"
2291.22Slukem	if ${allowextra}; then
2301.30Sapb		echo "This is non-fatal, due to '-e' option."
2311.22Slukem	else
2321.22Slukem		es=1
2331.22Slukem	fi
2341.20Slukem	echo "------------------------------------------"
2351.29Sapb	cat "${SDIR}/extra"
2361.25Slukem	echo "=========  end of ${count} extra files  ==========="
2371.20Slukem	echo ""
2381.20Slukemfi
2391.37Suebayasi}
2401.20Slukem
2411.37Suebayasicheck_destdir_missing()
2421.37Suebayasi{
2431.29Sapbif [ -s "${SDIR}/missing" ]; then
2441.29Sapb	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
2451.20Slukem	echo ""
2461.30Sapb	echo "======  ${count} missing files in DESTDIR  ========"
2471.20Slukem	echo "Files in flist but missing from DESTDIR."
2481.20Slukem	echo "File wasn't installed ?"
2491.22Slukem	if ${allowmissing}; then
2501.30Sapb		echo "This is non-fatal, due to '-m' option."
2511.22Slukem	else
2521.22Slukem		es=1
2531.22Slukem	fi
2541.20Slukem	echo "------------------------------------------"
2551.29Sapb	cat "${SDIR}/missing"
2561.25Slukem	echo "========  end of ${count} missing files  =========="
2571.20Slukem	echo ""
2581.15Slukemfi
2591.37Suebayasi}
2601.37Suebayasi
2611.38Suebayasigenerate_files
2621.38Suebayasigenerate_flist
2631.38Suebayasigenerate_mlist
2641.38Suebayasi
2651.39Suebayasiif false && [ -n "${metalog}" ]; then
2661.41Suebayasi	# XXX: Temporarily disabled due to problems with obsolete files in metalog
2671.41Suebayasi	generate_mlist_missing
2681.41Suebayasi	generate_mlist_extra
2691.39Suebayasi	compare_metalog
2701.41Suebayasielse
2711.41Suebayasi	generate_files_missing
2721.41Suebayasi	generate_files_extra
2731.41Suebayasi	compare_destdir
2741.39Suebayasifi
2751.20Slukem
2761.29Sapbexit 0		# cleanup will exit with ${es}
277