Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Migración del repositorio Subversion de IRCD e IRCD-OoB a Mercurial

Última Actualización: 17 de enero de 2013

De 1996 a 2004 fui el programador principal de IRC-Hispano. Al principio simplemente editaba el código fuente confiando en los backups y en hacer copias explícitas de vez en cuando (cuando iba a tocar algo "gordo"). Luego empecé a usar CVS. Más tarde migré ese repositorio CVS a Subversion.

Aunque dejé el desarrollo IRC en 2004 (pasé a Jabber/XMPP), siempre he querido publicar el código que desarrollé. El problema es que mucho código pertenecía a IRC Hispano (desarrollo pagado), y otro a Argo. A finales de 2012 conseguí el permiso de todo el mundo para publicar ese código "antiguo", porque hace años que no está en producción y ya no tiene valor comercial.

Pero creo que sí tiene valor técnico, y que merece ser preservado y puesto a disposición pública.

El primer código publicado fue el código fuente del servidor IRC (esto se ha ido publicando siempre durante 1996-2004, porque era el servidor utilizado en la red IRC-Hispano), y el código fuente de una variante particular de Argo, el IRC-OoB, para comercializar su tecnología de "IRC sobre Túneles IP".

Publicar este código fue complicado por varios motivos:

  • Quería publicarlo bajo Mercurial, para que fuese accesible vía web y que continuar su desarrollo fuese fácil.

  • El repositorio original estaba en Subversion, y provenía de una migración de un repositorio CVS. Que a su vez proviene de ficheros sin versionar (no hay un archivo histórico de cambios completo). Por tanto la historia es bastante enmarañada, y hay muchos "commits" espurios generados por las herramientas de migración.

  • En el mismo repositorio se conservaban varios proyectos diferentes. Algunos confidenciales aún hoy. Otros se publicarán de forma separada.

  • Hay documentos confidenciales en el repositorio que no se deberían publicar.

  • Cada vez que sacaba una versión pública de IRCD, creaba una rama nueva para hacer la versión OoB para Argo. Portaba a dicha rama, a mano, los cambios OoB para la versión anterior, debido a que el soporte de "merge" en Subversion es penoso (y aún lo era más antes de 2004).

    En un sistema de control de versiones moderno, como Mercurial, existiría una rama OoB permanente y única, y se iría haciendo "merge" desde la rama principal cuando fuese necesario, conservando una historia lineal y bastante simple.

Mercurial tiene una herramienta de migración capaz de importar repositorios en un buen número de formatos, incluyendo subversion. En el proceso se pueden hacer muchos ajustes y adaptaciones. Es una tarea poco documentada, así que me parece interesante publicar aquí los detalles de la migración.

La migración consta de tres scripts.

El primer script es complicado, y me costó un par de días de esfuerzo:

echo "jcea=Jesus Cea <jcea@jcea.es>" > authors.txt
echo "root=Jesus Cea <jcea@jcea.es>" >> authors.txt

