From 534052fa6c65aae637324c9691a1afe8fad29c15 Mon Sep 17 00:00:00 2001 From: Max Rees Date: Fri, 24 Apr 2020 17:04:48 -0500 Subject: checkapk: use abipkgdiff, if available --- checkapk.in | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 104 insertions(+), 17 deletions(-) (limited to 'checkapk.in') 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 -- cgit v1.2.3-70-g09d2