cookutils view modules/postcheck @ rev 1142

modules/postcheck: repology_get(): fix versions fetching
Still using regexps to parse XML, I understand it's bad but no external tools required.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Aug 22 23:54:42 2019 +0300 (2019-08-22)
parents 0385051c3996
children
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 badges_global="$CACHE/badges"; touch $badges_global
21 overrides="$WOK/$1/stuff/overrides"
22 overrides_exp="$data/overrides_exp"
23 fail="$data/fail" # file used as flag, if will be empty if no fails were found
25 sets=$(echo -n $SPLIT | awk 'BEGIN { RS = " "; FS = ":"; }
26 { if ($2 && ! set[$2]) { printf("%s ", $2); set[$2] = "1"; } }')
28 # Format of stuff/overrides:
29 # <rule> {<rule> ...} <fil[e]*>
30 # One or more rules may indicate:
31 # - ownership in form '80:80' (numeric UID:GID) or 'www:www' (string UID:GID)
32 # - permissions in form '0600' (four octal digits)
33 # File is space free string specified one (or more - using placeholders) files
36 # Expand overrides to the simple form: <rule><tab><file>
38 if [ -e "$overrides" ]; then
39 IFS=$'\n'
40 while read line; do
41 rules=${line% *}; file=${line##* }
43 for set in '' $sets; do
44 install="$WOK/$1/install"
45 [ -z "$set" ] || install="$install-$set"
46 [ -d "$install" ] || continue
47 for file in $(ls -d $install$file); do
48 for rule in $rules; do
49 echo "$rule ${file#$install}" >> $overrides_exp
50 done
51 done
52 done
53 done < $overrides
54 unset IFS
55 fi
58 # Get latest packaged version from Repology
60 repology_get() {
61 local found versions day=$(date +%j) # %j is the number of the day in the year
62 found=$(awk -F$'\t' -vpkg="$1" -vday="$day" '{
63 if ($1 == pkg && $2 == day) { print $3; exit; }
64 }' $repologydb)
65 if [ -n "$found" ]; then
66 echo "$found"
67 else
68 # set HOST_WGET in cook.conf
69 versions=$($HOST_WGET -q -T 20 -O- https://repology.org/badge/latest-versions/$1.svg \
70 | sed 's|<text |\n&|g; s|</text>|&\n|g' \
71 | sed '/<text /!d; /fill/d; /latest/d; s|.*>\(.*\)<.*|\1|; s|, | |g') # space separated list
72 if [ -n "$versions" ]; then
73 sed -i "/^$1 /d" $repologydb
74 echo -e "$1\t$day\t$versions" >> $repologydb
75 echo $versions
76 fi
77 fi
78 }
81 # Add the specified badge, set the fail flag and return false status
83 function add() {
84 ! grep -q "^${1}$" $badges && echo "$1" >> $badges
85 case $1 in
86 ss|old|win|patch|ownover|permover) return 0;;
87 *) echo 'yes' > $fail; false;;
88 esac
89 }
92 function docheck() {
93 action 'Checking build...'
94 if grep -q "^$PACKAGE$" $broken; then
95 if grep -q '^ERROR: unknown dep' $LOGS/$1.log; then
96 add 'bdbroken'
97 else
98 add 'broken'
99 fi
100 status; return # no more tests since package is broken
101 fi
102 status
105 if [ -e $WOK/$1/.arch ]; then
106 action "Checking 'any' arch..."
107 if [ "$(cut -d$'\t' -f2 $WOK/$1/.arch | sort -u)" == 'any' ]; then
108 if [ "$HOST_ARCH" != 'any' ]; then
109 add 'any'
110 fi
111 else
112 if [ "$HOST_ARCH" == 'any' ]; then
113 add 'noany'
114 fi
115 fi
116 status
117 fi
120 if [ -e $WOK/$1/.patch.done ]; then
121 # consider 'fix libtool' as no patch here
122 if [ -n "$(grep -v 'fix.libtool' $WOK/$1/.patch.done)" ]; then
123 add 'patch'
124 fi
125 fi
128 for set in '' $sets; do
129 src=$WOK/$1/source/$PACKAGE-$VERSION
130 [ -z "$set" ] || src="$src-$set"
131 [ -d "$src" ] || continue
133 action "Checking libtool in ${src#$WOK/$1/}..."
134 if [ -e "$src/libtool" ]; then
135 if ! grep -q '^fix.libtool$' $WOK/$1/.patch.done 2>/dev/null; then
136 add 'libtool'
137 fi
138 else
139 if grep -q '^\s*fix libtool' $WOK/$1/receipt 2>/dev/null; then
140 add 'nolibtool'
141 fi
142 fi
143 status
145 action "Checking site script in ${src#$WOK/$1/}..."
146 if fgrep -q 'configure: loading site script /etc/slitaz/cook.site' $LOGS/$PACKAGE.log; then
147 for i in bindir datadir datarootdir docdir dvidir htmldir includedir infodir libdir \
148 libexecdir localedir localstatedir mandir oldincludedir pdfdir psdir sbindir \
149 sharedstatedir sysconfdir; do
150 if fgrep -q -e "--$i=" $WOK/$1/receipt; then
151 add 'ss'
152 break
153 fi
154 done
155 fi
156 status
157 done
160 for set in '' $sets; do
161 install="$WOK/$1/install"
162 [ -z "$set" ] || install="$install-$set"
163 [ -d "$install" ] || continue
165 action "Checking ownership in ${install#$WOK/$1/}..."
167 IFS=$'\n'
168 bad_own="$(find $install -type f \( ! -user 0 -a ! -group 0 \))"
169 list=$(mktemp)
170 if [ -n "$bad_own" ]; then
171 if [ -e $overrides_exp ]; then
172 # There may be mix of overridden and not-overridden ownership
173 # in the package. Return status 'Done' only if all the ownership
174 # was overridden.
175 result=''
176 for i in $bad_own; do
177 if fgrep -q "$(stat -c %u:%g "$i") ${i#$install}" $overrides_exp ||
178 fgrep -q "$(stat -c %U:%G "$i") ${i#$install}" $overrides_exp; then
179 add 'ownover'
180 else
181 add 'own'
182 printf " %s:%s %s\n" "$(stat -c %u:%g "$i")" "${i#$install}" >>$list
183 result='bad'
184 fi
185 done
186 [ "$result" == '' ] # OK, all was overridden
187 else
188 for i in $bad_own; do
189 printf " %s:%s %s\n" "$(stat -c %u:%g "$i")" "${i#$install}" >>$list
190 done
191 add 'own'
192 fi
193 fi
194 status
195 unset IFS
196 if [ -s "$list" ]; then
197 echo " Problems found:"
198 sort -k2 $list
199 fi
200 rm $list
203 action "Checking permissions in ${install#$WOK/$1/}..."
205 IFS=$'\n'
206 bad_files="$(find $install -type f \( ! -perm 644 -a ! -perm 755 \))"
207 bad_dirs="$(find $install -type d ! -perm 755)"
208 list=$(mktemp)
209 if [ -n "$bad_files$bad_dirs" ]; then
210 if [ -e $overrides_exp ]; then
211 # There may be mix of overridden and not-overridden permissions
212 # in the package. Return status 'Done' only if all the permissions
213 # was overridden.
214 result=''
215 for i in $bad_files; do
216 if fgrep -q "$(printf "%04d\t%s" "$(stat -c%a "$i")" "${i#$install}")" $overrides_exp; then
217 add 'permover'
218 else
219 add 'perm'
220 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}" >>$list
221 result='bad'
222 fi
223 done
224 for i in $bad_dirs; do
225 if fgrep -q "$(printf "%04d" $(stat -c %a "$i")) ${i#$install}/" $overrides_exp; then
226 add 'permover'
227 else
228 add 'perm'
229 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}/" >>$list
230 result='bad'
231 fi
232 done
233 [ "$result" == '' ] # OK, all was overridden
234 else
235 for i in $bad_files; do
236 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}" >>$list
237 done
238 for i in $bad_dirs; do
239 printf " %04d %s\n" "$(stat -c %a "$i")" "${i#$install}/" >>$list
240 done
241 add 'perm'
242 fi
243 fi
244 status
245 unset IFS
246 if [ -s "$list" ]; then
247 echo " Problems found:"
248 sort -k2 $list
249 fi
250 rm $list
252 action "Checking broken symlinks in ${install#$WOK/$1/}..."
254 IFS=$'\n'
255 bad_sl="$(find $install -type l ! -exec test -e '{}' \; -print)"
256 result=''
257 if [ -n "$bad_sl" ]; then
258 add 'symlink'
259 result='bad'
260 fi
261 [ "$result" == '' ]; status
263 if [ "$result" == 'bad' ]; then
264 echo " Problems found:"
265 for i in $bad_sl; do
266 stat -c ' %N' $i
267 done
268 fi
269 unset IFS
270 done
272 if [ "$REPOLOGY" != '-' ]; then
273 action 'Querying Repology...'
274 repo_ver=$(repology_get ${REPOLOGY:-$PACKAGE})
275 if [ "$repo_ver" != '-' ]; then
276 if echo " $repo_ver " | fgrep -q " $VERSION "; then
277 [ -s $fail ] || add 'win'
278 else
279 add 'old'
280 fi
281 fi
282 status
283 fi
285 unset changed notchanged
286 fgrep -q 'The release checksum has changed.' $LOGS/$1.log && changed='yes'
287 fgrep -q 'The release checksum has not changed.' $LOGS/$1.log && notchanged='yes'
288 if [ -z "$changed" -a -n "$notchanged" ]; then
289 add 'equal'
290 fi
291 }
294 title 'Post-check'
295 docheck $1
298 # Put badges into activity log: <a href='...' data-badges='...'>...</a>
300 action 'Updating activity log...'
301 badges_log=$(tr '\n' ' ' <$badges | sed 's| $||')
302 sed -i "s|>$1</a>$| data-badges='$badges_log'&|" $activity
303 status
305 footer
307 rm -r $data # clean
309 # move badges to the global database
310 sed -i "/^$PACKAGE /d" $badges_global
311 echo "$PACKAGE $(tr '\n' ' ' <$badges | sed 's| $||')" >>$badges_global
312 rm $badges
314 tosort=$(mktemp)
315 cp $badges_global $tosort
316 sort -o $badges_global $tosort
317 rm $tosort