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