Index: subversion/bindings/swig/perl/native/t/3client.t
===================================================================
--- subversion/bindings/swig/perl/native/t/3client.t	(revision 18650)
+++ subversion/bindings/swig/perl/native/t/3client.t	(working copy)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -w
 
-use Test::More tests => 112;
+use Test::More tests => 116;
 use strict;
 
 # shut up about variables that are only used once.
@@ -162,6 +162,19 @@
 is($ctx->log_msg(undef),undef,
    'Clearing the log_msg callback works');
 
+# test info() on WC
+is($ctx->info("$wcpath/dir1/new", undef, 'WORKING',
+              sub
+              {
+                 my($infopath,$svn_info_t,$pool) = @_;
+                 is($infopath,"new",'path passed to receiver is same as WC');
+                 isa_ok($svn_info_t,'_p_svn_info_t');
+                 isa_ok($pool,'_p_apr_pool_t',
+                        'pool param is _p_apr_pool_t');
+              }, 0),
+   undef,
+   'info should return undef');
+
 # test getting the log
 is($ctx->log("$reposurl/dir1/new",$current_rev,$current_rev,1,0,
              sub 
Index: subversion/bindings/swig/perl/native/Client.pm
===================================================================
--- subversion/bindings/swig/perl/native/Client.pm	(revision 18650)
+++ subversion/bindings/swig/perl/native/Client.pm	(working copy)
@@ -10,7 +10,7 @@
                  revert resolved copy move revprop_set propset
                  proplist revvprop_list export ls cat import propget
                  uuid_from_url uuid_from_path url_from_path revprop_get
-                 revprop_list)); 
+                 revprop_list info)); 
 
 =head1 NAME
 
@@ -722,6 +722,37 @@
 
 The return of the status_func subroutine is ignored.
 
+=item $ctx-E<gt>info($path_or_url, $peg_revision, $revision, \&receiver, $recurse);
+
+Invokes \&receiver passing it information about $path_or_url for $revision.
+The information returned is system-generated metadata, not the sort of
+"property" metadata created by users.  For methods available on the object
+passed to \&receiver, B<see svn_info_t>.
+
+If both revision arguments are either svn_opt_revision_unspecified or NULL,
+then information will be pulled solely from the working copy; no network
+connections will be made.
+
+Otherwise, information will be pulled from a repository.  The actual node
+revision selected is determined by the $path_or_url as it exists in
+$peg_revision.  If $peg_revision is undef, then it defaults to HEAD for URLs
+or WORKING for WC targets.
+
+If $path_or_url is not a local path, then if $revision is PREV (or some other
+kind that requires a local path), an error will be returned, because the desired
+revision cannot be determined.
+
+Uses the authentication baton cached in ctx to authenticate against the repository.
+
+If $recurse is true (and $path_or_url is a directory) this will be a recursive
+operation, invoking $receiver on each child.
+
+ my $receiver = sub {
+     my( $path, $info, $pool ) = @_;
+     print "Current revision of $path is ", $info->rev, "\n";
+ };
+ $ctx->info( 'foo/bar.c', undef, 'WORKING', $receiver, 0 );
+
 =item $ctx-E<gt>switch($path, $url, $revision, $recursive, $pool);
 
 Switch working tree $path to $url at $revision.
@@ -793,7 +824,8 @@
                        revert resolved copy move revprop_set propset
                        proplist revvprop_list export ls cat import
                        propget uuid_from_url uuid_from_path
-                       url_from_path revprop_get revprop_list))
+                       url_from_path revprop_get revprop_list
+                       info))
 {
     no strict 'refs';
     my $real_function = \&{"SVN::_Client::svn_client_$function"};
@@ -820,7 +852,7 @@
                 last;
             }
         }
