#!/bin/sh case $(hostname) in 'rechenknecht') # on the master mirror tmp_dir=$( readlink -e "/tmp/${0##*/}."* || \ mktemp -d "${0##*/}.XXXXXXXX" --tmpdir=/tmp ) checksum=$( sha512sum "$0" | \ awk '{print $1}' ) cd "${tmp_dir}" for pkgfile in /srv/arch-mirror/arch/arch/archlinux32/pool/*-i686.pkg.tar.xz; do if [ -f "${pkgfile##*/}.so.needs" ]; then continue fi mkdir x bsdtar -xf "$pkgfile" -C x find 'x' \ -name 'opt' -prune , \ -type f \ -exec objdump -x '{}' \; 2>/dev/null | \ sed ' /^architecture:.* i386:x86-64, /,/^architecture:.* i386:x86-32, / d /\sNEEDED\s/ { s/^\s*\S\+\s\+\(\S\+\)\(\s.*\)\?$/\1/ /\.c32$/d s,^.*/,, t } /^Version References:$/,/^$/ { /^\s*required from / { s/^\s*required from \(\S\+\):\s*$/'"${checksum}"'\1/ T end h d } s/^\s*\(0x[0-9a-fA-F]\+\)\s\+0x[0-9a-fA-F]\+\s\+[0-9]\+\s\+\(\S\+\)$/\2-\1/ T end G s/^\(\S\+\)\n'"${checksum}"'\(\S\+\)$/\2-\1/ t } :end d ' | \ sort -u > \ "${pkgfile##*/}.so.needs" sed -i ' /^\(libav.*\.so\)\.[0-9]\+$/ { :a N s/^\(libav.*\.so\)\(\.[0-9]\+\)\?\n\1\.[0-9]\+$/\1/ t a P D } ' "${pkgfile##*/}.so.needs" find 'x' \ -name 'opt' -prune , \ \( -type f -o -type l \) \ -printf "${checksum}"'%f\n' \ -exec objdump -x '{}' \; 2>/dev/null | \ sed ' /^architecture:.* i386:x86-64, /,/^architecture:.* i386:x86-32, / d /^'"${checksum}"'/ { h d } /\sSONAME\s/ { s/^\s*\S\+\s\+\(\S\+\)\s.*$/\1/ t } /^Version definitions:$/,/^$/ { s/^[0-9]\+\s\+0x[0-9a-fA-F]\+\s\+\(0x[0-9a-fA-F]\+\)\s\+\(\S\+\)$/\2-\1/ T end G s/^\(\S\+\)\n'"${checksum}"'\(\S\+\)$/\2-\1/ t } :end d ' | \ sort -u >> \ "${pkgfile##*/}.so.provides" rm -rf --one-file-system x printf . done ;; 'buildmaster.archlinux32.org') # on the buildmaster base_dir=~/builder . ~/builder/lib/load-configuration mysql_load_min_and_max_versions { printf 'SET @link_dep_id = (' printf 'SELECT `dependency_types`.`id`' printf ' FROM `dependency_types`' printf ' WHERE `dependency_types`.`name`="link"' printf ');' printf 'CREATE TEMPORARY TABLE `x` (' printf '`it` VARCHAR(128),' printf '`kind` VARCHAR(16),' printf '`pkgname` VARCHAR(64),' printf '`epoch` MEDIUMINT,' printf '`pkgver` VARCHAR(64),' printf '`pkgrel` MEDIUMINT,' printf '`spr_total` VARCHAR(8),' printf '`sub_pkgrel` MEDIUMINT,' printf '`architecture` VARCHAR(4),' printf 'UNIQUE KEY `content`(`it`,`kind`,`pkgname`,`epoch`,`pkgver`,`pkgrel`,`sub_pkgrel`,`architecture`)' printf ');\n' printf 'LOAD DATA LOCAL INFILE "%s" INTO TABLE `x`;\n' \ ~/so-todos printf 'INSERT IGNORE INTO `install_targets`(`name`) SELECT `x`.`it` FROM `x`;\n' printf 'SELECT row_count();\n' printf 'INSERT IGNORE INTO `install_target_providers`(' printf '`package`,' printf '`install_target`,' printf '`version`' printf ') SELECT ' printf '`binary_packages`.`id`,' printf '`install_targets`.`id`,' printf '%s' \ "${min_version_id}" printf ' FROM `x`' printf ' JOIN `install_targets`' printf ' ON `x`.`it`=`install_targets`.`name`' printf ' AND `x`.`kind`="provides"' printf ' JOIN `architectures`' printf ' ON `x`.`architecture`=`architectures`.`name`' mysql_join_architectures_binary_packages printf ' AND `binary_packages`.`pkgname`=`x`.`pkgname`' printf ' AND `binary_packages`.`epoch`=`x`.`epoch`' printf ' AND `binary_packages`.`pkgver`=`x`.`pkgver`' printf ' AND `binary_packages`.`pkgrel`=`x`.`pkgrel`' printf ' AND `binary_packages`.`sub_pkgrel`=`x`.`sub_pkgrel`' printf ' AND (`binary_packages`.`sub_pkgrel_omitted` = (`x`.`spr_total`=""));' printf 'SELECT row_count();' for version_info in \ "${min_version_id},\">=\"" \ "${max_version_id},\"<\""; do printf 'INSERT IGNORE INTO `dependencies` (' printf '`dependent`,' printf '`depending_on`,' printf '`dependency_type`,' printf '`version`,' printf '`version_relation`) SELECT ' printf '`binary_packages`.`id`,' printf '`install_targets`.`id`,@link_dep_id,%s' \ "${version_info}" printf ' FROM `x`' printf ' JOIN `install_targets`' printf ' ON `x`.`it`=`install_targets`.`name`' printf ' AND `x`.`kind`="needs"' printf ' JOIN `architectures` ON `x`.`architecture`=`architectures`.`name`' mysql_join_architectures_binary_packages printf ' AND `binary_packages`.`pkgname`=`x`.`pkgname`' printf ' AND `binary_packages`.`epoch`=`x`.`epoch`' printf ' AND `binary_packages`.`pkgver`=`x`.`pkgver`' printf ' AND `binary_packages`.`pkgrel`=`x`.`pkgrel`' printf ' AND `binary_packages`.`sub_pkgrel`=`x`.`sub_pkgrel`' printf ' AND (`binary_packages`.`sub_pkgrel_omitted` = (`x`.`spr_total`=""));' printf 'SELECT row_count();' done } | \ mysql buildmaster ;; *) # on some intermediate box, e.g. on nlopc43 ssh rechenknecht ' cd /tmp/'"${0##*/}"'.* ls | \ sed '"'"' s/^\(\S\+\)-\(\([^-:]\+\):\)\?\([^-:]\+\)-\([^-.]\+\)\(\.\([0-9]\+\)\)\?-\([^-]\+\)\.pkg\.tar\.xz\.so\.\(needs\|provides\)$/\0 \9 \1 \3 \4 \5 \6 \7 \8/ t d '"'"' | \ while read -r f r; do sed " s/\$/ $r/ " "$f" done' | \ pv --line-mode | \ tr ' ' '\t' | \ ssh buildmaster 'tee so-todos | wc -l' ;; esac