summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxim Baz2018-08-07 00:48:51 +0200
committerMaxim Baz2018-08-07 12:20:01 +0200
commit52dd7449e0166cd0d50714681b0c0b5dcbed0d6b (patch)
tree2ab3b07bd81aaf61e1e1686f6dfe32f5f3f0b9e7
downloadaur-52dd7449e0166cd0d50714681b0c0b5dcbed0d6b.tar.gz
rebuild-detector: create
-rw-r--r--.SRCINFO27
-rw-r--r--Makefile9
-rw-r--r--PKGBUILD35
-rwxr-xr-xrebuild-detector49
-rwxr-xr-xrebuild-detector-cleanup24
-rw-r--r--rebuild-detector-cleanup.hook10
-rw-r--r--rebuild-detector-cleanup.hook.sigbin0 -> 566 bytes
-rw-r--r--rebuild-detector-cleanup.sigbin0 -> 566 bytes
-rw-r--r--rebuild-detector.hook10
-rw-r--r--rebuild-detector.hook.sigbin0 -> 566 bytes
-rw-r--r--rebuild-detector.install8
-rw-r--r--rebuild-detector.sigbin0 -> 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
new file mode 100644
index 000000000000..59fb89b433e1
--- /dev/null
+++ b/rebuild-detector-cleanup.hook.sig
Binary files differ
diff --git a/rebuild-detector-cleanup.sig b/rebuild-detector-cleanup.sig
new file mode 100644
index 000000000000..33aff0603f9a
--- /dev/null
+++ b/rebuild-detector-cleanup.sig
Binary files differ
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
new file mode 100644
index 000000000000..ca2637db6d1a
--- /dev/null
+++ b/rebuild-detector.hook.sig
Binary files differ
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
new file mode 100644
index 000000000000..6abe6ea88b08
--- /dev/null
+++ b/rebuild-detector.sig
Binary files differ