-        
+
         if (!defined($ctx))
         {
             # Allows import to work while not breaking use SVN::Client.
@@ -1193,6 +1225,81 @@
 
 =cut
 
+package _p_svn_info_t;
+use SVN::Base qw(Client svn_info_t_);
+
+=head2 svn_info_t
+
+=over 8
+
+=item $info->URL()
+
+Where the item lives in the repository.
+
+=item $info->rev()
+
+The revision of the object.  If path_or_url is a working-copy
+path, then this is its current working revnum.  If path_or_url
+is a URL, then this is the repos revision that path_or_url lives in.
+
+=item $info->kind()
+
+The node's kind.
+
+=item $info->repos_root_URL()
+
+The root URL of the repository.
+
+=item $info->repos_UUID()
+
+The repository's UUID.
+
+=item $info->last_changed_rev()
+
+The last revision in which this object changed.
+
+=item $info->last_changed_date()
+
+The date of the last_changed_rev.
+
+=item $info->last_changed_author()
+
+The author of the last_changed_rev.
+
+=item $info->lock()
+
+An exclusive lock, if present.  Could be either local or remote.
+
+=back
+
+See SVN::Wc::svn_wc_entry_t for the rest of these.   svn_client.h indicates that these were copied from that struct and mean the same things.   They are also only useful when working with a WC.
+
+=over 8
+
+=item $info->has_wc_info()
+
+=item $info->schedule()
+
+=item $info->copyfrom_url()
+
+=item $info->copyfrom_rev()
+
+=item $info->text_time()
+
+=item $info->prop_time()
+
+=item $info->checksum()
+
+=item $info->conflict_old()
+
+=item $info->conflict_new()
+
+=item $info->conflict_wrk()
+
+=item $info->prejfile()
+
+=cut
+
 package _p_svn_client_commit_info_t;
 use SVN::Base qw(Client svn_client_commit_info_t_);
 
Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c
===================================================================
--- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c	(revision 18650)
+++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.c	(working copy)
@@ -1120,6 +1120,23 @@
     return ret_val;
 }
 
+/* Thunked version of svn_client_info_t callback type. */
+svn_error_t *svn_swig_pl_info_receiver(void *baton,
+                                       const char *path,
+                                       const svn_info_t *info,
+                                       apr_pool_t *pool)
+{
+  svn_error_t *err = SVN_NO_ERROR;
+  swig_type_info *infoinfo = _SWIG_TYPE("svn_info_t *");
+
+  if (!SvOK((SV *)baton)) {
+    return;
+  }
+   
+  svn_swig_pl_callback_thunk(CALL_SV, baton, NULL, "sSS", path, info, infoinfo, pool, POOLINFO); 
+}
+
+
 /* Thunked version of svn_wc_cancel_func_t callback type. */
 svn_error_t *svn_swig_pl_cancel_func(void *cancel_baton) {
     SV *result;
Index: subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h
===================================================================
--- subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h	(revision 18650)
+++ subversion/bindings/swig/perl/libsvn_swig_perl/swigutil_pl.h	(working copy)
@@ -194,6 +194,12 @@
                                              void *baton,
                                              apr_pool_t *pool);
 
+/* Thunked version of svn_client_info_t callback type. */
+svn_error_t *svn_swig_pl_info_receiver(void *baton,
+                                       const char *path,
+                                       const svn_info_t *info,
+                                       apr_pool_t *pool);
+
 /* Thunked version of svn_wc_cancel_func_t callback type. */
 svn_error_t *svn_swig_pl_cancel_func(void *cancel_baton);
 
Index: subversion/bindings/swig/include/svn_types.swg
===================================================================
--- subversion/bindings/swig/include/svn_types.swg	(revision 18650)
+++ subversion/bindings/swig/include/svn_types.swg	(working copy)
@@ -441,6 +441,12 @@
    Callback: svn_info_receiver_t
 */
 
+%typemap(perl5, in) (svn_info_receiver_t receiver, void *receiver_baton)
+{
+  $1 = svn_swig_pl_info_receiver;
+  $2 = (void *)$input;
+}
+
 %typemap(ruby, in) (svn_info_receiver_t receiver, void *receiver_baton)
 {
   $1 = svn_swig_rb_info_receiver;
Index: subversion/bindings/swig/svn_client.i
===================================================================
--- subversion/bindings/swig/svn_client.i	(revision 18650)
+++ subversion/bindings/swig/svn_client.i	(working copy)
@@ -153,6 +153,15 @@
 }
 
 /* -----------------------------------------------------------------------
+   Callback: svn_client_info_receiver_t
+*/
+%typemap(perl5, in) (svn_client_info_receiver_t receiver, void *receiver_baton)
+{
+  $1 = svn_swig_pl_info_func;
+  $2 = $input;
+}
+
+/* -----------------------------------------------------------------------
    Callback: svn_cancel_func_t
    svn_client_ctx_t
 */




