Comparação e Junção de Directorias com o KDiff3

Introdução
Normalmente, os programadores precisam de modificar vários ficheiros numa pasta para atingir os seus fins. Para isso, o KDiff3 também lhe permite comparar e juntar várias pastas de forma recursiva!
Ainda que a comparação e junção de pastas pareça ser bastante óbvia, existem vários detalhes que o utilizador deverá conhecer. O mais importante é, obviamente, o facto de que vários ficheiros poderão ser afectados por cada operação. Se não tiver cópias de segurança dos seus dados originais, então poderá ser bastante difícil ou mesmo impossível de voltar ao estado original. Por isso, antes de começar uma junção, certifique-se que os seus dados estão a salvo e que é possível voltar atrás. Se cria um pacote ou usa um sistema de controlo de versões é uma decisão sua, mas mesmo os programadores experientes e os integradores precisam do código antigo e do novo. E repare que até ao autor do KDiff3 tenta fazer o seu melhor, mas não pode garantir que não existam erros. De acordo com a GPL da , não existe NENHUMA GARANTIA de qualquer forma para este programa. Por isso, seja humilde e tenha sempre em mente:
Errar é humano, mas para realmente baralhar as coisas é preciso um computador.
Por isso, este é o programa que poderá fazer isto por si: o KDiff3 ...
... lê e compara duas ou três pastas recursivamente,
... tem um cuidado especial com as ligações simbólicas,
... permite-lhe navegar nos ficheiros com um duplo-click do rato,
... propõe para cada item uma operação de junção, a qual poderá alterar antes de iniciar a junção de pastas,
... permite-lhe simular a junção e lista as acções que iriam tomar lugar, sem fazer nada de facto,
... permite-lhe fazer realmente a junção, possibilitando também a você interagir nas situações em que é necessária uma interacção manual,
... permite-lhe executar a operação seleccionada para todos os itens (tecla F7) ou para o item seleccionado (tecla F6),
... permite-lhe continuar a junção depois de uma interacção manual com a tecla F7,
... cria opcionalmente cópias de segurança com a extensão .orig,
...

Iniciar a Comparação ou Junção de Directoria
Isto é bastante semelhante à junção e comparação simples com ficheiros únicos. O utilizador apenas terá de indicar nomes de pastas na linha de comandos ou na janela de abertura de ficheiros.

Comparar/Juntar duas directorias:

kdiff3 pasta1 pasta2
   kdiff3 pasta1 pasta2 -o pastadest

Se não for indicada nenhuma pasta de destino, então o KDiff3 irá usar a pasta2.

Comparar/Juntar estas pastas:

kdiff3 pasta1 pasta2 pasta3
   kdiff3 pasta1 pasta2 pasta3 -o pastadest

Quando forem reunidas três pastas, então a pasta1 será usada como a base para a junção. Se não for indicada nenhuma pasta de destino, então o KDiff3 irá usar a pasta3 como pasta de destino para a junção.
Repare que só a comparação é que começa automaticamente, não a junção. Para tal, terá de seleccionar primeiro um item do menu ou a tecla F7. (Mais detalhes posteriormente.)

Informação Visível
Ao ler as pastas, aparece uma mensagem que o informa do progresso. Se você interromper a pesquisa das pastas, então só os ficheiros que tenham sido comparados até então serão listados.
Quando a pesquisa de pastas estiver completa, então o KDiff3 irá mostrar uma lista com os resultados restantes, ...
... e os detalhes sobre o item seleccionado de momento à direita:

