zoukankan      html  css  js  c++  java
  • svnbook

    http://www.subversion.org.cn/svnbook/1.4/

    http://www.subversion.org.cn/svnbook/1.4/svn.developer.usingapi.html#svn.developer.usingapi.otherlangs.ex-2

    例 8.3. 一个Python状态爬虫

    #!/usr/bin/env python
    
    """Crawl a working copy directory, printing status information."""
    
    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):
        # Calculate the length of the input working copy path.
        wc_path_len = len(wc_path)
    
        # Build a client context baton.
        ctx = svn.client.svn_client_ctx_t()
    
        def _status_callback(path, status, root_path_len=wc_path_len):
            """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[wc_path_len + 1:])
            
        # Do the status crawl, using _status_callback() as our callback function.
        svn.client.svn_client_status(wc_path, None, _status_callback,
                                     1, verbose, 0, 0, ctx)
    
    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[1], e[0]))
            sys.exit(1)
    

    就像例 8.2 “使用 Python 处理版本库层”中的例子,这个程序是池自由的,而且最重要的是使用Python的数据类型。svn_client_ctx_t()是欺骗,因为Subversion的API没有这个方法—这仅仅是SWIG自动语言生成中的一点问题(这是对应复杂C结构的一种工厂方法)。也需要注意传递给程序的路径(象最后一个)是通过 svn_path_canonicalize()执行的,因为要防止触发Subversion底层C库的断言,也就是防止导致程序立刻随意退出。



    [50] 当然,Subversion使用Subversion的API。

    [51] Subversion使用尽可能多ANSI系统调用和数据类型。

    [52] Neon和Berkeley DB就是这种库的例子。

    [53] 或仅仅是在紧密地程序优化中玩弄什么东西。

  • 相关阅读:
    【Linux】【Services】【Configuration】puppet
    【Linux】【Services】【Web】Haproxy
    【Linux】【Services】【Project】Haproxy Keepalived Postfix实现邮件网关Cluster
    【Linux】【Services】【Web】Nginx基础
    【Linux】【Services】【Project】Cobbler自动化装机
    【Linux】【Services】【Package】rpm包制作
    【Linux】【Services】【nfs】nfs安装与配置
    Bootstrap框架--DataTables列表示例--添加判断
    安全整改相关内容
    tomcat禁用PUT,DELETE等一些不必要的HTTP方法
  • 原文地址:https://www.cnblogs.com/lexus/p/2355197.html
Copyright © 2011-2022 走看看