Bert Huijben <b...@qqmail.nl> writes:

> A few weeks ago I proposed updating the database to exactly that move with
> replacements on the first update step. This adds the nodes that were not
> added by the initial move (aka the copy) in the op-depth of the move. From
> that point the normal status api will exactly report the replacements that
> will happen when committing. (Before adding those nodes the replacements
> would also happen, but you would only see them after the commit)
>
> After that initial step we can help the users who got themselves in this
> situation (by moving from a mixed revision working copy) by trying to
> remove as much of those replacements as possible.
>
> In many cases it will only be the revision number that has changed. But in
> these cases we have two NODES layers on top of each other with the same
> repos_id and repos_relpath where the top one has a moved-from set.
>
> We can then -as part of the same sql transaction, or as a different
> sql transaction- try to eliminate layers as part of the conflict resolving.
> This might involve text and property merges and in some cases installing
> new conflicts. We can than remove the shadowing.

I think what you are describing some variation of the following.  We
start with a single-revision, single-op-depth move. During the update
the base nodes in the move source become mixed-revision and the working
nodes in the move destination are updated so that they become
multiple-op-depth and mixed-revision.  Then as the update continues and
the move source moves back to single-revision we collapse the
multiple-op-depth move back to a single-revision move.

That is how I originally imagined move updating would work.  The problem
is that it can't handle user modifications after the move.  Things like
nested moves, adds, copies all obstruct the extra op-depths we would use
for the mixed-revision move destination:

    svn mv A B

  op-depth local-relpath presence revision moved-to moved-here
      0                    normal    3
      0       A            normal    3
      0       A/f          normal    3
      1       A            deleted           B
      1       A/f          deleted
      1       B            normal    3                 1
      1       B/f          normal    3                 1

This could be update node-by-node with B and B/f becoming mixed-revision
and multiple-op-depth for a period before becoming single-revision
again. However with a nested move:

   svn mv B/f B/g

  op-depth local-relpath presence revision moved-to moved-here
      0                    normal    3
      0       A            normal    3
      0       A/f          normal    3
      1       A            deleted           B
      1       A/f          deleted
      1       B            normal    3                 1
      1       B/f          normal    3                 1
      2       B/f          deleted           B/f
      2       B/g          deleted                     1

Now when I update A and pass through a mixed-revision I can't use
op-depth=2 to represent the mixed-rev move in B because those rows are
already being used.  Supporting updating nested moves has to happen or
this whole feature is pointless.

The only way I can see to update moves is to restrict our handling of
moves to single-revision destination.  We move from one single-revision
state to another.  So we start with a single-revision move from A to B.
The user runs update which makes A mixed-revision and "breaks" the move.
At the end of the update A is single-revision again but a different
revision from B and the move is still "broken".  The user runs some sort
of resolution and B is updated to match the revision of A and so the
move is no longer broken.  If the update is interrupted part way through
so that A remains mixed-revision then the user cannot resolve the broken
move until A is updated to single revision.  The "broken" move acts much
like a tree-conflict, the user cannot commit until it is resolved.

-- 
Certified & Supported Apache Subversion Downloads:
http://www.wandisco.com/subversion/download

Reply via email to