summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Rees <maxcrees@me.com>2020-04-24 17:04:48 -0500
committerMax Rees <maxcrees@me.com>2020-04-24 17:04:48 -0500
commit534052fa6c65aae637324c9691a1afe8fad29c15 (patch)
treedbe544a15277a4f1f54680e23d803fff547d6872
parent5d147332e67f99c08ca21da2489fd95666b2bf4b (diff)
downloadabuild-534052fa6c65aae637324c9691a1afe8fad29c15.tar.gz
abuild-534052fa6c65aae637324c9691a1afe8fad29c15.tar.bz2
abuild-534052fa6c65aae637324c9691a1afe8fad29c15.tar.xz
abuild-534052fa6c65aae637324c9691a1afe8fad29c15.zip
checkapk: use abipkgdiff, if available
-rw-r--r--checkapk.in121
1 files changed, 104 insertions, 17 deletions
diff --git a/checkapk.in b/checkapk.in
index e935ed5..d58d464 100644
--- a/checkapk.in
+++ b/checkapk.in
@@ -22,6 +22,20 @@ case "$(tar --version)" in
*) die 'unknown tar flavor';;
esac
: ${APK:="/sbin/apk"}
+if command -v abipkgdiff >/dev/null 2>&1; then
+ abigail=1
+fi
+
+list_has() {
+ local needle="$1"
+ local i
+ shift
+ for i in $@; do
+ [ "$needle" = "$i" ] && return 0
+ [ "$needle" = "!$i" ] && return 1
+ done
+ return 1
+}
usage() {
cat >&2 <<-__EOF__
@@ -33,6 +47,28 @@ usage() {
__EOF__
}
+fetch_old() {
+ if ! $APK fetch --stdout --repositories-file "$tmpdir/repositories" "$1" > old.apk; then
+ warning "could not download $1 (network error or new package)"
+ return 1
+ else
+ [ -e old.apk ] || die "can't find old apk old.apk"
+ return 0
+ fi
+}
+
+fetch_new() {
+ local i
+ for i in "$PKGDEST/$1" "$REPODEST/$repo/$CARCH/$1" "$startdir/$1"; do
+ i="$i-$pkgver-r$pkgrel.apk"
+ if [ -f "$i" ]; then
+ echo "$i"
+ return 0
+ fi
+ done
+ [ -f "$i" ] || die "can't find new apk $1"
+}
+
pkginfo() {
local apk="$1"
local filename="$2"
@@ -82,6 +118,61 @@ filelist() {
| sort -k 3,3 > "$filename"
}
+abigail_pre() {
+ [ -n "$abigail" ] || return 0
+
+ # This assumes one of each, which should generally be the case.
+ list_has "!dbg" $options || dbg2="$pkgname-dbg"
+ for i in $subpackages; do
+ case "$i" in
+ *-dev) dev2="$i";;
+ esac
+ done
+
+ if [ -n "$dbg2" ]; then
+ if fetch_old "$dbg2"; then
+ dbg1="$dbg2.old.apk"
+ mv old.apk "$dbg1"
+ fi
+ dbg2="$(fetch_new "$dbg2")"
+ fi
+
+ if [ -n "$dev2" ]; then
+ if fetch_old "$dev2"; then
+ dev1="$dev2.old.apk"
+ mv old.apk "$dev1"
+ fi
+ dev2="$(fetch_new "$dev2")"
+ fi
+}
+
+abigail() {
+ [ -n "$abigail" ] || return 0
+ [ -n "$oldapk" ] || return 0
+ case "$newapk" in
+ "$dbg2"|"$dev2") return 0;;
+ esac
+
+ set +e
+ abipkgdiff \
+ ${dbg1:+--debug-info-pkg1 "$dbg1"} \
+ ${dbg2:+--debug-info-pkg2 "$dbg2"} \
+ ${dev1:+--devel-pkg1 "$dev1"} \
+ ${dev2:+--devel-pkg2 "$dev2"} \
+ --leaf-changes-only \
+ --impacted-interfaces \
+ --show-bytes \
+ "$oldapk" "$newapk"
+ rc=$?
+ set -e
+
+ if [ "$((rc & 4))" -eq 4 ]; then
+ warning "Abigail detected a possibly incompatible change."
+ elif [ "$((rc & 8))" -eq 8 ]; then
+ error "Abigail detected an incompatible change."
+ fi
+}
+
check_soname() {
local soname sover_old basename soname_new sover_new
local rdeps real_rdeps i self j
@@ -149,33 +240,25 @@ fi
. ./APKBUILD
startdir="$PWD"
+repodir="${startdir%/*}"
+repo="${repodir##*/}"
tmpdir=$(mktemp -d -t checkpkg-script.XXXXXX)
trap "rm -rf '$tmpdir'" INT EXIT
cd "$tmpdir" || die "failed to create temp dir"
+# generate a temp repositories file with only the http(s) repos
+grep -E "^https?:" /etc/apk/repositories > "$tmpdir/repositories"
+
+abigail_pre
+
for i in $pkgname $subpackages; do
_pkgname=${i%%:*}
- pkg=${_pkgname}-$pkgver-r$pkgrel
- pkgfile=${pkg}.apk
- repodir=${startdir%/*}
- repo=${repodir##*/}
- for newapk in "$PKGDEST"/$pkgfile "$REPODEST"/$repo/$CARCH/$pkgfile "$startdir"/$pkgfile; do
- if [ -f "$newapk" ]; then
- break
- fi
- done
- [ -f "$newapk" ] || die "can't find new apk $pkgfile"
-
- # generate a temp repositories file with only the http(s) repos
- grep -E "^https?:" /etc/apk/repositories > "$tmpdir/repositories"
+ newapk="$(fetch_new "$_pkgname")"
oldapk=old.apk
- if ! $APK fetch --stdout --repositories-file "$tmpdir/repositories" "$_pkgname" > "$oldapk"; then
- warning "could not download $_pkgname (network error or new package)"
+ if ! fetch_old "$_pkgname"; then
oldapk=
- else
- [ -e "$oldapk" ] || die "can't find old apk $oldapk"
fi
if [ -n "$oldapk" ]; then
@@ -200,5 +283,9 @@ for i in $pkgname $subpackages; do
done
[ -n "$soname" ] || msg "No soname differences for $_pkgname."
+ if grep -q '^provides = so:' "pkginfo-$_pkgname-new"; then
+ abigail
+ fi
+
rm -f old.apk
done