subversion python绑定文档?

时间:2009-09-19 16:32:18

标签: python svn documentation

在哪里可以找到使用subversion python绑定的一个很好的介绍?

我发现one section in the svnbook谈论它;还有一些basic examples from 1.3

是否有更全面和最新的内容?

4 个答案:

答案 0 :(得分:5)

我想在这里补充一点说明。

感谢上面两个答案(@BenjaminWohlwend@Logan),我意识到Subversion有多套Python绑定/接口;我在我的Ubuntu 11.04盒子上做了这个:

$ apt-cache search '[Ss]vn|[Ss]ubversion' | grep -i python
python-svn - A(nother) Python interface to Subversion
python-svn-dbg - A(nother) Python interface to Subversion (debug extension)
python-subversion - Python bindings for Subversion
python-subversion-dbg - Python bindings for Subversion (debug extension)
python-opster - a python command line parsing speedster
python-py - Advanced Python testing tool and networking lib
python-rope - Python refactoring library
python-subvertpy - Alternative Python bindings for Subversion

可以查看Debian包文件列表,以确定它们引用的库;所以我们有:

...我还在存储库中找到了另一个:

链接http://svn.apache.org/repos/asf/subversion(我从@BenjaminWohlwend获得)显然是Subversion源代码本身的Apache Software Foundation(asf?)Subversion存储库。

