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.
Une forge sous NetBSD
Installation des packages
Installation de pkgin
D'abord on installe le package pkgin en lui même via la méthode binaire "traditionnelle" NetBSD
$ export PKG_PATH=ftp://ftp.fr.NetBSD.org/pub/pkgsrc/packages/NetBSD/amd64/5.0/All
$ pkg_add -v pkgin
Il faut ensuite modifier le fichier /usr/pkg/etc/pkgin/repositories.conf pour y ajouter la ligne
ftp://ftp.fr.NetBSD.org/pub/pkgsrc/packages/NetBSD/amd64/5.0/All
Puis mettre à jour la liste des packages binaire disponibles
$ pkgin update
Installation des autres composants
Les composants dont on aura besoin sont les suivant :
- git : scmgit
- postgresql : postgresql84-server
- le connecteur postgresql pour ruby : ruby18-postgres-pr
- le binding imagemagick pour ruby : ruby18-RMagick
- le serveur web ruby : thin
On installe donc tout ça
$ pkgin install scmgit postgresql84-server ruby18-postgres-pr ruby18-RMagick thin
Quelques minutes plus tard tout est arrivé et installé
Installation des gems
Il faudra ensuite installer les Ruby On Rails via les gem
$ gem install rail -v=2.2.2
Récupération de redmine
Exemple pour la version 0.8.6 ici :
$ ftp http://rubyforge.org/frs/download.php/66633/redmine-0.8.6.tar.gz
Maintenant que tout est près passons à la configuration
Configuration
Ajouts des utilisateurs
Nous allons faire tourner chaque processus avec des utilisateurs différents :
redmine:redmine pour le serveur web thin git:git pour le daemon git
$ groupadd _redmine
$ groupadd _git
$ useradd -m -g _redmine _redmine
$ useradd -m -g _git _git
Préparation du serveur postgresql
D'abord on copie le script d'init de postgresql dans /etc/rc.d/ pour qu'il puisse être activé au démarrage :
$ cp /usr/pkg/share/examples/rc.d/pgsql /etc/rc.d/pgsql
$ echo "pgsql=YES" >> /etc/rc.conf
Puis on initialise la base :
$ /etc/rc.d/pgsql initdb -E unicode
Enfin on démarre le serveur
$ /etc/rc.d/pgsql start
On crée ensuite la base qui va bien
$ createuser -I -E -P -S -R -D redmine
Renseigner le mot de passe
$ createdb -T template0 -O redmine -E UTF8
Postgresql est maintenant utilisable
Configuration de redmine
$ tar xvfz redmine-0.8.6.tar.gz
$ mv redmine-0.8.6 redmine # non obligatoire
$ cd redmine
Configuration de la base de production redmine
$ cp config/database.yml.example config/database.yml
Il faut modifier ensuite ce fichier pour correspondre à :
production:
adapter: postgresql
database: redmine
host: localhost
username: redmine
password: mon_pwd
On initialise la base redmine :
$ RAILS_ENV=production rake db:migrate
Et on insère les données par défaut :
$ RAILS_ENV=production rake redmine:load_default_data
Afin que redmine puisse fonctionner, l'utilisateur dans lequel va tourner le serveur thin doit pouvoir accéder à certains répertoires :
$ mkdir tmp public/plugin_assets
$ sudo chown -R _redmine:_redmine files log tmp public/plugin_assets
$ sudo chmod -R 755 files log tmp public/plugin_assets
Configuration du serveur thin
Notez que ici redmine est installé dans /home/_redmine
Il faut simplement créer un script rcng pour démarrer automatiquement thin : /etc/rc.d/thin
#!/bin/sh
#
# PROVIDE: thin
# REQUIRE: DAEMON
. /etc/rc.subr
name="thin"
rcvar=$name
command="/usr/pkg/bin/$name"
stop_cmd="/usr/pkg/bin/thin -c /home/_redmine/redmine -e production stop"
command_args="-c /home/_redmine/redmine -e production -d -u _redmine -g _redmine start"
load_rc_config $name
run_rc_command $1
Puis l'activer
$ chmod 755 /etc/rc.d/thin
$ echo "thin=YES" >> /etc/rc.conf
$ /etc/rc.d/thin start
Un serveur thin tourne maintenant sur le port 3000 du serveur
le daemon git
On considère ici que les dépots git se trouveront dans /home/_git/depots Tout comme pour thin il faut simplement créer un script rcng
#!/bin/sh
#
# PROVIDE: gitdaemon
# REQUIRE: DAEMON
. /etc/rc.subr
name="git-daemon"
rcvar=$name
pidfile="/var/run/$name.pid"
command="/usr/pkg/libexec/git-core/git-daemon"
command_args="--detach --base-path=/home/_git/depot --user=_git --group=_git --pid-file=$pidfile"
load_rc_config $name
run_rc_command $1
Puis l'activer
$ chmod 755 /etc/rc.d/gitdaemon
$ echo "gitdaemon=YES" >> /etc/rc.conf
$ /etc/rc.d/gitdaemon start
Déposer les dépots git dans /home/_git/depots et ils seront automatiquement disponibles, par exemple :
Pour un depot /home/_git/depots/CBlog.git :
$ git clone git://monbeauserveur/CBlog.git
Pour plus d'information ici UnixGarden est ton ami : là et là
Conclusion
La forge est maintenant opérationnelle, pour y accéder : http://monbeauserveur:3000 .
UPDATE :
rhaamo vient de rajouter le support de mercurial
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