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

Php 如何以编程方式获取SVN修订号?,php,python,svn,Php,Python,Svn,,但不需要实际查询SVN服务器。这是一个基于web的项目,所以我想我将只使用存储库作为公共视图(除非有人能告诉我为什么这是个坏主意)。我假设这个信息在.svn文件夹的某个地方,但是在哪里,我如何解析它?我想做一些像这样的事情,把修订放在右下角 如果您手头有Python或PHP代码,或者只是正确方向上的一点,您会很感激它。您可以使用命令行上的“svn info”获取签出的当前修订号 例如: $ svn info Chemin : . URL : http://.../trunk Racine du

,但不需要实际查询SVN服务器。这是一个基于web的项目,所以我想我将只使用存储库作为公共视图(除非有人能告诉我为什么这是个坏主意)。我假设这个信息在
.svn
文件夹的某个地方,但是在哪里,我如何解析它?我想做一些像这样的事情,把修订放在右下角


如果您手头有Python或PHP代码,或者只是正确方向上的一点,您会很感激它。

您可以使用命令行上的“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信息--xml
http://.../trunk
http://...
128b9c1a-…-612a326c9977
正常的
无穷
然后,获取
条目
标记的
修订
属性


请注意,我不会在每个页面视图上都这样做:不会像您的应用程序希望的那样快

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


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

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


您可以直接转到命令行并运行svn info。请记住,这可能是一个混合的修订。您还可以运行svn up,标准输出的最后一行将为您提供修订号


或者,您想使用SVNAPI吗?您可能还想查看SubWCRev中的TortoiseSVN代码,该代码用于将文件中的令牌替换为WC的当前版本

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

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

entry = info( path )

这适用于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";

在兰斯之后,这里有一个命令行,一行一行

svn log -q --limit 1  http://svnbox/path/to/repo/trunk \
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];'
Subversion包含的工具正是用于此目的。工作副本实际上可能有局部修改,或者可能由多个修订组成<代码>转换
知道如何处理;请参见链接文档中的示例

您可以从python中调用
svversion
,如下所示:

import subprocess

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

我知道这已经很老了,但我想我应该提供如何在PHP中为我的web应用程序实现这一点:

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

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

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

因此stripSVNstuff($SVN_rev)的输出将是“6”(不带引号)。

我希望找到一种方法,而不是解析
SVN info
,但我认为这是一种有效的解决方案。可能会产生比解析文件更一致的信息。。。我不知道的
--xml
选项;这会让事情变得更简单。我不知道你是不是在挖苦人,但对我来说,这听起来确实比炮击或插入svn然后解析一堆输出更有效率。不……一点也不。我的意思是,这听起来比在每次加载页面时运行外部进程要有效得多。我认为阅读文本文件实际上会更有效率。为什么
shell=True
?看@lorenzog:这个答案已经快7岁了,所以我不记得了。如果你已经验证了它在没有shell=True的情况下可以工作,那么请告诉我,我会将其编辑掉。它似乎至少对我来说工作正常:(出于某种原因,我不能-你的尼克…)
$SVN_rev = "\$LastChangedRevision$";
$SVN_headURL = "\$HeadURL$";

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