[repacman] Utilitaire de (re)création de paquet pacman

Autres projets et contributions
Répondre
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

[repacman] Utilitaire de (re)création de paquet pacman

Message par gyo »

Suite à une demande initiée par melodie : http://forums.archlinux.fr/topic601.html
J'ai créé un petit programme qui permet de recréé un paquet pacman (.pkg.tar.gz) à partir d'un paquet installé sur le système archlinux (si celui-ci n'existe pas déjà dans le cache).

Cela vous permet de restaurer un logiciel X si l'upgrade de X ne donne pas de bon résultats (bug du paquet, incompatibilité avec d'autres logiciels installés, etc.).
Bien sûr avant d'upgrader votre logiciel X que vous jugé sensible vous aurez préalablement recréé le .pkg.tar.gz grâce à ce programme.

Une autre utilisation de ce programme peut être le "snapshot" de votre système actuel et de graver tous les paquets créé ainsi, sur un cd ou dvd.. Le snapshot ne se fait pas encore de manière aisée avec le logiciel, mais ça pourrait être une amélioration à apporter pour réaliser ce processus de manière automatisée puisqu'il faut parcourir tous les logiciels qui sont installés sur le système...

[EDIT]
repacman sort en version 0.96 !
ChangeLog 0.96 :
- repacman.sh renommé en repacman ça fait plus « smart »
- repacman s'exécute désormais dans un environnement fakeroot ci celui-ci existe (utile pour avoir les bonnes permissions de réglées dans le paquet créé)
- repacman est et sera disponible via un fichier .tar.gz pour le téléchargement (ce qui permet en extrayant l'archive d'avoir tout de suite le droit d'exécution sur le script et accessoirement le comprimer)

Voilà, la version actuelle est disponible à cette adresse : http://foulmetal.free.fr/archlinux/repacman-0.96.tar.gz

L'utilisation est ultra simple :
$ repacman nom_du_paquet
Donc, cette commande créé un paquet nom_du_paquet-version_actuelle-rel.pkg.tar.gz dans le répertoire courant.
Dernière modification par gyo le ven. 04 mai 2007, 14:01, modifié 1 fois.
Avatar de l’utilisateur
mélodie
Maître du Kyudo
Messages : 2784
Inscription : lun. 30 oct. 2006, 02:06
Localisation : Pyrénées

Re: [repacman] Utilitaire de (re)création de paquet pacman

Message par mélodie »

gyo a écrit :Cela vous permet de restaurer un logiciel X si l'upgrade de X ne donne pas de bon résultats (bug du paquet, incompatibilité avec d'autres logiciels installés, etc.).
C'est bien aussi pour dupliquer sur plusieurs machines, quelqu'un a deux ou plus de machines, une connexion RTC, ou bien n'a pas envie de retélécharger... et n'a plus le paquet, ou a vidé son cache...
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Cool, juste un détail :
- changer le nom du packager par celui contenu du /etc/makepkg.conf (PACKAGER)

Puisqu'on est pas sûr que le paquet est le même que celui offciel (pas à cause de l'outils mais des modifications possibles dans la config, patches sauvages ou que sais-je), il serait bien de ne pas créditer l'auteur original pour ce paquet.

Autres fonctionnalités possibles : écrire les fichiers dans un répertoire temporaire avant de les "tarer". Cela permettrait, par exemple, d'exécuter des scripts dans un répertoires d'addons (du genre /etc/repacman.d) pour modifier les paquets (supprimer les locales :), optimiser les images, resampler les sons...) à la volée.

Qui à dit que je ne suis pas satisfait des packages ?! :)

Code : Tout sélectionner

if [ -d /etc/repacman.d ]; then
  for addon in `ls /etc/repacman.d/*`; do
    if [ -x $addon ]; then
      . $addon
    fi
  done
fi

tar czvf $pkg_dir...
Anarchy for the triple A.
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

Message par gyo »

mimas a écrit :Cool, juste un détail :
- changer le nom du packager par celui contenu du /etc/makepkg.conf (PACKAGER)

