
A janela do editor do resultado da junção (por baixo das janelas de introdução de diferenças) também tem uma linha de informação no topo que mostra "Resultado:", o nome do ficheiro e "[Modificado]" se você tiver alterado alguma coisa. Normalmente irá conter algum texto resultante das funcionalidades de junção automática, mas frequentemente irá conter também conflitos.
A gravação está desactivada até que todos os conflitos estejam resolvidos. (Use os botões para "Ir para o Conflito por Resolver Anterior/Seguinte" para descobrir os conflitos que faltam.)
Com apenas dois ficheiros de entrada, todas as diferenças são também conflitos que necessitam de ser resolvidos manualmente.
Com três ficheiros de entrada, o primeiro ficheiro é tratado como a base, enquanto que o segundo e o terceiro contêm as modificações. Quando, em qualquer linha, só o ficheiro B ou o C tiverem sido alterados mas não ambos, então será seleccionada a origem alterada. Só quando o B e o C alteraram as mesmas linhas é que a ferramenta detecta um conflito que deverá ser resolvido manualmente. Quando o B e o C são iguais mas não são o mesmo que o A, é seleccionado o C.
A janela do editor do resultado da junção também tem uma coluna de resumo à esquerda. Mostra a letra do ficheiro de entrada para o qual foi seleccionada a linha ou nada, se todas as três origens são iguais nessa linha. Para os conflitos, ela mostra um ponto de interrogação "?" e a linha mostra "<Conflito na Junção>", tudo a vermelho. Dado que a resolução de conflitos linha a linha poderá levar bastante tempo, as linhas são reunidas em grupos com as mesmas características de diferenças e conflitos. Mas os conflitos só com espaços em branco são separados dos outros conflitos para facilitar a junção dos ficheiros em que a indentação foi alterada em várias linhas.
Ao carregar na coluna do resumo com o botão do rato em ambas as janelas, o grupo que pertença a essa linha será seleccionado em todas as janelas e o início desse grupo será mostrado. (Isto poderá envolver um salto de posição automático para a janelas se o início do grupo não estiver visível). Este grupo fica então o "grupo actual". Fica realçado com a "Cor de fundo do intervalo actual" e aparece uma barra preta do lado esquerdo do texto.
A barra de botões por baixo do menu contém três botões de selecção que contêm as letras "A", "B" e "C". Carregue no selector de entrada para inserir (ou remover se já estiver inserido) as linhas da origem respectiva. Para escolher as linhas de várias entradas, carregue nos botões respectivos pela ordem necessária. Por exemplo, se quiser que as linhas de "B" apareçam antes das linhas de "A" no resultado, carregue primeiro em "B" e depois em "A".
Se usar a opção de avanço automático ("Ir automaticamente para o próximo conflito não resolvido após a selecção da fonte"), deverá desactivar isto antes de escolher as linhas de várias entradas ou se quiser editar as linhas após a sua escolha. Caso contrário, o KDiff3 irá saltar para o próximo conflito após a selecção da primeira entrada.
Normalmente é útil editar directamente o resultado da junção. A coluna de resumo irá mostrar "m" por cada linha modificada manualmente. Quando, por exemplo, as diferenças estão alinhadas de forma que não seja satisfatório escolher simplesmente as entradas, então poderá marcar o texto necessário e usar a cópia e colagem normais para colocar no resultado da junção.
Algumas das vezes, quando uma linha é removida tanto por junção automática como por edição e não ficam mais nenhumas linhas nesse grupo, então o texto "<Sem linha de origem>" irá aparecer nessa linha. Isto é apenas um substituto para o grupo, quando decidir mudar de ideias e seleccionar algum texto de origem de novo. Este texto não irá aparecer no ficheiro gravado ou em qualquer selecção que deseje copiar e colar.
O texto "<Conflito na Junção>" irá aparecer na área de transferência se copiar e colar algum texto que tenha uma dessas linhas. Mas tenha à mesma cuidado ao fazê-lo.
A junção normal irá começar por resolver os conflitos simples automaticamente. Mas o menu "Juntar" oferece algumas acções para outros usos comuns. Se você tiver de seleccionar a mesma origem para a maioria dos conflitos, então poderá escolher "A", "B" ou "C" em qualquer lado ou apenas para os conflitos que continuem ainda por resolver ou então para os conflitos de espaços em branco por resolver. Se quiser decidir cada um dos deltas por si próprio, poderá "Passar os deltas para conflitos". Ou, se preferir voltar às escolhas automáticas do KDiff3, seleccione então a opção "Resolver automaticamente os conflitos simples". Nesse caso, o KDiff3 irá reiniciar a junção. Para as acções que alteram as suas modificações anteriores, o KDiff3 pedir-lhe-á uma confirmação antes de prosseguir.
Nota: Ao escolher uma das origens para os conflitos que não sejam de espaços em branco e as opções "Ignorar os Números" ou "Ignorar os Comentários de C/C++" forem usadas, então as alterações nos números ou comentários serão tratadas como espaços em branco também.
Muitos sistemas de controlo de versões suportam palavras-chave especiais no ficheiro. (p.ex. "$Date: 2006-03-31 15:21:46 +0100 (Sex, 31 Mar 2006) $", "$Header$", "$Author: scripty $", "$Log$" etc.) Durante o envio de novas versões, o sistema de controlo de versões (SCV) muda essas linhas. Por exemplo, o "$Date: 2006-03-31 15:21:46 +0100 (Sex, 31 Mar 2006) $" passará a "$Date: 2006-03-30 17:52:41 +0200 (Thu, 30 Mar 2006) $". Dado que esta linha será diferente em cada versão do ficheiro, iria necessitar de intervenção manual durante a junção.
O KDiff3 oferece a junção automática destes itens. Para as linhas simples que correspondam à opção da "Expressão regular da junção automática" para todos os ficheiros de entrada, o KDiff3 irá escolher a linha do B ou - se disponível - do C. (Para além disso, é necessário que as linhas em questão se alinhem na comparação e a linha anterior não contenha conflitos). Esta junção automática pode tanto correr automaticamente após o início de uma junção (active a opção "Executar a junção automática da expressão regular no início da junção") como posteriormente, através do menu de junção "Executar a Junção Automática da Expressão Regular".
A junção automática para o histórico do controlo de versões (também chamado de "registo") é também suportada. A junção automática do histórico tanto poderá correr automaticamente quando iniciar a junção, activando para tal a opção "Juntar o histórico do controlo de versões no início da junção" ou mais tarde através do menu de junção "Resolver Automaticamente os Conflitos do Histórico".
Normalmente, o histórico do controlo de versões começa por uma linha que contém a palavra-chave "$Log$". Isto deverá corresponder à opção "Expressão regular do início do histórico". O KDiff3 detecta quais as linhas subsequentes no histórico, analisando os caracteres iniciais que aparecem antes da palavra-chave "$Log$". Se também aparecer o mesmo "comentário inicial" nas linhas seguintes, então estas também serão incluídas no histórico.
Durante o envio de cada nova versão, o SCV grava uma linha única que indica a versão, a data e a hora, seguida de linhas com os comentários dos utilizadores. Essas linhas formam um item de histórico. Esta secção do histórico vai crescendo com o envio de versões novas e os itens mais recentes aparecem no topo (a seguir à linha inicial do histórico).
Quando, em desenvolvimentos paralelos, dois ou mais programadores enviam versões em ramificações diferentes, o histórico da junção irá conter vários itens que aparecem como conflitos na junção das ramificações. Dado que a junção destes se poderá tornar demasiado aborrecidas, o KDiff3 oferece o suporte com duas estratégias possíveis: basta introduzir a informação de histórico de ambas as contribuições no topo ou ordenar a informação de histórico do utilizador, usando uma chave definida pelo mesmo.
O método basta-inserir-todos-os-itens é mais fácil de configurar. O KDiff3 só precisa de um método para detectar as linhas que pertencem a um item de histórico. A maioria dos SCV inserem uma linha em branco, após cada item do histórico. Se não existirem mais linhas em branco, então este será um critério suficiente para o KDiff3. Basta introduzir uma "Expressão regular do início do item de histórico" em branco. Se o critério da linha vazia não for suficiente, poderá indicar uma expressão regular para detectar o início do item do histórico.
Lembre-se que o KDiff3 irá remover os itens de histórico duplicados. Se um item de histórico aparecia várias vezes no histórico de um ficheiro de entra, só um irá aparecer no resultado.
Se quiser ordenar o histórico, então terá de indicar como deverá ser gerada a chave de ordenação. Use parêntesis na "Expressão regular do início do item de histórico" para agrupar as partes da expressão regular que deverão mais tarde ser usadas na chave de ordenação. Indique depois a "Ordem da chave de ordenação do início do item de histórico", indicando para tal uma lista de números separados por ",", referentes à posição do grupo na expressão regular.
Dado que isto não é tão simples de pôr a funcionar logo, poderá testar e melhorar as expressões regulares e gerar as chaves, numa janela dedicada, se carregar no botão "Testar as suas expressões regulares".
Exemplo: Assuma um histórico que se pareça ao seguinte:
/************************************************************************** ** HISTORY: $Log: \janela_do_ze\Aplicacao\src\algoritmo-complexo.cpp $ ** ** \principal\ramo_integracao_12 2 Abr 2001 10:45:41 ze ** Juntou-se a ramificação manel_versao_15. ** ** \principal\ramo_correccao_erros_7\1 30 Mar 2001 19:22:05 pedro ** Melhorias na velocidade da sub-rotina convertToMesh(). ** Correcção do estoiro. **************************************************************************/
A linha inicial do histórico corresponde à expressão regular ".*\$Log.*\$.*". Depois, seguem-se os itens de histórico.
A linha com a palavra-chave "$Log$" começa com dois "*", após os quais se segue um espaço. O KDiff3 usa o primeiro texto não-branco como "comentários iniciais" e assume que o histórico termina na primeira linha sem esse comentário inicial. Neste exemplo, a última linha termina com um texto que também começa por dois "*" mas, em vez de um espaço, seguem-se mais "*". Como tal, esta linha termina o histórico.
Se a ordenação do histórico não for necessária, então a expressão regular do início de linha do item de histórico poderá ser algo como se segue. (Esta linha está dividida em dois, por não caber de outra forma.)
\s*\\principal\\\S+\s+[0-9]+ (Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez) [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*
Para mais detalhes sobre as expressões regulares, veja por favor a documentação da Trolltech sobre expressões regulares. Repare que o "\s" (com o "s" minúsculo) corresponde a qualquer espaço em branco e o "\S" (com o "S" maiúsculo) corresponde a qualquer carácter não-branco. No nosso exemplo, o início do item de histórico, contém primeiro a informação da versão com a expressão regular "\\principal\\\S+", a data consiste no dia "[0-9]+", mês "(Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez)" e no ano "[0-9][0-9][0-9][0-9]", a hora "[0-9][0-9]:[0-9][0-9]:[0-9][0-9]" e, finalmente, o nomes do programador ".*".
Repare nos caracteres do "comentário inicial" (no exemplo "**"), que terão já sido removidos pelo KDiff3 antes de tentar a junção; como tal, a expressão regular começa com uma correspondência a zero ou mais espaços em branco "\s*". Dado que os caracteres de comentários poderão ser diferentes para cada ficheiro (p.ex., o C/C++ usa caracteres de comentários diferentes de um programa em Perl), o KDiff3 toma conta dos caracteres de comentário iniciais e você não os deverá definir na expressão regular.
Se precisar de um histórico ordenado, então deverá ser calculada a chave de ordenação. Para tal, as partes relevantes da expressão regular deverão ser agrupadas entre parêntesis. (os parêntesis extra poderão ficar à mesma, mesmo que a ordenação do histórico esteja desactivada.)
\s*\\principal\\(\S+)\s+([0-9]+) (Jan|Fev|Mar|Abr|Mai|Jun|Jul|Ago|Set|Out|Nov|Dez) ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)
Os parêntesis contêm agora 1. a informação de versão, 2. dia, 3. mês, 4. ano, 5. hora, 6. nome. Mas, se pretender ordenar por data e hora, é necessário construir uma chave com os elementos por uma ordem de aparência diferente: Primeiro o ano, seguido do mês, dia, hora, informação de versão e nome. Daí, a ordem da chave de ordenação será "4,3,2,5,1,6".
Dado que os nomes dos meses não são bons para ordenar (o "Abr" viria em primeiro lugar), o KDiff3 detecta em que ordem os nomes dos meses foram dados e usa esse número em alternativa ("Abr"->"04"). E, se for encontrado um número puro, será transformado num valor de 4 algarismos com zeros iniciais para ordenar. Finalmente, a chave de ordenação resultante da linha inicial do primeiro item de histórico será:
2001 04 0002 10:45:41 ramo_integracao_12 ze
Para mais informações, veja também a Opções de Junção.