如何从Python / SWIG调用SVN的fs.change_rev_prop2 - 将old_value_p作为双指针传递?

时间:2015-08-27 01:25:04

标签: python pointers svn swig

我试图从Python / SWIG调用fs.change_rev_prop2 - 显然无法弄清楚如何通过old_value_p,因为我假设需要成为来自Python的双指针。

最小化代码示例:

#!/usr/bin/env python

from svn import repos, fs, core

fs_ptr = repos.fs(repos.open("/opt/app/svn/repos/test"))
rev_num = 1

user = fs.revision_prop(fs_ptr, rev_num, "svn:author")

# Works, but is is deprecated in favor of fs.change_rev_prop2 .
fs.change_rev_prop(fs_ptr, rev_num, "svn:author", user.lower())

# fs.change_rev_prop2(fs_ptr, rev_num, "svn:author", user, user.lower())
# > svn.core.SubversionException: 160049 - revprop 'svn:author' has unexpected value in filesystem

# fs.change_rev_prop2(fs_ptr, rev_num, "svn:author", None, user.lower())
# Per svn_ra.h: If the capability is not advertised, then @a old_value_p MUST be @c NULL.
# This results in a successful change of the revision property, but then this program ends with a segmentation fault.

#160049错误的详细信息:

Traceback (most recent call last):
    File "./normalize-usernames.py", line 10, in <module>
        fs.change_rev_prop2(fs_ptr, rev_num, "svn:author", user, user.lower())
    File "/opt/app/subversion/lib/svn-python/libsvn/fs.py", line 711, in svn_fs_change_rev_prop2
        return _fs.svn_fs_change_rev_prop2(*args)
svn.core.SubversionException: 160049 - revprop 'svn:author' has unexpected value in filesystem

我相信我试图传递的价值是&#34;正确&#34;。毕竟,我在尝试将其设置回来之前立即从API获取它。我假设我没有以本机API可以接受的方式正确传递值。

所以我可以继续使用change_rev_prop - 但它在API中被明确标记为已弃用(&#34;为了向后兼容1.6 API&#34而提供)。应该可以做得更好,但是......

有趣的是,使用change_rev_prop2None调用old_value_p会导致所需的更改在存储库中生效 - 但不会导致Python程序立即以分段错误终止。

似乎我需要将旧/当前值作为指针传递 - 可能能够区分空指针(未提供的值)与指向空值的指针(值为提供,但值为空)?但是,我已经尝试了所有我能想到的组合而没有成功 - 包括使用ctypes中的各种包装。

SO正在适当地建议可能已经有答案的大量问题 - 但似乎大多数问题都包括作者控制C源的情况以及改变C API以避免复杂性的建议完全 - 我不认为这是一个选择。这是我迄今为止唯一的Python和SWIG体验,任何提示都将不胜感激,谢谢!

0 个答案:

没有答案
相关问题