Fusionar y la ventana del editor de la salida fusionada

La ventana del editor de la salida fusionada (bajo las ventanas de la entrada de diferencias) también tiene una línea de información sobre ella que mostrará «Salida», el nombre del archivo y «[Modificado]» si edita algo. Normalmente contendrá texto que podrá fusionarse automáticamente con facilidad, pero algunas veces también contendrá conflictos.

La opción de guardar se ha desactivado hasta que se hayan resuelto todos los conflictos (use los botones «Ir al conflicto anterior/siguiente sin resolver» para encontrar los conflictos pendientes).

Con solo dos archivos de entrada, cada diferencia es también un conflicto que debe resolverse manualmente.

Con tres archivos de entrada el primer archivo se utiliza como base, mientras que el segundo y tercer archivos de entrada contienen las modificaciones. Si en cualquier línea solo tienen cambios la entrada B o la C, pero no ambas, se seleccionará automáticamente la fuente cambiada. Solo cuando B y C tengan cambios en las mismas líneas, la herramienta detectará un conflicto que debe resolverse manualmente. Cuando B y C sean iguales, pero diferentes a A, se seleccionará C.

La columna resumen

El editor de la salida de la fusión también tiene una columna resumen a su izquierda. Mostrará la letra de la entrada de la que se seleccionó la línea, o nada si las tres fuentes son iguales en esa línea. Para los conflictos mostrará un signo de interrogación «?» y la línea mostrará «<Conflicto de fusión>», en rojo. Puesto que resolver los conflictos línea a línea es muy arduo, las líneas se agruparán en grupos que tengan las mismas diferencias y conflictos característicos. Pero los conflictos causados solo por espacios en blanco se separarán de los conflictos no causados por espacios en blanco para facilitar la fusión de los archivos cuando el sangrado cambia en muchas líneas.

Configurar el grupo actual, sincronizado de fusión y posición de vista de diferencias

Cuando se pulsa en la columna resumen con el botón izquierdo del ratón en la ventana a la que pertenezca este grupo, se seleccionarán todas las ventanas y se mostrará el comienzo de este grupo (esto implica un salto automático en la posición de la ventana si el principio del grupo no se encuentra visible). El grupo se convierte en el «grupo actual». Se resalta con la «gama (diff) de color del fondo actual» y aparecerá una barra negra en la parte izquierda del texto.

Seleccionar las entradas A, B o C para el conflicto actual y la edición

La barra de botones bajo el menú incluye tres botones para seleccionar las entradas que contienen las letras «A», «B» y «C». Pulse el botón selector de entrada para insertar (o eliminar si ya se ha insertado) las líneas de la fuente respectiva. Para seleccionar las líneas de varias entradas pulse los botones correspondientes en el orden que necesite. Por ejemplo, si desea que las líneas de «B» aparezcan antes de las líneas de «A» en la salida, pulse primero «B» y luego «A».

Si estaba utilizando la opción avance automático («Automáticamente ir al conflicto siguiente sin resolver después de una selección de origen»), debería desactivarla antes de elegir líneas desde varias entradas o editar líneas después de su elección. Si no lo hace, KDiff3 saltará al siguiente conflicto después de elegir la primera entrada.

Suele ser práctico para editar directamente la salida resultante de la fusión. La columna resumen mostrará «m» para cada línea que se haya modificado manualmente. Cuando, por ejemplo, las diferencias estén alineadas de forma que la simple elección no sea satisfactoria, puede marcar el texto necesario y utilizar copiar y pegar de forma normal para situarlo en la salida de la fusión.

Algunas veces, cuando una línea se elimina, ya sea por la fusión o por la edición manual, y no hay más líneas en este grupo, aparecerá el texto <Sin línea fuente>. Se coloca en lugar del grupo de forma que pueda cambiar de idea y seleccionar de nuevo la fuente. Este texto no aparecerá en el archivo guardado o en cualquier selección que copie y pegue.

El texto «<Conflicto de fusión>» aparecerá en el portapapeles si copia y pega texto que la contenga. Pero tenga cuidado al hacerlo.

Seleccionar las entradas A, B o C para todos los conflictos

