Cuando desarrollas software como parte de un equipo, es bastante común que en algún momento tú y Fulanito De Tal modifiquen el mismo archivo para dos cambios distintos y que tengas que reconciliar las diferencias antes de que puedas hacer el check-in. Pero a menudo, las herramientas que vienen con el controlador de código son HO-rrendas (SourceSafe 6.0 anyone?)
Es por eso que una buena herramienta de diferencias es escencial en el toolkit de un desarrollador, y si eres igual de codo ejem, digo... práctico que yo, pues siempre buscas lo bueno, bonito y barato (léase gratis, de preferencia). Así que voy a mencionar 3 de mis favoritas en esta categoría: WinMerge, DiffMerge y BeyondCompare. Todas ellas soportan básicamente las mismas características: comparación de fólderes, múltiples archivos, y archivos con diferentes encodings, pero también tienen uno que otro extra que las hace diferentes e interesantes.
Finalmente, veremos también cómo hacerle para integrarlas a SourceGear Vault (el controlador de código que uso en mi trabajo) de manera que solo tengas que darle clic derecho en el Solution Explorer de Visual Studio, selecciones "Compare..." y voilá, compares la versión local contra la versión controlada.
WinMerge
WinMerge es una herramienta de esas que son gratis en todo el sentido de la palabra. Es gratis para descargar y open source. De las cosas interesantes que ofrece son que permite la creación de los parches de código (para aquellos controladores como CVS, supongo) y tiene integración al shell de Windows, incluso en las versiones de 64 bits (osea que sale si le das un clic-derecho a un archivo en Windows Explorer, te sale la opción para comparar archivos).
De las cosas que no me gustan (y dirás que qué payaso, pero en fin) son que la interfaz está un poco fea, estéticamente hablando y no tan intuitiva. Solo corre en Windows, y la capacidad de editar archivos a la hora de hacer el merge es limitada. Pero aún así es una herramienta bastante competente.
Puedes ver algunos screenshots aquí, y descargalo desde acá.
DiffMerge
Vault viene con una herramienta llamada DiffMerge la cual solo la obtenías con el producto y no era muy robusta. Sin embargo, la semana pasada Eric Sink anunció que DiffMerge 3.0 ahora está disponible de manera gratis y separada. La nueva versión tiene varias bondades que la anterior carecía: comparación de 3 archivos a la vez, soporte para edición de archivos y oh sí, corre en Windows, en Mac OS X o en Linux (!)
De las cosas que no me gustaron está que no tiene integración con el shell de Windows, limitando un poco la capacidad de hacer comparaciones rápidas. Además, cuando comparas fólderes enteros tarda un poco ya que lee todos los archivos en todos los subfólderes de un solo golpe. Pero si no te importa esto, pues vale la pena que lo pruebes.
Puedes ver algunos screenshots aquí, y descargarlo desde acá.
BeyondCompare
BeyondCompare es una de las herramientas que cuesta dinero, pero no mucho ($30 dlls por una licencia individual). De hecho, nosotros compramos 10 licencias a $13 dlls cada una, lo cual es una ganga si lo comparan con otras como Araxis Merge, donde UNA licencia cuesta $130 dlls. He usado BC por años y cada versión solo se pone mejor. Soy fan, y al parecer no soy el único.
Aparte de lo estándar, el feature que nos mantiene con este producto es la habilidad de exportar el reporte de diferencias a un archivo HTML (o XML si así lo deseas). Ninguna otra herramienta barata o gratis que yo haya visto trae esto. Nosotros lo utilizamos para la documentación de los cambios al código, y como parte de nuestro proceso de revisión de código para que otros desarrolladores puedan darle el visto bueno antes de que se le haga check-in a los cambios.
En la columna de "contras" está que carece de la capacidad de hacer un merge automático--lo cual podría ser irrelevante si eres igual de desconfiado que yo en esas operaciones. Y su capacidad de edición de archivos es limitada. Sin embargo, parece que van a agregarle todo eso a la versión 3.0 de BC que va a salir a finales de este año. No estoy seguro si la integración al shell que trae funcione bajo 64 bits.
Puedes descargar una versión shareware de 30 días desde aquí.
Integración de herramientas de diferencia a SourceGear Vault
En mi equipo usamos Vault de SourceGear como nuestro controlador de código. No les voy a escribir una carta de amor sobre el producto, pero sí les diré que es lo que SourceSafe debió ser desde un principio (¿y les comenté que está hecho en .NET?)
El caso es que una de las razones por las que Vault me cae bien, es que te permite configurar la herramienta que desees utilizar para las comparaciones (diff) o para la reconciliación de cambios (merge). Para hacerlo solo tienes que ir a las opciones de Visual Studio y de ahí acceder a las de Vault.
- Desde Visual Studio, selecciona "Options..." del menú "Tools".
- Selecciona "Plug-In Settings" que está debajo de "Source Control" al lado izquierdo.
- Da clic en "Advanced…" (esto te llevará a las opciones de Vault)
- Selecciona "Diff/Merge" del lado izquierdo.
Lo único que tienes que hacer despues de eso, es especificar el programa y los argumentos que le vas a pasar.
Si quieres usar WinMerge, tienes que especificar lo siguiente (tomados de esta página):
| Diff Program: | C:\Program Files\WinMerge\WinMerge.exe\ |
| Diff Arguments: | /dl "%LEFT_LABEL%" /dr "%RIGHT_LABEL%" "%LEFT_PATH%" "%RIGHT_PATH%" |
| Merge Program: | C:\Program Files\WinMerge\WinMerge.exe\ |
| Mege Arguments: | /dl "%WORKING_LABEL%" /dr "%OTHER_LABEL%" "%WORKING_PATH%" "%OTHER_PATH%" "%DEST_PATH%" |
Si quieres utilizar DiffMerge 3.0, entonces solo tienes que modificar la ruta al ejecutable que viene con la configuración de Vault. Quedaría entonces, así:
| Diff Program: | C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe |
| Diff Arguments: | /ro1 /ro2 /title1:"%LEFT_LABEL%" /title2:"%RIGHT_LABEL%" "%LEFT_PATH%" "%RIGHT_PATH%" |
| Merge Program: | C:\Program Files\SourceGear\DiffMerge\DiffMerge.exe |
| Mege Arguments: | /ro1 /ro3 /merge /title1:"%WORKING_LABEL%" /title2:"%DEST_LABEL%" /title3:"%OTHER_LABEL%" /result:"%DEST_PATH%" "%WORKING_PATH%" "%BASELINE_PATH%" "%OTHER_PATH%" |
Y finalmente, si quieres utilizar BeyondCompare, entonces los argumentos serían:
| Diff Program: | C:\Program Files\Beyond Compare 2\BC2.exe |
| Diff Arguments: | /title1="%LEFT_LABEL%" /title2="%RIGHT_LABEL%" "%LEFT_PATH%" "%RIGHT_PATH%" |
O puedes mezclar un poco las cosas. Por ejemplo yo uso BeyondCompare para la funcionalidad de comparación y DiffMerge 3.0 para la funcionalidad de reconciliación.
Conclusión
Una buena herramienta de diferencias es escencial para tu kit de desarrollador. Hay varias en el mercado que son gratis o bastante baratas y que pueden integrarse con tus herramientas de desarrollo. Tómate un tiempecito para echarles un ojo y escoger la que mejor se acomode a tus necesidades.