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}