aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2023-02-03 16:12:59 -0500
committerB. Watson <urchlay@slackware.uk>2023-02-03 16:12:59 -0500
commit01f35ed9fffde74ce22e7fafb336f49fef4427b3 (patch)
treed2a295d24a7ce5648db7b84e91d630a3b322fefe
parent92f98a10b4b07885ce48556e94ae476c54057226 (diff)
downloadsbo-maintainer-tools-01f35ed9fffde74ce22e7fafb336f49fef4427b3.tar.gz
sbopkglint: add pre-doinst test.
-rw-r--r--TODO12
-rwxr-xr-xsbopkglint37
-rw-r--r--sbopkglint.d/05-basic-sanity.t.sh2
-rw-r--r--sbopkglint.d/pre-doinst.sh42
4 files changed, 77 insertions, 16 deletions
diff --git a/TODO b/TODO
index a29ddae..af51a80 100644
--- a/TODO
+++ b/TODO
@@ -11,23 +11,11 @@ Future test ideas:
test (doinst can and should create these; they should *not* just be
files in the package).
-- noarch could recommend a package be made noarch, if it contains no
- ELF files and doesn't use lib or lib64 dirs. Should this just
- be a recommendation, or should it count as a failed test?
-
- static libraries? some packages ship these because upstream doesn't
support shared libs, though. maybe only complain if libfoo.so.* and
libfoo.a both exist (if we have a shared lib, we shouldn't also have
a static one). Maybe this should be a disable-able warning?
-- icons. Make sure they are what their filename says (I've run into .png
- files named .svg, and .gif files named .png, etc). If they're in
- /usr/share/icons/<size>x<size>/, make sure they actually are the correct
- size (or that they're SVG, if they're in scalable/). Really large icons
- in /usr/share/pixmaps are probably useless (most stuff that uses the
- old-style icons expects them to be 48x48 or 64x64). Icons must be
- readable by everyone, non-executable, and owned by root:root.
-
- duplicate files, maybe the error message could suggest a "ln -s" command
to use if the file really does need to appear in multiple dirs.
diff --git a/sbopkglint b/sbopkglint
index d234e39..7e1638e 100755
--- a/sbopkglint
+++ b/sbopkglint
@@ -502,6 +502,41 @@ for package in $packages; do
VERSION="$( echo $filename | rev | cut -d- -f3 | rev )"
PKG="$( mktemp -d $TMP/sbopkglint.XXXXXX )"
+ totalwarns=0
+ foundtests=0
+
+ # pre-doinst test requires extracting the package *without*
+ # running its doinst.sh. this is so we can check for e.g.
+ # /usr/info/dir existing in the package (rather than being
+ # created by doinst, which would be OK).
+ echo -n "Exploding $package to $PKG ..."
+ olddir="$( pwd )"
+ cd "$PKG"
+ explodepkg "$PKG" &> $PKG/.tmp.$$
+ S="$?"
+ if [ "$S" != "0" ]; then
+ echo "FAILED"
+ echo "explodepkg exited with status $S"
+ rm -rf $PKG
+ exit_status=1
+ continue
+ fi
+ echo "OK"
+
+ echo -n "Running pre-doinst test..."
+ warncount=0
+ source $testdir/pre-doinst.sh
+ if [ "$warncount" = "0" ]; then
+ echo "OK"
+ else
+ echo "FAILED"
+ : $(( totalwarns += warncount ))
+ fi
+ cd "$olddir"
+ rm -rf $PKG
+ mkdir -p $PKG
+
+ # now the "real" tests
echo -n "Installing $package to $PKG ..."
/sbin/installpkg -root "$PKG" "$package" &> $PKG/.tmp.$$
S="$?"
@@ -521,8 +556,6 @@ for package in $packages; do
olddir="$( pwd )"
cd "$PKG"
- totalwarns=0
- foundtests=0
for testscript in $testdir/*.t.sh; do
foundtests=1
(
diff --git a/sbopkglint.d/05-basic-sanity.t.sh b/sbopkglint.d/05-basic-sanity.t.sh
index 3b98c74..b879729 100644
--- a/sbopkglint.d/05-basic-sanity.t.sh
+++ b/sbopkglint.d/05-basic-sanity.t.sh
@@ -50,8 +50,6 @@ requiredfiles="usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild"
# these files must not exist.
badfiles="\
-usr/info/dir \
-usr/info/dir.gz \
usr/lib64/perl5/perllocal.pod \
usr/lib/perl5/perllocal.pod \
usr/share/perl5/perllocal.pod \
diff --git a/sbopkglint.d/pre-doinst.sh b/sbopkglint.d/pre-doinst.sh
new file mode 100644
index 0000000..8df1a8c
--- /dev/null
+++ b/sbopkglint.d/pre-doinst.sh
@@ -0,0 +1,42 @@
+#!/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.
+
+# Unlike the rest of the tests (those ending in .t.sh), this one runs
+# before the package's doinst.sh does. Purpose for this is to check
+# for the existence of stuff in the package tarball that shouldn't be
+# there (e.g. /usr/info/dir), but might correctly be created by doinst.sh.
+
+#######################################################################
+badfiles="\
+usr/info/dir \
+usr/info/dir.gz \
+usr/share/icons/hicolor/icon-theme.cache \
+usr/share/glib-2.0/schemas/gschemas.compiled \
+usr/share/mime/mime.cache \
+usr/share/applications/mimeinfo.cache \
+usr/lib/gio/modules/giomodule.cache \
+usr/lib64/gio/modules/giomodule.cache \
+var/cache/fontconfig/CACHEDIR.TAG \
+var/cache/man/usr-man/CACHEDIR.TAG"
+
+for i in $badfiles; do
+ if [ -e "$i" ]; then
+ warn "package contains forbidden file: $i"
+ fi
+done
+
+if [ -d usr/share/fonts ]; then
+ badfontstuff="$( find usr/share/fonts -name 'fonts.*' )"
+ if [ -n "$badfontstuff" ]; then
+ warn "package contains forbidden file(s): $badfontstuff"
+ fi
+fi
+
+badlinks="$( find -P . -type l )"
+if [ -n "$badfontstuff" ]; then
+ warn "package contains actual symlinks: $badlinks"
+fi