cookutils view modules/postcheck @ rev 1113

modules/postcheck: fix displaying the problems
author Aleksej Bobylev <al.bobylev@gmail.com>
date Wed Dec 05 17:04:10 2018 +0200 (2018-12-05)
parents 75961317d29b
children f77e48e58ac0
line source
1 #!/bin/sh
2 #
3 # postcheck - module of the SliTaz Cook
4 # Copyright (C) SliTaz GNU/Linux - GNU GPL v3
5 #
6 # Check for different cases at the end and add badges
8 . /usr/lib/slitaz/libcook.sh
9 . /etc/slitaz/cook.conf
10 . $WOK/$1/receipt
12 data="$(mktemp -d)" # temporary data for post-checking
14 repologydb="$CACHE/repology.db"
16 badges="$WOK/$1/.badges"
17 echo -n > $badges # clean badges
19 overrides="$WOK/$1/stuff/overrides"
20 overrides_exp="$data/overrides_exp"
21 fail="$data/fail" # file used as flag, if will be empty if no fails were found
23 sets=$(echo -n $SPLIT | awk 'BEGIN { RS = " "; FS = ":"; }
24 { if ($2 && ! set[$2]) { printf("%s ", $2); set[$2] = "1"; } }')
26 # Format of stuff/overrides:
27 # <rule> {<rule> ...} <fil[e]*>
28 # One or more rules may indicate:
29 # - ownership in form '80:80' (numeric UID:GID) or 'www:www' (string UID:GID)
30 # - permissions in form '0600' (four octal digits)
31 # File is space free string specified one (or more - using placeholders) files
34 # Expand overrides to the simple form: <rule><tab><file>
36 if [ -e "$overrides" ]; then
37 IFS=$'\n'
38 while read line; do
39 rules=${line% *}; file=${line##* }
41 for set in '' $sets; do
42 install="$WOK/$1/install"
43 [ -z "$set" ] || install="$install-$set"
44 [ -d "$install" ] || continue
45 for file in $(ls -d $install$file); do
46 for rule in $rules; do
47 echo "$rule ${file#$install}" >> $overrides_exp
48 done
49 done
50 done
51 done < $overrides
52 unset IFS
53 fi
56 # Get latest packaged version from Repology
58 repology_get() {
59 local found versions day=$(date +%j) # %j is the number of the day in the year
60 found=$(awk -F$'\t' -vpkg="$1" -vday="$day" '{
61 if ($1 == pkg && $2 == day) { print $3; exit; }
62 }' $repologydb)
63 if [ -n "$found" ]; then
64 echo "$found"
65 else
66 # set HOST_WGET in cook.conf
67 versions=$($HOST_WGET -q -T 20 -O- https://repology.org/badge/latest-versions/$1.svg \
68 | sed '/<text /!d; /fill/d; /latest/d; s|.*>\(.*\)<.*|\1|; s|, | |g') # space separated list
69 if [ -n "$versions" ]; then
70 sed -i "/^$1 /d" $repologydb
71 echo -e "$1\t$day\t$versions" >> $repologydb
72 echo $versions
73 fi
74 fi
75 }
78 # Add the specified badge, set the fail flag and return false status
80 function add() {
81 ! grep -q "^${1}$" $badges && echo "$1" >> $badges
82 case $1 in
83 ss|old|win|patch|ownover|permover) return 0;;
84 *) echo 'yes' > $fail; false;;
85 esac
86 }
89 function docheck() {
90 action 'Checking build...'
91 if grep -q "^$PACKAGE$" $broken; then
92 if grep -q '^ERROR: unknown dep' $LOGS/$1.log; then
93 add 'bdbroken'
94 else
95 add 'broken'
96 fi
97 status; return # no more tests since package is broken
98 fi
99 status
102 if [ -e $WOK/$1/.arch ]; then
103 action "Checking 'any' arch..."
104 if [ "$(cut -d$'\t' -f2 $WOK/$1/.arch | sort -u)" == 'any' ]; then
105 if [ "$HOST_ARCH" != 'any' ]; then
106 add 'any'
107 fi
108 else
109 if [ "$HOST_ARCH" == 'any' ]; then
110 add 'noany'
111 fi
112 fi
113 status
114 fi
117 if [ -e $WOK/$1/.patch.done ]; then
118 # consider 'fix libtool' as no patch here
119 if [ -n "$(grep -v 'fix.libtool' $WOK/$1/.patch.done)" ]; then
120 add 'patch'
121 fi
122 fi
125 for set in '' $sets; do
126 src=$WOK/$1/source/$PACKAGE-$VERSION
127 [ -z "$set" ] || src="$src-$set"
128 [ -d "$src" ] || continue
130 action "Checking libtool in ${src#$WOK/$1/}..."
131 if [ -e "$src/libtool" ]; then
132 if ! grep -q '^fix.libtool$' $WOK/$1/.patch.done 2>/dev/null; then
133 add 'libtool'
134 fi
135 else
136 if grep -q '^fix.libtool$' $WOK/$1/.patch.done 2>/dev/null; then
137 add 'nolibtool'
138 fi
139 fi
140 status
142 action "Checking site script in ${src#$WOK/$1/}..."
143 if fgrep -q 'configure: loading site script /etc/slitaz/cook.site' $LOGS/$PACKAGE.log; then
144 for i in bindir datadir datarootdir docdir dvidir htmldir includedir infodir libdir \
145 libexecdir localedir localstatedir mandir oldincludedir pdfdir psdir sbindir \
146 sharedstatedir sysconfdir; do
147 if fgrep -q -e "--$i=" $WOK/$1/receipt; then
148 add 'ss'
149 break
150 fi
151 done
152 fi
153 status
154 done
157 for set in '' $sets; do
158 install="$WOK/$1/install"
159 [ -z "$set" ] || install="$install-$set"
160 [ -d "$install" ] || continue
162 action "Checking ownership in ${install#$WOK/$1/}..."
164 IFS=$'\n'
165 bad_own="$(find $install -type f \( ! -user 0 -a ! -group 0 \))"
166 list=$(mktemp)
167 if [ -n "$bad_own" ]; then
168 if [ -e $overrides_exp ]; then
169 # There may be mix of overridden and not-overridden ownership
170 # in the package. Return status 'Done' only if all the ownership
171 # was overridden.
172 result=''
173 for i in $bad_own; do
174 if fgrep -q "$(stat -c %u:%g "$i") ${i#$install}" $overrides_exp ||
175 fgrep -q "$(stat -c %U:%G "$i") ${i#$install}" $overrides_exp; then
176 add 'ownover'
177 else
178 add 'own'
179 printf " %s:%s %s\n" "$(stat -c %u:%g "$i")" "${i#$install}" >>$list
180 result='bad'
181 fi
182 done
183 [ "$result" == '' ] # OK, all was overridden
184 else
185 for i in $bad_own; do
186 printf " %s:%s %s\n" "$(stat -c %u:%g "$i")" "${i#$install}" >>$list
187 done
188 add 'own'
189 fi
190 fi
191 status
192 unset IFS
193 if [ -s "$list" ]; then
194 echo " Problems found:"
195 sort -k2 $list
196 fi
197 rm $list
200 action "Checking permissions in ${install#$WOK/$1/}..."
202 IFS=$'\n'
203 bad_files="$(find $install -type f \( ! -perm 644 -a ! -perm 755 \))"
204 bad_dirs="$(find $install -type d ! -perm 755)"
205 list=$(mktemp)
206 if [ -n "$bad_files$bad_dirs" ]; then
207 if [ -e $overrides_exp ]; then
208 # There may be mix of overridden and not-overridden permissions
209 # in the package. Return status 'Done' only if all the permissions
210 # was overridden.
211 result=''
212 for i in $bad_files; do
213 if fgrep -q "$(printf "%04d\t%s" "$(stat -c%a "$i")" "${i#$install}")" $overrides_exp; then
214 add 'permover'
215 else
216 add 'perm'
217 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}" >>$list
218 result='bad'
219 fi
220 done
221 for i in $bad_dirs; do
222 if fgrep -q "$(printf "%04d" $(stat -c %a "$i")) ${i#$install}/" $overrides_exp; then
223 add 'permover'
224 else
225 add 'perm'
226 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}/" >>$list
227 result='bad'
228 fi
229 done
230 [ "$result" == '' ] # OK, all was overridden
231 else
232 for i in $bad_files; do
233 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}" >>$list
234 done
235 for i in $bad_dirs; do
236 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}/" >>$list
237 done
238 add 'perm'
239 fi
240 fi
241 status
242 unset IFS
243 if [ -s "$list" ]; then
244 echo " Problems found:"
245 sort -k2 $list
246 fi
247 rm $list
249 action "Checking broken symlinks in ${install#$WOK/$1/}..."
251 IFS=$'\n'
252 bad_sl="$(find $install -type l ! -exec test -e '{}' \; -print)"
253 result=''
254 if [ -n "$bad_sl" ]; then
255 add 'symlink'
256 result='bad'
257 fi
258 [ "$result" == '' ]; status
260 if [ "$result" == 'bad' ]; then
261 echo " Problems found:"
262 for i in $bad_sl; do
263 stat -c ' %N'
264 done
265 fi
266 unset IFS
267 done
269 if [ "$REPOLOGY" != '-' ]; then
270 action 'Querying Repology...'
271 repo_ver=$(repology_get ${REPOLOGY:-$PACKAGE})
272 if [ "$repo_ver" != '-' -a ! -s $fail ]; then
273 if echo " $repo_ver " | fgrep -q " $VERSION "; then
274 add 'win'
275 else
276 add 'old'
277 fi
278 fi
279 status
280 fi
281 }
284 title 'Post-check'
285 docheck $1
288 # Put badges into activity log: <a href='...' data-badges='...'>...</a>
290 action 'Updating activity log...'
291 badges_log=$(tr '\n' ' ' <$badges | sed 's| $||')
292 sed -i "s|>$1</a>$| data-badges='$badges_log'&|" $activity
293 status
295 footer
297 rm -r $data # clean