La fusión normal se inicia resolviendo los conflictos sencillos automáticamente. Pero el menú «Fusionar» proporciona algunas acciones para otras necesidades habituales. Si ha seleccionado la misma fuente para más conflictos, podrá seleccionar «A», «B» o «C» en cualquier sitio, o solo para los conflictos pendientes de resolver, o para los conflictos sin resolver que sean debidos a espacios. Si desea decidir cada delta por sí mismo, puede «Establecer deltas a conflictos». O si desea volver a las elecciones automáticas de KDiff3 seleccione «Resolver automáticamente conflictos simples». KDiff3 reiniciará la fusión. Para las acciones que cambien sus modificaciones anteriores, KDiff3 le pedirá confirmación antes de proceder.

Nota: Cuando seleccione fuente para los conflictos de espacios en blanco sin resolver y las opciones «Ignorar números» o «Ignorar comentarios C/C++», los cambios en los números o en los comentarios se tratarán también como espacios en blanco.

Fusión automática de las claves de control de versión y del historial (registro)

Muchos sistemas de control de versión permiten usar palabras claves especiales en el archivo (p. ej.: «$Date$$», «$Header$», «$Author$», «$Log$», etc.) Durante la descarga el sistema de control de versiones (VCS) cambia estas líneas. Por ejemplo, «$Date$» se cambiará por «$Date: 2005/03/22 18:45:01 $». Como esta línea será diferente en cada versión del archivo, podría requerir interacción manual durante la fusión.

KDiff3 ofrece fusión automática para estos elementos. Para las líneas que coincidan con la opción «Fusionar automáticamente expresión regular» en todos los archivos de entrada de KDiff3 se elegirá la línea desde B o -si está disponible- desde C (adicionalmente es necesario que las líneas en cuestión si las comparamos con las líneas anteriores no han de tener conflictos). Esta fusión automática también se puede ejecutar de forma inmediata después de iniciar la fusión (active la opción «Ejecutar expresión regular de fusión automática al iniciar la fusión») o posteriormente a través del menú de fusión «Ejecutar expresión regular de fusión automática»).

También se permite la fusión automática del historial de control de versión (también llamado «registro»). El historial de fusión automática se puede ejecutar automáticamente cuando se inicie la fusión activando la opción «Resolver automáticamente los conflictos del historial».

Normalmente el historial de control de versión comienza con una línea que contiene la palabra clave «$Log$». Esta deberá coincidir con la opción «El historial comienza con la expresión regular». KDiff3 detecta que las siguientes líneas se encuentran en el historial analizando los caracteres importantes que se encuentran delante de la palabra clave «$Log$». Si el mismo «comentario importante» también aparece en las siguientes líneas, también estas se incluirán en el historial.

Durante cada descarga el VCS escribe una única línea especificando la versión, fecha, e información horaria seguida de líneas con comentarios del usuario. Estas líneas forman una entrada de historial. Esta sección del historial crece cada vez que descarga de forma que las entrada más recientes aparecerán en la parte superior (después de la línea de inicio del historial).

Cuando dos o más desarrolladores que están realizando un desarrollo paralelo descargan una rama de un archivo la fusión del historial contendrá varias entradas que aparecerán como conflictos durante la fusión de las ramas. Como esta fusión puede ser muy aburrida, KDiff3 le permite usar dos posibles estrategias: Insertar la información del historial de ambos colaboradores en la parte superior u ordenar la información del historial por una clave definida por el usuario.

El método que simplemente inserta las entradas es fácil de configurar. KDiff3 solo necesita un método para detectar qué líneas pertenecen a una entrada del historial. La mayor parte de los VCS insertan una línea vacía después de cada entrada del historial. Si no hay otras líneas vacías, este criterio es suficiente para KDiff3. Seleccione «Entrada del historial que inicia una expresión regular». Si el criterio de la línea vacía no es suficiente, puede especificar una expresión regular para detectar el inicio de la entrada del historial.

Tenga en cuenta que KDiff3 eliminará las entradas duplicadas del historial. Si una entrada aparece varias veces en el historial de un archivo de entrada, solo permanecerá una entrada en la salida.

Si desea ordenar el historial, debe especificar cómo se debe construir la clave de ordenación. Utilice paréntesis en «Entrada del historial que inicia una expresión regular» para agrupar partes del a expresión regular que se deberían utilizar posteriormente para la tecla de ordenación. A continuación especifique «Orden de la clave de ordenación que inicia la entrada del historial» especificando una lista de números separados por una coma «,» para referirse a la posición del grupo en la expresión regular.

