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!
Even though comparing and merging directories seems to be quite obvious, there are several details that you should know about. Most important is of course the fact that now many files might be affected by each operation. If you don't have backups of your original data, then it can be very hard or even impossible to return to the original state. So before starting a merge, make sure that your data is safe, and going back is possible. If you make an archive or use some version control system is your decision, but even experienced programmers and integrators need the old sources now and then. And note that even though I (the author of KDiff3) try to do my best, I can't guarantee that there are no bugs. According to the GNU GPL there is NO WARRANTY whatsoever for this program. So be humble and always keep in mind:
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,
... lets you run the selected operation for all items (key F7) or the selected item (key F6),
... lets you continue the merge after manual interaction with key F7,
... optionally creates backups, with the .orig extension,
...

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 dir1 dir2
   kdiff3 dir1 dir2 -o destdir

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

Comparar/Juntar estas pastas:

kdiff3 dir1 dir2 dir3
   kdiff3 dir1 dir2 dir3 -o destdir

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.
Note that only the comparison starts automatically, not the merge. For this you first must select a menu entry or the key F7. (More details later.)

Visible Information
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.
The directories are collapsed by default. You can expand and collapse them by clicking on the +/- or by double-clicking the item or by using the Left Arrow or Right Arrow keys. The Directory menu also contains two actions Fold all subdirs and Unfold all subdirs with which you can collapse or expand all directories at once.
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.
The image in the name column reflects the file type in the first directory (A). It can be one of these:
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
After comparing the directories KDiff3 also evaluates a proposal for a merge operation. This is shown in the Operation column. You can modify the operation by clicking on the operation you want to change. A small menu will popup and allows you to select an operation for that item. (You can also select the most needed operations via keyboard. Ctrl+1/2/3/4/Del will select A/B/C/Merge/Delete respectively if available.) This operation will be executed during the merge. It depends on the item and on the merge-mode you are in, what operations are available. The merge-mode is one of
Three directory-merge (A is treated as older base of both).
Junção de duas pastas.
Two directory-sync-mode (activate via option Synchronize Directories).
Na junção de três pastas, a proposta de operação será: Se para um item ...
all three directories are equal: Copy from C
A and C are equal but B is not: Copy from B (or if B does not exist, delete the destination if exists)
A and B are equal but C is not: Copy from C (or if C does not exist, delete the destination if exists)
B and C are equal but A is not: Copy from C (or if C does not exist, delete the destination if exists)
only A exists: Delete the destination (if exists)
only B exists: Copy from B
only C exists: Copy from C
A, B and C are not equal: Merge
A, B and C don't have the same file type (⪚ A is a directory, B is a file): Error: Conflicting File Types. While such items exist the directory merge cannot start.
Na junção de duas pastas, a proposta de operação será: Se para um item ...
both directories are equal: Copy from B
A exists, but not B: Copy from A
B exists, but not A: Copy from B
A and B exist but are not equal: Merge
A and B don't have the same file type (⪚ A is a directory, B is a file): Error: Conflicting File Types. While such items exist the directory merge cannot start.
Sync-mode is active if only two directories and no explicit destination were specified and if the option Synchronize directories is active. KDiff3 then selects a default operation so that both directories are the same afterwards. If for an item
both directories are equal: Nothing will be done.
A exists, but not B: Copy A to B
B exists, but not A: Copy B to A
A and B exist, but are not equal: Merge and store the result in both directories. (For the user the visible save-filename is B, but then KDiff3 copies B also to A.)
A and B don't have the same file type (⪚ A is a directory, B is a file): Error: Conflicting File Types. While such items exist the directory merge cannot start.
When two directories are merged and the option Copy newer instead of merging is selected, then KDiff3 looks at the dates and proposes to choose the newer file. If the files are not equal but have equal dates, then the operation will contain Error: Dates are equal but files are not. While such items exist the directory merge cannot start.

A Coluna de Estado
During the merge one file after the other will be processed. The status column will show Done for items where the merge operation has succeeded, and other texts if something unexpected happened. When a merge is complete, then you should make a last check to see if the status for all items is agreeable.

Colunas de Estatísticas
When the file comparison mode Full Analysis is enabled in the options, then KDiff3 will show extra columns containing the numbers of unsolved, solved, nonwhite and whitespace conflicts. (The solved-column will only show when comparing or merging three directories.)