A Coluna do Nome
Cada ficheiro e pasta encontrado durante a pesquisa é aqui mostrado numa árvore. Você poderá seleccionar um item se carregar nele uma vez com o rato.
As pastas estão fechadas por omissão. Você poderá expandi-las e fechá-las se carregar no +/- ou se fizer duplo-click no item ou ainda usando as teclas de cursores esquerda/direita. O menu Directoria também contém duas acções Fechar Todas as Sub-Directorias e Expandir Todas as Sub-Directorias, com as quais poderá fechar ou abrir todas as subpastas de uma vez.
Se fizer duplo-click num item de um ficheiro, então a comparação do ficheiro irá começar e irá aparecer a janela de diferenças do ficheiro.
A imagem na coluna do nome reflecte o tio de ficheiro na primeira pasta (A). Poderá ser um dos seguintes:
Ficheiro normal
Pasta normal (imagem de pasta)
Ligação para um ficheiro (imagem de ficheiro com uma seta de ligação)
Ligação para uma pasta (imagem de pasta com uma seta de ligação)
Se o tipo de ficheiro for diferente nas outras pastas, então isso é visível nas colunas A/B/C e na janela que mostra os detalhes sobre o item seleccionado. Repare que, neste caso, não poderá ser seleccionada nenhuma operação de junção automaticamente. Ao iniciar a junção, então o utilizador será informado dos problemas desse tipo.

As Colunas A/B/C e o Esquema de Cores
Como pode ser visto na imagem acima, as cores vermelha, verde, amarela e preta são usadas nas colunas A/B/C.
Preto: O item não existe nesta pasta.
Verde: Item mais recente.
Amarelo: Mais antigo que o verde, mais recente que o vermelho.
Vermelho: O item mais antigo.
Contudo, para os itens que eram idênticos na comparação, a sua cor é também idêntica mesmo que a idade seja diferente.
As pastas são consideradas iguais se todos os itens que contêm forem idênticos. Nesse caso, elas terão a mesma cor. Porém, a idade de uma pasta não é tida em consideração de acordo com a sua cor.
A ideia do autor para este esquema de coloração veio do dirdiff. As cores lembram as cores de uma folha que é verde quando é nova, vai-se tornando amarela com o tempo e é vermelha quando é antiga.

A Coluna de Operação
Depois de comparar as patas, o KDiff3 avalia também uma proposta para uma operação de junção. Esta é mostrada na coluna de Operação. O utilizador poderá modificar a operação se carregar na operação que deseja alterar. Irá aparecer um pequeno menu que lhe permite seleccionar uma operação para esse item (Poderá também seleccionar as operações mais necessárias através do teclado. O Ctrl+1/2/3/4/Del irá seleccionar o A/B/C/Juntar/Remover, respectivamente, se estiver disponível.) Esta operação será executada durante a junção. Depende do item e do modo de junção em que se encontra e de que operações estão disponíveis. O modo de junção é um dos seguintes
Junção de três pastas (a A é tratada como a base mais antiga de ambas).
Junção de duas pastas.
Modo de sincronização de duas pastas (activado com a opção Sincronizar as Directorias).
Na junção de três pastas, a proposta de operação será: Se para um item ...
todas as três pastas forem iguais: Copiar do C
o A e o C são iguais mas o B não: Copiar a partir do B (ou se o B não existir, remover o destino se existir)
o A e o B são iguais mas o C não: Copiar a partir do C (ou se o C não existir, remover o destino se existir)
o B e o C são iguais mas o A não: Copiar a partir do C (ou se o C não existir, remover o destino se existir)
só o A existir: Remover o destino (se existir)
só o B existir: Copiar a partir do B
só o C existir: Copiar a partir do C
o A, o B e o C não são iguais: Juntar
o A, o B e o C não tiverem o mesmo tipo de ficheiro (⪚ o A é uma pasta e o B um ficheiro): Erro: Tipo de Ficheiros em Conflito. Enquanto existirem itens nesta situação, a junção de pastas não poderá começar.
Na junção de duas pastas, a proposta de operação será: Se para um item ...
ambas as pastas forem iguais: Copiar do B
o A existir, mas o B não: Copiar a partir do A
o B existir, mas o A não: Copiar a partir do B
o A e o B existirem mas não forem iguais: Juntar
o A e o B não tiverem o mesmo tipo de ficheiro (⪚ o A é uma pasta e o B um ficheiro): Erro: Tipo de Ficheiros em Conflito. Enquanto existirem itens nesta situação, a junção de pastas não poderá começar.
O modo de sincronização só está activo se forem indicadas duas pastas e não se não for indicado nenhum destino explícito, assim como a opção Sincronizar as directorias terá de estar activa. Nesse caso, o KDiff3 irá seleccionar uma operação por omissão, de modo a que ambas as pastas fiquem iguais no fim. Se, para um item ...
ambas as pastas forem iguais: Não será feito nada.
o A existir mas o B não: Copiar o A para o B
o B existir mas o A não: Copiar o B para o A
o A e o B existirem, mas não forem iguais: Juntar e guardar o resultado em ambas as pastas. (Para o utilizador, o nome do ficheiro gravado visível será o B, mas o KDiff3 irá copiar o B também para o A.)
o A e o B não tiverem o mesmo tipo de ficheiro (⪚ o A é uma pasta e o B um ficheiro): Erro: Tipo de Ficheiros em Conflito. Enquanto existirem itens nesta situação, a junção de pastas não poderá começar.
Quando duas pastas forem reunidas e a opção Copiar o mais recente em vez de juntar estiver seleccionada, então o KDiff3 irá olhar para as datas e irá optar por escolher o ficheiro mais recente. Se os ficheiros não forem iguais mas tiverem datas iguais, então a operação irá conter Erro: As datas são iguais mas os ficheiros não.. Enquanto esses itens existirem a junção de pastas não poderá começar.

