[[[
Make diff_summarize callable from Perl binding.

Patch by: James Fang <june.fang{_AT_}gmail.com>

[in subversion/bindings/swig]
* svn_client.i
    Add a typemap for (svn_client_diff_summarize_func_t, void*) arguments sequence.
* perl/libsvn_swig_perl/swigutil_pl.h,
* perl/libsvn_swig_perl/swigutil_pl.c
    (svn_swig_pl_thunk_client_diff_summarize_func): New callback thunk function.
* perl/native/Client.pm
    Document the diff_summarize method.
    Expose svn_client_diff_summarize_kind_t as SVN::Client::Summarize::*.
]]]

Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
===================================================================
--- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c	(revision 35343)
+++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c	(working copy)
@@ -830,6 +830,25 @@ svn_error_t *svn_swig_pl_thunk_log_recei
     return SVN_NO_ERROR;
 }
 
+svn_error_t * svn_swig_pl_thunk_client_diff_summarize_func(
+                     const svn_client_diff_summarize_t *diff,
+                     void *baton,
+                     apr_pool_t *pool)
+{
+    SV *func = baton;
+
+    if(!SvOK(func))
+    return SVN_NO_ERROR;
+
+    svn_swig_pl_callback_thunk(CALL_SV,
+                               func, NULL,
+                               "SS", diff,
+                               _SWIG_TYPE("svn_client_diff_summarize_t *"),
+                               pool, POOLINFO);
+
+    return SVN_NO_ERROR;
+}
+
 svn_error_t *svn_swig_pl_thunk_history_func(void *baton,
                                             const char *path,
                                             svn_revnum_t revision,
Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
===================================================================
--- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h	(revision 35343)
+++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h	(working copy)
@@ -107,6 +107,13 @@ svn_error_t * svn_swig_pl_thunk_log_rece
                                              const char *date,
                                              const char *msg,
                                              apr_pool_t *pool);
+
+/* thunked diff summarize callback.  */
+svn_error_t * svn_swig_pl_thunk_client_diff_summarize_func(
+                     const svn_client_diff_summarize_t *diff,
+                     void *baton,
+                     apr_pool_t *pool);
+
 /* thunked commit editor callback. */
 svn_error_t *svn_swig_pl_thunk_commit_callback(svn_revnum_t new_revision,
 					       const char *date,
Index: subversion/bindings/swig/perl/native/Client.pm
===================================================================
--- subversion/bindings/swig/perl/native/Client.pm	(revision 35343)
+++ subversion/bindings/swig/perl/native/Client.pm	(working copy)
@@ -406,6 +406,23 @@ pass an empty array to return a unified 
 
 Has no return.
 
+=item $ctx-E<gt>diff_summarize($target1, $revision1, $target2, $revision2, $recursive, $ignore_ancestry, \&summarize_func, $pool);
+
+Produce a diff summary which lists the changed items between $target1
+at $revision1 and $target2 at $revision2 without creating text deltas.
+$target1 and $target2 can be either working-copy paths or URLs.
+
+The function may report false positives if $ignore_ancestry is false,
+since a file might have been modified between two revisions, but still
+have the same contents.
+
+Calls \&summarize_func with with a svn_client_diff_summarize_t structure
+describing the difference.
+
+See diff() for a description of the other parameters.
+
+Has no return.
+
 =item $ctx-E<gt>export($from, $to, $revision, $force, $pool);
 
 Export the contents of either a subversion repository or a subversion
@@ -1419,6 +1436,48 @@ A reference to a hash of property names 
 
 =back
 
+=cut
+
+package SVN::Client::Summarize;
+use SVN::Base qw(Client svn_client_diff_summarize_kind_);
+
+=head2 svn_client_diff_summarize_kind_t - SVN::Summarize
+
+An enum of the following constants:
+
+$SVN::Client::Summarize::normal, $SVN::Client::Summarize::added,
+$SVN::Client::Summarize::modified, $SVN::Client::Summarize::deleted.
+
+=back
+
+=cut
+
+package _p_svn_client_diff_summarize_t;
+use SVN::Base qw(Client svn_client_diff_summarize_t_);
+
+=head2 svn_client_diff_summarize_t
+
+=over 8
+
+=item $diff_summarize-E<gt>path()
+
+Path relative to the target.  If the target is a file, path is the
+empty string.
+
+=item $diff_summarize-E<gt>summarize_kind()
+
+Change kind.
+
+=item $diff_summarize-E<gt>prop_changed()
+
+Properties changed?
+
+=item $diff_summarize-E<gt>node_kind()
+
+File or dir?
+
+=back
+
 =head1 TODO
 
 * Better support for the config.
Index: subversion/bindings/swig/svn_client.i
===================================================================
--- subversion/bindings/swig/svn_client.i	(revision 35343)
+++ subversion/bindings/swig/svn_client.i	(working copy)
@@ -195,6 +195,28 @@
                   )
 #endif
 
+/* -----------------------------------------------------------------------
+Callback: svn_client_diff_summarize_func_t
+        svn_client_diff_summarize2()
+        svn_client_diff_summarize()
+        svn_client_diff_summarize_peg2()
+        svn_client_diff_summarize_peg()
+*/
+
+#ifdef SWIGPYTHON
+#endif
+
+#ifdef SWIGPERL
+    %typemap(in) (svn_client_diff_summarize_func_t summarize_func,
+                  void *summarize_baton) {
+        $1 = svn_swig_pl_thunk_client_diff_summarize_func;
+        $2 = (void *)$input;
+    }
+#endif
+
+#ifdef SWIGRUBY
+#endif
+
 #ifdef SWIGRUBY
 %callback_typemap(svn_client_diff_summarize_func_t summarize_func,
                   void *summarize_baton,

