viernes, 3 de julio de 2026

RetroMultiInstaller + github: número de la última versión para tu script de instalación

Un problema recurrente que me he encontrado con github es que cada vez que sale una nueva versión en un programa que usa el sistema de repositorios de github cambia la URL y por tanto deja de funcionar el script.

Durante algún tiempo he hecho la ñapa de definir una variable "version" para solo tener que cambiar este valor y estar cambiando todos los sitios donde sale para así evitar errores por "espaguetización", así por ejemplo sería el script para descargar un AppImage:

#/bin/bash
toolname="amspirit"
version="1.10.7"
url="https://github.com/AMSpiriT-Emulator/amspirit-releases/releases/download/v${version}-beta/freetube-${version}-beta-${arch}.AppImage"
source $pwddir/../commonscripts/makeopenchangetodir.sh /opt/appimages
wget -N ${url} -O ${toolname}.AppImage
chmod +x ${toolname}.AppImage
source $pwddir/../commonscripts/makeopenchangetodir.sh /opt/appimages/${toolname}.AppImage.home
cd $pwddir
$pwddir/../commonscripts/createshortcuts.sh ${toolname} 
Pero seguimos con la necesidad de estar pendiente de los cambios de versión, algo que es poco sostenible, así que investigué un poco como sabe github y, si está bien definido la dirección URL donde podemos consultar el número sería algo como ésto:

https://api.github.com/repos/usuario/programa/releases/latest 

La consulta nos devolverá un json con muchos valores, a nosotros nos interesa el que tiene la etiqueta 'tag_name', que tendría un valor como:

Así que lo primero que hice fue un nuevo script para uso común que haga esta tarea, pasándole como parámetros el usuario y repositorio del programa:

script: ./commonscripts/githubversion.sh 

#/bin/bash
# $1: user
# $2: repo
pwddir=$(pwd)
$pwddir/../commonscripts/instalator.sh  jq &> /dev/null
latestversionurl="https://api.github.com/repos/${1}/${2}/releases/latest"
versionpack=$(wget "${latestversionurl}" -q -O -)
tag=$(echo "${versionpack}" | jq -r '.tag_name')
echo ${tag#v} 

Con este script obtengo el número, puede que tenga algún sufijo o prefijo que sobra, por ejemplo supongamos que nos devuelve "Lite-1.10.7" en ese caso con el comando sed sustituimos esa cadena por la cadena vacía, así quedaría el script de instalación:

#/bin/bash
pwddir=$(pwd)
toolname="amspirit"
user="AMSpiriT-Emulator"
repo="amspirit-releases"
version=$(${pwddir}/../commonscripts/githubversion.sh ${user} ${repo} | sed 's/Lite-//')
arch=`uname -m`
url="https://github.com/${user}/${repo}/releases/download/Lite-${version}/amspirit-lite-qt-${version}-linux-${arch}.AppImage"
source $pwddir/../commonscripts/makeopenchangetodir.sh /opt/appimages
wget -N ${url} -O ${toolname}.AppImage
chmod +x ${toolname}.AppImage
source $pwddir/../commonscripts/makeopenchangetodir.sh /opt/appimages/${toolname}.AppImage.home
cd $pwddir
$pwddir/../commonscripts/createshortcuts.sh ${toolname} 

En caso de devolver solo "1.10.7" el trozo siguiente sobraría:

| sed 's/Lite-//')

Y ya está, ahora cada vez que seleccionemos instalar uno de estos programas siempre nos descargará la última versión publicada.