master hovercats/bin / sh / outdated
  1#!/bin/sh
  2# Check repository for outdated packages
  3
  4die() {
  5    printf '%s\n' "$*" >&2
  6    exit 1
  7}
  8
  9mkcd() {
 10    mkdir -p "$1" && cd "$1"
 11}
 12
 13repology_name() {
 14    # Fix any known naming inconsistences between packages and Repology.
 15    remote=$(
 16        # Strip unrelated suffixes.
 17        remote=${1%%-bin}
 18        remote=${remote%%-git}
 19
 20        # Remote names are all lowercase.
 21        tr '[:upper:]' '[:lower:]' <<EOF |
 22$remote
 23EOF
 24        # Remote always uses -.
 25        tr _ -
 26    )
 27
 28    case $remote in
 29        cairo)
 30            remote=cairo-graphics-library
 31        ;;
 32        
 33        liberation-fonts)
 34            remote=fonts:liberation
 35        ;;
 36
 37        libjpeg)
 38            remote=ijg-libjpeg
 39        ;;
 40
 41        libmupdf | libxaw3d)
 42            # TODO [community]: Rename packages?
 43            remote=${remote##lib}
 44        ;;
 45
 46        linux-headers)
 47            remote=linux
 48        ;;
 49
 50        lpeg)
 51            remote=lua:lpeg
 52        ;;
 53
 54        samurai)
 55            remote=samurai-build-tool
 56        ;;
 57        
 58        sshfs)
 59            remote=fusefs:sshfs
 60        ;;
 61        
 62        surf)
 63            remote=surf-browser
 64        ;;
 65
 66        st)
 67            remote=st-term
 68        ;;
 69
 70        terminus-font)
 71            remote=fonts:terminus
 72        ;;
 73
 74        vis)
 75            remote=vis-editor
 76        ;;
 77
 78        webkit2gtk)
 79            # TODO [community]: Rename package?
 80            remote=webkitgtk
 81        ;;
 82
 83        tz)
 84        	remote=tzdata
 85        ;;
 86
 87        libpkgconf)
 88        	remote=pkgconf
 89        ;;
 90
 91    esac
 92}
 93
 94repology_version() {
 95    [ -f "$1.svg" ] || return 1
 96    read -r remote_ver < "$1.svg" || :
 97    remote_ver=${remote_ver%</text>*}
 98    remote_ver=${remote_ver##*>}
 99}
100
101repo_version() {
102    read -r ver _ 2>/dev/null < "$2/ver" || {
103        printf '%-30s local version not found\n' "$1" >&2
104        return 1
105    }
106
107    [ "$ver" != git ]
108}
109
110get_outdated() {
111    repo=${PWD%%/}
112    printf '\n[Checking Repology for outdated packages in %s]\n\n' "$repo" >&2
113
114    for pkg in */; do
115        pkg=${pkg%%/}
116        repology_name "${pkg##*/}"
117
118        [ "$remote" = - ] ||
119            set -- "$@" -z "$remote.svg" \
120                "https://repology.org/badge/latest-versions/$remote.svg"
121    done
122
123    mkcd "$tmp/${repo##*/}"
124
125    curl -SsZA 'kiss-outdated' --parallel-max 16 --remote-name-all "$@" ||
126        die 'fatal: network error'
127
128    for _pkg in "$OLDPWD"/*/; do
129        pkg=${_pkg%%/}
130        pkg=${pkg##*/}
131
132        repo_version  "$pkg" "$_pkg" || continue
133        repology_name "$pkg"
134        repology_version "$remote" || continue
135
136        case $remote_ver in
137            *", $ver"* | *"$ver,"* | "$ver" | '') continue ;;
138            -) printf '%-30s no remote version found\n' "$pkg" >&2; continue ;;
139        esac
140
141        printf '%-30s %s -> %s\n' "$pkg" "$ver" "$remote_ver"
142    done
143}
144
145main() {
146    set -e
147
148    [ "$1" ] || set -- "$PWD"
149
150    mkdir -p "${tmp:=${XDG_CACHE_HOME:-"$HOME/.cache"}/kiss/repology}"
151
152    for repo do
153        old_pwd=$PWD
154        cd "$repo"
155        get_outdated
156        cd "$old_pwd"
157    done
158}
159
160main "$@"