devtools/sogrep

99 lines
2.6 KiB
Bash

#!/bin/bash
# License: Unspecified
: ${SOLINKS_MIRROR:="https://mirror.pkgbuild.com"}
: ${SOCACHE_DIR:="${XDG_CACHE_HOME:-${HOME}/.cache}/sogrep"}
repos=('staging' 'testing' 'core' 'extra'
'community-staging' 'community-testing' 'community'
'multilib-staging' 'multilib-testing' 'multilib'
'gnome-unstable' 'kde-unstable')
arches=('x86_64')
source /usr/share/makepkg/util/util.sh
recache() {
local repo arch
for repo in "${repos[@]}"; do
for arch in "${arches[@]}"; do
rm -rf "${SOCACHE_DIR}/${arch}/${repo}"
mkdir -p "${SOCACHE_DIR}/${arch}/${repo}"
curl "${SOLINKS_MIRROR}/${repo}/os/${arch}/${repo}.links.tar.gz" | bsdtar -xf - -C "${SOCACHE_DIR}/${arch}/${repo}"
done
done
}
search() {
local repo=$1 arch lib=$2
if [[ $repo != all ]]; then
if ! in_array "$repo" "${repos[@]}"; then
echo "${BASH_SOURCE[0]##*/}: unrecognized repo '$repo'"
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
local repos=("${repo}")
fi
if [[ ! -d ${SOCACHE_DIR} ]]; then
recache
fi
for arch in "${arches[@]}"; do
for repo in "${repos[@]}"; do
db=${SOCACHE_DIR}/${arch}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
pkg=${pkg#${db}}
printf '%s/%s\n' "${repo}" "${pkg%-*-*/links}"
done < <(grep -rlZ "${lib}" "${db}")
fi
done
done | sort -u
}
usage() {
cat <<- _EOF_
Usage: ${BASH_SOURCE[0]##*/} [OPTIONS] REPO LIBNAME
Check the soname links database for pacman repositories containing
packages linked to a given shared library. If the repository specified
is "all", then all repositories will be searched, otherwise only the
named repository will be searched.
If the links database does not exist, it will be downloaded first.
OPTIONS
-r, --refresh Refresh the links databases
-h, --help Show this help text
_EOF_
}
if (( $# == 0 )); then
echo "error: No arguments passed."
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
while (( $# )); do
case $1 in
-r|--refresh)
recache
;;
-h|--help)
usage
exit 0
;;
*)
if (( $# < 2 )); then
echo "error: Not enough arguments passed."
echo "Try '${BASH_SOURCE[0]##*/} --help' for more information."
exit 1
fi
search "$@"
exit $?
;;
esac
shift
done