OP对文档的追求似乎与python-subversion(或SWIG绑定(或libsvn)有关;其源代码构建指令在@Logan的帖子中。我无法'从svn.developer: Using the APIs中已经引用的bindings/swig/python/README中找到更好的文档源;它解释了SWIG如何从C生成Python接口:

  

翻译参数列表

     

SWIG绑定的参数减少定律有点像     这个:

- The module prefix can be omitted.  o:  

     void *some_C_function = svn_client_foo;  

  becomes:  

     import svn.client  
     func = svn.client.foo  
     

[...]

然后,可以查看svn/core.py,然后查找函数(和“明确定义的符号”),如svn_mergeinfo_merge;注意core.py导入libsvn.core - 其中libsvn可能是指从C文件libsvn_swig_py/swigutil_py.c构建的共享对象(.so)文件。

然后,我们可以查找svn_mergeinfo_merge,找到SVNSearch: Subversion (commit 23570 05.03.2007)之类的提交消息,该消息引用该函数,svn_mergeinfo.h;进一步查找该文件,我们在ASF存储库中找到它:svn_mergeinfo.h,它确实包含:

/** Like svn_mergeinfo_merge2, but uses only one pool.
 *
 * @deprecated Provided for backward compatibility with the 1.5 API.
 */
SVN_DEPRECATED
svn_error_t *
svn_mergeinfo_merge(svn_mergeinfo_t mergeinfo,
                    svn_mergeinfo_t changes,
                    apr_pool_t *pool);

在那里看到DEPRECATED,这里引用svn commit: r1175903 (Mon Sep 26 2011)可能很好:

  
      
  • subversion / libsvn_subr / mergeinfo.c

         

    (svn_mergeinfo_merge2):新的。

         

    (svn_mergeinfo_merge):转到deprecated.c。

         

    (svn_mergeinfo_catalog_merge):使用新的API。

  •   

那就是 - 特定功能在2011年已被弃用 - 所以希望一个人的Python SVN绑定和SVN安装应该匹配......

答案 1 :(得分:2)

如果从源代码构建Subversion,则不会自动包含Subversion Python绑定。您必须专门构建并包含它们。幸运的是,您可以在安装Subversion后执行此操作。绑定源包含在Subversion源代码中。

这些说明适用于Red Hat Enterprise Linux上的Subversion 1.5.9和Python 2.4.3,但对于最新版本的Subversion和Python以及通用unix安装,它们应该很容易被攻击。

首先,从http://downloads.sourceforge.net/swig

下载swig
tar -xvf swig-<version>.tar.gz
cd swig-<version>

此时你必须做出决定。您可以为所有支持的语言安装swig,也可以根据需要进行安装。 “make check”可能需要一个小时才能运行,并且可能由于您不关心的语言错误而失败。

如果您想使用所有支持的语言:

./configure 

如果你想将范围缩小到只是python,请运行:

./configure --with-python=/usr/local/bin/python2.4 --without-perl --without-ruby --without-php4

接下来,运行:

make

如果您选择完整安装,请运行:

make -k check

如果你缩小到只是python,你只需要运行python测试:

make check-python-examples
make check-python-test-suite

如果一切正常,您就可以安装swig了:

make install

从这里开始,安装subversion python绑定应该相当简单:

tar -xvf subversion-1.5.9.tar.gz --gzip 
cd subversion-1.5.9
make swig-py
make install-swig-py
touch /usr/lib64/python2.4/site-packages/svn-python.pth
echo /usr/local/lib/svn-python > /usr/lib64/python2.4/site-packages/svn-python.pth

与往常一样,您的里程可能会因您的具体版本和架构而异。祝你好运。

答案 2 :(得分:1)

答案 3 :(得分:0)

希望通过其他帖子重新开始:python-subversion:我想尝试Example 8.3. A Python status crawler - Using the APIs (svnbook)。在Ubuntu 11.04上,Python 2.7,svn_client_status2崩溃了一个带有UTF-8字符的文件名“错误(22):将目录'path'中的条目转换为UTF-8 时出错” - 对此的解决方案是在调用此函数之前调用setlocale

我也意识到Python API中有svn_client_status3svn_client_status4; svn_client_status3的通话略有不同,也需要setlocale。但是,不应该使用svn_client_status4 - 它是段错误的,因为它需要一个Python无法提供的struct参数;有关更多信息,请参阅#16027750 Debugging: stepping through Python script using gdb?

要将其包装起来,这里是带有语言环境设置的示例8.3,它使用svn_client_status3 - 并且不会在我的系统上崩溃(即使在具有UTF-8字符的文件名上):

#!/usr/bin/env python

# modified from:
# http://svnbook.red-bean.com/en/1.5/svn.developer.usingapi.html
# does the same as `svn status`, and is marked:
"""Crawl a working copy directory, printing status information."""

# tested on Python 2.7, Ubuntu Natty 11.04; needs:
# sudo apt-get install python-subversion

import locale
print locale.getlocale() # (None, None) - in C: ANSI_X3.4-1968
locale.setlocale(locale.LC_ALL, '') # would print en_US.UTF-8
print locale.getlocale() # NOW it is ('en_US', 'UTF-8')

import sys
import os.path

import getopt
import svn.core, svn.client, svn.wc


def generate_status_code(status):
  """Translate a status value into a single-character status code,
  using the same logic as the Subversion command-line client."""
  code_map = { svn.wc.svn_wc_status_none        : ' ',
               svn.wc.svn_wc_status_normal      : ' ',
               svn.wc.svn_wc_status_added       : 'A',
               svn.wc.svn_wc_status_missing     : '!',
               svn.wc.svn_wc_status_incomplete  : '!',
               svn.wc.svn_wc_status_deleted     : 'D',
               svn.wc.svn_wc_status_replaced    : 'R',
               svn.wc.svn_wc_status_modified    : 'M',
               svn.wc.svn_wc_status_merged      : 'G',
               svn.wc.svn_wc_status_conflicted  : 'C',
               svn.wc.svn_wc_status_obstructed  : '~',
               svn.wc.svn_wc_status_ignored     : 'I',
               svn.wc.svn_wc_status_external    : 'X',
               svn.wc.svn_wc_status_unversioned : '?',
             }
  return code_map.get(status, '?')


def do_status(wc_path, verbose):
  # Build a client context baton.
  ctx = svn.client.svn_client_ctx_t()

  def _status_callback(path, status):
      """A callback function for svn_client_status."""

      # Print the path, minus the bit that overlaps with the root of
      # the status crawl
      text_status = generate_status_code(status.text_status)
      prop_status = generate_status_code(status.prop_status)
      print '%s%s  %s' % (text_status, prop_status, path)

  # Do the status crawl, using _status_callback() as our callback function.
  revision = svn.core.svn_opt_revision_t()
  revision.type = svn.core.svn_opt_revision_head
  #~ svn.client.svn_client_status2(wc_path, revision, _status_callback,
                                #~ svn.core.svn_depth_infinity, verbose,
                                #~ 0, 0, 1, ctx)
  svn.client.svn_client_status3(wc_path, revision, _status_callback,
                                svn.core.svn_depth_infinity, verbose,
                                0, 0, 1, (), ctx)
  # DO NOT USE svn_client_status4! (needs a C struct argument)


def usage_and_exit(errorcode):
    """Print usage message, and exit with ERRORCODE."""
    stream = errorcode and sys.stderr or sys.stdout
    stream.write("""Usage: %s OPTIONS WC-PATH
Options:
  --help, -h    : Show this usage message
  --verbose, -v : Show all statuses, even uninteresting ones
""" % (os.path.basename(sys.argv[0])))
    sys.exit(errorcode)

if __name__ == '__main__':
  # Parse command-line options.
  try:
    opts, args = getopt.getopt(sys.argv[1:], "hv", ["help", "verbose"])
  except getopt.GetoptError:
    usage_and_exit(1)
  verbose = 0
  for opt, arg in opts:
    if opt in ("-h", "--help"):
      usage_and_exit(0)
    if opt in ("-v", "--verbose"):
      verbose = 1
  if len(args) != 1:
    usage_and_exit(2)

  # Canonicalize the repository path.
  wc_path = svn.core.svn_path_canonicalize(args[0])

  # Do the real work.
  try:
    do_status(wc_path, verbose)
  except svn.core.SubversionException, e:
    sys.stderr.write("Error (%d): %s\n" % (e.apr_err, e.message))
    sys.exit(1)