Xmerge para integrar código refactorizado

16:51 2 Comments

Llevamos unos días con bastante movimiento. Primero lanzamos 3.0, luego anunciamos el nuevo Xdiff, después hicimos una comparativa entre varios controles de versiones bajo escenarios de carga, y machacamos a Perforce y a Subversion, así que ahora voy a ver si puedo explicar, de la forma más simple posible, cómo funciona el nuevo Xmerge.

Mezclando código que se ha movido


Si no te aclaras muy bien con lo que estoy explicando sobre diff y merge, creo que sería mejor que empezases con el post que escribí la semana pasada sobre Xdiff. Hay un vídeo corto y todo por si no te apetece mucho leer :-P.

Básicamente Xmerge aplica la tecnología que hemos desarrollado para Xdiff dentro del proceso de merge (mezcla o integración). El escenario es muy sencillo:

  • Tenemos un fichero con algo de código
  • Tu vas y mueves un método de sitio, desde la parte de arriba hasta abajo, por ejemplo (porque prefieres los privados al final, o símplemente porque sí).
  • Mientras tú haces eso, en mi propia rama de tara, yo voy y cambio el método en su posición "original".
  • Y ahora te toca hacer el merge... ¿Resultado? Pues un rollo a menos que tengas Xmerge :-P

    Código original


    Vamos a empezar con un código muy sencillo como el de la siguiente imagen:



    Alguien mueve el método "multiply" hasta abajo


    El método "multiply" es privado así que vamos a ponerlo al final.

    Una vez movido comprobamos las diferencias en Plastic:



    Y mientras tanto alguien 'refactoriza' el método original


    El método "multiply" no es precísamente una maravilla... :). Vamos a cambiar alguna cosa:



    Estructura de ramas antes de integrar


    Aquí está la estructura de ramas tal y como la dibuja Plastic justo antes de hacer el merge (recuerda que he usado una rama diferente para cada cambio, rama por tarea... lo de siempre!).



    Ejecutando xmerge



    Cuando hagamos el merge de las dos ramas hacia /main (bueno, la primera no va a protestar porque es un cambio directo) obtendremos un conflicto como el siguiente:

    Lo bueno de Xmerge es que lo detecta y te muestra un botón 'xmerge' para avisarte de que te puede echar una mano para resolver este lío. (Haz clic en la imagen de debajo para hacerla más grande).



    Vale, de qué va esto?

    Xmerge detecta que el bloque de código que estás intentando mezclar ha sido movido. Así que detectará también a dónde se ha movido y lanzará un "submerge" sólo de los fragmentos involucrados. Así puedes resolver el conflicto de manera más simple y una vez que lo tengas, el resultado se "pegará" en la herramienta de merge original.



    No sé si queda claro porque es un caso avanzado, pero ninguna herramienta es capaz de hacer algo como esto... Es la tecnología de merge más avanzada del mercado! :)

    Resultado del cross-merged


    Allá va:



    Y la peli...


    Bueno, para los que prefieran "ver la peli en lugar de leer el libro"... :)

    Ponedlo a pantalla completa porque lo he grabado a 1024x768 así que debería verse muy bien.



    Conclusión


    Bueno, no es la funcionalidad más sencilla de explicar de todas las que hemos desarrollado así que... preguntad!

    Esta es nuestra segunda versión de Xmerge. La primera (en Plastic 2.8) era ya capaz de hacer todo lo del "submerge" pero el usuario tenía que localizar el código movido a mano. Ahora es el propio Xmerge el que es capaz de localizar el código movido (de eso va toda la tecnología, claro).

    Estamos preparando más cosas en esta línea, así que atentos al blog :)
  • 2 comentarios:

    WinMerge ya permite desde hace tiempo, detectar código movido.
    ¿Existe la posibilidad de descargarse XMerge como binario separado para poder compararlo con otras soluciones?

    Pablo Santos dijo...

    Hola Carlos.

    ¿WinMerge detecta código que ha sido movido y después modificado? ¿Me podrías pasar el link en el que muestre un ejemplo?

    ¿Es capaz también de gestionarlo durante el merge?

    De momento XMerge es sólo parte de Plastic, pero vamos que podrías usarlo por separado sin problema.

    ¿Qué sistema de control de versiones usas?

    Saludos,

    pablo