#!/bin/sh # Check repository for outdated packages die() { printf '%s\n' "$*" >&2 exit 1 } mkcd() { mkdir -p "$1" && cd "$1" } repology_name() { # Fix any known naming inconsistences between packages and Repology. remote=$( # Strip unrelated suffixes. remote=${1%%-bin} remote=${remote%%-git} # Remote names are all lowercase. tr '[:upper:]' '[:lower:]' < manpages # man-pages-posix -> man-pages-posix remote=manpages ;; netsurf-fb) remote=netsurf ;; noto-emoji) remote=fonts:noto-emoji ;; openjpeg2) # TODO [community]: Rename package? remote=openjpeg ;; osh) remote=oil-shell ;; pass) remote=password-store ;; pinentry-dmenu) remote=pinentry-dmenu-cemkeylan ;; pybind11) remote=python:pybind11 ;; python-psutil) remote=python:psutil ;; pyqt5) # TODO [community]: Rename package? remote=python-qt ;; python2) remote=python ;; qt5*) remote=qt ;; rage) remote=rage-encryption ;; sane) remote=sane-backends ;; spleen-font) remote=fonts:spleen ;; sshfs) remote=fusefs:sshfs ;; slides) remote=slides-presentation-tool ;; surf) remote=surf-browser ;; st) remote=st-term ;; sway-no-seat | sway-tiny) remote=sway ;; tea) remote=gitea-tea ;; terminus-font) remote=fonts:terminus ;; tiv) remote=tiv-terminalimageviewer ;; tree) remote=tree-steve-baker ;; ttf-font-awesome) remote=font-awesome6 ;; unifont) remote=fonts:unifont ;; vis) remote=vis-editor ;; webkit2gtk) # TODO [community]: Rename package? remote=webkitgtk ;; xf86-*) remote=xdrv:${remote##*-} ;; xmlsec1) # TODO [community]: Rename package? remote=xmlsec ;; esac } repology_version() { [ -f "$1.svg" ] || return 1 read -r remote_ver < "$1.svg" || : remote_ver=${remote_ver%*} remote_ver=${remote_ver##*>} } repo_version() { read -r ver _ 2>/dev/null < "$2/version" || { printf '%-30s local version not found\n' "$1" >&2 return 1 } [ "$ver" != git ] } get_outdated() { repo=${PWD%%/} printf '\n[Checking Repology for outdated packages in %s]\n\n' "$repo" >&2 for pkg in */; do pkg=${pkg%%/} repology_name "${pkg##*/}" [ "$remote" = - ] || set -- "$@" -z "$remote.svg" \ "https://repology.org/badge/latest-versions/$remote.svg" done mkcd "$tmp/${repo##*/}" curl -SsZ --parallel-max 16 --remote-name-all "$@" || die 'fatal: network error' for _pkg in "$OLDPWD"/*/; do pkg=${_pkg%%/} pkg=${pkg##*/} repo_version "$pkg" "$_pkg" || continue repology_name "$pkg" repology_version "$remote" || continue case $remote_ver in *", $ver"* | *"$ver,"* | "$ver" | '') continue ;; -) printf '%-30s no remote version found\n' "$pkg" >&2; continue ;; esac printf '%-30s %s -> %s\n' "$pkg" "$ver" "$remote_ver" done } main() { set -e [ "$1" ] || die 'usage: kiss [ou]tdated /path/to/repo...' mkdir -p "${tmp:=${XDG_CACHE_HOME:-"$HOME/.cache"}/kiss/repology}" for repo do old_pwd=$PWD cd "$repo" get_outdated cd "$old_pwd" done } main "$@"