From 5422dc71da86fbadd5c24f7371944606455019f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 22 Jun 2021 08:00:02 +0700 Subject: [PATCH 1/3] common/scripts: add equivalent script for update-check This script will read necessary variables from template, then calling the old update_check method. --- common/scripts/update-check | 46 +++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100755 common/scripts/update-check diff --git a/common/scripts/update-check b/common/scripts/update-check new file mode 100755 index 000000000000..dbbae3428c70 --- /dev/null +++ b/common/scripts/update-check @@ -0,0 +1,46 @@ +#!/bin/bash +# vim: set ts=4 sw=4 et: + +die() { + printf '%s\n' "$*" >&2 + exit 1 +} + +pkgname=$1 + +if [ -z "$pkgname" ]; then + die "pkgname is required" +fi + +XBPS_DISTDIR="$(cd "${0%/*}/../.." && pwd)" +XBPS_SRCPKGDIR="$XBPS_DISTDIR/srcpkgs" + +if [ ! -f "$XBPS_SRCPKGDIR/$1/template" ]; then + die "$pkgname: not found" +fi + +source "$XBPS_DISTDIR/common/environment/setup/misc.sh" +source "$XBPS_DISTDIR/common/xbps-src/shutils/update_check.sh" + +vars="pkgname|version|homepage|distfiles" +template="$( + sed -E -n " + /^[a-z_]*($vars)=[^\"']*\$/p + /^[a-z_]*($vars)=\"[^\"]*\"\$/p + /^[a-z_]*($vars)='[^']*'\$/p + /^[a-z_]*($vars)=\"[^\"]*\$/,/^[^\"]*\"\$/p + /^[a-z_]*($vars)='[^']*\$/,/^[^']*'\$/p + " "$XBPS_SRCPKGDIR/$1/template" +)" + +# Not really safe +case "$template" in + *'$('* | *'`'*) + die "command substitution in pkgname|version|homepage|distfiles" + ;; +esac + +eval "$template" +XBPS_TARGET_PKG=$pkgname + +update_check From cde200d193588eee33180b25886190ed2ccec957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 22 Jun 2021 08:02:05 +0700 Subject: [PATCH 2/3] xbps-src: call external script for update-check --- xbps-src | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/xbps-src b/xbps-src index 806c6480f21c..a21d2aa7fb8a 100755 --- a/xbps-src +++ b/xbps-src @@ -959,8 +959,7 @@ case "$XBPS_TARGET" in bulk_update -I ;; update-check) - read_pkg ignore-problems - update_check + ${XBPS_COMMONDIR}/scripts/update-check "$XBPS_TARGET_PKG" ;; update-hash-cache) update_hash_cache From d332ba77b6c6940318f887d0e16ebce6103a9a4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 22 Jun 2021 08:03:27 +0700 Subject: [PATCH 3/3] update-check: move the real check to external script The change is best-viewed with git diff --color-moved --- common/scripts/update-check | 208 +++++++++++++++++++++++- common/xbps-src/shutils/update_check.sh | 208 ------------------------ 2 files changed, 207 insertions(+), 209 deletions(-) delete mode 100644 common/xbps-src/shutils/update_check.sh diff --git a/common/scripts/update-check b/common/scripts/update-check index dbbae3428c70..f8be72b6265a 100755 --- a/common/scripts/update-check +++ b/common/scripts/update-check @@ -20,7 +20,213 @@ if [ ! -f "$XBPS_SRCPKGDIR/$1/template" ]; then fi source "$XBPS_DISTDIR/common/environment/setup/misc.sh" -source "$XBPS_DISTDIR/common/xbps-src/shutils/update_check.sh" + +update_check() { + local i p url pkgurlname rx found_version consider + local update_override=$XBPS_SRCPKGDIR/$XBPS_TARGET_PKG/update + local original_pkgname=$pkgname + local urlpfx urlsfx + local -A fetchedurls + + if [ -r $update_override ]; then + . $update_override + if [ "$XBPS_UPDATE_CHECK_VERBOSE" ]; then + echo "using $XBPS_TARGET_PKG/update overrides" 1>&2 + fi + fi + + if ! type curl >/dev/null 2>&1; then + echo "ERROR: cannot find \`curl' executable!" + return 1 + fi + + export LC_ALL=C + + if [ -z "$site" ]; then + case "$distfiles" in + # only consider versions those exist in ftp.gnome.org + *ftp.gnome.org*) ;; + *) + printf '%s\n' "$homepage" ;; + esac + for i in $distfiles; do + printf '%s\n' "${i%/*}/" + done + else + printf '%s\n' "$site" + fi | + # filter loop: if version are "folder" name based, + # substitute original url by every folder based ones (expand) + while IFS= read -r url; do + # default case: don't rewrite url + printf '%s\n' "$url" + if [ "$single_directory" ]; then + continue + fi + rx= + urlpfx="${url}" + urlsfx= + dirpfx= + case "$url" in + *.voidlinux.*|\ + *sourceforge.net/sourceforge*|\ + *code.google.com*|*googlecode*|\ + *launchpad.net*|\ + *cpan.*|\ + *pythonhosted.org*|\ + *github.com*|\ + *//gitlab.*|\ + *bitbucket.org*|\ + *ftp.gnome.org*|\ + *kernel.org/pub/linux/kernel/*|\ + *cran.r-project.org/src/contrib*|\ + *rubygems.org*|\ + *crates.io*|\ + *codeberg.org*|\ + *hg.sr.ht*|\ + *git.sr.ht*) + continue + ;; + *) + vdpfx=${vdprefix:-"|v|\\Q$pkgname\\E"} + vdsfx=${vdsuffix:-"|\\.x"} + match=$(grep -Po "^[^/]+//[^/]+(/.+)?/($vdpfx)(?=[-_.0-9]*[0-9](?&2 + fi + skipdirs= + curl -A "xbps-src-update-check/$XBPS_SRC_VERSION" --max-time 10 -Lsk "$urlpfx" | + grep -Po -i "$rx" | + # sort -V places 1.1/ before 1/, but 1A/ before 1.1A/ + sed -e 's:$:A:' -e 's:/A$:A/:' | sort -Vru | sed -e 's:A/$:/A:' -e 's:A$::' | + while IFS= read -r newver; do + newurl="${urlpfx}${newver}${urlsfx}" + if [ "$newurl" = "$url" ]; then + skipdirs=yes + fi + if [ -z "$skipdirs" ]; then + printf '%s\n' "$newurl" + fi + done + fi + done | + while IFS= read -r url; do + rx= + if [ -z "$site" ]; then + case "$url" in + *sourceforge.net/sourceforge*) + pkgurlname="$(printf %s "$url" | cut -d/ -f5)" + url="https://sourceforge.net/projects/$pkgurlname/rss?limit=200";; + *code.google.com*|*googlecode*) + url="http://code.google.com/p/$pkgname/downloads/list";; + *launchpad.net*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4)" + url="https://launchpad.net/$pkgurlname/+download";; + *cpan.*) + pkgname=${pkgname#perl-};; + *pythonhosted.org*) + pkgname=${pkgname#python-} + pkgname=${pkgname#python3-} + url="https://pypi.org/simple/$pkgname";; + *github.com*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" + url="https://github.com/$pkgurlname/tags" + rx='/archive/refs/tags/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; + *//gitlab.*) + pkgurlname="$(printf %s "$url" | cut -d/ -f1-5)" + url="$pkgurlname/tags" + rx='/archive/[^/]+/\Q'"$pkgname"'\E-v?\K[\d.]+(?=\.tar\.gz")';; + *bitbucket.org*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" + url="https://bitbucket.org/$pkgurlname/downloads" + rx='/(get|downloads)/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar)';; + *ftp.gnome.org*|*download.gnome.org*) + : ${pattern="\Q$pkgname\E-\K(0|[13]\.[0-9]*[02468]|[4-9][0-9]+)\.[0-9.]*[0-9](?=)"} + url="https://download.gnome.org/sources/$pkgname/cache.json";; + *kernel.org/pub/linux/kernel/*) + rx=linux-'\K'${version%.*}'[\d.]+(?=\.tar\.xz)';; + *cran.r-project.org/src/contrib*) + rx='\b\Q'"${pkgname#R-cran-}"'\E_\K\d+(\.\d+)*(-\d+)?(?=\.tar)';; + *rubygems.org*) + url="https://rubygems.org/gems/${pkgname#ruby-}" + rx='href="/gems/'${pkgname#ruby-}'/versions/\K[\d.]*(?=")' ;; + *crates.io*) + url="https://crates.io/api/v1/crates/${pkgname#rust-}" + rx='/crates/'${pkgname#rust-}'/\K[0-9.]*(?=/download)' ;; + *codeberg.org*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" + url="https://codeberg.org/$pkgurlname/releases" + rx='/archive/\K[\d.]+(?=\.tar\.gz)' ;; + *hg.sr.ht*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" + url="https://hg.sr.ht/$pkgurlname/tags" + rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; + *git.sr.ht*) + pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" + url="https://git.sr.ht/$pkgurlname/refs" + rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; + esac + fi + + rx=${pattern:-$rx} + rx=${rx:-'(?&2 + fi + continue + fi + + if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then + echo "fetching $url and scanning with $rx" 1>&2 + fi + 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" | + grep -Po -i "$rx" + fetchedurls[$url]=yes + done | + tr _ . | + sort -Vu | + { + grep . || echo "NO VERSION found for $original_pkgname" 1>&2 + } | + while IFS= read -r found_version; do + if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then + echo "found version $found_version" + fi + consider=true + p="$ignore " + while [ -n "$p" ]; do + i=${p%% *} + p=${p#* } + case "$found_version" in + $i) + consider=false + if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then + echo "ignored $found_version due to $i" + fi + esac + done + if $consider; then + xbps-uhelper cmpver "$original_pkgname-${version}_1" \ + "$original_pkgname-$(printf %s "$found_version" | tr - .)_1" + if [ $? = 255 ]; then + echo "${original_pkgname}-${version} -> ${original_pkgname}-${found_version}" + fi + fi + done +} vars="pkgname|version|homepage|distfiles" template="$( diff --git a/common/xbps-src/shutils/update_check.sh b/common/xbps-src/shutils/update_check.sh deleted file mode 100644 index fcfbf31759d6..000000000000 --- a/common/xbps-src/shutils/update_check.sh +++ /dev/null @@ -1,208 +0,0 @@ -# vim: set ts=4 sw=4 et: - -update_check() { - local i p url pkgurlname rx found_version consider - local update_override=$XBPS_SRCPKGDIR/$XBPS_TARGET_PKG/update - local original_pkgname=$pkgname - local urlpfx urlsfx - local -A fetchedurls - - if [ -r $update_override ]; then - . $update_override - if [ "$XBPS_UPDATE_CHECK_VERBOSE" ]; then - echo "using $XBPS_TARGET_PKG/update overrides" 1>&2 - fi - fi - - if ! type curl >/dev/null 2>&1; then - echo "ERROR: cannot find \`curl' executable!" - return 1 - fi - - export LC_ALL=C - - if [ -z "$site" ]; then - case "$distfiles" in - # only consider versions those exist in ftp.gnome.org - *ftp.gnome.org*) ;; - *) - printf '%s\n' "$homepage" ;; - esac - for i in $distfiles; do - printf '%s\n' "${i%/*}/" - done - else - printf '%s\n' "$site" - fi | - # filter loop: if version are "folder" name based, - # substitute original url by every folder based ones (expand) - while IFS= read -r url; do - # default case: don't rewrite url - printf '%s\n' "$url" - if [ "$single_directory" ]; then - continue - fi - rx= - urlpfx="${url}" - urlsfx= - dirpfx= - case "$url" in - *.voidlinux.*|\ - *sourceforge.net/sourceforge*|\ - *code.google.com*|*googlecode*|\ - *launchpad.net*|\ - *cpan.*|\ - *pythonhosted.org*|\ - *github.com*|\ - *//gitlab.*|\ - *bitbucket.org*|\ - *ftp.gnome.org*|\ - *kernel.org/pub/linux/kernel/*|\ - *cran.r-project.org/src/contrib*|\ - *rubygems.org*|\ - *crates.io*|\ - *codeberg.org*|\ - *hg.sr.ht*|\ - *git.sr.ht*) - continue - ;; - *) - vdpfx=${vdprefix:-"|v|\\Q$pkgname\\E"} - vdsfx=${vdsuffix:-"|\\.x"} - match=$(grep -Po "^[^/]+//[^/]+(/.+)?/($vdpfx)(?=[-_.0-9]*[0-9](?&2 - fi - skipdirs= - curl -A "xbps-src-update-check/$XBPS_SRC_VERSION" --max-time 10 -Lsk "$urlpfx" | - grep -Po -i "$rx" | - # sort -V places 1.1/ before 1/, but 1A/ before 1.1A/ - sed -e 's:$:A:' -e 's:/A$:A/:' | sort -Vru | sed -e 's:A/$:/A:' -e 's:A$::' | - while IFS= read -r newver; do - newurl="${urlpfx}${newver}${urlsfx}" - if [ "$newurl" = "$url" ]; then - skipdirs=yes - fi - if [ -z "$skipdirs" ]; then - printf '%s\n' "$newurl" - fi - done - fi - done | - while IFS= read -r url; do - rx= - if [ -z "$site" ]; then - case "$url" in - *sourceforge.net/sourceforge*) - pkgurlname="$(printf %s "$url" | cut -d/ -f5)" - url="https://sourceforge.net/projects/$pkgurlname/rss?limit=200";; - *code.google.com*|*googlecode*) - url="http://code.google.com/p/$pkgname/downloads/list";; - *launchpad.net*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4)" - url="https://launchpad.net/$pkgurlname/+download";; - *cpan.*) - pkgname=${pkgname#perl-};; - *pythonhosted.org*) - pkgname=${pkgname#python-} - pkgname=${pkgname#python3-} - url="https://pypi.org/simple/$pkgname";; - *github.com*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" - url="https://github.com/$pkgurlname/tags" - rx='/archive/refs/tags/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; - *//gitlab.*) - pkgurlname="$(printf %s "$url" | cut -d/ -f1-5)" - url="$pkgurlname/tags" - rx='/archive/[^/]+/\Q'"$pkgname"'\E-v?\K[\d.]+(?=\.tar\.gz")';; - *bitbucket.org*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" - url="https://bitbucket.org/$pkgurlname/downloads" - rx='/(get|downloads)/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar)';; - *ftp.gnome.org*|*download.gnome.org*) - : ${pattern="\Q$pkgname\E-\K(0|[13]\.[0-9]*[02468]|[4-9][0-9]+)\.[0-9.]*[0-9](?=)"} - url="https://download.gnome.org/sources/$pkgname/cache.json";; - *kernel.org/pub/linux/kernel/*) - rx=linux-'\K'${version%.*}'[\d.]+(?=\.tar\.xz)';; - *cran.r-project.org/src/contrib*) - rx='\b\Q'"${pkgname#R-cran-}"'\E_\K\d+(\.\d+)*(-\d+)?(?=\.tar)';; - *rubygems.org*) - url="https://rubygems.org/gems/${pkgname#ruby-}" - rx='href="/gems/'${pkgname#ruby-}'/versions/\K[\d.]*(?=")' ;; - *crates.io*) - url="https://crates.io/api/v1/crates/${pkgname#rust-}" - rx='/crates/'${pkgname#rust-}'/\K[0-9.]*(?=/download)' ;; - *codeberg.org*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" - url="https://codeberg.org/$pkgurlname/releases" - rx='/archive/\K[\d.]+(?=\.tar\.gz)' ;; - *hg.sr.ht*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" - url="https://hg.sr.ht/$pkgurlname/tags" - rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; - *git.sr.ht*) - pkgurlname="$(printf %s "$url" | cut -d/ -f4,5)" - url="https://git.sr.ht/$pkgurlname/refs" - rx='/archive/(v?|\Q'"$pkgname"'\E-)?\K[\d.]+(?=\.tar\.gz")';; - esac - fi - - rx=${pattern:-$rx} - rx=${rx:-'(?&2 - fi - continue - fi - - if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then - echo "fetching $url and scanning with $rx" 1>&2 - fi - 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" | - grep -Po -i "$rx" - fetchedurls[$url]=yes - done | - tr _ . | - sort -Vu | - { - grep . || echo "NO VERSION found for $original_pkgname" 1>&2 - } | - while IFS= read -r found_version; do - if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then - echo "found version $found_version" - fi - consider=true - p="$ignore " - while [ -n "$p" ]; do - i=${p%% *} - p=${p#* } - case "$found_version" in - $i) - consider=false - if [ -n "$XBPS_UPDATE_CHECK_VERBOSE" ]; then - echo "ignored $found_version due to $i" - fi - esac - done - if $consider; then - xbps-uhelper cmpver "$original_pkgname-${version}_1" \ - "$original_pkgname-$(printf %s "$found_version" | tr - .)_1" - if [ $? = 255 ]; then - echo "${original_pkgname}-${version} -> ${original_pkgname}-${found_version}" - fi - fi - done -}