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

Name :
URL (optional) :
Write here: "ETOOMUCHSPAM"
Comments :