#!/bin/sh . "${0%/*}/../conf/default.conf" # Create a lock file. if [ $# -eq 0 ]; then broken="$( ls "${work_dir}/package-states" | \ grep '\.broken$' )" broken="$( echo "${broken}" | \ sed 's|\(\.[^.]\+\)\{4\}$||' | \ sort -u )" "$0" ${broken} || \ exit $? ( ls "${webserver_directory}/graphs" printf '%s.png\n' ${broken} ${broken} ) | \ sort | \ uniq -u | \ sed "s|^|${webserver_directory}/graphs/|" | \ xargs -r rm exit fi if ps ax | \ grep -v grep | \ grep -v "^\s*$$\s" | \ grep -wF "$0$( printf ' %s' "$@" )"; then >&2 echo $$ >&2 echo 'I was running already.' exit fi exec 9> "${work_dir}/${0##*/}.lock" if ! flock -n 9; then echo 'Cannot get lock.' exit fi tmp_dir="$(mktemp -d)" trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT sort -u "${work_dir}/build-order" | \ grep -v '^\(\S\+\) \1$' | \ grep '^\S\+ \S\+$' > \ "${tmp_dir}/original-build-order" sort -k1,1 "${work_dir}/build-list" > \ "${tmp_dir}/build-list.sorted-by-package" ( sort -k1,1 "${tmp_dir}/original-build-order" | \ join -1 1 -2 1 -o 1.1,1.2 - "${tmp_dir}/build-list.sorted-by-package" sort -k2,2 "${tmp_dir}/original-build-order" | \ join -1 2 -2 1 -o 1.1,1.2 - "${tmp_dir}/build-list.sorted-by-package" ) | \ sort -u | \ sponge "${tmp_dir}/original-build-order" ls "${work_dir}/package-infos" | \ sed 's|\(\.[^.]\+\)\{4\}$||' | \ sort -u > \ "${tmp_dir}/known-packages" ls "${work_dir}/package-infos" | \ grep '\.groups$' | \ while read -r pf; do cat "${work_dir}/package-infos/${pf}" | \ xargs -r printf "${pf%.*.*.*.*} %s\n" >> \ "${tmp_dir}/known-groups" done ls "${work_dir}/package-infos" | \ grep '\.packages$' | \ while read -r pf; do grep -vxF "${pf%.*.*.*.*}" "${work_dir}/package-infos/${pf}" | \ xargs -r printf "${pf%.*.*.*.*} %s\n" >> \ "${tmp_dir}/known-split-packages" done for target_package in "$@"; do output="${webserver_directory}/graphs/${target_package}.png" grep " $(str_to_regex "${target_package}")\$" "${tmp_dir}/original-build-order" | \ sort -u > \ "${tmp_dir}/build-order" printf '0 target-package %s\n' "${target_package}" > \ "${tmp_dir}/knots" last_sum='' current_sum="$(sha512sum "${tmp_dir}/build-order")" while ! [ "${last_sum}" = "${current_sum}" ]; do last_sum="${current_sum}" awk '{print $1}' "${tmp_dir}/build-order" | \ sort -u > \ "${tmp_dir}/new" ( cat \ "${tmp_dir}/original-build-order" \ "${tmp_dir}/known-split-packages" grep -v ' base\(-devel\)\?$' "${tmp_dir}/known-groups" || \ true ) | \ sort -k2,2 | \ join -1 2 -2 1 -o 1.1,1.2 - "${tmp_dir}/new" | \ sponge -a "${tmp_dir}/build-order" sort -u "${tmp_dir}/build-order" | \ sponge "${tmp_dir}/build-order" current_sum="$(sha512sum "${tmp_dir}/build-order")" done tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u | \ join -j 1 - "${tmp_dir}/build-list.sorted-by-package" | \ while read pkg rev mod_rev repo; do if [ -f "${work_dir}/package-states/${pkg}.${rev}.${mod_rev}.${repo}.broken" ]; then printf '1 broken-build-list-package %s\n' "${pkg}" else printf '2 build-list-package %s\n' "${pkg}" fi done >> \ "${tmp_dir}/knots" ( sort -u "${work_dir}/deletion-list" tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u ) | \ sort | \ uniq -d | \ xargs -r printf '3 deletion-list-package %s\n' >> \ "${tmp_dir}/knots" ( awk '{print $2}' "${tmp_dir}/known-split-packages" | \ sort -u tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u ) | \ sort | \ uniq -d | \ xargs -r printf '4 split-package %s\n' >> \ "${tmp_dir}/knots" ( cat "${tmp_dir}/known-packages" tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u ) | \ sort | \ uniq -d | \ xargs -r printf '5 package %s\n' >> \ "${tmp_dir}/knots" ( awk '{print $2}' "${tmp_dir}/known-groups" | \ sort -u tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u ) | \ sort | \ uniq -d | \ xargs -r printf '6 group %s\n' >> \ "${tmp_dir}/knots" tr ' ' '\n' < \ "${tmp_dir}/build-order" | \ sort -u | \ xargs -r printf '100 unknown %s\n' >> \ "${tmp_dir}/knots" printf '%s\n' \ 'digraph dependencies {' \ ' fontname=dejavu;' > \ "${tmp_dir}/input" sort -k3,3 -k1n,1 "${tmp_dir}/knots" | \ uniq -f2 | \ while read -r num what who; do if [ "${what}" = 'broken-build-list-package' ]; then color='#ff0000' elif [ "${what}" = 'build-list-package' ]; then color='#800000' elif [ "${what}" = 'target-package' ]; then color='#00ff00' elif [ "${what}" = 'package' ]; then color='#000000' elif [ "${what}" = 'split-package' ]; then color='#8080ff' elif [ "${what}" = 'group' ]; then color='#0000ff' elif [ "${what}" = 'deletion-list-package' ]; then color='#808080' else color='#ff80ff' fi printf ' "%s" [fontcolor="%s"];\n' "${who}" "${color}" done >> \ "${tmp_dir}/input" xargs -rn2 printf ' "%s" -> "%s";\n' < \ "${tmp_dir}/build-order" | \ sort -u >> \ "${tmp_dir}/input" printf '%s\n' \ '}' >> \ "${tmp_dir}/input" line_count="$(wc -l < "${tmp_dir}/input")" if [ "${line_count}" -gt 500 ]; then sed -i '/"base\(-devel\)\?"/d' "${tmp_dir}/input" line_count="$(wc -l < "${tmp_dir}/input")" if [ "${line_count}" -gt 700 ]; then rm -f "${output}" >&2 printf 'Skipping graph for "%s" - would be too big (%d).\n' \ "${target_package}" \ "${line_count}" continue fi fi printf 'small enough (%s): %d\n' \ "${target_package}" \ "${line_count}" touch "${output}" chmod 644 "${output}" if ! dot -Tpng -o "${output}" "${tmp_dir}/input"; then rm -f "${output}" continue fi done rm "${work_dir}/${0##*/}.lock"