2009-09-30 95 views
7

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

如果您手头上有代码,或者只是在正确的方向上指向一个点,Python或PHP中的代码将得到赞赏。

回答

13

颠覆包括svnversion工具正是为了这个目的。工作副本实际上可能有本地修改,或者可能包含多个修订版本。 svnversion知道如何处理;请参阅链接文档中的示例。

您可以从蟒蛇调用svnversion这样的:

import subprocess 

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

为什么'shell = True'?见https://docs.python.org/2/library/subprocess.html#frequently-used-arguments – lorenzog 2016-05-11 09:22:31

+0

@lorenzog:这个答案差不多7岁,所以我不记得了。如果你已经证实它的工作原理没有shell = True,那么让我知道,我会编辑它。 – 2016-05-11 12:04:22

+0

它似乎至少对我来说工作正常:http://stackoverflow.com/a/37157630/204634(出于某种原因,我不能@ - 你的尼克..?) – lorenzog 2016-05-11 15:09:11

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,并获取entry标签的revision属性。


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

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

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

+0

我希望有一种方法,而不是解析'svn info',但我想这是一个有效的解决方案。可能比解析文件产生更一致的信息......我不知道的'--xml'选项;应该让事情更轻松。 – mpen 2009-09-30 19:14:05

4

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

More on using hooks here

+0

现在听起来很有效率! – mpen 2009-09-30 19:11:46

+0

我不知道你是不是很讽刺,但是对于我来说,这听起来更有效率,而不是对svn进行脱壳或分析,然后解析一堆输出。 – glomad 2009-09-30 22:24:49

+0

不......一点也不。这并不意味着它的方式:) – mpen 2009-10-01 04:48:10

0

你可以只掏出来的命令行和运行svn信息。请记住,这可能是一个混合版本。你也可以运行一个svn,最后一行STDOUT会给你修订版本号。

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

2

如果你正在寻找一个Python实现,退房pysvn,你可以调用info command获得详细信息,包括当前版本:

entry = info(path) 
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"; 
3

继兰斯之后,这里是一行命令行。

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

我知道这是很老,但我想我会献上我如何为我的web应用程序做到这一点在PHP中:

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

$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”(不含引号)。

相关问题