如何将一个svn存储库内部版本号添加到Python代码中?

时间:2008-10-28 05:10:34

标签: python svn

  

编辑:这个问题重复了How to access the current Subversion build number?(感谢您的抬头,查尔斯!)

你好,

此问题与Getting the subversion repository number into code

类似

差异在于:

  1. 我想将修订号添加到Python

  2. 我想修改存储库(不是签出文件)

  3. 即。我想从'svn info',likeo:

    的回复中提取修订版号

    $ svn info

    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 info'并正确编写代码,尽管这似乎相当野蛮。 :)

    非常感谢帮助。

    谢谢&欢呼声。

6 个答案:

答案 0 :(得分:3)

有一个名为svnversion的命令,它带有颠覆功能,旨在解决这类问题。

答案 1 :(得分:3)

直接从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,此代码也具有工作的优势。

答案 2 :(得分:2)

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

编辑:您基本上可以这样做:

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

答案 3 :(得分:1)

我使用了一种与此非常相似的技术,以便在我的shell中显示当前的subversion版本号:

svnRev=$(echo "$(svn info)" | grep "^Revision" | awk -F": " '{print $2};')
echo $svnRev

对我来说非常好。

为什么每次整个存储库的版本号递增时,都希望更改python文件?如果一个来自repo,另一个来自tarball,这将使得做两个文件之间的差异很烦人。

答案 4 :(得分:1)

如果你想在一个源文件中有一个可以设置为当前工作副本修订版的变量,并且不在subversion上重放,并且在你运行程序时实际可用的工作副本,那么{{3我是你的解决方案。

似乎还有一个名为SubWCRev

的Linux端口

使用工作副本的最高提交级别执行$ WCREV $的替换。其他信息也可能提供。

答案 5 :(得分:0)

根据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"

Golly Python很酷。 :)