This page covers a known problem with Darcs1 patch types (used in old-fashioned and hashed repositories). It does not affect Darcs2 patch types. If running
darcs show repo in your repository displays the line
Format: hashed, darcs-2, this will not happen.
See DarcsTwo for information about upgrading.
See FAQ/ConflictsDarcs1 for information about conflicts and how they can be resolved.
If a conflict involves a third patch that reverses the effect of one of the conflicting patches, darcs considers conflict resolved and does not apply any of the conflicting patches.
See a small example that we use in our testsuite:
rm -rf temp1 temp2 mkdir temp1 cd temp1 darcs init --hashed echo first > a darcs add a darcs record -am first Finished recording patch 'first' cd .. darcs get temp1 temp2 Copying patches, to get lazy repository hit ctrl-C... Finished getting. cd temp1 echo second > a darcs record -am 'first to second' Finished recording patch 'first to second' echo first > a darcs record -am 'second back to first' Finished recording patch 'second back to first' cd .. cd temp2 echo third > a darcs record -am 'first to third' Finished recording patch 'first to third' cd .. cd temp1 darcs pull -a ../temp2
At the last step, darcs does not say there is a conflict, while it there should be one. Worse, the file “a” in the working copy still contains “first” and not “third”. It has no conflict marker, the patch “first to third” is present in the history (darcs changes) but has no effect on the working copy.
The hidden conflicts lead to data loss.
The problem is most acute with the
darcs rollback command as rollback is designed to create the inverse patches. However, it is not limited to rollback. As explained above, the inverses can be created by accident or worse yet, maliciously.
Be careful when trying to resolve conflict by rolling any conflicting patches back while all the conflicting patches are not present in the repository. That is sure way to create hidden conflicts. However, note that rolling back conflicting patches trigger other, more immediate bugs in darcs.
Explain how to find out that you repository has hidden conflicts
Unpull patches until the topmost patch contains merger but
darcs resolve does not report conflict.
The conflict is not hidden if the topmost patch is a rollback (UNDO) and it contains the rollback of the conflict (aka.
regrem) and depend on all the conflicting patches.
Explain how to reliably recover from hidden conflict and prevent their propagation.