On Jan 20, 2010, at 11:10 , Роман Донченко wrote:

> Daniel Eggert <egg...@macvaerk.dtu.dk> писал в своём письме Wed, 20 Jan 2010 
> 19:54:40 +0300:
> 
>>>> I got svn.ra.open2() and svn.ra.get_dir() working, but I'm unable to make 
>>>> the receiver/baton part of
>>>>    l = svn.ra.get_log2(session, None, 1, 4, 0, False, False, [], receiver, 
>>>> None)
>>>> work. The receiver is supposed to be a svn_log_entry_receiver_t. I tried 
>>>> to do
>>>>    def receiver(baton, entry):
>>>>        print entry
>>>> but I get
>>>>    TypeError: argument number 8:
>>> 
>>> The immediate cause of this is that you forgot the include_merged_revisions 
>>> argument. 8=] But were you to include it, your code would still be wrong, 
>>> because...
>>> 
>>>> How does swig wrap svn_log_entry_receiver_t?
>>> 
>>> A callable Python object (which can be a function, or a class instance) 
>>> that you pass becomes both the C function and the C baton. Thus, your call 
>>> should look like:
>>> 
>>> svn.ra.get_log2(
>>> session,    # session
>>> None,       # paths 
>>> 1,  # start
>>> 4,  # end
>>> 0,  # limit
>>> False,      # discover_changed_paths
>>> False,      # strict_node_history
>>> False,      # include_merged_revisions
>>> [], # revprops
>>> receiver    # receiver & receiver_baton
>>>     # pool (is omitted)
>>> )
>>> 
>>> And the receiver should look like:
>>> 
>>> def receiver(entry, pool):
>>>  print entry
>>> 
>>>> I have not been able to find any python sample code that uses svn.ra.
>>> 
>>> Look at the bindings' testsuite at 
>>> <http://svn.apache.org/repos/asf/subversion/trunk/subversion/bindings/swig/python/tests/ra.py>.
>> 
>> Thanks. This is very helpful.
>> 
>> Some of those crash for me, too:
>> 
>>>>> root = svn.ra.get_repos_root(session)
>> Assertion failed: (is_canonical(path, strlen(path))), function 
>> svn_path_is_empty, file 
>> /SourceCache/subversion/subversion-35/subversion/subversion/libsvn_subr/path.c,
>>  line 414.
>> Abort
>> 
>> It turns out that this was caused by my repository URL having a trailing 
>> "/". Not very elegant for the entire thing to simply crash, and not very 
>> easy to figure out what was causing this.
>> 
>> It would be great if this would be handled more gracefully.
>> 
>> I'm currently using version 1.6.5 (r38866).
> 
> This is a constraint of the C API. When you pass paths and URIs to Subversion 
> functions, they must be in the canonical internal form. Unless the URI you 
> use is an output of another Subversion function, you must use 
> core.svn_path_internal_style to prepare it.

Aha! Thanks a lot!

/Daniel

Reply via email to