Patch in progress (v1) at: https://paste.apache.org/yx7k

The point of this exercise is not to provide user-level commands but to 
abstract the relevant APIs so they will be ready for use in implementing new 
features, of which shelving is the current target.

There are 5 parts:
  * svn_client__wc_editor()
    - a delta editor that applies changes as local modifications to a WC
  * svn_client__wc_replay()
    - a delta editor driver that pushes the WC's local mods out to an editor 
(like in a commit)
  * get_dumpstream_loader()
    - a dump stream loader that drives a delta editor
  * svn_repos__get_dump_editor()
    - a delta editor that writes changes (for one revision) to a dump stream
  * user-level commands and glue logic to drive those, for testing
    - 'x-wc-dump' connects wc_replay to the dump stream writer (dump_editor)
    - 'x-wc-load' connects dumpstream_loader to the wc_editor

  (WC-local-mods)
    ^       v
    ^       v
  (delta-editor-API)
    ^       v
    ^       v
  (dump-stream)


== svn_client__wc_editor() ==

No such editor existed. The largest subset I found was in copy_foreign.c, where 
an implementation exists specifically to add a copied directory tree. I have 
begun extending it to support all editor operations.

This part is half completed.


== svn_client__wc_replay() ==

This is exposed by a wrapper around some of the existing commit code.

This part is complete except for ancillary considerations (such as externals).


== get_dumpstream_loader() ==

The closest existing implementation is in 'svnrdump load', where indeed such an 
editor exists, however it is both coupled to the RA layer and coupled to 
svnrdump's particular needs (which include remapping revision numbers and 
mergeinfo, checking and canonicalizing properties).

I copied the essential parts from there to create a new implementation. This is 
functionally complete.

This implementation is not far off being a generic core of a dump-stream loader 
(for one revision record). The rest of svnrdump's functionality -- and quite 
likely svnadmin load as well -- should be rewritten around it, with wrappers 
and/or through callbacks added to the core.


== svn_repos__get_dump_editor() ==

This exists -- I recently extracted it from svnrdump -- and is working and 
tested by the svnrdump tests.

(I am still working to adapt 'svnadmin dump' to use this instead of its own 
tightly coupled implementation.)


== Library organization ==

Dump stream loader and writer implementations are currently in libsvn_repos.

Libsvn_repos is not directly linked from libsvn_client. It is linked 
indirectly, via libsvn_ra. When I try to call libsvn_repos functions directly 
from libsvn_client on Linux, without modifying the build configuration, it 
fails to link, but if libsvn_client calls an intermediate pass-through function 
in libsvn_ra which calls into libsvn_repos, then the link succeeds.

The dump stream loader and writer could belong in libsvn_delta, as 
serializations of the delta editor. Libsvn_delta is linked directly both from 
libsvn_client and from libsvn_repos.

It seems more right to me to put the dumpfile serialization functions into 
libsvn_delta than either to use an RA layer passthough (as this has nothing to 
do with client-server communications) or to declare that libsvn_client now 
depends directly on libsvn_repos, but I welcome other thoughts on any and all 
of this.

-- 
- Julian

Reply via email to