void-packages

Void Source Packages
git clone git://ezup.dev/void-packages.git
Log | Files | Refs | README | LICENSE

update_check.sh (8190B)


      1# vim: set ts=4 sw=4 et:
      2
      3update_check() {
      4    local i p url pkgurlname rx found_version consider
      5    local update_override=$XBPS_SRCPKGDIR/$XBPS_TARGET_PKG/update
      6    local original_pkgname=$pkgname
      7    local urlpfx urlsfx
      8    local -A fetchedurls
      9
     10    if [ -r $update_override ]; then
     11        . $update_override
     12        if [ "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
     13            echo "using $XBPS_TARGET_PKG/update overrides" 1>&2
     14        fi
     15    fi
     16
     17    if ! type curl >/dev/null 2>&1; then
     18        echo "ERROR: cannot find \`curl' executable!"
     19        return 1
     20    fi
     21
     22    export LC_ALL=C
     23
     24    if [ -z "$site" ]; then
     25        case "$distfiles" in
     26            # only consider versions those exist in ftp.gnome.org
     27            *ftp.gnome.org*) ;;
     28            *)
     29                printf '%s\n' "$homepage" ;;
     30        esac
     31        for i in $distfiles; do
     32            printf '%s\n' "${i%/*}/"
     33        done
     34    else
     35        printf '%s\n' "$site"
     36    fi |
     37    # filter loop: if version are "folder" name based,
     38    # substitute original url by every folder based ones (expand)
     39    while IFS= read -r url; do
     40        # default case: don't rewrite url
     41        printf '%s\n' "$url"
     42        if [ "$single_directory" ]; then
     43            continue
     44        fi
     45        rx=
     46        urlpfx="${url}"
     47        urlsfx=
     48        dirpfx=
     49        case "$url" in
     50            *.voidlinux.*|\
     51              *sourceforge.net/sourceforge*|\
     52              *code.google.com*|*googlecode*|\
     53              *launchpad.net*|\
     54              *cpan.*|\
     55              *pythonhosted.org*|\
     56              *github.com*|\
     57              *//gitlab.*|\
     58              *bitbucket.org*|\
     59              *ftp.gnome.org*|\
     60              *kernel.org/pub/linux/kernel/*|\
     61              *cran.r-project.org/src/contrib*|\
     62              *rubygems.org*|\
     63              *crates.io*|\
     64              *codeberg.org*|\
     65              *hg.sr.ht*|\
     66              *git.sr.ht*)
     67                continue
     68                ;;
     69            *)
     70                vdpfx=${vdprefix:-"|v|\\Q$pkgname\\E"}
     71                vdsfx=${vdsuffix:-"|\\.x"}
     72                match=$(grep -Po "^[^/]+//[^/]+(/.+)?/($vdpfx)(?=[-_.0-9]*[0-9](?<!\\Q$pkgname\\E)($vdsfx)/)" <<< "$url")
     73                if [ "$?" = 0 ]; then
     74                    urlpfx="${match%/*}/"
     75                    dirpfx="${match##*/}"
     76                    urlsfx="${url#$urlpfx}"
     77                    urlsfx="${urlsfx#*/}"
     78                    rx="href=[\"']?(\\Q$urlpfx\\E)?\\.?/?\\K\\Q$dirpfx\\E[-_.0-9]*[0-9]($vdsfx)[\"'/]"
     79                fi
     80                ;;
     81        esac
     82        if [ "$rx" ]; then
     83            # substitute url if needed
     84            if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
     85                echo "(folder) fetching $urlpfx and scanning with $rx" 1>&2
     86            fi
     87            skipdirs=
     88            curl -A "xbps-src-update-check/$XBPS_SRC_VERSION" --max-time 10 -Lsk "$urlpfx" |
     89                grep -Po -i "$rx" |
     90                # sort -V places 1.1/ before 1/, but 1A/ before 1.1A/
     91                sed -e 's:$:A:' -e 's:/A$:A/:' | sort -Vru | sed -e 's:A/$:/A:' -e 's:A$::' |
     92                while IFS= read -r newver; do
     93                    newurl="${urlpfx}${newver}${urlsfx}"
     94                    if [ "$newurl" = "$url" ]; then
     95                        skipdirs=yes
     96                    fi
     97                    if [ -z "$skipdirs" ]; then
     98                        printf '%s\n' "$newurl"
     99                    fi
    100                done
    101        fi
    102    done |
    103    while IFS= read -r url; do
    104        rx=
    105        if [ -z "$site" ]; then
    106            case "$url" in
    107            *sourceforge.net/sourceforge*)
    108                pkgurlname="$(printf %s "$url" | cut -d/ -f5)"
    109                url="https://sourceforge.net/projects/$pkgurlname/rss?limit=200";;
    110            *code.google.com*|*googlecode*)
    111                url="http://code.google.com/p/$pkgname/downloads/list";;
    112            *launchpad.net*)
    113                pkgurlname="$(printf %s "$url" | cut -d/ -f4)"
    114                url="https://launchpad.net/$pkgurlname/+download";;
    115            *cpan.*)
    116                pkgname=${pkgname#perl-};;
    117            *pythonhosted.org*)
    118                pkgname=${pkgname#python-}
    119                pkgname=${pkgname#python3-}
    120                url="https://pypi.org/simple/$pkgname";;
    121            *github.com*)
    122                pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)"
    123                url="https://github.com/$pkgurlname/tags"
    124                rx='/archive/refs/tags/(v?|\Q'"$pkgname"'\E-)?\K[\d\.]+(?=\.tar\.gz")';;
    125            *//gitlab.*)
    126                pkgurlname="$(printf %s "$url" | cut -d/ -f1-5)"
    127                url="$pkgurlname/tags"
    128                rx='/archive/[^/]+/\Q'"$pkgname"'\E-v?\K[\d\.]+(?=\.tar\.gz")';;
    129            *bitbucket.org*)
    130                pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)"
    131                url="https://bitbucket.org/$pkgurlname/downloads"
    132                rx='/(get|downloads)/(v?|\Q'"$pkgname"'\E-)?\K[\d\.]+(?=\.tar)';;
    133            *ftp.gnome.org*|*download.gnome.org*)
    134                : ${pattern="\Q$pkgname\E-\K(0|[13]\.[0-9]*[02468]|[4-9][0-9]+)\.[0-9.]*[0-9](?=)"}
    135                url="https://download.gnome.org/sources/$pkgname/cache.json";;
    136            *kernel.org/pub/linux/kernel/*)
    137                rx=linux-'\K'${version%.*}'[\d.]+(?=\.tar\.xz)';;
    138            *cran.r-project.org/src/contrib*)
    139                rx='\b\Q'"${pkgname#R-cran-}"'\E_\K\d+(\.\d+)*(-\d+)?(?=\.tar)';;
    140            *rubygems.org*)
    141                url="https://rubygems.org/gems/${pkgname#ruby-}"
    142                rx='href="/gems/'${pkgname#ruby-}'/versions/\K[\d\.]*(?=")' ;;
    143            *crates.io*)
    144                url="https://crates.io/api/v1/crates/${pkgname#rust-}"
    145                rx='/crates/'${pkgname#rust-}'/\K[0-9.]*(?=/download)' ;;
    146            *codeberg.org*)
    147                pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)"
    148                url="https://codeberg.org/$pkgurlname/releases"
    149                rx='/archive/\K[\d\.]+(?=\.tar\.gz)' ;;
    150            *hg.sr.ht*)
    151                pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)"
    152                url="https://hg.sr.ht/$pkgurlname/tags"
    153                rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d\.]+(?=\.tar\.gz")';;
    154            *git.sr.ht*)
    155                pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)"
    156                url="https://git.sr.ht/$pkgurlname/refs"
    157                rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d\.]+(?=\.tar\.gz")';;
    158            esac
    159        fi
    160
    161        rx=${pattern:-$rx}
    162        rx=${rx:-'(?<!-)\b\Q'"$pkgname"'\E[-_]?((src|source)[-_])?v?\K([^-/_\s]*?\d[^-/_\s]*?)(?=(?:[-_.](?:src|source|orig))?\.(?:[jt]ar|shar|t[bglx]z|tbz2|zip))\b'}
    163
    164        if [ "${fetchedurls[$url]}" ]; then
    165            if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
    166                echo "already fetched $url" 1>&2
    167            fi
    168            continue
    169        fi
    170
    171        if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
    172            echo "fetching $url and scanning with $rx" 1>&2
    173        fi
    174        curl -H 'Accept: text/html,application/xhtml+xml,application/xml,text/plain,application/rss+xml' -A "xbps-src-update-check/$XBPS_SRC_VERSION" --max-time 10 -Lsk "$url" |
    175            grep -Po -i "$rx"
    176        fetchedurls[$url]=yes
    177    done |
    178    tr _ . |
    179    sort -Vu |
    180    {
    181        grep . || echo "NO VERSION found for $original_pkgname" 1>&2
    182    } |
    183    while IFS= read -r found_version; do
    184        if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
    185            echo "found version $found_version"
    186        fi
    187        consider=true
    188        p="$ignore "
    189        while [ -n "$p" ]; do
    190            i=${p%% *}
    191            p=${p#* }
    192            case "$found_version" in
    193            $i)
    194                consider=false
    195                if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then
    196                    echo "ignored $found_version due to $i"
    197                fi
    198            esac
    199        done
    200        if $consider; then
    201            xbps-uhelper cmpver "$original_pkgname-${version}_1" \
    202                "$original_pkgname-$(printf %s "$found_version" | tr - .)_1"
    203            if [ $? = 255 ]; then
    204                echo "${original_pkgname}-${version} -> ${original_pkgname}-${found_version}"
    205            fi
    206        fi
    207    done
    208}