[darcs-users] darcs conflicts/dependencies -- is patch theory the place to start?

Owen Stephens darcs at owenstephens.co.uk
Mon Sep 10 09:17:19 UTC 2012


Hi AntC,

On 10 September 2012 03:04, AntC <anthony_clayden at clear.net.nz> wrote:
> Can I also say that it's really hard to figure out what's going on in the
> darcs world from the wikis and published papers. (This is by way of
apology if
> there's already an answer to my question. I've just failed to find it.)

Yes, I agree, there are various bits and pieces of information, most of it
is
likely out of date, or not quite what's implemented in Darcs at the moment.

> I'm trying to understand conflicts and why they're so problematic.

The complications arise due to the need to be able to conceptually consider
a
darcs repo as a *set* of patches, where the order in which (non-dependent)
patches are pulled doesn't matter. A conflict must therefore always track
the
other patches that it conflicts with, and must update this tracking
whenever it
is commuted with other patches/conflicts.

I did write a quick wiki page on conflictors a while back, which may help to
shed some light on their behaviour/implementation:

    http://darcs.net/Theory/Conflictors

But be warned, conflictors are fairly complicated, and their implementation
is
really difficult to pick apart - we are definitely wanting to replace them
with
something better.

> I saw in one of the papers an example:
> - Fork B wants a patch from Fork A that is a change in content for file F.
> - But preceeding this change in Fork A is a patch that creates file F.
> ==> So there's a dependency: can't commute a change to a file before its
> creation, in order to 'slide' it round to fork B.

Right, so Fork A has <... ; Create A ; Change A> and Fork B wants to pull
just
"Change A".

> At first sight that scenario seems daft:
> - Presumably F didn't exist in the repo at the common point of origin
>   where A and B forked apart. (Otherwise the create couldn't have been
valid.)
> - So the change to F wouldn't be valid in Fork B.
> - So Fork B should be pulling both the create and the change.

Yes, this is what would happen. Pulling would calculate all the patches that
aren't in Fork B, and present them as a list to the user - the user then can
only select patches that have their dependencies selected too:

    > mkdir darcs-testing
    > cd darcs-testing
    [...]
    > darcs init --repo R
    > cd R
    [...]
    > touch a
    > darcs rec -alm 'add a'
    [...]
    > touch b
    > darcs rec -alm 'add b'
    [...]
    > echo 'foo' > a
    > darcs rec -alm 'change a'
    [...]
    > cd ..
    > darcs init --repo S
    > cd S
    [...]
    > darcs pull ../R
    Mon Sep 10 10:07:00 BST 2012  Owen Stephens <darcs at owenstephens.co.uk>
      * add a
    Shall I pull this patch? (1/3)  [ynW...], or ? for more options: n
    Mon Sep 10 10:07:05 BST 2012  Owen Stephens <darcs at owenstephens.co.uk>
      * add b
    Shall I pull this patch? (2/3)  [ynW...], or ? for more options: n
    Will not ask whether to pull 1 already decided patch.

Note here that having said no to "add a" darcs will not let me select
"change
a".

> But on further thought I saw it:
> - Fork B has already pulled the patch to create F.

Right, so previously, B has pulled the "create F" patch.

> - (Let's furthermore say that the only difference between the forks
>    is that B has some unrelated change to file G.)
>
> So we have:
> - O -> Fork A ->             Create F -> Change F
>     -> Fork B -> Change G -> Create F -> (try to) Pull the Change F
>
> Am I right in thinking the Pull would give a conflict under darcs theory?

No, there would be no conflict, assuming that B has pulled in the "Create F"
patch previously from A. Upon attempting a pull, B would calculate the set
of
patches not in A, which would *not* include "Create F".

> That the Change F would have to commute with the Create F, but can't?
> And similarly if Fork B tried to pull both the Create and Change, there
would
> be a conflict with the Create that's already in Fork B?

Currently, in darcs' implementation, there *would* be a conflict between two
files created with the same path, but in different repos, see this page:

    http://darcs.net/Ideas/AddAddConflicts

Also, I think mornfall's GSoC project would go a long way to solving this
problem, by assigning GUIDs to each file, rather than just using the
filepath:

    http://web.mornfall.net/blog/soc_reloaded:_outcomes.html

> (Of course the situation could be a lot more complicated: F could have
been
> renamed or moved along the way; there might be other changes to the
content of
> F -- which is why we have to 'slide' the patches through all intervening
> changes.)

Yes, but it should work fine :-)

> So to resolve this scenario, would this approach help?:
I'm entirely clear what the scenario is, but I think I understand what you
mean.
> - The Create F in Fork B must be pulled from Fork A.
Yes
>   Not just create a file which happens to have the same directory/name
>   (that could just be a concidence).
Yes
> - Pulling the Change F detects the dependency on Create F,
>   and validates that the patch is already pulled into Fork B.
Yes
> - Then 'slide' both the Create and Change into Fork B.
> - At the point of 'sliding' past the Create towards the end of Fork B,
> - Detect it's the same patch and identical effect, so they 'cancel out'.
Well, essentially, but it's done before any real commutation is attempted.
>
> I think this should manage the risk of combinatorial explosion, because
the
> rule is that depended-upon patches must have already been pulled into the
> target repo.

I'm not sure it does, but perhaps I just don't understand your proposal.
Please
do ask more questions or clarify!

> I understand that real-life conflicts are much more complex, and are
typically
> conflicts of partially overlapping 'hunk' changes. But would it help
there to
> have a rule that depended-upon patches must be already pulled into the
target?

As far as I understand this is a rule already - you can't pull patches
without
pulling in their dependencies.

> Thank you
> AntC

Cheers,

Owen.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osuosl.org/pipermail/darcs-users/attachments/20120910/0633a853/attachment-0001.html>


More information about the darcs-users mailing list