Assume two repositories, C (for central) and W (for working). At the start of the example, they both have the same set of patches, B (for base): C: B W: B

As time goes on, patches are made to both repositories in parallel: C: B + C0 W: B + W0

Pulling into W from C, allows the developer working on W to get the latest and integrate and test before pushing: C: B + C0 W: B + (W0 || C0)

If there were any conflicts with this, then a new patch will have to be recorded in W to fix them: C: B + C0 W: B + (W0 || C0) + W1

At a later date, more work has gone on in parallel: C: B + C0 + C1 W: B + (W0 || C0) + W1 + W2

Now the developer wants to pull from C, achieving: C: B + C0 + C1 W: B + (((W0 || C0) + W1 + W2) || (C0 + C1))

But, if there are conflicts with C1 and W1, this pull will never complete. The problem seems to be that since C1 is a delta on C0, darcs must back track and essentially unravel the merge of C0 and W0. My understanding on this is fuzzy at best.

This is real problem, as this scenario is not unreasonable. There are reasonable cases, where the developer working on W isn’t able to push up to to C as often as she pulls from C.