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