Debido a que no es sencillo de hacer al primer intento, podrá comprobar y mejorar la expresión regular y la generación de clave en un diálogo dedicado pulsando el botón «Comprobar sus expresiones regulares».

Ejemplo: Supongamos que tenemos un historial similar a este:

/**************************************************************************
** HISTORIAL:    $Log: \vista_principal_de_tom\MiAplicación\src\algoritmocomplejo.cpp $
**
**     \main\rama_integración_12   2 Abr 2001 10:45:41   tom
**  rama fusionada simon_rama_15.
**
**     \main\henry_correccionerrores_rama_7\1   30 Mar 2001 19:22:05   henry
**  mejora la velocidad de la subrutina convertToMesh().
**  Eliminación de fallo.
**************************************************************************/

La línea de comienzo del historial es la que coincida con la expresión regular ".*\$Log.*\$.*". Las siguientes son las entradas del historial.

La línea con «$Log$» -la palabra clave comienza con dos «*» seguidos de un espacio. KDiff3 utiliza la cadena con el primer espacio no vacío como «comentario importante» y asume que el historial finaliza en la primera línea sin este comentario importante. En este ejemplo la última línea finaliza con una cadena que también comienza con dos «*», pero en lugar de un carácter de espacio le siguen más «*». Por tanto, esta línea finalizará el historial.

Si no es necesaria la ordenación del historial, la entrada del historial comenzará con una línea de expresión regular como esta (esta línea se divide en dos porque, en caso contrario, no se podría ajustar)

\s*\\main\\\S+\s+[0-9]+ (Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)
 [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*

Para obtener detalles sobre las expresiones regulares, por favor, consulte la documentación de las expresiones regulares de Trolltech. Tenga en cuenta que «\s» (con la «s» minúscula) coincidirá con cualquier espacio y «\S» (con «S» mayúscula) coincidirá con lo que no sean espacios en blanco. En nuestro ejemplo la entrada del historial deberá contener primero la versión de información de la expresión regular "\\main\\\S+", la fecha formada por el día «[0-9]+», mes «(Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)» y año «[0-9][0-9][0-9][0-9]», la hora «[0-9][0-9]:[0-9][0-9]:[0-9][0-9]» y, finalmente, el nombre de registro del desarrollador «.*».

Observe que el «comentario importante» (en el ejemplo «**») lo eliminará KDiff3 antes de buscar la coincidencia, de ahí que la expresión regular comience con con una expresión regular para ninguno o más espacios en blanco «.*». Puesto que los caracteres de comentario puede ser diferentes en cada archivo (por ejemplo, C/C++ utilizan caracteres de comentarios diferentes a los que utiliza Perl script) KDiff3 tiene en cuenta los caracteres de los comentarios y no debería especificarlos en la expresión regular.

Si necesita un historial ordenado, se calculará la clave de ordenación. Para esta las partes relevantes en la expresión regular se deben agrupar entre paréntesis (los paréntesis adicionales puede mantenerse aunque desactive la ordenación del historial).

(Ene|Feb|Mar|Abr|May|Jun|Jul|Ago|Sep|Oct|Nov|Dic)
 ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)

Los paréntesis ahora contendrán: 1. versión de información, 2. día, 3. mes, 4. año, 5. hora, 6. nombre. Pero si deseamos ordenarlos por fecha y hora, necesitará construir una clave con los elementos en un orden de aparición diferente: Primero el año, seguido del mes, día, hora, información de versión y nombre. De ahí que el orden de la clave de ordenación que se deba especificar sea «4,3,2,5,1,6».

Ya que los nombres de los meses no son buenos para la ordenación («Abr» iría primero) KDiff3 detectará que son nombres de meses y utilizará números en su lugar («Abr»->«04»). Si se encuentra un número puro se transformará en un valor de 4 dígitos con ceros significativos para la ordenación. Finalmente la clave de ordenación resultante que iniciará la primera entrada del historial será:

2001 04 0002 10:45:41 rama_integración_12   tom 

Para obtener más detalles consulte también Preferencias de fusión.