Puisqu'on est pas sûr que le paquet est le même que celui offciel (pas à cause de l'outils mais des modifications possibles dans la config, patches sauvages ou que sais-je), il serait bien de ne pas créditer l'auteur original pour ce paquet.
Ouais, je suis plus ou moins d'accord, ce que l'utilisateur change c'est uniquement les fichiers de config en principe. En ce qui concerne le patchage, il faut que l'utilisateur fasse une modification au niveau des sources donc un autre PKGBUILD et un éventuel changement du nom du packageur, donc ça se fait de manière automatique le changement de packageur (info que je récupère dans le fichier desc du répertoire /var/lib/pacman/local/nom_du_paquet/).
Mais sinon, peut être effectuer un changement dans les infos pour montrer qu'un paquet installé a été installé à partir d'un paquet paqué par repacman.sh, à voir mais il ne s'agit pas d'une priorité à mon avis.
mimas a écrit : Autres fonctionnalités possibles : écrire les fichiers dans un répertoire temporaire avant de les "tarer". Cela permettrait, par exemple, d'exécuter des scripts dans un répertoires d'addons (du genre /etc/repacman.d) pour modifier les paquets (supprimer les locales :), optimiser les images, resampler les sons...) à la volée.

Qui à dit que je ne suis pas satisfait des packages ?! :)

Code : Tout sélectionner

if [ -d /etc/repacman.d ]; then
  for addon in `ls /etc/repacman.d/*`; do
    if [ -x $addon ]; then
      . $addon
    fi
  done
fi

tar czvf $pkg_dir...
C'est une idée très intéressante, tu nous fais un patch ? ;-)
commentaire rédigé à l’aide d’un clavier ergonomique bépo
KISS MY ARCH
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

Message par gyo »

Pour mélodie (comme promis !!) :

« Le bûge de la version 0.9 » *musique d'hypnose*

Au départ, le fonctionnement interne de mon programme était le suivant :
- création d'un répertoire temporaire de travail
- pour chaque fichier du paquet installé (liste des fichiers récupérés dans la base de données pacman) faire selon le type de fichier dans le répertoire de travail :
1) création d'un répertoire si le fichier est un répertoire
2) création d'un lien vers le fichier se trouvant sur le système si le fichier est autre chose qu'un répertoire
3) et enfin création du paquet.

Pour le 3), il fallait que j'utilise l'option -h du programme tar en plus des options czf afin de déréférencer les liens (i.e. récupérer le fichier vers lequel le lien pointe au lieu de seulement prendre en compte le lien bêtement) que mon programme créait dans le répertoire de travail.
Mais le soucis était que si dans le paquet installé il se trouvait déjà un lien (dans mon programme je fais donc un lien sur un lien), ben tar déférençait de manière récursivement tous les liens.
Exemple :
- au niveau système :

Code : Tout sélectionner

lrwx rwx rwx /usr/lib/lien_libtruc -> /usr/lib/lien_libtruc
_rwxr_xr_x /usr/lib/libtruc
- dans le répertoire de travail :

Code : Tout sélectionner

lrwx rwx rwx $TMP/usr/lib/lien_libtruc -> /usr/lib/lien_libtruc
lrwx r_x r_x $TMP/usr/lib/libtruc -> /usr/lib/libtruc
- quand le paquet était créé, un coup d'œil dans l'archive, on avait :

Code : Tout sélectionner

_rwx rwx rwx /usr/lib/lien_libtruc taille1
_rwxr_xr_x /usr/lib/libtruc taille2
où taille1 = taille2

- Donc le paquet, d'une part, ne respectait pas tous les types de fichiers, en l'occurrence les liens symboliques
- et d'autre part le paquet risquait en conséquence d'être plus volumineux que le paquet initial à cause du déférençage de tous les liens.

Donc maintenant, ce problème est résolu, en utilisant une ruse de siouskeuh ; on a toujours un répertoire de travail, mais celui-ci ne sert uniquement pour la création de répertoires puis ensuite je fais un tar czvf -T liste_fichiers (en me plaçant préalablement dans le répertoire de travail) avec comme contenu une liste des fichiers à paquager avec chemins relatifs pour les répertoires et chemins absolus pour les fichiers non répertoire...

Voilà, je peux pas faire mieux comme explication, j'espère que j'ai été assez clair :roll:
commentaire rédigé à l’aide d’un clavier ergonomique bépo
KISS MY ARCH
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Vite fait

Code : Tout sélectionner

