如何向Python代码中添加svn存储库构建编号?

如何向Python代码中添加svn存储库构建编号?,python,svn,Python,Svn,编辑:此问题重复(感谢您的提醒,查尔斯!) 你好 这个问题类似于 区别在于: 我想将修订号添加到Python中 我想要存储库的修订版(而不是签出的文件) 即,我想从“svn信息”的返回中提取修订号,如: $svn信息 Path: . URL: svn://localhost/B/trunk Repository Root: svn://localhost/B Revision: 375 Node Kind: directory Schedule: normal Last Changed Auth

编辑:此问题重复(感谢您的提醒,查尔斯!)

你好

这个问题类似于

区别在于:

  • 我想将修订号添加到Python中

  • 我想要存储库的修订版(而不是签出的文件)

  • 即,我想从“svn信息”的返回中提取修订号,如:

    $svn信息

    Path: .
    URL: svn://localhost/B/trunk
    Repository Root: svn://localhost/B
    Revision: 375
    Node Kind: directory
    Schedule: normal
    Last Changed Author: bmh
    Last Changed Rev: 375
    Last Changed Date: 2008-10-27 12:09:00 -0400 (Mon, 27 Oct 2008)
    
    我想要一个375(修订版)的变量。将$Rev$放入变量以跟踪文件中的更改非常简单。但是,我希望跟踪存储库的版本,并且我理解(而且似乎是基于我的测试),$Rev$只在文件更改时更新

    我最初的想法是使用Python内置的svn/libsvn模块,尽管我找不到任何关于如何使用它们的文档或示例

    或者,我曾想过调用“svn信息”并将代码正则化,尽管这似乎相当残忍。:)

    非常感谢您的帮助


    谢谢和干杯。

    为了在shell中显示当前subversion版本号,我使用了与此非常类似的技术:

    svnRev=$(echo "$(svn info)" | grep "^Revision" | awk -F": " '{print $2};')
    echo $svnRev
    
    它对我很有效


    为什么每次增加整个存储库的版本号时都要更改python文件?如果一个文件来自repo,另一个文件来自tarball,这将使在两个文件之间进行差异处理等操作变得烦人。

    Python直接绑定到libsvn,因此您根本不需要调用命令行客户机。有关更多详细信息,请参阅

    编辑:您基本上可以执行以下操作:

    from svn import fs, repos, core
    repository = repos.open(root_path)
    fs_ptr = repos.fs(repository)
    youngest_revision_number = fs.youngest_rev(fs_ptr)
    

    subversion附带了一个名为
    svinversion
    的命令,该命令旨在解决此类问题。

    如果您希望在一个源文件中有一个可以设置为当前工作副本版本的变量,并且不会在subversion上重播,并且在运行程序时,工作副本实际上是可用的,那么my将是您的解决方案

    似乎还有一个名为


    两者都使用工作副本的最高提交级别执行$WCREV$替换。还可以提供其他信息。

    直接从django被盗:

    def get_svn_revision(path=None):
        rev = None
        if path is None:
            path = MODULE.__path__[0]
        entries_path = '%s/.svn/entries' % path
    
        if os.path.exists(entries_path):
            entries = open(entries_path, 'r').read()
            # Versions >= 7 of the entries file are flat text.  The first line is
            # the version number. The next set of digits after 'dir' is the revision.
            if re.match('(\d+)', entries):
                rev_match = re.search('\d+\s+dir\s+(\d+)', entries)
                if rev_match:
                    rev = rev_match.groups()[0]
            # Older XML versions of the file specify revision as an attribute of
            # the first entries node.
            else:
                from xml.dom import minidom
                dom = minidom.parse(entries_path)
                rev = dom.getElementsByTagName('entry')[0].getAttribute('revision')
    
        if rev:
            return u'SVN-%s' % rev
        return u'SVN-unknown'
    
    适当地调整。您可能希望将MODULE更改为其中一个代码模块的名称


    即使目标系统未安装subversion,此代码也可以正常工作。

    根据CesarB的响应和Charles提供的链接,我已完成以下操作:

    try:
      from subprocess import Popen, PIPE
      _p = Popen(["svnversion", "."], stdout=PIPE)
      REVISION= _p.communicate()[0]
      _p = None # otherwise we get a wild exception when Django auto-reloads
    except Exception, e:
      print "Could not get revision number: ", e
      REVISION="Unknown"
    

    天哪,蟒蛇很酷。:)

    我可以想象BMH不想在每个文件中都使用它,而是希望有一个单独的位置来详细说明系统的当前版本-请看本页右下角的示例。是的,但这并不能让您访问SvVersion中的所有逻辑-在这种情况下,SvVersion做正确的事情。有很多,这个问题有很多重复之处——我几乎看不出这是一个特定于python的问题(或者有特定于python的答案),除非您想与基于setuptools的构建过程或诸如此类的过程相结合。您可以对此进行修改,以显示如何将结果写入绑定到生成的egg/package/whatnot中的构建工件,只是为了完成并回答问题的两个方面(如何计算答案,以及如何将其捆绑到python项目中)。