Reimplement the 'arbitrary nodes diff' in libsvn_client as a proper driver of
the diff processor, instead of a driver of the old diff callbacks 'with nice
output' (which was in some cases invalid and didn't follow any of the
ordering rules).

This removes the last real driver of the old diff callbacks and will finally
make it possible to convert the diff output handling to the diff processor
api, which will allow resolving some long standing bugs and feature
requests.

In theory this might even allow driving merge over this diff (to allow
things like maintaining vendor branches), but this will require more work.

* subversion/libsvn_client/diff_local.c
  (includes): Add private/svn_diff_tree.h.

  (do_file_diff,
   do_dir_diff): New prototype.

  (do_arbitrary_files_diff): Remove function.
  (arbitrary_diff_walker_baton): Remove struct.
  (arbitrary_diff_walker,
   arbitrary_diff_this_dir): Remove prototypes.

  (do_arbitrary_dirs_diff,
   arbitrary_diff_this_dir): Fold into each other and rrename to...
  (inner_dir_diff): ... this. Obtain dirents in both directories and
    handle the results recursively, following the diff editor rules.

  (do_dir_diff,
   do_file_diff): New functions.

  (arbitrary_diff_walker): Remove function.

  (svn_client__arbitrary_nodes_diff): Wrap callbacks using the standard
    wrapper. Update caller.

* subversion/tests/cmdline/diff_tests.py
  (diff_two_working_copies): Assume that additions are reported as
    'revision 0', like how all other diff drivers produce the data.
    Assume that the driver properly notices the change from F of a directory
    to a file, and as such reports a delete and add.
    (But directory deletes can't report property deletes via the old
     callbacks api)

  (diff_arbitrary_files_and_dirs): Assume that additions are reported as
    'revision 0', like how all other diff drivers produce the data.


git-svn-id: https://svn.apache.org/repos/asf/subversion/trunk@1569551 13f79535-47bb-0310-9956-ffa450edef68