file_stream | while read; do
  case $REPLY in
    %NAME%)	  pkginfo_var='pkgname';;
    %VERSION%)	  pkginfo_var='pkgver';;
    %DESC%)	  pkginfo_var='pkgdesc';;
    %GROUPS%)	  pkginfo_var='group';;
    %URL%)	  pkginfo_var='url';;
    %LICENSE%)	  pkginfo_var='license';;
    %ARCH%)	  pkginfo_var='arch';;
    %BUILDDATE%)  pkginfo_var='builddate';;
    %PACKAGER%)	  pkginfo_var='packager';;
    %SIZE%)	  	  echo "size = `du -cb . | tail -n 1 | awk '{print $1}'`" >> .PKGINFO;;
    %REPLACES%)	  pkginfo_var='replace';;
    %DEPENDS%)	  pkginfo_var='depend';;
    %CONFLICTS%)  pkginfo_var='conflict';;
    %PROVIDES%)	  pkginfo_var='provide';;
    %BACKUP%)	  pkginfo_var='backup';;
    %*%) unset pkginfo_var;;
    *)
      if [ -n "$REPLY" -a -n "$pkginfo_var" ]; then
        echo "$pkginfo_var = $REPLY" >> .PKGINFO
      fi
    ;;
  esac
done

Code : Tout sélectionner

function f_create_tar {
  mkdir $FILE_PREP_DIR
  cd $FILE_PREP_DIR
  [ -e $package_dir/files ] || _f_missed_file files 2

  sed -rne '/%FILES%/,/%BACKUP%/{/^(%FILES%|%BACKUP%| *)$/d;p}' $package_dir/files > .FILELIST

  # Filtre pour récupérer seulement le répertoires
  sed -rne '/^.+\/$/p' .FILELIST | \
    while read; do
      mkdir -p $FILE_PREP_DIR/$REPLY
    done

  if [ -e $package_dir/install ]; then
    cd $FILE_PREP_DIR
    cp $package_dir/install .INSTALL
  fi


  for directory in `grep "/$" .FILELIST`; do
	mkdir -p $directory
  done

  for file in `grep "[^/]$" .FILELIST`; do
	cp -a /$file $file
  done

  export pkg_dir=$FILE_PREP_DIR
  if [ -d /etc/repacman.d ]; then
    for addon in `ls /etc/repacman.d/*`; do
      if [ -x $addon ]; then
        . $addon
      fi
    done
  fi
  unset pkg_dir

  f_generate_pkginfo
  tar cvf /dev/null * | sort >.FILELIST

  tar czvf $CURRENT_DIR/$pkgname_ver.pkg.tar.gz --exclude=. --exclude=.. * .*
}
Les scripts d'extension peuvent connaître le nom répertoire où se trouve les fichiers à repaquetager via la variable $pkg_dir.

EDIT: le changement du packager n'est pas géré. Il y a maintenant modification de .PKGINFO en fonction des fichiers réellement présents dans l'archive, ainsi que de leur poids total.

C'est carrément hacky. ;)
Dernière modification par mimas le sam. 05 mai 2007, 14:26, modifié 1 fois.
Anarchy for the triple A.
Avatar de l’utilisateur
mimas
Elfe
Messages : 559
Inscription : sam. 30 sept. 2006, 22:30
Localisation : Toulouse

Message par mimas »

Petite modif. dans ma modif. :)
Anarchy for the triple A.
Avatar de l’utilisateur
atlas95
Hankyu
Messages : 16
Inscription : dim. 11 févr. 2007, 21:58

Message par atlas95 »

Trop trop trop trop bon ce programme !!!!

Merci beaucoup aux auteurs !!!!
Avatar de l’utilisateur
gyo
Maître du Kyudo
Messages : 1049
Inscription : jeu. 19 avr. 2007, 10:40
Localisation : Nantes (44)

Message par gyo »

Pour tous rapports de bugs et demande d'amélioration au sujet de repacman ça se passe par ici maintenant -> http://bugs.archlinux.fr/index.php?tasks=all&project=5 (merci Warnaud \o/)
commentaire rédigé à l’aide d’un clavier ergonomique bépo
KISS MY ARCH
Avatar de l’utilisateur
warnaud
Maître du Kyudo
Messages : 1640
Inscription : ven. 11 août 2006, 17:05
Localisation : Rolle (CH)

Message par warnaud »

de rien ^_^"
Plus ça rate, plus ça a de chance de réussir. En somme, un succès n'est qu'une erreur qui a finit par réussir (même par erreur). Ne déséspérez donc pas et perseverez. Utilisez La Rache™
Patientia quod lard quod barrus planto diligo ut licentia
—¤÷(`[¤*Powered By *¤]´)÷¤—
Archlinux ~ Fvwm ~ Irssi ~ URxvt
Répondre