Branko Čibej <br...@wandisco.com> writes:

> On 30.08.2013 17:18, Julian Foad wrote:
>> Branko Čibej wrote:
>>
>>> It strikes me that if for update-like edits, which are driven by the
>>> server, the once rule is interpreted in terms of WC paths, not node URLs
>>> or node IDs; then the server already has all the information it needs to
>>> transform the working copy.
>>>
>>> Take your first multiple source example:
>>>
>>> |                   |
>>> +-- A  mv--\        |
>>> |           \       |
>>> +-- B  mv--\ \      |
>>>             \-\-->  +-- C
>>>
>>> The working copy really doesn't have to know that both A and B became C.
>>> It only has to represent the final state. this can be described as:
>>>
>>>     move A, C; delete B
>>>
>>> or
>>>
>>>     move B, C; delete A 
>>>
>>> and any text modifications are applied after the move.
>> That would work for the WC base tree, but is not good enough for handling 
>> the local modifications.  Consider if the user has made local modifications 
>> inside B, and the server sends "move A, C; delete B".  If the client told 
>> the user:
>>
>>   I've updated A OK (moved it to C).
>>   Tree conflict: incoming delete of B, local modifications to B.
>>
>> ... that would be a horrible experience.  And it would be arbitrary (from 
>> the user's POV) whether she got this conflict or not, depending on which one 
>> the server decided to move and which one the server decided to delete.
>>
>> The client *does* need to know that B is in fact being moved to C, so that 
>> it can offer to transfer my local modifications from B to C.
>
> I'm not at all sure that you can avoid a conflict even in this case.
> It's either a tree conflict, or a text conflict (if both A and B were
> modified, and they refer to the same node).
>
> One possible solution is to replay the moves in the order they happened.
> Then you'd get two cases:
>
>   * A is an ancestor of B: the operation is:
>       o move(A, B) -> tree conflict, can be resolved as a text merge
>       o move(B, C)
>   * A and B are the same node: In this case, they'll can only be visible
>     at the same time if you have a switched subtree or an external
>     subtree, and the multiple-source move doesn't happen (because the
>     move needs to be replicated in both subtrees)
>
> I'm not sure how the editor driver would represent the move sequence and
> whether the resulting (intermediate) tree conflict should be resolved to
> a text conflict automatically or not; but I'm pretty sure it can be done
> without introducing multiple-source or multiple-target moves.

Allowing multiple moves to the same destination doesn't really fit with
Ev2 but I can imagine an enhanced Ev1 editor drive that does

   move away A
   move to C (original A)
   del A
   move away B
   move to C (original B)
   del B
   add C

The deletes lead to tree-conflicts on A and B due to local mods.  The
add creates a pristine C with no local mods.  The user resolves the
tree-conflicts post-update and gets to choose which local mods are
merged to C, possibly both but one before the other, which may in turn
raise text/prop/tree-conflicts on C.

-- 
Philip Martin | Subversion Committer
WANdisco // *Non-Stop Data*

Reply via email to