2009/11/25

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.

2009/08/27

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

Pages : 1