Thompson, Thomas J wrote on Tue, Sep 27, 2011 at 13:25:04 -0700:
> Hi,
>
> I'm an intermediate perl developer with lots to learn, but I think
> I've found an issue with the perl subversion bindings that I'd like to
> pass by you folks to ensure it's not just operator error. I would
> give you the version I'm working with, but I see no VERSION variable
> in the SVN::Client module. What version information would be useful?
>
svn_client_version()
(Though, perhaps we should just be setting $VERSION...)
> I tried to subclass SVN::Client, but I found that function calls were failing with type errors. I brought this up in this thread on perlmonks:
> http://www.perlmonks.org/?node_id=928123
>
> I was seeing errors that look like this:
> TypeError in method 'svn_client_ls', argument 2 of type 'char const *'
>
> I found out this section of code handles arguments for calls to the svn functions:
> # import methods into our name space and wrap them in a closure
> # to support method calling style $ctx->log()
> foreach my $function (@_all_fns)
> {
> no strict 'refs';
> my $real_function = \&{"SVN::_Client::svn_client_$function"};
> *{"SVN::Client::$function"} = sub
> {
> my ($self, $ctx);
> my @args;
>
> # Don't shift the first param if it isn't a SVN::Client
> # object. This lets the old style interface still work.
> # And is useful for functions like url_from_path which
> # don't take a ctx param, but might be called in method
> # invocation style or as a normal function.
> for (my $index = $[; $index <= $#_; $index++)
> {
> if (ref($_[$index]) eq 'SVN::Client')
> {
> ($self) = splice(@_,$index,1);
> $ctx = $self->{'ctx'};
> last;
> } elsif (ref($_[$index]) eq '_p_svn_client_ctx_t') {
> $self = undef;
> ($ctx) = splice(@_,$index,1);
> last;
> }
> }
>
> The problem here is this line:
> if (ref($_[$index]) eq 'SVN::Client')
>
> This breaks if you attempt to subclass SVN::Client to add functionality. The result is type errors because the invocant is not removed from the function arguments before being passed through to the svn api. This should instead be:
>
> if (UNIVERSAL::isa($_[$index], 'SVN::Client')
>
>
>
> What should I do from here to ensure it is addressed? I'd like to help out the perl/svn community.
>
(This is just an answer to your process question; I haven't reviewed the
issue to determine whether or not I agree with your proposed fix.)
Send a patch against subversion/bindings/swig/perl/native/Client.pm.
See http://subversion.apache.org/patches
Thanks!
Received on 2011-09-27 23:17:21 CEST