[Yaourt] Installation de paquets semi-binaires (terminé)

Annonces, dépannage, évolution du projet yaourt
layus
newbie
Messages : 5
Inscription : mer. 31 oct. 2012, 22:01

[Yaourt] Installation de paquets semi-binaires (terminé)

Message par layus »

Bonjour à tous,

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')
Ici le protocole "file" n'est pas très heureux, et on pourrait lui préférer "local" pour être plus explicites.

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' )
Après discussion, il semble que makepkg ne soit pas le bon endroit pour insérer de l'interactivité (même si cela marche très bien :)).
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
Pensez-vous que cette addition aie sa place dans le code de yaourt ?

Merci d'avance !
Layus.
Dernière modification par layus le jeu. 01 nov. 2012, 19:36, modifié 1 fois.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17237
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Yaourt] Installation de paquets semi-binaires (en cours

Message par benjarobin »

Désolé, je vais être très franc et je pense que tu te trompe complètement dans la philosophie d'ArchLinux
Pourquoi faire aussi compliqué, il suffit de le placer dans le même dossier que le PKGBUILD... Et un commentaire dans le PKGBUILD...

De plus le rajouter zenity en tant que dépendance même optionnel dans yaourt ne me semble pas une bonne idée, yaourt est un outil en ligne de commande, lancer une interface graphique depuis yaourt me semble une assez mauvaise idée.
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Yaourt] Installation de paquets semi-binaires (en cours

Message par FoolEcho »

Pareil que benjarobin: c'est se compliquer la vie pour pas grand-chose. Je ne vois pas le gain ici.
layus a écrit :Or un même PKGBUILD devrait pouvoir servir à installer le même jeu, indépendamment du moyen d’achat.
Je ne vois pas ce qui l'empêche ici puisque les PKGBUILDs s'attendent justement à utiliser les ressources locales, elles ne préjugent pas qu'elles viennent de hib ou pas (ou alors tu as des exemples précis ?)... Au pire, tu récupères le source et tu adaptes ton PKGBUILD (enfin je suppose, jamais utilisé hib).
layus a écrit :Enfin, il est toujours pertinent d'épargner la bande passante sur de si gros téléchargements.
Certes... Mais en plaçant le source dans le répertoire du PKGBUILD, tu n'as pas à télécharger 36 fois le source de toutes manières.
layus a écrit :Après discussion, il semble que makepkg ne soit pas le bon endroit pour insérer de l'interactivité (même si cela marche très bien :)).
Vu que yaourt interroge l'utilisateur sur la possibilité d'éditer PKGBUILD et .install, côté interactivité il y a ce qu'il faut. :)

Ceci étant, tuxce est le mieux qualifié pour te répondre. :chinois:
«The following statement is not true. The previous statement is true.» :nage:
layus
newbie
Messages : 5
Inscription : mer. 31 oct. 2012, 22:01

Re: [Yaourt] Installation de paquets semi-binaires (en cours

Message par layus »

Le problème fondamental que j'essaye de corriger, c'est une incohérence de la chaîne de compilation.

Lorsqu’on installe un paquet aur via yaourt, il crée juste avant l'appel à makepkg le dossier de compilation.
Cependant, aucune étape de yaourt n'est prévue pour donner le temps à l'utilisateur de placer ces sources dans le dossier de compilation,
dont il ignore peut-être même le nom.

Il faut donc déplacer ce fichier lors d'une des étapes interactives précédant la compilation (ex: Voulez-vous éditer PKGBUILD ? [O/n])
ou le faire après le premier échec de makepkg qui ne reconnaît pas le protocole local/file.

C'est vraiment ce problème là que j'essaye de régler. À savoir permettre à l'utilisateur de mentionner la position de sa/ses sources locales à une étape bien précise de la configuration.
Il existe bien sur d'autres solutions déjà mentionnées, comme demander à l'utilisateur de définir une variable d'environnement avant l'exécution de yaourt, mais c'est un peu redondant puisqu'il faut avoir accès au PKGBUILD avant de savoir quoi configurer.
De même certains PKGBUILD utilisent un truc genre "input" pour récupérer l'emplacement du fichier, mais alors on ne dispose pas de l’auto-complétion des noms de dossier, etc.

Il serait très agréable que cette étape s'intègre naturellement dans le processus d'installation de makepkg ou de yaourt.
On pourrait imaginer de lancer un shell ou un équivalent à zenity en ligne de commande pour éviter d'avoir recours à une dépendance supplémentaire (et graphique) mais cette solution a pour avantage d'utiliser "ln" plutôt que "cp" par exemple, et de ne sélectionner que les fichiers qui ont le bon nom. (même si ce n'est pas forcément un avantage dans le cas de fichiers renommés.)
Elle permet aussi d'installer correctement ces PKGBUILD avec l'option --noconfirm.

Imaginons un utilisateur lambda : "yaourt -S worldofgoo [--noconfirm]" plante d'office lors de la première exécution, c'est un peu irritant.
(cf. par exemple arx-fatalis, worldofgoo ou encore fieldrunners-humblebundle)
Je ne suis pas convaincu que le PKGBUILD soit un bon endroit pour insérer toute la (fastidieuse) logique pour trouver les sources locales.

Bref, mon but n'est pas de faire l'unanimité.
Je propose surtout cette solution pour tous ceux qui sont intéressés; ainsi il y en aura une trace sur internet.
Pour moi, elle marche nickel (j'utilise le DLAGENT de makepkg) et j'en suis très heureux :).

Merci de vos commentaires,
Layus.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [Yaourt] Installation de paquets semi-binaires (en cours

Message par FoolEcho »

layus a écrit :C'est vraiment ce problème là que j'essaye de régler. À savoir permettre à l'utilisateur de mentionner la position de sa/ses sources locales à une étape bien précise de la configuration.
Il existe bien sur d'autres solutions déjà mentionnées, comme demander à l'utilisateur de définir une variable d'environnement avant l'exécution de yaourt, mais c'est un peu redondant puisqu'il faut avoir accès au PKGBUILD avant de savoir quoi configurer.
De même certains PKGBUILD utilisent un truc genre "input" pour récupérer l'emplacement du fichier, mais alors on ne dispose pas de l’auto-complétion des noms de dossier, etc.
J'entends bien, mais je n'en vois vraiment pas l'intérêt car on peut résoudre ce «problème» simplement avec les outils à disposition (mais encore une fois, ça n'est pas moi qui développe/maintient yaourt).

Pour ce type de cas de figure, il est plus simple de récupérer l'archive (via yaourt tant qu'à faire):

Code : Tout sélectionner

yaourt -G truc-hib
D'aller dans le répertoire truc-hib, d'y placer la fameuse source locale et de lancer makepkg (perso, j'ai un répertoire "abs" dans mon home pour ces cas-là/les paquets que je maintiens).
«The following statement is not true. The previous statement is true.» :nage:
Répondre