diff options
author | Maxim Baz | 2018-08-07 00:48:51 +0200 |
---|---|---|
committer | Maxim Baz | 2018-08-07 12:20:01 +0200 |
commit | 52dd7449e0166cd0d50714681b0c0b5dcbed0d6b (patch) | |
tree | 2ab3b07bd81aaf61e1e1686f6dfe32f5f3f0b9e7 | |
download | aur-52dd7449e0166cd0d50714681b0c0b5dcbed0d6b.tar.gz |
rebuild-detector: create
-rw-r--r-- | .SRCINFO | 27 | ||||
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | PKGBUILD | 35 | ||||
-rwxr-xr-x | rebuild-detector | 49 | ||||
-rwxr-xr-x | rebuild-detector-cleanup | 24 | ||||
-rw-r--r-- | rebuild-detector-cleanup.hook | 10 | ||||
-rw-r--r-- | rebuild-detector-cleanup.hook.sig | bin | 0 -> 566 bytes | |||
-rw-r--r-- | rebuild-detector-cleanup.sig | bin | 0 -> 566 bytes | |||
-rw-r--r-- | rebuild-detector.hook | 10 | ||||
-rw-r--r-- | rebuild-detector.hook.sig | bin | 0 -> 566 bytes | |||
-rw-r--r-- | rebuild-detector.install | 8 | ||||
-rw-r--r-- | rebuild-detector.sig | bin | 0 -> 566 bytes |
12 files changed, 172 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO new file mode 100644 index 000000000000..33c8de8e0b02 --- /dev/null +++ b/.SRCINFO @@ -0,0 +1,27 @@ +pkgbase = rebuild-detector + pkgdesc = Pacman hook to automatically detect which packages need to be rebuilt + pkgver = 1.0.0 + pkgrel = 1 + install = rebuild-detector.install + arch = any + license = MIT + source = rebuild-detector + source = rebuild-detector.sig + source = rebuild-detector.hook + source = rebuild-detector.hook.sig + source = rebuild-detector-cleanup + source = rebuild-detector-cleanup.sig + source = rebuild-detector-cleanup.hook + source = rebuild-detector-cleanup.hook.sig + validpgpkeys = EB4F9E5A60D32232BB52150C12C87A28FEAC6B20 + sha256sums = c77f55f6d84a9754e744a547fd64ee1b15906fb45afd127613dddc41a9760547 + sha256sums = SKIP + sha256sums = 85117be08f7c904805de0b58722532caa55dfc2cb31f118d509871f3d40b96ec + sha256sums = SKIP + sha256sums = 9d5be08cd837a4e6445b1880119896f82596be2bd53cf24b525abab3b90079d0 + sha256sums = SKIP + sha256sums = 5609c9c0812412cee629964eec692e989524d476f69c5125fa1cb846ff5be7e2 + sha256sums = SKIP + +pkgname = rebuild-detector + diff --git a/Makefile b/Makefile new file mode 100644 index 000000000000..f06b907bcc71 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +.PHONY: prepare + +prepare: + gpg --detach-sign --yes rebuild-detector + gpg --detach-sign --yes rebuild-detector.hook + gpg --detach-sign --yes rebuild-detector-cleanup + gpg --detach-sign --yes rebuild-detector-cleanup.hook + updpkgsums + makepkg --printsrcinfo > .SRCINFO diff --git a/PKGBUILD b/PKGBUILD new file mode 100644 index 000000000000..bc828e3d9de8 --- /dev/null +++ b/PKGBUILD @@ -0,0 +1,35 @@ +# Maintainer: Maxim Baz <$pkgname at maximbaz dot com> + +pkgname=rebuild-detector +pkgver=1.0.0 +pkgrel=1 +pkgdesc="Pacman hook to automatically detect which packages need to be rebuilt" +arch=("any") +license=("MIT") +install=rebuild-detector.install +source=("rebuild-detector" + "rebuild-detector.sig" + "rebuild-detector.hook" + "rebuild-detector.hook.sig" + "rebuild-detector-cleanup" + "rebuild-detector-cleanup.sig" + "rebuild-detector-cleanup.hook" + "rebuild-detector-cleanup.hook.sig") +sha256sums=('c77f55f6d84a9754e744a547fd64ee1b15906fb45afd127613dddc41a9760547' + 'SKIP' + '85117be08f7c904805de0b58722532caa55dfc2cb31f118d509871f3d40b96ec' + 'SKIP' + '9d5be08cd837a4e6445b1880119896f82596be2bd53cf24b525abab3b90079d0' + 'SKIP' + '5609c9c0812412cee629964eec692e989524d476f69c5125fa1cb846ff5be7e2' + 'SKIP') +validpgpkeys=("EB4F9E5A60D32232BB52150C12C87A28FEAC6B20") + +package() { + install -Dm755 rebuild-detector -t "$pkgdir/usr/share/libalpm/scripts/" + install -Dm755 rebuild-detector-cleanup -t "$pkgdir/usr/share/libalpm/scripts/" + install -Dm644 rebuild-detector.hook -t "$pkgdir/usr/share/libalpm/hooks/" + install -Dm644 rebuild-detector-cleanup.hook -t "$pkgdir/usr/share/libalpm/hooks/" +} + +# vim:set ts=4 sw=4 et: diff --git a/rebuild-detector b/rebuild-detector new file mode 100755 index 000000000000..31ddd19fb654 --- /dev/null +++ b/rebuild-detector @@ -0,0 +1,49 @@ +#!/bin/bash +# +# For each of the upgraded packages, detect packages that depend on it +# and add those to the list of packages to rebuild grouped by repo. +# +# Cleanup the upgraded packages themselves from the rebuild-pending list. +# +# All repositories are watched by default. +# Set $REBUILD_DETECTOR_REPOS to a space-separated list to override. + +readonly REBUILD_DETECTOR_CACHE_DIR="/var/cache/rebuild-detector" +mkdir -p "$REBUILD_DETECTOR_CACHE_DIR" + +get_installed_pkgs() { + printf -v installed '[%s]' "$(gettext installed)" + pacman -Sl $REBUILD_DETECTOR_REPOS | awk -v i="$installed" '$NF == i { print $1,$2 }' +} + +detect_depending_pkgs() { + parallel --plus --will-cite "pactree -u {#.* } | tail -n +2 | grep '^$1$' >/dev/null && echo {}" +} + + +tmp=$(mktemp -dt "rebuild-detector-upgrade-hook.XXXXXXXX") || exit +trap 'rm -rf $tmp' EXIT +cd "$tmp" || exit + +mapfile -t upgraded +get_installed_pkgs >installed + +for pkg in "${upgraded[@]}"; do + detect_depending_pkgs "$pkg" <installed >depending + + while read -r repo package; do + echo "$package" >>"$REBUILD_DETECTOR_CACHE_DIR/$repo.list" + done <depending +done + +shopt -s nullglob +for list in "$REBUILD_DETECTOR_CACHE_DIR/"*.list; do + sort -u "$list" -o "$list" +done + +current_dir="$(cd "$(dirname "$0")"; pwd)" +for pkg in "${upgraded[@]}"; do + echo "$pkg" +done | "$current_dir/rebuild-detector-cleanup" + +exit 0 diff --git a/rebuild-detector-cleanup b/rebuild-detector-cleanup new file mode 100755 index 000000000000..38c27ce710e8 --- /dev/null +++ b/rebuild-detector-cleanup @@ -0,0 +1,24 @@ +#!/bin/bash +# +# Remove packages from the rebuild-pending list. + +readonly REBUILD_DETECTOR_CACHE_DIR="/var/cache/rebuild-detector" + +get_pkg_info() { + pacman -Sl | awk '{ print $1,$2 }' +} + + +tmp=$(mktemp -dt "rebuild-detector-cleanup-hook.XXXXXXXX") || exit +trap 'rm -rf $tmp' EXIT +cd "$tmp" || exit + +get_pkg_info >pkg_info + +while read -r pkg; do + repo=$(grep " $pkg" pkg_info | cut -d' ' -f1) + file="$REBUILD_DETECTOR_CACHE_DIR/$repo.list" + [ -f "$file" ] && sed -i "/^$pkg$/d" "$file" +done + +exit 0 diff --git a/rebuild-detector-cleanup.hook b/rebuild-detector-cleanup.hook new file mode 100644 index 000000000000..2a0ca4663896 --- /dev/null +++ b/rebuild-detector-cleanup.hook @@ -0,0 +1,10 @@ +[Trigger] +Type = Package +Operation = Remove +Target = * + +[Action] +Description = Ensure the removed packages are not present in the rebuild-pending list +When = PostTransaction +Exec = /usr/share/libalpm/scripts/rebuild-detector-cleanup +NeedsTargets diff --git a/rebuild-detector-cleanup.hook.sig b/rebuild-detector-cleanup.hook.sig Binary files differnew file mode 100644 index 000000000000..59fb89b433e1 --- /dev/null +++ b/rebuild-detector-cleanup.hook.sig diff --git a/rebuild-detector-cleanup.sig b/rebuild-detector-cleanup.sig Binary files differnew file mode 100644 index 000000000000..33aff0603f9a --- /dev/null +++ b/rebuild-detector-cleanup.sig diff --git a/rebuild-detector.hook b/rebuild-detector.hook new file mode 100644 index 000000000000..6c553b0e0348 --- /dev/null +++ b/rebuild-detector.hook @@ -0,0 +1,10 @@ +[Trigger] +Type = Package +Operation = Upgrade +Target = * + +[Action] +Description = Detect packages that require a rebuild +When = PostTransaction +Exec = /usr/share/libalpm/scripts/rebuild-detector +NeedsTargets diff --git a/rebuild-detector.hook.sig b/rebuild-detector.hook.sig Binary files differnew file mode 100644 index 000000000000..ca2637db6d1a --- /dev/null +++ b/rebuild-detector.hook.sig diff --git a/rebuild-detector.install b/rebuild-detector.install new file mode 100644 index 000000000000..4c05739d26bd --- /dev/null +++ b/rebuild-detector.install @@ -0,0 +1,8 @@ +post_install() { + echo ">> Make sure to select which repos to monitor, it will greately speedup the hook." + echo ">> export REBUILD_DETECTOR_REPOS='my-aur-repo'" +} + +post_upgrade() { + post_install +} diff --git a/rebuild-detector.sig b/rebuild-detector.sig Binary files differnew file mode 100644 index 000000000000..6abe6ea88b08 --- /dev/null +++ b/rebuild-detector.sig |