Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Subversion Wiki" for 
change notification.

The "MoveDev/MovesOverDeltaEditor" page has been changed by JulianFoad:
http://wiki.apache.org/subversion/MoveDev/MovesOverDeltaEditor

New page:
Here is a method to communicate moves over an ''svn_delta_editor_t'' edit drive.

It requires modifying the sender and the receiver but uses the existing editor 
protocol.  It requires a small amount of extra communication -- the list of 
moves -- which may be communicated out of band or carried inside the edit drive 
(for example, as properties that  the consumer recognizes as special).

The aim is for a move-aware producer to be able to drive a move-unaware 
consumer and ''vice-versa''.

It assumes:

 * A depth-first tree walk.
 * Nodes identified  by path alone (no node ids).
 * The only tree-change operations are:
  * add node
  * copy subtree (from ... [1])
  * delete subtree.
 * A way to communicate the moves.
 * No additional ordering requirements.

This method can probably be adapted to other editors such as  
''svn_wc_diff_callbacks_t''.

== Basic Method ==
 * Producer sends the "from" and "to" paths of each move, before or during the 
corresponding "delete" and "copy" operations.
 * When the consumer sees a "delete" that corresponds to a move:
  * It does not perform a delete.
  * If necessary (to allow a subsequent replacement), it moves the path to a 
temporary location and keeps track of it.
 * When the consumer sees a "copy" that corresponds to a move:
  * It performs a move from the "move-from" path.
  * It applies any modifications.

== Example ==
Starting from:

{{{
/
+-- A/
    +--foo
}}}
Rename 'A' to 'B':

{{{
/
+-- B/
    +-- foo
}}}
Where the copy and the delete are in the same directory, so our present edit 
producers send the 'del' before the 'copy'.

Old sequence (assuming del before cp):

 * del A
 * cp B from A@10
 * modify-props B
 * ?? cp B/foo from A/foo@10

New sequence (assuming del before cp):

 * moves = [ A -> B ]
  * Tells us just the move-root path-pairs
 * del A
  * Move 'A' to a temporary location (in case a replacement arrives)
 * cp B from A@10
  * Move temp-A to B. Assert cp-from matches.
 * modify-props B
 * ?? cp B/foo from A/foo@10
  * Is it a move-root? No.
  * Is it a move-child? Yes. Assert cp-from matches.

Reply via email to