Doing A Merge
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.
Be aware that if you didn't specify a destination directory explicitely, then the destination will be C in three directory mode, B in two directory merge mode, and in sync-mode it will be A and/or 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:
Recursive Directories: If this is off, then items in subdirectories will not be found.
Pattern/Anti-Pattern: Include/exclude items that match
Exclude Hidden Files
List only Deltas: Files that match in all directories don't appear in the tree, and hence also not in the destination.
(In the current version, you must do a rescan via menu Directory Rescan yourself, after changing options affecting the directory scan.)
Se estiver satisfeito até agora, o resto é simples.
To merge all items: Select Start/Continue directory merge in the Directory menu or press F7 (which is the shortcut). To merge only the current item: Select Run Operation For Current Item or press 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.
If you merge all items a dialog will appear giving you the options Do it, Simulate it and Cancel.
Select Simulate it if you want to see what would be done without actually doing it. A verbose list of all operations will be shown.
Otherwise select Do it to really start merging.
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).
When you have finished with a file, again select Start/Continue directory merge or the key F7. If you haven't saved yet, a dialog will ask you to do so. Then KDiff3 will continue with the next item.
When KDiff3 encounters an error, it will tell you so and will show the verbose-status-information. At the bottom of this list, there will be some error messages which should help you to understand the cause of the problem. When you continue merging (F7 key) KDiff3 will give you the choice to retry or skip the item that caused the problem. This means that before continuing you can choose another operation or solve the problem by other means.
Quando a junção estiver completa, o KDiff3 informá-lo-á então com uma mensagem.
If some items were merged individually then KDiff3 remembers this (while this merge-session goes on), and doesn't merge them again when later the merge for all items is run. Even when the merge was skipped or nothing was saved these items count as completed. Only when you change the merge operation the item will be merged again.

Opções para Comparar e Juntar Pastas
The KDiff3 preferences (menu Settings Configure KDiff3) now has a section called Directory Merge with these options:
Directorias Recursivas:	Indica se você deseja pesquisar as pastas de forma recursiva.
Padrões de Ficheiros:	Only files that match any pattern here will be put in the tree. More than one pattern may be specified here via using the semicolon ; as separator. Valid wildcards: * and ?. (⪚ *.cpp;*.h). Default is *. Directories need not match this pattern.
Anti-Pattern(s):	Files and directories that match this pattern will be excluded from the tree. More than one pattern may be specified here via using the semicolon ; as separator. Valid wildcards: * and ?. Default is *.orig;*.o.
Usar CVS-Ignore:	Ignore files and directories that would also be ignored by CVS. Many automatically generated files are ignored by CVS. The big advantage is that this can be directory specific via a local .cvsignore file. (See info:/cvs/cvsignore.)
Procurar os Ficheiros e Directorias Escondidos:	On some filesystems files have an Hidden attribute. On other systems a filename starting with a dot (.) causes it to be hidden. This option allows you to decide whether to include these files in the tree or not. Default is on.
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:	For links to directories: When disabled, then the symbolic links will be compared. When enabled then the link will be treated like a directory and it will be scanned recursively. (Note that the program doesn't check if the link is recursive. So for example a directory that contains a link to the directory would cause an infinite loop, and after some time when the stack overflows or all memory is used up, crash the program.) Default is off.
List only deltas:	Only items that are not equal in all input directories will be listed and only the changed files are visible. Hence files that are equal in all directories won't be copied during a merge and if the destination dir does not contain the files before the merge, you might miss some files later. (This option is likely to be changed in a later version.) Default is off.
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:	Instead of merging the proposed operation will copy the newer source if changes happened. (Considered unsafe, because it implies that the knowledge, that the other file hasn't been edited too. Check to make sure in every case.) Default is off.
Ficheiros de segurança:	If a file or complete directory is replaced by another or is deleted then the original version will be renamed with an .orig extension. If an old backup file with .orig extension already exists then this will be deleted without backup. This also affects the normal merging of single files, not only in directory-merge mode. Default is on.

Other Functions

Modo de Ecrã Repartido/Completo
Usually the directory merge list view remains visible while a single file is compared or merged. With the mouse you can move the the splitter bar that separates the file list from the text-diff windows. If you don't want this, you can disable Split Screen View in the Directory menu. Then you can use Toggle View in the Directory menu to switch between the file list and the text-diff view that then occupy the full screen.

Comparar ou Juntar um Único Ficheiro
Probably you will prefer a simple double mouse click on a file in order to compare it. Nevertheless there also exists an entry in the Directory menu. You can also directly merge a single file, without starting the directory merge via the Merge single file in the Directory Menu. On saving the result, the status will be set to done, and the file will not be merged again if a directory merge is started.
But note that this status information will be lost when you rerun a directory scan: Directory Rescan