Home | History | Annotate | Line # | Download | only in sets
checkflist revision 1.33.28.1
      1        1.3  mikel #! /bin/sh --
      2        1.3  mikel #
      3  1.33.28.1    jym #	$NetBSD: checkflist,v 1.33.28.1 2009/05/13 19:17:50 jym Exp $
      4        1.3  mikel #
      5       1.30    apb # Verify output of makeflist against contents of ${DESTDIR} and ${metalog}.
      6        1.1    cgd 
      7       1.29    apb if [ -z "${DESTDIR}" ]; then
      8       1.15  lukem 	echo "DESTDIR must be set"
      9        1.1    cgd 	exit 1
     10       1.15  lukem fi
     11       1.15  lukem 
     12       1.29    apb prog="${0##*/}"
     13       1.27    apb rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/"
     14       1.27    apb . "${rundir}/sets.subr"
     15        1.1    cgd 
     16       1.29    apb SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")"
     17       1.20  lukem 
     18       1.20  lukem es=0
     19       1.20  lukem cleanup()
     20       1.20  lukem {
     21       1.29    apb 	/bin/rm -rf "${SDIR}"
     22       1.32    apb 	if [ ${es} -gt 255 ]; then
     23       1.20  lukem 		es=255
     24       1.20  lukem 	fi
     25       1.29    apb 	exit ${es}
     26       1.20  lukem }
     27       1.20  lukem trap cleanup 0 2 3 13		# EXIT INT QUIT PIPE
     28       1.20  lukem 
     29        1.9   ross origin=.
     30       1.10  perry xargs=""
     31       1.10  perry dargs=""
     32       1.15  lukem metalog=
     33       1.22  lukem allowextra=false
     34       1.22  lukem allowmissing=false
     35       1.10  perry 
     36       1.10  perry # handle args
     37       1.24  lukem while getopts xbM:em ch; do
     38       1.24  lukem 	case ${ch} in
     39       1.24  lukem 	x)
     40       1.10  perry 		xargs="-x"
     41       1.18   tron 		origin="./etc/X11 ./etc/fonts ./usr/X11R6"
     42       1.10  perry 		;;
     43       1.24  lukem 	b)
     44       1.10  perry 		xargs="-b"
     45       1.10  perry 		;;
     46       1.24  lukem 	M)
     47       1.29    apb 		metalog="${OPTARG}"
     48       1.15  lukem 		;;
     49       1.24  lukem 	e)
     50       1.22  lukem 		allowextra=true
     51       1.22  lukem 		;;
     52       1.24  lukem 	m)
     53       1.22  lukem 		allowmissing=true
     54       1.22  lukem 		;;
     55       1.24  lukem 	*)
     56       1.10  perry 		cat 1>&2 <<USAGE
     57       1.24  lukem Usage: ${prog} [-x|-b] [-M metalog] [-e] [-m]
     58       1.24  lukem 	-x		check only x11 lists
     59       1.24  lukem 	-b		check netbsd + x11 lists
     60       1.15  lukem 	-M metalog	metalog file
     61       1.22  lukem 	-e		extra files are not considered an error
     62       1.22  lukem 	-m		missing files are not considered an error
     63       1.10  perry USAGE
     64       1.10  perry 		exit 1
     65       1.10  perry 		;;
     66       1.10  perry 	esac
     67       1.10  perry done
     68       1.24  lukem shift $((${OPTIND} - 1))
     69       1.10  perry 
     70       1.30    apb #
     71       1.30    apb # Exceptions to flist checking (all begin with "./"):
     72       1.30    apb #
     73       1.30    apb # * ignore var/db/syspkg and its contents
     74  1.33.28.1    jym # * ignore METALOG and METALOG.*
     75       1.30    apb # * ignore etc/mtree/set.*
     76       1.30    apb #
     77       1.30    apb IGNORE_REGEXP="^\./var/db/syspkg(\$|/)"
     78  1.33.28.1    jym IGNORE_REGEXP="${IGNORE_REGEXP}|^\./METALOG(\..*)?\$"
     79  1.33.28.1    jym IGNORE_REGEXP="${IGNORE_REGEXP}|^\./etc/mtree/set\.[a-z]*\$"
     80       1.15  lukem 
     81       1.30    apb #
     82       1.30    apb # Here would be a good place to add custom exceptions to flist checking.
     83       1.30    apb #
     84       1.15  lukem 
     85       1.30    apb #
     86       1.30    apb # Make three lists:
     87       1.30    apb # * ${SDIR}/files: files present in DESTDIR.
     88       1.30    apb # * ${SDIR}/flist: files mentioned in flist;
     89       1.30    apb # * ${SDIR}/mlist: files mentioned in metalog;
     90       1.30    apb #
     91  1.33.28.1    jym # All three lists are filtered against ${IGNORE_REGEXP}.
     92  1.33.28.1    jym #
     93       1.30    apb ( cd "${DESTDIR}" && ${FIND} ${origin} \
     94       1.30    apb 	\( -type d -o -type f -o -type l \) -print ) \
     95       1.30    apb 	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/files"
     96       1.30    apb ${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \
     97       1.30    apb 	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/flist"
     98       1.30    apb if [ -n "${metalog}" ]; then
     99       1.30    apb 	${AWK} '{print $1}' <"${metalog}" \
    100       1.30    apb 	| ${SORT} -u | ${EGREP} -v -e "${IGNORE_REGEXP}" >"${SDIR}/mlist"
    101       1.30    apb fi
    102       1.10  perry 
    103       1.30    apb #
    104       1.30    apb # compare DESTDIR with METALOG, and report on differences.
    105       1.30    apb #
    106       1.31    apb # XXX: Temporarily disabled due to problems with obsolete files in metalog
    107       1.31    apb #
    108       1.31    apb if false && [ -n "${metalog}" ]; then
    109       1.30    apb     ${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing"
    110       1.30    apb     ${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra"
    111       1.15  lukem 
    112       1.33    dbj     # Handle case insensitive filesystems
    113       1.33    dbj     mv -f "${SDIR}/extra" "${SDIR}/extra.all"
    114       1.33    dbj     while read f; do
    115       1.33    dbj 	[ -f "${DESTDIR}/${f}" ] || \
    116       1.33    dbj 	    [ -d "${DESTDIR}/${f}" ] || \
    117       1.33    dbj 	    [ -L "${DESTDIR}/${f}" ] || echo "$f"
    118       1.33    dbj     done < "${SDIR}/extra.all" > "${SDIR}/extra"
    119       1.33    dbj 
    120       1.30    apb     if [ -s "${SDIR}/extra" ]; then
    121       1.30    apb 	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
    122       1.30    apb 	echo ""
    123       1.30    apb 	echo "=======  ${count} extra files in METALOG  ========="
    124       1.30    apb 	echo "Files in METALOG but missing from DESTDIR."
    125       1.30    apb 	echo "File was deleted after installation ?"
    126       1.30    apb 	echo "------------------------------------------"
    127       1.30    apb 	cat "${SDIR}/extra"
    128       1.30    apb 	echo "=========  end of ${count} extra files  ==========="
    129       1.30    apb 	echo ""
    130       1.30    apb 	es=1 # this is fatal even if ${allowextra} is true
    131       1.30    apb     fi
    132       1.30    apb 
    133       1.30    apb     if [ -s "${SDIR}/missing" ]; then
    134       1.30    apb 	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
    135       1.30    apb 	echo ""
    136       1.30    apb 	echo "======  ${count} missing files in METALOG  ========"
    137       1.30    apb 	echo "Files in DESTDIR but missing from METALOG."
    138       1.30    apb 	echo "File installed but not registered in METALOG ?"
    139       1.30    apb 	echo "------------------------------------------"
    140       1.30    apb 	cat "${SDIR}/missing"
    141       1.30    apb 	echo "========  end of ${count} missing files  =========="
    142       1.30    apb 	echo ""
    143       1.30    apb 	es=1 # this is fatal even if ${allowmissing} is true
    144       1.30    apb     fi
    145       1.30    apb fi
    146       1.30    apb 
    147       1.30    apb #
    148       1.30    apb # compare flist with DESTDIR, and report on differences.
    149       1.30    apb #
    150       1.30    apb ${COMM} -23 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/missing"
    151       1.30    apb ${COMM} -13 "${SDIR}/flist" "${SDIR}/files" > "${SDIR}/extra"
    152       1.15  lukem 
    153       1.33    dbj # Handle case insensitive filesystems
    154       1.33    dbj mv -f "${SDIR}/missing" "${SDIR}/missing.all"
    155       1.33    dbj while read f; do
    156       1.33    dbj     [ -f "${DESTDIR}/${f}" ] || \
    157       1.33    dbj 	[ -d "${DESTDIR}/${f}" ] || \
    158       1.33    dbj 	[ -L "${DESTDIR}/${f}" ] || echo "$f"
    159       1.33    dbj done < "${SDIR}/missing.all" > "${SDIR}/missing"
    160       1.33    dbj 
    161       1.29    apb if [ -s "${SDIR}/extra" ]; then
    162       1.29    apb 	count="$(${AWK} 'END {print NR}' "${SDIR}/extra")"
    163       1.20  lukem 	echo ""
    164       1.30    apb 	echo "=======  ${count} extra files in DESTDIR  ========="
    165       1.20  lukem 	echo "Files in DESTDIR but missing from flist."
    166       1.20  lukem 	echo "File is obsolete or flist is out of date ?"
    167       1.22  lukem 	if ${allowextra}; then
    168       1.30    apb 		echo "This is non-fatal, due to '-e' option."
    169       1.22  lukem 	else
    170       1.22  lukem 		es=1
    171       1.22  lukem 	fi
    172       1.20  lukem 	echo "------------------------------------------"
    173       1.29    apb 	cat "${SDIR}/extra"
    174       1.25  lukem 	echo "=========  end of ${count} extra files  ==========="
    175       1.20  lukem 	echo ""
    176       1.20  lukem fi
    177       1.20  lukem 
    178       1.29    apb if [ -s "${SDIR}/missing" ]; then
    179       1.29    apb 	count="$(${AWK} 'END {print NR}' "${SDIR}/missing")"
    180       1.20  lukem 	echo ""
    181       1.30    apb 	echo "======  ${count} missing files in DESTDIR  ========"
    182       1.20  lukem 	echo "Files in flist but missing from DESTDIR."
    183       1.20  lukem 	echo "File wasn't installed ?"
    184       1.22  lukem 	if ${allowmissing}; then
    185       1.30    apb 		echo "This is non-fatal, due to '-m' option."
    186       1.22  lukem 	else
    187       1.22  lukem 		es=1
    188       1.22  lukem 	fi
    189       1.20  lukem 	echo "------------------------------------------"
    190       1.29    apb 	cat "${SDIR}/missing"
    191       1.25  lukem 	echo "========  end of ${count} missing files  =========="
    192       1.20  lukem 	echo ""
    193       1.15  lukem fi
    194       1.20  lukem 
    195       1.29    apb exit 0		# cleanup will exit with ${es}
    196