suite à une discussion que j'avais initiée sur les forums archlinux.org,
je viens au cœur de la communauté yaourt avec encore plus de questions
En quelques lignes, mon problème vient des PKGBUILD, et donc des paquets AUR, qui permettent d'installer les jeux achetés via Humble Indie Bundle.
Comme ces jeux sont payants, il n'est pas possible (ou difficile) d'automatiser leur téléchargement lors de l'étape "makepkg" de la création du paquet.
Une solution utilisée par certains consiste à télécharger les sources à l'aide du code d'achat du site.
Cette solution est (à mon sens) inadéquate puisqu'en plus de dévoiler le coupon secret d'achat, elle n'est valable que si on a acheté le jeu via Humble Indie Bundle.
Or un même PKGBUILD devrait pouvoir servir à installer le même jeu, indépendamment du moyen d’achat.
Enfin, il est toujours pertinent d'épargner la bande passante sur de si gros téléchargements.
Une solution élégante consiste donc à expliciter dans les sources du paquet qu'il faut fournir le code payant localement.
Par exemple pour worldofgoo
Code : Tout sélectionner
source=("WorldOfGooSetup.1.41.tar.gz"::"file://WorldOfGooSetup.1.41.tar.gz"
'WorldOfGoo.desktop')
Avec ce protocole, il suffit d'ajouter un "dlagent" dans la conf de makepkg pour qu'il reconnaisse le protocole.
J'ai donc créé la ligne suivante afin qu'il me propose un joli menu pour sélectionner dans mon arborescence le bon fichier.
Code : Tout sélectionner
DLAGENT = ( ...
'file::/bin/ln -s $(zenity --file-selection --title="Select ressource %u" --file-filter $(basename %u)) %o' )
Je me suis donc proposé de faire la même chose à l'intérieur de yaourt.
L'objectif est de parser le PKGBUILD juste avant d'appeler makepkg pour repérer les fichiers dont le protocole est "local" (ou "file" pour compatibilité) et d'afficher la fenêtre zenity pour choisir le fichier local.
Voici donc le diff qui réalise cette action :
Code : Tout sélectionner
diff --git a/src/lib/pkgbuild.sh.in b/src/lib/pkgbuild.sh.in
index 5f2099c..4dd3f3d 100644
--- a/src/lib/pkgbuild.sh.in
+++ b/src/lib/pkgbuild.sh.in
@@ -241,6 +241,33 @@ build_package() {
return 1
fi
fi
+
+ # check for local files in required source
+ msg $(_gettext "Looking for explicitly local files")
+ for _source in "${source[@]}"; do
+ local url=${_source#*::}
+ local filename=${_source%::*}
+
+ # Regex is awful, but parts are :: proto:\2, user:\5, host:\6, path:\7\8
+ local regex_url='^((.*)://)?((([^/]*)?@([^/]*))(/))?(.*)$'
+ local proto=$(echo $url | sed -r -e "s#$regex_url#\2#" )
+ local path=$( echo $url | sed -r -e "s#$regex_url#\7\8#" )
+
+ if [ "x$proto" == "xlocal" -o "x$proto" == "xfile" ]; then
+ local location=$(zenity --file-selection \
+ --title="Select ressource $path" \
+ --file-filter "$(basename $path)" \
+ 2>/dev/null)
+
+ if [ ! -z "$location" -a -f "$location" ]; then
+ #msg2 "Local ressource $filename found."
+ msg $(_gettext "Local ressource %s found." "$filename" )
+ ln -s "$location" "./$filename"
+ else
+ warning $(_gettext "Invalid local ressource, expect errors...")
+ fi
+ fi
+ done
# Build
if (( ! UID )); then
Merci d'avance !
Layus.