summarylogtreecommitdiffstats
path: root/rebuild-detector
blob: 7aec2c7ca4b4c62dbe4d2ae8d31b392f14bbb7aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#!/bin/bash
#
# Detect broken packages that need to be rebuilt and save them grouped by repo.

shopt -s nullglob
shopt -s extglob

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 | awk -v i="$installed" '$NF == i { print $1,$2 }'
}

get_binaries() {
    find -L /usr/bin -type f -print0 | xargs -0 readlink -f
}

get_broken_pkgs() {
    parallel --will-cite 'ldd "{}" 2>/dev/null | grep "not found" >/dev/null && pacman -Qqo "{}"'
}

get_pkg_repo() {
    grep " $1" installed | cut -d' ' -f1
}

get_broken_python_pkgs() {
    python_version="$(python --version | cut -d'.' -f2)"
    pacman -Qqo /usr/lib/python3.!($python_version) 2>/dev/null
}

get_broken_perl_pkgs() {
    perl_version="$(perl -v | grep -Po '\d+' | head -n2 | paste -sd '.\n')"
    pacman -Qqo /usr/lib/perl*/!($perl_version) 2>/dev/null
}


tmp=$(mktemp -dt "rebuild-detector.XXXXXXXX") || exit
trap 'rm -rf $tmp' EXIT
cd "$tmp" || exit

# Detect broken packages
get_installed_pkgs >installed
get_binaries | get_broken_pkgs >broken
get_broken_python_pkgs >>broken
get_broken_perl_pkgs >>broken

# Save broken packages grouped by repo, overriding previous results
rm -f "$REBUILD_DETECTOR_CACHE_DIR/"*.list
while read -r pkg; do
    repo="$(get_pkg_repo "$pkg")"
    echo "$pkg" >>"$REBUILD_DETECTOR_CACHE_DIR/$repo.list"
done <broken

# Remove duplicates
for list in "$REBUILD_DETECTOR_CACHE_DIR/"*.list; do
    sort -u "$list" -o "$list"
done

exit 0