[darcs-users] Conflict marking
igloo at earth.li
Wed Nov 5 03:06:11 UTC 2008
I'm trying to write down exactly how conflict marking works.
I'd appreciate it if you'd let me know if you see any errors in the
If we have a repository
then we can commute this to
* everything in Cs is a conflictor, and
* Bs cannot be commuted to
where E is a conflictor.
Let Fs^ be the effect of Cs. Then Bs can be commuted to
(proof by contradiction: If a patch in Gs depended on something in Fs,
then whatever conflicted with that F would have also conflicted with
Gs is the pristine state.
Now, we can imagine this repo as starting with the sequence Gs, and then
having multiple forks:
One fork is
Forall patches in Cs, if Cs = Xs [effect, context:Y] Zs
Fs effect(Xs) effect context Y
is a fork (but commute anything you can past Y to make the conflict look
as simple as possible).
Similarly, if one fork is subsumed by another then remove it.
For example, in the merge
A + (B C)
where A conflicts with B and C depends on B, we only need the forks
A and BC
we don't need all of
A, B and BC
Note that in order to find the Fs fork we don't need to split Cs into
Gs Fs, we can just get Fs from the effect of the conflictors.
Note also that we don't need to worry about what the conflictors
conflict with, only what they are /first/ to conflict with (i.e. what is
in their effect).
The other half of the puzzle is how to show 2 or more forks to the user,
but I haven't got that far yet. That's obviously dependent on exactly
what types of primitive patches you have.
More information about the darcs-users