A Coluna de Estado
Durante a junção, os ficheiros serão processados um a seguir ao outro. A coluna de estado irá mostrar Terminado para os itens em que a operação de junção foi bem sucedida e outros textos se algo ocorreu de inesperado. Quando se terminar uma junção, o utilizador deverá então fazer uma última verificação para confirmar se o estado de todos os itens é aceitável.

Colunas de Estatísticas
Quando o modo de comparação de ficheiros Análise Completa estiver activo nas opções, então o KDiff3 irá mostrar colunas extra que contêm o número de conflitos não resolvidos, resolvidos, de espaços em branco e dos outros conflitos. (A coluna de resolvidos só irá aparecer ao comparar ou ao juntar três pastas.)

Fazer uma Junção
O utilizador tanto poderá reunir o item seleccionado de momento (ficheiro ou pasta) ou todos os itens. Quando tiver feito todas as suas opções de operação (em todas as subpastas também), aí então poderá iniciar a junção.
Tenha em atenção que, se não tiver indicado explicitamente uma pasta de destino, então o destino será o C no modo de três pastas, o B no modo de junção de duas pastas e no modo de sincronização será o A e/ou o B.
Se tiver indicado uma pasta de destino, verifique também que todos os itens que deverão estar no resultado, estão na árvore respectiva. Existem algumas opções que fazem com que certos itens sejam omitidos na comparação e junção de pastas. Assinale estas opções para evitar surpresas desagradáveis:
Directorias Recursivas: Se estiver desligada, então os itens em todas as subpastas não serão tratados.
Padrão/Anti-Padrão: Inclui/exclui os itens que correspondam ao padrão
Excluir os Ficheiros Escondidos
Listar apenas os Deltas: Os ficheiros que correspondam em todas as pastas não aparecem na árvore e, por isso, também não aparecem no destino.
(Na versão actual, é necessário o próprio utilizador fazer uma nova pesquisa através do menu Directoria Analisar de Novo, depois de alterar as opções que afectam a pesquisa da pasta.)
Se estiver satisfeito até agora, o resto é simples.
Para juntar todos os itens: Seleccione Iniciar/Continuar a Junção da Directoria no menu Directoria ou carregue em F7 (que é o atalho). Para juntar apenas o item actual: Seleccione Executar a Operação no Item Actual ou carregue em F6.
Se, devido à existência de tipos de ficheiro em conflito, ainda permanecerem alguns itens com operações inválidas, então irá aparecer uma mensagem onde serão evidenciados esses itens, para que possa seleccionar uma operação válida para cada item.
Se juntar todos os itens, irá aparecer uma janela que lhe apresenta as opções Fazê-lo, Simulá-lo e Cancelar.
Seleccione Simulá-lo se quiser ver o que seria feito sobre o item sem aplicar de facto as modificações. Será apresentada uma lista descritiva com todas as operações.
Caso contrário, seleccione Fazê-lo para iniciar de facto a junção.
Nesse caso, o KDiff3 irá executar a operação indicada para todos os itens. Se for necessária alguma intervenção manual (na junção de ficheiros simples), então irá aparecer uma janela de junção (ver a imagem grande).
Quando tiver terminado um ficheiro, seleccione de novo Iniciar/continuar a junção da directoria ou a tecla F7. Se não tiver ainda gravado nada, irá aparecer uma janela a pedir-lhe isso. Aí, o KDiff3 irá passar ao próximo item.
Quando o KDiff3 encontrar um erro, indicar-lhe-á tal facto e irá mostrar a informação descritiva do estado. No fundo desta lista, existirão algumas mensagens de erro que o deverão ajudar a compreender a causa do problema. Quando continuar a junção (com a tecla F7), o KDiff3 indicar-lhe-á a opção para repetir ou saltar o item que causou o problema. Isto significa que, antes de continuar, poderá escolher outra operação ou resolver o problema por outros meios.
Quando a junção estiver completa, o KDiff3 informá-lo-á então com uma mensagem.
Se alguns dos itens foram reunidos individualmente, então o KDiff3 irá recordar isto (enquanto esta sessão de junção prosseguir) e não os juntará de novo, até que a junção para todos os itens tenha sido executada. Mesmo quando a junção tenha sido ignorada ou não tenha sido gravado nada, estes itens irão contar como completos. Só quando tiver alterado a operação de junção é que o item será reunido de novo.