rm -r ircd-hg/* ircd-hg/.*

hg convert --datesort --authors authors.txt ircd-svn ircd-hg

(
  cd ircd-hg
  hg branches | grep "^u2.*-OoB " | cut -d" " -f1 | sed 's/\(.*\)/\1 OoB/g'
) > branchmap.txt

(
  cd ircd-hg
  >../tags.txt
  previo=`hg log -r "max(branch('OoB'))" --template "{node}"`
  for i in `hg branches | grep "^u2.*-OoB " | cut -d" " -f1 | tac`
  do
    cabeza=`hg log -r "min(branch('$i'))" --template "{node}"`
    cola=`hg log -r "max(branch('$i'))" --template "{node}"`
    padre=`hg log -r "p1('$cabeza')" --template "{node}"`
    origen=`grep $cabeza .hg/shamap |cut -d" " -f1`
    p1=`grep $previo .hg/shamap |cut -d" " -f1`
    p2=`grep $padre .hg/shamap |cut -d" " -f1`
    echo $origen $p1,$p2
    previo=$cola
    echo $cola $i >>../tags.txt
  done
) > splicemap.txt

echo svn:db5442c5-c7e5-0310-8be0-98c3e449b2ea/branches/u2_10_H_08_11-OoB@5 \
svn:db5442c5-c7e5-0310-8be0-98c3e449b2ea/branches/u2_10_H_08_02-OoB@179 >>splicemap.txt

rm -r ircd-hg/* ircd-hg/.*

hg convert --datesort --authors authors.txt \
           --branchmap branchmap.txt \
           --splicemap splicemap.txt ircd-svn ircd-hg

(
  cd ircd-hg
  hg up -r OoB
  cat >.hgtags <<EOF
1895195c18956e4a0e6aa1373bafd05041a14cb7 u2_10_H_02_50
193341efc64e8c83277127d5ef400a2567311f18 u2_10_H_04_49
32ecba8435e7b7a45951887e29913b08b385e144 u2_10_H_04_49-OoB
04ab0446ef2f6cd0b0df86a7dec31a2bd8f5d539 u2_10_H_04_77
75e8c877d25c6263b135583b97015bde13995bfc u2_10_H_04_77-OoB
1cb73c1e386ac5c6028858f230e7b64f4c0a77c9 u2_10_H_04_78
2dc8d602ddcc5c1115985eee53be56257404b049 u2_10_H_04_76
da705213e1ab283eae95de553be078a2176b5d6f u2_10_H_04_76-OoB
3c5569acc0f35eab99ec91f45a38d8dc7354c726 u2_10_H_05_68
929b7f7d55cb59b39327c166c037dc7cd5d80d84 u2_10_H_05_68-OoB
61357553b1c85f14d785740a759793bcdf9a0d76 u2_10_H_04_00
496f026b5e1b7f222f25bc2e1b804b243330397f u2_10_H_04_01-OoB
52d11a2113cc1ea18c091dfac180032a662580a2 u2_10_H_07_01
f0034e1e977a9a6ec68d93551933bdc3f5ed66e9 u2_10_H_07_01-OoB
281db3077047902faa040fa9d19458efc6b29d8a u2_10_H_06_01
95e2eb38aa642109e1ad9415c8294178cd1f3b22 u2_10_H_06_01-OoB
a115162858afb85aa284bfa15268e6dcc98338ce u2_10_H_06_28
a6d437beccd48b2d71c07a0cc0a60724d1b41ceb u2_10_H_04_20
4516fb6cf46e0f8bd66721171bbb31b603919a49 u2_10_H_04_20-OoB
c6ea93c65562a9a8b0a00d0d3efae904f10e2c45 u2_10_H_05_69
2dc7a15458e5a9a8252b1e05c9ab36b08c52fb71 u2_10_H_05_69-OoB
db8c971997fdb536d82ec95ffc7459f0c88206b4 u2_10_H_04_79
896ff83568e458ae1c4c762d60df8a8b7f42aa2e u2_10_H_04_79-OoB
043ea4c036701bede90d183a9eb9a9ffc084d2c9 u2_10_H_09_13
c175c599a3b879011ba552e033d593c2b81bdd2a u2_10_H_09_13-OoB
67d0478154e0e33a2c61cba27f50d20f23a78d6f u2_10_H_07_10
baddd836fbaecff708e07055d9a9550c55085a72 u2_10_H_07_10-OoB
ec8c0260371d51d7b7036e9832858355d8ca594a u2_10_H_03_38
cf4fa7d2f1a3e4d88092ee7be6f8dc20c8477bf4 u2_10_H_03_38-OoB
dd26404b3c37a9614c822baa65986865b20ba7a0 u2_10_H_08_01
0fd66ce6b40d61e2bec2d473f270d22e5d9af2df u2_10_H_08_01-OoB
eafbcc80e35c09ab78a45c0b71d3f7e18e744992 u2_10_H_08_02
74dfd76c2c903cbca4c7fc668b14ad59c4c20563 u2_10_H_08_18
fb70cf649a808815f45997b4dd27cc2bb0327328 u2_10_H_08_18-OoB
4636ae62f9c6d45f544f1322c8fab79ebe5f0f3b u2_10_H_08_66
751e938d9cc10cec029483ff2049ca18162c4484 u2_10_H_08_66-OoB
be5d090b8927a7270082a50c9e98fee420e6675e u2_10_H_09_04
8ed2e39d89b54c4b5e2a1913c5f4899938513b64 u2_10_H_09_04-OoB
EOF
  hg add .hgtags
  hg comm -m "Configura tags"
)

Este script realiza una primera migración de Subversion a Mercurial. De hecho se realizan dos migraciones. En la primera, se hace una migración directa, sin más. De esa migración se extrae información de ramas que quiero unificar, y se calculan los puntos de corte para convertir un repositorio muy ramificado con muchas ramas espurias (limitaciones de Subversion) a una única rama OoB. También se corrige un "merge" fantasma en el repositorio original, que no queremos.

Una vez obtenida toda esa información, y generados los ficheros de configuración correspondientes, se borra el repositorio migrado y se realiza una migración nueva desde Subversion, en esta ocasión realizando los ajustes calculados.

Por último, se añaden "tags" para identificar las diferentes versiones.

Los siguientes scripts son más sencillos:

\rm -r ircd-hg2/* ircd-hg2/.*
hg clone -r OoB ircd-hg ircd-hg2
cd ircd-hg2
hg pull -r ircd

Este script simplemente toma el repositorio Mercurial generado con el script anterior y extrae dos ramas de él (el repositorio contiene código de otros proyectos): la rama "OoB" y la rama "ircd".

El tercer script nos da un repositorio limpito y listo para publicar:

echo "ircd default" >branchmap.txt

cat >filemap.txt <<EOF
exclude agenda.c
exclude agenda_lista.c
exclude agenda_sms.py
exclude analiza_dump
exclude berkeleydb.c
exclude berkeleydb.h
exclude berkeleydb2.h
exclude cibercafes
exclude claves_de_cifrado
exclude comandos.c
exclude comandos.h
exclude config.h
exclude db.c
exclude db.h
exclude dbuf.c
exclude dbuf.h
exclude ilines_lista.c
exclude ipvirtual.c
exclude m_db.c
exclude m_db.h
exclude malloc.c
exclude malloc.h
exclude max_clones
exclude mod_bdd.h
exclude mod_berkeleydb.c
exclude mod_berkeleydb.h
exclude mod_ipc.h
exclude mod_notify.h
exclude mod_notify_db.h
exclude mod_privmsg.h
exclude mod_servmsg.h
exclude mod_tools.h
exclude module.h
exclude modulos
exclude modulos.c
exclude modulos.h
exclude modulos_python.c
exclude modulos_python.h
exclude nicks_lista.c
exclude olimpo.c
exclude privmsg.c
exclude privmsg.h
exclude saluda.c
exclude shared.c
exclude shared.h
exclude strlcat.c
exclude strlcpy.3
exclude strlcpy.c
exclude version.h
exclude z0
exclude z1
exclude z2
exclude z3
exclude z4
exclude z42
exclude z5
exclude z52
exclude z6
exclude z7
exclude z7.plantilla_email
EOF

rm -r ircd-hg3/* ircd-hg3/.*
hg convert --datesort --branchmap branchmap.txt \
                      --filemap filemap.txt ircd-hg2 ircd-hg3

Este script realiza una conversión de un repositorio Mercurial a otro, cambiando el nombre de la rama "ircd" a "default", siguiendo la convención habitual, y excluyendo numerosos ficheros ajenos al servidor IRCD, a pesar de haber limitado las ramas que hemos exportado (culpa mía, por mezclar cosas en el repositorio original. He aprendido mucho desde entonces :). Esos ficheros se corresponden al código fuente de Olimpo, y se publicarán de forma separada.

El resultado.

Los detalles de lo liberado.


Historia

  • 13/ene/13: Primera versión de este documento.



Python Zope ©2013 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS