checkflist revision 1.43
11.3Smikel#! /bin/sh --
21.3Smikel#
31.43Schristos#	$NetBSD: checkflist,v 1.43 2013/01/15 02:46:41 christos 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.42Suebayasi#
171.42Suebayasi# * ${SETS_DLIST}: files present in DESTDIR.
181.42Suebayasi# * ${SETS_FLIST}: files mentioned in flist;
191.42Suebayasi# * ${SETS_MLIST}: files mentioned in metalog;
201.42Suebayasi#
211.42SuebayasiSETS_DLIST="${DESTDIR}/SETS.dlist"
221.42SuebayasiSETS_FLIST="${DESTDIR}/SETS.flist"
231.42SuebayasiSETS_MLIST="${DESTDIR}/SETS.mlist"
241.42Suebayasi
251.42Suebayasi#
261.42Suebayasi# * ${SETS_METALOG_EXTRA}: Files in METALOG but missing from DESTDIR."
271.42Suebayasi# * ${SETS_METALOG_MISSING}: Files in DESTDIR but missing from METALOG."
281.42Suebayasi# * ${SETS_DESTDIR_EXTRA}: Files in DESTDIR but missing from setlist."
291.42Suebayasi# * ${SETS_DESTDIR_MISSING}: Files in setlist but missing from DESTDIR."
301.42Suebayasi#
311.42SuebayasiSETS_METALOG_EXTRA="${DESTDIR}/SETS.metalog.extra"
321.42SuebayasiSETS_METALOG_MISSING="${DESTDIR}/SETS.metalog.missing"
331.42SuebayasiSETS_DESTDIR_EXTRA="${DESTDIR}/SETS.destdir.extra"
341.42SuebayasiSETS_DESTDIR_MISSING="${DESTDIR}/SETS.destdir.missing"
351.20Slukem
361.20Slukemes=0
371.20Slukemcleanup()
381.20Slukem{
391.32Sapb	if [ ${es} -gt 255 ]; then
401.20Slukem		es=255
411.20Slukem	fi
421.29Sapb	exit ${es}
431.20Slukem}
441.20Slukemtrap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
451.20Slukem
461.9Srossorigin=.
471.10Sperryxargs=""
481.10Sperrydargs=""
491.15Slukemmetalog=
501.22Slukemallowextra=false
511.22Slukemallowmissing=false
521.10Sperry
531.10Sperry# handle args
541.35Suebayasiwhile getopts xybL:M:em ch; do
551.24Slukem	case ${ch} in
561.24Slukem	x)
571.10Sperry		xargs="-x"
581.18Stron		origin="./etc/X11 ./etc/fonts ./usr/X11R6"
591.10Sperry		;;
601.35Suebayasi	y)
611.35Suebayasi		xargs="-y"
621.35Suebayasi		origin="./etc/ext ./usr/ext"
631.35Suebayasi		;;
641.35Suebayasi	# backward compat
651.24Slukem	b)
661.10Sperry		xargs="-b"
671.10Sperry		;;
681.35Suebayasi	L)
691.35Suebayasi		xargs="-L ${OPTARG}"
701.35Suebayasi		;;
711.24Slukem	M)
721.29Sapb		metalog="${OPTARG}"
731.15Slukem		;;
741.24Slukem	e)
751.22Slukem		allowextra=true
761.22Slukem		;;
771.24Slukem	m)
781.22Slukem		allowmissing=true
791.22Slukem		;;
801.24Slukem	*)
811.10Sperry		cat 1>&2 <<USAGE
821.35SuebayasiUsage: ${prog} [-x|-y|-b|-L lists] [-M metalog] [-e] [-m]
831.24Slukem	-x		check only x11 lists
841.35Suebayasi	-y		check only extsrc lists
851.24Slukem	-b		check netbsd + x11 lists
861.35Suebayasi	-L base,x,ext	check specified lists
871.15Slukem	-M metalog	metalog file
881.22Slukem	-e		extra files are not considered an error
891.22Slukem	-m		missing files are not considered an error
901.10SperryUSAGE
911.10Sperry		exit 1
921.10Sperry		;;
931.10Sperry	esac
941.10Sperrydone
951.24Slukemshift $((${OPTIND} - 1))
961.10Sperry
971.30Sapb#
981.30Sapb# Exceptions to flist checking (all begin with "./"):
991.30Sapb#
1001.30Sapb# * ignore var/db/syspkg and its contents
1011.34Sapb# * ignore METALOG and METALOG.*
1021.30Sapb# * ignore etc/mtree/set.*
1031.30Sapb#
1041.36Suebayasiignore_exceptions()
1051.36Suebayasi{
1061.40SuebayasiIGNORE_REGEXP_SYSPKG="^\./var/db/syspkg(\$|/)"
1071.40SuebayasiIGNORE_REGEXP_METALOG="^\./METALOG(\..*)?\$"
1081.42SuebayasiIGNORE_REGEXP_SETS="^\./SETS\..*\$"
1091.40SuebayasiIGNORE_REGEXP_MTREE="^\./etc/mtree/set\.[a-z]*\$"
1101.40Suebayasi
1111.40Suebayasi	${EGREP} -v \
1121.40Suebayasi		-e "${IGNORE_REGEXP_SYSPKG}" \
1131.40Suebayasi		-e "${IGNORE_REGEXP_METALOG}" \
1141.42Suebayasi		-e "${IGNORE_REGEXP_SETS}" \
1151.40Suebayasi		-e "${IGNORE_REGEXP_MTREE}"
1161.36Suebayasi}
1171.15Slukem
1181.30Sapb#
1191.30Sapb# Here would be a good place to add custom exceptions to flist checking.
1201.30Sapb#
1211.15Slukem
1221.30Sapb#
1231.30Sapb# Make three lists:
1241.30Sapb#
1251.34Sapb# All three lists are filtered against ${IGNORE_REGEXP}.
1261.34Sapb#
1271.36Suebayasi
1281.42Suebayasigenerate_dlist()
1291.36Suebayasi{
1301.30Sapb( cd "${DESTDIR}" && ${FIND} ${origin} \
1311.30Sapb	\( -type d -o -type f -o -type l \) -print ) \
1321.42Suebayasi	| ${SORT} -u | ignore_exceptions >"${SETS_DLIST}"
1331.36Suebayasi}
1341.36Suebayasi
1351.36Suebayasigenerate_flist()
1361.36Suebayasi{
1371.30Sapb${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \
1381.42Suebayasi	| ${SORT} -u | ignore_exceptions >"${SETS_FLIST}"
1391.36Suebayasi}
1401.36Suebayasi
1411.36Suebayasigenerate_mlist()
1421.36Suebayasi{
1431.30Sapbif [ -n "${metalog}" ]; then
1441.30Sapb	${AWK} '{print $1}' <"${metalog}" \
1451.42Suebayasi	| ${SORT} -u | ignore_exceptions >"${SETS_MLIST}"
1461.43Schristoselse
1471.43Schristos	SETS_MLIST=/dev/null
1481.30Sapbfi
1491.36Suebayasi}
1501.36Suebayasi
1511.41Suebayasigenerate_mlist_missing()
1521.36Suebayasi{
1531.42Suebayasi	${COMM} -23 "${SETS_DLIST}" "${SETS_MLIST}" > "${SETS_METALOG_MISSING}"
1541.36Suebayasi}
1551.36Suebayasi
1561.41Suebayasigenerate_mlist_extra()
1571.36Suebayasi{
1581.42Suebayasi	${COMM} -13 "${SETS_DLIST}" "${SETS_MLIST}" > "${SETS_METALOG_EXTRA}"
1591.36Suebayasi}
1601.36Suebayasi
1611.42Suebayasigenerate_dlist_missing()
1621.41Suebayasi{
1631.42Suebayasi	${COMM} -23 "${SETS_FLIST}" "${SETS_DLIST}" > "${SETS_DESTDIR_MISSING}"
1641.41Suebayasi}
1651.41Suebayasi
1661.42Suebayasigenerate_dlist_extra()
1671.41Suebayasi{
1681.42Suebayasi	${COMM} -13 "${SETS_FLIST}" "${SETS_DLIST}" > "${SETS_DESTDIR_EXTRA}"
1691.41Suebayasi}
1701.41Suebayasi
1711.39Suebayasiexist_case_insensitive()
1721.39Suebayasi{
1731.39Suebayasi	while read f; do
1741.39Suebayasi		[ -f "${DESTDIR}/${f}" ] || \
1751.39Suebayasi		[ -d "${DESTDIR}/${f}" ] || \
1761.39Suebayasi		[ -L "${DESTDIR}/${f}" ] || \
1771.39Suebayasi		echo "$f"
1781.39Suebayasi	done
1791.39Suebayasi}
1801.39Suebayasi
1811.30Sapb#
1821.30Sapb# compare DESTDIR with METALOG, and report on differences.
1831.30Sapb#
1841.37Suebayasicompare_metalog()
1851.37Suebayasi{
1861.33Sdbj    # Handle case insensitive filesystems
1871.42Suebayasi    mv -f "${SETS_METALOG_EXTRA}" "${SETS_METALOG_EXTRA}.all"
1881.42Suebayasi    exist_case_insensitive < "${SETS_METALOG_EXTRA}.all" > "${SETS_METALOG_EXTRA}"
1891.42Suebayasi    rm -f "${SETS_METALOG_EXTRA}.all"
1901.33Sdbj
1911.37Suebayasi    check_metalog_extra
1921.37Suebayasi    check_metalog_missing
1931.37Suebayasi}
1941.37Suebayasi
1951.37Suebayasicheck_metalog_extra()
1961.37Suebayasi{
1971.42Suebayasi    if [ -s "${SETS_METALOG_EXTRA}" ]; then
1981.42Suebayasi	count="$(${AWK} 'END {print NR}' "${SETS_METALOG_EXTRA}")"
1991.30Sapb	echo ""
2001.30Sapb	echo "=======  ${count} extra files in METALOG  ========="
2011.30Sapb	echo "Files in METALOG but missing from DESTDIR."
2021.30Sapb	echo "File was deleted after installation ?"
2031.30Sapb	echo "------------------------------------------"
2041.42Suebayasi	cat "${SETS_METALOG_EXTRA}"
2051.30Sapb	echo "=========  end of ${count} extra files  ==========="
2061.30Sapb	echo ""
2071.30Sapb	es=1 # this is fatal even if ${allowextra} is true
2081.30Sapb    fi
2091.37Suebayasi}
2101.30Sapb
2111.37Suebayasicheck_metalog_missing()
2121.37Suebayasi{
2131.42Suebayasi    if [ -s "${SETS_METALOG_MISSING}" ]; then
2141.42Suebayasi	count="$(${AWK} 'END {print NR}' "${SETS_METALOG_MISSING}")"
2151.30Sapb	echo ""
2161.30Sapb	echo "======  ${count} missing files in METALOG  ========"
2171.30Sapb	echo "Files in DESTDIR but missing from METALOG."
2181.30Sapb	echo "File installed but not registered in METALOG ?"
2191.30Sapb	echo "------------------------------------------"
2201.42Suebayasi	cat "${SETS_METALOG_MISSING}"
2211.30Sapb	echo "========  end of ${count} missing files  =========="
2221.30Sapb	echo ""
2231.30Sapb	es=1 # this is fatal even if ${allowmissing} is true
2241.30Sapb    fi
2251.37Suebayasi}
2261.37Suebayasi
2271.30Sapb#
2281.30Sapb# compare flist with DESTDIR, and report on differences.
2291.30Sapb#
2301.37Suebayasicompare_destdir()
2311.37Suebayasi{
2321.33Sdbj# Handle case insensitive filesystems
2331.42Suebayasimv -f "${SETS_DESTDIR_MISSING}" "${SETS_DESTDIR_MISSING}.all"
2341.42Suebayasiexist_case_insensitive < "${SETS_DESTDIR_MISSING}.all" > "${SETS_DESTDIR_MISSING}"
2351.42Suebayasirm -f "${SETS_DESTDIR_MISSING}.all"
2361.33Sdbj
2371.37Suebayasicheck_destdir_extra
2381.37Suebayasicheck_destdir_missing
2391.37Suebayasi}
2401.37Suebayasi
2411.37Suebayasicheck_destdir_extra()
2421.37Suebayasi{
2431.42Suebayasiif [ -s "${SETS_DESTDIR_EXTRA}" ]; then
2441.42Suebayasi	count="$(${AWK} 'END {print NR}' "${SETS_DESTDIR_EXTRA}")"
2451.20Slukem	echo ""
2461.30Sapb	echo "=======  ${count} extra files in DESTDIR  ========="
2471.20Slukem	echo "Files in DESTDIR but missing from flist."
2481.20Slukem	echo "File is obsolete or flist is out of date ?"
2491.22Slukem	if ${allowextra}; then
2501.30Sapb		echo "This is non-fatal, due to '-e' option."
2511.22Slukem	else
2521.22Slukem		es=1
2531.22Slukem	fi
2541.20Slukem	echo "------------------------------------------"
2551.42Suebayasi	cat "${SETS_DESTDIR_EXTRA}"
2561.25Slukem	echo "=========  end of ${count} extra files  ==========="
2571.20Slukem	echo ""
2581.20Slukemfi
2591.37Suebayasi}
2601.20Slukem
2611.37Suebayasicheck_destdir_missing()
2621.37Suebayasi{
2631.42Suebayasiif [ -s "${SETS_DESTDIR_MISSING}" ]; then
2641.42Suebayasi	count="$(${AWK} 'END {print NR}' "${SETS_DESTDIR_MISSING}")"
2651.20Slukem	echo ""
2661.30Sapb	echo "======  ${count} missing files in DESTDIR  ========"
2671.20Slukem	echo "Files in flist but missing from DESTDIR."
2681.20Slukem	echo "File wasn't installed ?"
2691.22Slukem	if ${allowmissing}; then
2701.30Sapb		echo "This is non-fatal, due to '-m' option."
2711.22Slukem	else
2721.22Slukem		es=1
2731.22Slukem	fi
2741.20Slukem	echo "------------------------------------------"
2751.42Suebayasi	cat "${SETS_DESTDIR_MISSING}"
2761.25Slukem	echo "========  end of ${count} missing files  =========="
2771.20Slukem	echo ""
2781.15Slukemfi
2791.37Suebayasi}
2801.37Suebayasi
2811.42Suebayasigenerate_dlist
2821.38Suebayasigenerate_flist
2831.38Suebayasigenerate_mlist
2841.38Suebayasi
2851.42Suebayasigenerate_mlist_missing
2861.42Suebayasigenerate_mlist_extra
2871.42Suebayasi
2881.42Suebayasigenerate_dlist_missing
2891.42Suebayasigenerate_dlist_extra
2901.42Suebayasi
2911.39Suebayasiif false && [ -n "${metalog}" ]; then
2921.41Suebayasi	# XXX: Temporarily disabled due to problems with obsolete files in metalog
2931.39Suebayasi	compare_metalog
2941.41Suebayasielse
2951.41Suebayasi	compare_destdir
2961.39Suebayasifi
2971.20Slukem
2981.29Sapbexit 0		# cleanup will exit with ${es}
299