25/11/2009

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 :

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.

20/10/2009

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 :

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.

28/08/2009

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}

27/08/2009

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

13/01/2009

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 :

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 :)

25/08/2008

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 "."

18/07/2008

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 ...

18/07/2008

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.

18/12/2007

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 :

18/12/2007

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