Hi,
I found following code causes a NoMethodError on subversion-1.4.6 with
ruby-1.8.6.
$ svn --version
svn, version 1.4.6 (r28521)
compiled Mar 10 2008, 14:18:48
$ cat svn_test.rb
require 'svn/ra'
context = Svn::Client::Context.new
callbacks = Svn::Ra::Callbacks.new(context.auth_baton)
session = Svn::Ra::Session.open("http://localhost/", {}, callbacks)
session.commit_editor2("commit log") {}
$ ruby -v svn_test.rb
ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-freebsd6]
/usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `svn_ra_get_commit_editor2': undefined method `get_wc_prop' for false:FalseClass (NoMethodError)
from /usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `call'
from /usr/local/lib/ruby/site_ruby/1.8/svn/util.rb:60:in `get_commit_editor2'
from /usr/local/lib/ruby/site_ruby/1.8/svn/ra.rb:64:in `commit_editor2'
from svn_test.rb:5
In this test, localhost:80 is set up by Apache with mod_dav_svn as follows:
<Directory /home/hayashi/svn_test>
Order allow,deny
Allow from all
</Directory>
<Location />
DAV svn
SVNPath /home/hayashi/svn_test
</Location>
Above behavior may be from a bug of svn_swig_rb_setup_ra_callbacks.
The call-flow of above code fragment is following:
Svn::Ra:Session.open (Ruby svn/ra.rb)
-> Svn::Ra.open2/_wrap_svn_ra_open2 (Ruby/C svn_ra.c)
-> svn_swig_rb_setup_ra_callbacks (C libsvn_swig_ruby/swigutil_rb.c)
-> svn_ra_open2
4th argument of svn_ra_open2 (the callback_baton) doesn't set up successfully.
The value is send to svn_ra_open2 as an initial, (void *)0.
As a result, in a callbacking the baton is passed to a callback function
(e.g. ra_callbacks_get_wc_prop) as `false' because (void*)0 == Qfalse.
In my observation, the problem is not fixed in trunk.
Following patch (for trunk) will be a solution.
[[[
Fix a bug that Svn::Ra::Session#open doesn't set callback_baton correctly.
* subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
(svn_swig_rb_setup_ra_callbacks): initialize the baton.
]]]
Index: subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c
===================================================================
--- subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c (revision 30116)
+++ subversion/bindings/swig/ruby/libsvn_swig_ruby/swigutil_rb.c (working copy)
@@ -2628,6 +2628,7 @@
}
*callbacks = apr_pcalloc(pool, sizeof(**callbacks));
+ *baton = (void *)rb_callbacks;
(*callbacks)->open_tmp_file = ra_callbacks_open_tmp_file;
(*callbacks)->auth_baton = auth_baton;
Thanks,
--
HAYASHI, Shinpei <hayashi_at_rerecode.net>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe_at_subversion.tigris.org
For additional commands, e-mail: dev-help_at_subversion.tigris.org
Received on 2008-03-30 13:24:10 CEST