Opções para Comparar e Juntar Pastas
As preferências do KDiff3 (no menu Configuração Configurar o KDiff3) têm agora uma secção intitulada Junção de Directorias com as seguintes opções:
Directorias Recursivas:	Indica se você deseja pesquisar as pastas de forma recursiva.
Padrões de Ficheiros:	Só os ficheiros que correspondam ao padrão ou padrões aqui indicados é que serão colocados na árvore. Poderá ser indicado mais do que um padrão através do separador ponto-e-vírgula ;. São considerados caracteres especiais válidos o * e o ?. (⪚ *.cpp;*.h). Por omissão, este campo é igual a *. As pastas não precisam de corresponder a este padrão.
Anti-padrões:	Os ficheiros e pastas que correspondam ao padrão ou padrões aqui indicados serão excluídos da árvore. Poderá ser indicado mais do que um padrão através do separador ponto-e-vírgula ;. São considerados caracteres especiais válidos o * e o ?. Por omissão, este campo é igual a *.orig;*.o.
Usar CVS-Ignore:	Ignora os ficheiros e pastas que são também ignorados pelo CVS. Muitos dos ficheiros gerados automaticamente são ignorados pelo CVS. A grande vantagem é que esta funcionalidade é específica para cada pasta através de um ficheiro .cvsignore local. (Veja em info:/cvs/cvsignore.)
Procurar os Ficheiros e Directorias Escondidos:	Em alguns sistemas de ficheiros, existe um atributo Escondido. Em outros sistemas, um nome de ficheiro que comece por . faz com que este seja considerados escondido. Esta opção permite-lhe decidir se deve incluir estes ficheiros na árvore ou não. Por omissão, são incluídos.
Seguir as Ligações de Ficheiros:	Para as ligações aos ficheiros: Quando a opção estiver desactivada, as ligações simbólicas serão comparadas. Caso contrário, serão compilados os ficheiros para os quais apontam as ligações. Por omissão, a opção está desligada.
Seguir as Ligações de Directorias:	Para as ligações a pastas: Quando a opção estiver desactivada, as ligações simbólicas serão comparadas. Se estiver activa, então a ligação será tratada como uma pasta e será pesquisada recursivamente. (Lembre-se que o programa não verifica se a ligação é recursiva. Por isso, se uma pasta contiver por exemplo uma ligação para ela própria irá causar um ciclo infinito, pelo que ao fim de algum tempo a pilha estoira ou toda a memória será usada e o programa irá estoirar deste modo). Por omissão, a opção está desligada.
Listar apenas os deltas:	Somente os itens que não sejam iguais em todas as pastas de entrada é que serão listados, assim como os ficheiros alterados. Como tal, os ficheiros que sejam iguais em todas as pastas não serão copiados numa junção e, se a pasta de destino não contiver os ficheiros antes da junção, o utilizador poderá perder alguns ficheiros mais tarde. (Esta opção poderá ser alterada numa versão posterior). Por omissão, esta opção está desligada.
Modo de Comparação de Ficheiros:	
Comparação Binária:	Este é o modo de comparação de ficheiros por omissão.
Análise Completa:	Faz uma análise completa de cada ficheiro e mostra os resultados nas colunas de informação das estatísticas. (O número de conflitos resolvidos, por resolver, devido a espaços em branco ou a outros casos). A análise completa é mais lenta que uma simples comparação binária e é muito mais lenta se for usada em ficheiros que não contenham texto. (Indique os tipos de anti-padrões necessários.)
Confiar na data de modificação:	Se comparar pastas grandes numa rede lenta, poderá ser mais rápido comparar somente as datas de modificação e os tamanhos dos ficheiros. Porém, este melhoramento de velocidade traz alguma incerteza. Use esta opção com cuidado. Por omissão, está desligada.
Confiar no tamanho:	É semelhante à comparação da data de modificação. Não ocorre nenhuma comparação em si. Dois ficheiros quaisquer são considerados iguais se os seus tamanhos de ficheiros forem iguais. Isto é útil quando a operação de cópia de ficheiros não preservar a data de modificação. Use esta opção com cuidado. Por omissão, está desligada.
Sincronizar as Directorias:	Activa o "Modo de Sincronização" em que duas pastas são comparadas e não foi indicada nenhuma pasta de destino. Neste modo, as operações propostas serão escolhidas de modo a que ambas as pastas de origem fiquem iguais no fim. Do mesmo modo, o resultado da junção será gravado em ambas as pastas. Por omissão, esta opção está desligada.
Copiar o mais recente em vez de juntar:	Em vez de juntar, a operação proposta irá copiar os ficheiros mais recentes se ocorreram algumas alterações. (É considerado inseguro, porque implica saber se o outro ficheiro não foi também alterado. Verifique para se certificar em qualquer um dos casos.). Por omissão, a opção está desligada.
Ficheiros de segurança:	Se um ficheiro ou uma pasta completa for substituído por outro ou for removido, então a versão original mudará para um nome com uma extensão .orig. Se já existir um ficheiro antigo com uma extensão .orig, então este será removido sem ser criada nenhuma cópia de segurança. Isto também afecta a junção normal de ficheiros simples, não só no modo de junção de pastas. Por omissão, a opção está activa.

Outras Funções

Modo de Ecrã Repartido/Completo
Normalmente a lista de junção da pasta fica visível enquanto um único ficheiro é comparado ou reunido. Com o rato, o utilizador poderá mover a barra separadora que delimita a lista de ficheiros das janelas de diferenças do texto. Se não a quiser, poderá desactivar a Janela Repartida no menu Directoria. Aí, poderá usar a opção Comutar a Vista no menu Directoria para alternar entre a lista de ficheiros e a janela de diferenças no texto que irá então ocupar o ecrã completo.

Comparar ou Juntar um Único Ficheiro
Provavelmente, você irá preferir um duplo-click do rato simples sobre um ficheiro para o poder comparar. Contudo, existe também um item no menu Directoria. Poderá também juntar directamente um único ficheiro sem iniciar a junção de pastas, através da opção Juntar um único ficheiro do menu Directoria. Ao gravar o resultado, o estado ficará como terminado e o ficheiro não será reunido de novo se for iniciada uma junção de pastas.
Mas repare que esta informação de estado será perdida quando voltar a executar uma pesquisa de pastas: menu Directoria Pesquisar de novo