checkflist revision 1.38
1#! /bin/sh -- 2# 3# $NetBSD: checkflist,v 1.38 2009/12/10 16:12:00 uebayasi Exp $ 4# 5# Verify output of makeflist against contents of ${DESTDIR} and ${metalog}. 6 7if [ -z "${DESTDIR}" ]; then 8 echo "DESTDIR must be set" 9 exit 1 10fi 11 12prog="${0##*/}" 13rundir="$(dirname "$0")" # ${0%/*} isn't good enough when there's no "/" 14. "${rundir}/sets.subr" 15 16SDIR="$(${MKTEMP} -d "/tmp/${prog}.XXXXXX")" 17 18es=0 19cleanup() 20{ 21 /bin/rm -rf "${SDIR}" 22 if [ ${es} -gt 255 ]; then 23 es=255 24 fi 25 exit ${es} 26} 27trap cleanup 0 2 3 13 # EXIT INT QUIT PIPE 28 29origin=. 30xargs="" 31dargs="" 32metalog= 33allowextra=false 34allowmissing=false 35 36# handle args 37while getopts xybL:M:em ch; do 38 case ${ch} in 39 x) 40 xargs="-x" 41 origin="./etc/X11 ./etc/fonts ./usr/X11R6" 42 ;; 43 y) 44 xargs="-y" 45 origin="./etc/ext ./usr/ext" 46 ;; 47 # backward compat 48 b) 49 xargs="-b" 50 ;; 51 L) 52 xargs="-L ${OPTARG}" 53 ;; 54 M) 55 metalog="${OPTARG}" 56 ;; 57 e) 58 allowextra=true 59 ;; 60 m) 61 allowmissing=true 62 ;; 63 *) 64 cat 1>&2 <<USAGE 65Usage: ${prog} [-x|-y|-b|-L lists] [-M metalog] [-e] [-m] 66 -x check only x11 lists 67 -y check only extsrc lists 68 -b check netbsd + x11 lists 69 -L base,x,ext check specified lists 70 -M metalog metalog file 71 -e extra files are not considered an error 72 -m missing files are not considered an error 73USAGE 74 exit 1 75 ;; 76 esac 77done 78shift $((${OPTIND} - 1)) 79 80# 81# Exceptions to flist checking (all begin with "./"): 82# 83# * ignore var/db/syspkg and its contents 84# * ignore METALOG and METALOG.* 85# * ignore etc/mtree/set.* 86# 87ignore_exceptions() 88{ 89IGNORE_REGEXP="^\./var/db/syspkg(\$|/)" 90IGNORE_REGEXP="${IGNORE_REGEXP}|^\./METALOG(\..*)?\$" 91IGNORE_REGEXP="${IGNORE_REGEXP}|^\./etc/mtree/set\.[a-z]*\$" 92 ${EGREP} -v -e "${IGNORE_REGEXP}" 93} 94 95# 96# Here would be a good place to add custom exceptions to flist checking. 97# 98 99# 100# Make three lists: 101# * ${SDIR}/files: files present in DESTDIR. 102# * ${SDIR}/flist: files mentioned in flist; 103# * ${SDIR}/mlist: files mentioned in metalog; 104# 105# All three lists are filtered against ${IGNORE_REGEXP}. 106# 107 108generate_files() 109{ 110( cd "${DESTDIR}" && ${FIND} ${origin} \ 111 \( -type d -o -type f -o -type l \) -print ) \ 112 | ${SORT} -u | ignore_exceptions >"${SDIR}/files" 113} 114 115generate_flist() 116{ 117${HOST_SH} "${rundir}/makeflist" ${xargs} ${dargs} \ 118 | ${SORT} -u | ignore_exceptions >"${SDIR}/flist" 119} 120 121generate_mlist() 122{ 123if [ -n "${metalog}" ]; then 124 ${AWK} '{print $1}' <"${metalog}" \ 125 | ${SORT} -u | ignore_exceptions >"${SDIR}/mlist" 126fi 127} 128 129generate_missing() 130{ 131 ${COMM} -23 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/missing" 132} 133 134generate_extra() 135{ 136 ${COMM} -13 "${SDIR}/files" "${SDIR}/mlist" > "${SDIR}/extra" 137} 138 139# 140# compare DESTDIR with METALOG, and report on differences. 141# 142# XXX: Temporarily disabled due to problems with obsolete files in metalog 143# 144compare_metalog() 145{ 146 # Handle case insensitive filesystems 147 mv -f "${SDIR}/extra" "${SDIR}/extra.all" 148 while read f; do 149 [ -f "${DESTDIR}/${f}" ] || \ 150 [ -d "${DESTDIR}/${f}" ] || \ 151 [ -L "${DESTDIR}/${f}" ] || echo "$f" 152 done < "${SDIR}/extra.all" > "${SDIR}/extra" 153 154 check_metalog_extra 155 check_metalog_missing 156} 157 158check_metalog_extra() 159{ 160 if [ -s "${SDIR}/extra" ]; then 161 count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 162 echo "" 163 echo "======= ${count} extra files in METALOG =========" 164 echo "Files in METALOG but missing from DESTDIR." 165 echo "File was deleted after installation ?" 166 echo "------------------------------------------" 167 cat "${SDIR}/extra" 168 echo "========= end of ${count} extra files ===========" 169 echo "" 170 es=1 # this is fatal even if ${allowextra} is true 171 fi 172} 173 174check_metalog_missing() 175{ 176 if [ -s "${SDIR}/missing" ]; then 177 count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 178 echo "" 179 echo "====== ${count} missing files in METALOG ========" 180 echo "Files in DESTDIR but missing from METALOG." 181 echo "File installed but not registered in METALOG ?" 182 echo "------------------------------------------" 183 cat "${SDIR}/missing" 184 echo "======== end of ${count} missing files ==========" 185 echo "" 186 es=1 # this is fatal even if ${allowmissing} is true 187 fi 188} 189 190if false && [ -n "${metalog}" ]; then 191 compare_metalog 192fi 193 194# 195# compare flist with DESTDIR, and report on differences. 196# 197compare_destdir() 198{ 199# Handle case insensitive filesystems 200mv -f "${SDIR}/missing" "${SDIR}/missing.all" 201while read f; do 202 [ -f "${DESTDIR}/${f}" ] || \ 203 [ -d "${DESTDIR}/${f}" ] || \ 204 [ -L "${DESTDIR}/${f}" ] || echo "$f" 205done < "${SDIR}/missing.all" > "${SDIR}/missing" 206 207check_destdir_extra 208check_destdir_missing 209} 210 211check_destdir_extra() 212{ 213if [ -s "${SDIR}/extra" ]; then 214 count="$(${AWK} 'END {print NR}' "${SDIR}/extra")" 215 echo "" 216 echo "======= ${count} extra files in DESTDIR =========" 217 echo "Files in DESTDIR but missing from flist." 218 echo "File is obsolete or flist is out of date ?" 219 if ${allowextra}; then 220 echo "This is non-fatal, due to '-e' option." 221 else 222 es=1 223 fi 224 echo "------------------------------------------" 225 cat "${SDIR}/extra" 226 echo "========= end of ${count} extra files ===========" 227 echo "" 228fi 229} 230 231check_destdir_missing() 232{ 233if [ -s "${SDIR}/missing" ]; then 234 count="$(${AWK} 'END {print NR}' "${SDIR}/missing")" 235 echo "" 236 echo "====== ${count} missing files in DESTDIR ========" 237 echo "Files in flist but missing from DESTDIR." 238 echo "File wasn't installed ?" 239 if ${allowmissing}; then 240 echo "This is non-fatal, due to '-m' option." 241 else 242 es=1 243 fi 244 echo "------------------------------------------" 245 cat "${SDIR}/missing" 246 echo "======== end of ${count} missing files ==========" 247 echo "" 248fi 249} 250 251generate_files 252generate_flist 253generate_mlist 254generate_missing 255generate_extra 256 257compare_destdir 258 259exit 0 # cleanup will exit with ${es} 260