aboutsummaryrefslogtreecommitdiff
path: root/sbopkglint.d/50-icons.t.sh
diff options
context:
space:
mode:
Diffstat (limited to 'sbopkglint.d/50-icons.t.sh')
-rw-r--r--sbopkglint.d/50-icons.t.sh81
1 files changed, 81 insertions, 0 deletions
diff --git a/sbopkglint.d/50-icons.t.sh b/sbopkglint.d/50-icons.t.sh
new file mode 100644
index 0000000..f96a09c
--- /dev/null
+++ b/sbopkglint.d/50-icons.t.sh
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# sbopkglint test, must be sourced by sbopkglint (not run standalone).
+
+# PKG, PRGNAM, VERSION, ARCH are set by sbopkglint. also the current
+# directory is the root of the installed package tree.
+
+#######################################################################
+# check icons in /usr/share/icons/hicolor/ and /usr/share/pixmaps.
+# all icons must be world-readable, owned by root:root. the file type
+# has to match the filename (e.g. a PNG file that's called "foo.gif"
+# is a failure). for /usr/share/icons/hicolor/<size>, the image
+# size has to match the directory name (e.g. 64x64).
+
+nonimages=""
+
+check_mime() {
+ local file="$1"
+ local havemime="$2"
+ local wantmime="$3"
+
+ echo "check_mime $file $havemime $wantmime"
+
+ if [ "$havemime" != "$wantmime" ]; then
+ warn "bad filename extension: $file is $havemime, .$ext should be $wantmime"
+ fi
+}
+
+check_image() {
+ local f="$1"
+ local size
+ local bn="$( basename $f )"
+ local ext="$( echo $bn | sed 's,.*\.\([^.]*\)$,\1,' )"
+ [ "$ext" = "$f" ] && ext=""
+
+ [ "$bn" = "theme" -o "$bn" = "icon-theme.cache" -o "$bn" = "index.theme" ] && return
+
+ mime="$( file -L -z -b --mime-type "$f" )"
+ case "$mime" in
+ image/*) ;; # OK
+ *) nonimages+="$f " ; return ;;
+ esac
+
+ # it's not real clear to me whether .bmp or .ico should be allowed
+ # as icons. for now, just check the mime types.
+ case "$ext" in
+ ""|".") badextensions+="$f " ;;
+ PNG|png) check_mime $f $mime image/png ;;
+ GIF|gif) check_mime $f $mime image/gif ;;
+ JPG|jpg|JPEG|jpeg) check_mime $f $mime image/jpeg ;;
+ XPM|xpm) check_mime $f $mime image/xpmi ;;
+ SVG|svg|SVGZ|svgz) check_mime $f $mime image/xpmi ;;
+ BMP|bmp) check_mime $f $mime image/bmp ;;
+ ICO|ico) check_mime $f $mime image/vnd.microsoft.icon ;;
+ esac
+
+ # extract e.g. 64x64 or 128x128 from the path to the file.
+ # this works for e.g. /usr/share/icons/hicolor/64x64/apps/blah.png,
+ # but it's required to have / before and after the size, so an
+ # icon named /usr/share/pixmaps/foo_32x32.png won't have its
+ # size checked.
+ size="$( echo $f | grep -o '/\([0-9][0-9]*\)x\1/' | cut -d/ -f2 )"
+
+ if [ -n "$size" ]; then
+ actualsize="$( identify "$f" | sed -n 's,.* \([0-9][0-9]*x[0-9][0-9]*\) .*,\1,p' )"
+ if [ "$size" != "$actualsize" ]; then
+ warn "incorrectly sized (or named) icon $f (should be $actualsize)"
+ fi
+ fi
+}
+
+for icondir in usr/share/pixmaps usr/share/icons/hicolor; do
+ if [ -d "$icondir" ]; then
+ files="$( find -L "$icondir" -type f )"
+ for i in $files; do
+ check_image $i
+ done
+ fi
+done
+
+[ "$nonimages" != "" ] && warn "non-image files in icon dirs:" && ls -ld $nonimages