Convertir l'arbre CVS des ports en git (round 2)
Il y a quelques mois je cherchais tranquillement à convertir l'arbre cvs des ports FreeBSD en arbre git.
Ça avait bien marché, mais il y avait deux inconvénients majeurs :
- C'était trop long a faire
- Les mises à jours était horrible à faire.
Et puis hier, gaston me montre ça nonchalamment, puis ça, bon j'y crois pas trop mais je me lance
Récupération du CVSROOT
Créer le fichier de config suivant pour csup
*default host=cvsup.free.org
*default base=/var/db
*default prefix=/usr/portsdev/cvsroot
*default release=cvs
*default delete use-rel-suffix
*default compress
ports-all
Puis récupérer le cvsroot :
$ csup cvsroot-supfile
Installation des pré-requis
Installation des packages
$ make -C /usr/ports/devel/mercurial install clean
$ make -C /usr/ports/lang/ruby18 install clean
$ make -C /usr/ports/textproc/ruby-iconv install clean
$ make -C /usr/ports/devel/ruby-rbtree install clean
Installation de rcsparse
$ hg clone http://ww2.fs.ei.tum.de/~corecode/hg/rcsparse
$ cd rcsparse
$ ruby extconf.rb
$ make
$ make site-install
Récupération des sources de fromcvs
$ hg clone http://ww2.fs.ei.tum.de/~corecode/hg/fromcvs
Conversion du CVSROOT en git
Préparation du répertoire de destination
$ mkdir /usr/portsdev/freebsd-ports.git
$ cd /usr/portsdev/freebsd-ports.git
$ git init --bare
Conversion
$ cd /usr/portsdev/fromcvs
$ ruby togit.rb /usr/portsdev/cvsroot ports /usr/portsdev/freebsd-ports.git
2h30 (oui seulement 2h30 !!! ) après c'était fait
Le répertoire de destination fait 720Mo.
Repack du rep
$ cd /usr/portsdev/freebsd-ports.git && git repack -a -f -d
Ce coup ci ça ne dure que 5 petites minutes et le répertoire ne fait plus que 410Mo
Mise à jour de l'arbre git
Comme fromcvs fonctionne de manière incrémentale, il faudra juste relancer le csup de temps en temps et relancer la commande togit.rb pour faire très rapidement les mises à jours
Bilan du round 2
fromcvs n'est pas parfait (il n'importe pas encore les tags) en revanche il a été capable de me conserver plus de branches que ce que parsecvs avait fait, en plus il est beaucoup, beaucoup, beaucoup plus rapide :
Pour les ports la conversion passe de 17h30 à 2h30 le repack passant lui de 28h50 à 5min, la taille du repos avant repack de 4go à 710Mo.
Par contre attention togit.rb est un très gros consommateur de RAM : il a bouffé mes 4Go de RAM plus 3Go de SWAP pour convertir les ports !!!
La mise à jour fonctionne parfaitement. Autant dire que je garde cette méthode. J'ai bien essayé de modifier fromcvs afin qu'il puisse importer les tags, mais je n'y suis pas arrivé, le ruby ne m'aime définitivement pas.
CBlog bientôt une release donc un ports
Une nouvelle fonctionnalité vient de faire son apparition dans CBlog : la possibilité de pouvoir désactiver les commentaires via un simple "Comments: false" dans l'entête d'un message (à la demande de rhaamo - oui il y a au moins deux utilisateurs de CBlog :)).
En fait c'est encore mieux que ça, un nouveau champs Posts.nb.allow_comments est disponible dans le HDF (datafile) du coup vous pouvez faire ce que vous voulez avec dans votre template, il correspond au contenu de l'entête Comments:. Dans le template d'exemple si il est égale à false, il n'affiche pas le formulaire de commentaires.
Il me reste deux fonctionnalités à implémenter pour faire une release 1.0 :
- la gestion de page statiques.
- la gestion d'une page d'erreur pour afficher les problèmes plutot que le stderr.
Bien sûr il reste toujours du nettoyage a faire pour rendre plus propre et robuste le code, de la documentation :)
En ce qui concerne CPlanet il n'y a plus que du nettoyage car je ne vois pour le moment aucun besoin de rajouter de fonctionnalitées.
Dans tous les cas dès la release venue, un joli ports FreeBSD fera son entrée.
Toute contribution est la bienvenue, surtout que pour le moment le code n'a été testé que sous FreeBSD.
Reconstruire les paquets cassés
Voici un petit script ZSH pour rechercher les binaires systèmes qui ne trouvent pas les bibliothèques dont ils dépendent et les reconstruire en utilisant portmaster.
#!/usr/local/bin/zsh typeset -a torebuild rep=(/usr/local/bin/**/*(.)) rep+=(/usr/local/lib/**/*.so(.)) rep+=(/usr/local/sbin/**/*(.)) for bin ($rep) { file $bin | grep -q "ELF" && { ldd =$bin | grep -q "not found" && { torebuild+=$(pkg_info -qoW $bin) } } } portmaster -f ${(u)torebuild}
Convertir l'arbre CVS des ports en git
Voulant pouvoir jouer tranquillement avec les ports via git, je me suis dit que j'allais convertir les CVS des ports en git tout simplement.
Récupération du CVSROOT
Créer le fichier de config suivant pour csup
*default host=cvsup.free.org
*default base=/var/db
*default prefix=/usr/portsdev
*default release=cvs
*default delete use-rel-suffix
*default compress
ports-all
Puis récupérer le cvsroot :
$ csup cvsroot-supfile
Récupération et construction de parsecvs
Récupérer les sources
$ git clone git://anongit.freedesktop.org/~keithp/parsecvs
Contruire les lib git qui seront nécessaires, sans les installer.
$ make -C /usr/ports/devel/git
Modifier le Makefile de parsecvs pour qu'il ressemble à celui-ci
GCC_WARNINGS1=-Wall -Wpointer-arith -Wstrict-prototypes
GCC_WARNINGS2=-Wmissing-prototypes -Wmissing-declarations
GCC_WARNINGS3=-Wnested-externs -fno-strict-aliasing
GCC_WARNINGS=$(GCC_WARNINGS1) $(GCC_WARNINGS2) $(GCC_WARNINGS3)
GITPATH=/usr/ports/devel/git/work/git-1.6.4
CFLAGS=-O2 -g $(GCC_WARNINGS) -I$(GITPATH) -DSHA1_HEADER='<openssl/sha.h>' -I/usr/local/include
LIBS=-L$(GITPATH) -lgit $(GITPATH)/xdiff/lib.a -lssl -lcrypto -lz -liconv -L/usr/local/lib
YFLAGS=-d -l
LFLAGS=-l
OBJS=gram.o lex.o parsecvs.o cvsutil.o revdir.o \
revlist.o atom.o revcvs.o git.o gitutil.o rcs2git.o \
nodehash.o tags.o tree.o
parsecvs: $(OBJS)
cc $(CFLAGS) -o $@ $(OBJS) $(LIBS)
$(OBJS): cvs.h
lex.o: y.tab.h
lex.o: lex.c
y.tab.h: gram.c
clean:
rm -f $(OBJS) y.tab.h gram.c lex.c parsecvs
install:
cp parsecvs edit-change-log ${HOME}/bin
Construction et installation de parsecvs
$ gmake
$ cp parsecvs edit-change-log /usr/local/bin
Conversion du CVSROOT en git
$ cd /usr/portsdev/ports
Si vous utilisez zsh :
$ print -l **/*,v | parsecvs
Sinon
$ find . -name "*,v" -print | parsecvs
Attention c'est long, très long : 17h30 sur un Q6600 avec 4Go de RAM et un disque SATA 150 en zfs Le facteur principal est la vitesse du disque dur en effet la consommation de RAM et CPU est négligeable comparée à l'utilisation disque.
Une fois cette étape terminée vous disposez d'un répertoire git fonctionnel mais énorme : plus de 4Go
Repack du rep
$ git repack -a -f -d -l
Cette étape est très longue aussi et dépend de la vitesse de votre disque pour beaucoup. Ici ça a pris 28h50
Une fois cette étape finie vous voila avec un répertoire git de 400M ce qui est quand même beaucoup mieux.
Préparation pour les mises à jour
Alors comme cvsps foire prodigieusement souvent via git cvsimport, il faut le lancer de côté :
$ export CVS_RSH=ssh
$ export CVSROOT=anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
$ cvsps -x --norc -u -A ports > /tmp/cvsps.out
Mise à jour de l'arbre git
$ git cvsimport -o master -P /tmp/cvsps.out ports
Vous voila avec un git à jour, pour continuer à mettre à jour, recommencer les deux dernières étapes.
En un seul coup pour zsh :
$ git cvsimport -o master -P <(cvsps -x --norc -u -A ports) ports
du café commerce équitable pour freebsd
Bon alors voila, depuis quelque temps le support des BSD (MacOS X compris) pour openJDK est officialisé au sein de projet bsd-port.
Ne voyant toujours rien venir dans les ports (on est obligé de se farcir du java pas libre et surtout de ce faire chier à dl à la mano tous les trucs qui vont bien pour pouvoir l'installer en acceptant des licences à droite et à gauche), je dis que je vais me le builder moi même depuis les sources.
Il y a deux possibilités d'avoir l'OpenJDK en libre : la version officielle, et la version icedtea.
Je me suis d'abord rabattu sur la version Icedtea, en effet la version 1.8 annonce intégrer le projet bsd-port. Icedtea me semblait plus simple de prime abord car toutes les dépendances sont testées par les autotools, et qu'un presque simple ./configure && make && make install devrait faire l'affaire.
C'est sans compter sur les linuxismes, en effet, il lui faut gawk, md5sum (appelé md5 sur FreeBSD donc il ne le trouve pas) plus plein de choses à droite à gauche. En ayant eu marre de patcher toutes les 5 mins les autotools, de rajouter les 25000 dépendances qui me sont inutiles, j'ai honteusement lâché l'affaire pour me rabattre sur l'OpenJDK officiel. Et là magique simple et rapide pour le faire (pas rapide à compiler par contre) :
Tout d'abord il faut commencer par préparer son environnement, pour cela il faut installer :
- cups
- les libs Xorg
- diablog-jdk ou un jdk quelconque > 1.5
- freetype
Ensuite il faut récupérer les sources pour cela deux manières : celle recommandée mais chiantes (que j'ai moi) passe par mercurial, l'autre passe par un snapshot mercurial :
installer mercurial ajouter le plugin forest :
$ hg clone http://www.bitbucket.org/pmezard/hgforest-crew/
$ cp hgforest-crew/forest.py /laoujaienvie/forest.py
Puis dans le ~/.hgrc, ajouter :
[extensions]
hgext.forest=/laoujaienvie/forest.py
cloner l'aborescence openjdk :
$ hg fclone http://hg.openjdk.java.net/bsd-port/bsd-port
récupérer les plugs icedtea
$ fetch http://www.intricatesoftware.com/distfiles/jdk-7-icedtea-plugs-1.6a.tar.gz
compiler le tout (attention c'est long)
$ gmake \
ALT_BOOTDIR=/usr/local/diablo-jdk1.6.0/ \
ALT_FREETYPE_HEADERS_PATH=/usr/local/include \
ALT_FREETYPE_LIB_PATH=/usr/local/lib \
ALT_BINARY_PLUGS_PATH=/home/build/jdk-7-icedtea-plugs \
ANT_HOME=/usr/local \
NO_DOCS=true \
HOTSPOT_BUILD_JOBS=1 \
OPENWIN_HOME=/usr/local \
OPENWIN_LIB=/usr/local/lib \
X11_PATH=/usr/local
Attention pour tout cela il vous faudra environ 1.2Go d'espace disque.
Une fois toute cette opération terminée vous obtiendrez dans le rép bsd-port/build un joli répertoire bsd-i586 ou un joli répertoire bsd-amd64 suivant votre archi contenant votre jdk libre tout propre.
La seconde méthode consiste à ne pas utiliser mercurial mais à prendre un snapshot depuis l'hgweb
Par exemple, pour la dernière version disponible :
$ fetch http://hg.openjdk.java.net/bsd-port/bsd-port/archive/tip.tar.bz2
Le reste est identique.
Résultat :
$ /home/build/bsd-port/build/bsd-i586/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.g7.0-internal-root_2009_01_12_16_54-b00)
OpenJDK Client VM (build 14.g0-b10, mixed mode)
Voila il ne me reste plus qu'a pondre une joli ports et hop.
A noter que pour la permière compilation il faudra quand même diablo-jdk, mais ensuite votre openjdk pourra compiler les nouvelles version d'openjdk.
PS: En fait ça me fait chier les post en Anglais :)
ZSH les ports et l'arbre de dépendances
voila un petit script zsh qui permet d'afficher sous la forme d'un arbre l'ensemble des dépendances d'un ports donné, je trouve ça très pratique lorsque l'on crée un nouveau ports pour pouvoir vérifier ces dépendances, ou lorsque l'on est sur le point d'installer un ports pour affiner son installation en voyant qu'elle dépendance installe qu'elle dépendance.
Cerise sur le gâteau, comme ce script fait des appels make pour récupérer la liste des dépendance, il prends en compte les options et les knobs que vous avez pu choisir.
#!/usr/bin/env zsh PORTSDIR=$(make -V PORTSDIR) function showdep() { local level=$1 cd $2 all_dep=(${${=${(f)"$(make -V BUILD_DEPENDS)"}}#*:} ${${=${(f)"$(make -V LIB_DEPENDS)"}}#*:} ${${=${(f)"$(make -V RUN_DEPENDS)"}}#*:}) for dep (${(ou)all_dep}){ repeat $level print -n " " print ${dep//${PORTSDIR}\//} (( newlevel = level + 1 )) showdep $newlevel $dep } } showdep 0 "."
libpuzzle : une lib pour comparer les images
Je maintien un ports pour freebsd de la libpuzzle (développée par Frank DENIS aka Jedi/Sector One)
Pour ceux qui ne le connaisse pas c'est un monsieur qu'il est vachement bien, ma conf ZSH d'origine vient de lui, (elle a beaucoup évoluée depuis) il est l'auteur des très bon logiciels suivants :
Revenons en a libpuzzle, j'ai crée ce ports sans trop connaitre la libpuzzle car c'est un dépendance d'un autre programme que j'utilise et maintien : ftwin
Récemment je me suis intéressé de plus près a libpuzzle, il s'agit donc d'une librairie permettant de comparer des images entre elles, afin de déterminée celles qui sont visuellement identiques, même dans des formats différentes. Cette lib a le bon gout de venir avec un petit utilitaire nommé puzzle-diff, qui permet de comparer en ligne de commande 2 images entre elles.
Un exemple d'utilisation sympathique c'est par exemple la détection automatique d'une image de référence dans un flux vidéos, ainsi quand on encode une série de vidéos enregistrées depuis la freebox ou il y a des pubs au début, il suffit d'avoir une image de référence pour le début de la partie intéressante de la vidéos. Le petit script suivant permet ainsi de déterminer le point de départ de l'encodage a faire :
#!/usr/bin/env zsh FILM=$1 STARTTIME=1 date while [ : ];do mplayer -really-quiet -ss $STARTTIME -vo jpeg -nosound -frames 1 "$FILM" 2>&1 >/dev/null [[ $(puzzle-diff 00000001.jpg startref.jpg) -lt 0.1 ]] && break (( STARTTIME = STARTTIME + 1 )) done echo $STARTTIME
il suffi ensuite de reporter le $STARTTIME dans mencoder de la manière suivante :
# mencoder -ss $STARTTIME ...
Mutt c'est beau, mutt c'est bien
Dans un poste précédent, j'explique que mutt c'était vraiment bien, et que avec le patch sidebar c'était encore mieux, mais que ce patch ne fonctionnait pas dans la sa dernière version si les "folder" sont lu via un serveur imap.
Et bien comme on me l'a gentiment fait remarqué dans les commentaires il y a peu, le 11 juin 2008 ça a été corrigé
June 11, 2008 Fixes the indenting folder patch -- no more null's being displayed.
Je sais c'est vieux, mais comme le gentil porteur du paquet mutt-devel sous FreeBSD n'a pas incrémenté son PORTREVESION quand il a mis à jour le patch, je n'ai pas pu le voir.
Bref testé et approuvé, plus besoin de manip à la con pour avoir mon beau mutt avec une sidebar et des répertoires incrémentés correctement.
Merci au développeur du patch en question.
Port de ftwin sous FreeBSD
ftwin est un logiciel permettant de découvrir les fichiers en doublons, y compris les images identiques mais de formats différents et les fichiers contenus dans des archives.
Après avoir fait des packages pour Archlinux de ftwin et de sa dépendance libpuzzle (disponible sur mon aur), je me suis attaqué à en faire une version FreeBSD qui est mon OS principal.
Premier problème ftwin utilise fgetgrent une fonction qui n'existe pas sous FreeBSD, François Pesce le développeur de ftwin a rapidement modifier son code afin de le rendre plus portable.
Second problème les autotools, un problème dans la manière dont sont utilisés les autotools dans ftwin fait que celui-ci ne trouve pas les bibliothèques et les header dans /usr/local. Après avoir patcher acinclude.m4 et bien galérer à comprendre comment fonctionne les autotools, et donc comment réaliser au mieux le port FreeBSD correspondant, le résultat est enfin là.
Voici donc les port de ftwin et de libpuzzle sous FreeBSD :
Script pour trouver les ports orphelins (sans mainteneur)
Si comme moi vous souhaitez aider à votre manière le projet FreeBSD, une bonne solution est d'adopter et donc de maintenir les ports orphelins.
Pour les trouver c'est pas dur, les ports orphelins ont comme mainteneur ports@FreeBSD.org, j'ai donc fait un petit script qui va me rapporter très simplement la liste complète de ceux qui n'ont pas mainteneur officiels.
#!/usr/local/bin/zsh
for i in /usr/ports/*/*/Makefile;do
[ ${#${(M)${(f)"$(<$i)"}:#*ports@FreeBSD.org*}} -eq 1 ] && print $i
done
Pages : 1


