如何以编程方式获取SVN修订号?

时间:2009-09-30 18:17:48

标签: php python svn

Like this question,但无需实际查询SVN服务器。这是一个基于Web的项目,所以我想我将只使用存储库作为公共视图(除非有人可以告诉我为什么这是一个坏主意)。我假设此信息位于.svn文件夹中的某个文件中,但是在哪里,以及如何解析它?我想做一些像SO那样的事情,在右下角进行修改。

Python或PHP中的代码如果您手头有它,或者只是朝着正确的方向指出,那就很感激了。

9 个答案:

答案 0 :(得分:13)

Subversion包含svnversion工具,正是出于此目的。工作副本实际上可能具有本地修改,或者可能包含各种修订。 svnversion知道如何处理;请参阅链接文档中的示例。

您可以像这样从python中调用svnversion

import subprocess

def svnversion():
    p = subprocess.Popen("svnversion", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    (stdout, stderr) = p.communicate()
    return stdout

答案 1 :(得分:4)

我可能会使用post-commit钩子将版本号写入网站内的某个文本文件,然后在加载页面时读取该文件。

More on using hooks here

答案 2 :(得分:3)

您可以在命令行中使用“svn info”获取结帐的当前修订号。

例如:

$ svn info
Chemin : .
URL : http://.../trunk
Racine du dépôt : http://...
UUID du dépôt : 128b9c1a-...-612a326c9977
Révision : 185
Type de nœud : répertoire
Tâche programmée : normale
Auteur de la dernière modification : ...
Révision de la dernière modification : 185
Date de la dernière modification: 2009-09-28 20:12:29 +0200 (lun. 28 sept. 2009)

注意它是本地化的;如果您使用的是Linux,可以尝试使用:

$ LANG=en svn info
svn: warning: cannot set LC_CTYPE locale
svn: warning: environment variable LANG is en
svn: warning: please check that your locale name is correct
Path: .
URL: http://.../trunk
Repository Root: http://...
Repository UUID: 128b9c1a-...-612a326c9977
Revision: 185
Node Kind: directory
Schedule: normal
Last Changed Author: mzeis
Last Changed Rev: 185
Last Changed Date: 2009-09-28 20:12:29 +0200 (Mon, 28 Sep 2009)

如果在PHP中使用它,那么将它作为XML获取可能会更有帮助(更容易解析,而不是区域设置感知)

$ svn info --xml
<?xml version="1.0"?>
<info>
<entry
   kind="dir"
   path="."
   revision="185">
<url>http://.../trunk</url>
<repository>
<root>http://...</root>
<uuid>128b9c1a-...-612a326c9977</uuid>
</repository>
<wc-info>
<schedule>normal</schedule>
<depth>infinity</depth>
</wc-info>
<commit
   revision="185">
<author>...</author>
<date>2009-09-28T18:12:29.130307Z</date>
</commit>
</entry>
</info>

只需使用simplexml_load_string,然后获取revision代码的entry属性。


请注意,我不会在每个页面视图上执行此操作:不如人们希望您的应用程序快。

相反,我会在创建存档时获得该修订号,稍后会发送到生产服务器 - 并将其存储在某种配置文件中。

这样,您不需要在生产服务器上使用svn命令,也不需要在该服务器上进行结帐。

答案 3 :(得分:3)

这适用于svn版本1.6.2。但请注意,不同的SVN版本使用不同格式的.svn文件夹。

<?php

$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries');
preg_match("/dir\n(.+)/", $contents, $matches);
$svnRevision = $matches[1];

print "This Directory's SVN Revsion = $svnRevision\n";

答案 4 :(得分:3)

在Lance之后,这是一个命令行单行。

svn log -q --limit 1  http://svnbox/path/to/repo/trunk \
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];'

答案 5 :(得分:2)

我喜欢MediaWiki使用的解决方案,阅读.svn/entities的内容。检查此问题的第一个答案:Getting the subversion repository number into code

答案 6 :(得分:2)

如果您正在寻找Python实现,请查看pysvn,您可以调用info command获取详细信息,包括当前版本:

entry = info( path )

答案 7 :(得分:1)

我知道这已经很老了,但我想我会用PHP为我的网络应用程序提供这样做:

将其放入应用程序的PHP文件中,并为“Date Revision Author HeadURL Id”设置SVN Keywords属性(文件中的关键字替换)。

$SVN_rev = "\$LastChangedRevision$";
$SVN_headURL = "\$HeadURL$";

function stripSVNstuff($s)
{
    $s = substr($s, strpos($s, ":")+1);
    $s = str_replace("$", "", $s);
    return trim($s);
}

因此,在svn对源文件进行关键字替换之后,$ SVN_rev行将如下所示:

$SVN_rev = "\$LastChangedRevision: 6 $";

所以stripSVNstuff($ SVN_rev)的输出为“6”(不含引号)。

答案 8 :(得分:0)

你可以直接命令到命令行并运行svn info。请记住,这可能是一个混合的修订版。您也可以运行一个svn,STDOUT的最后一行将为您提供修订号。

或者,您想使用svn API吗?您可能还想查看SubWCRev中的TortoiseSVN代码,该代码用于将文件中的标记替换为WC的当前修订版。