如何连接到远程svn服务器并检索最新的版本号

时间:2014-02-28 15:05:04

标签: php svn

我有一个在我的localhost上运行的PHP应用程序,我在https://www.assembla.com有一个远程SVN存储库。我使用SVNTortoise客户端,它工作得很好,但我想通过PHP连接到svn存储库并获取最新的版本号,仅此而已。我看到了其他类似的问题,但在我的情况下,重点是我想要连接到REMOTE存储库。如何在远程服务器上运行svn --version命令并使用PHP处理响应?

2 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题,我并不真正使用PHP,所以我不打算给你PHP代码,但我会告诉你如何将它变成PHP应该很容易代码。

命令行客户端

意识到svn --version没有回答你想要的问题(它说的是Subversion客户端是什么版本)。当前发布的Subversion版本不包含直接询问您想要的信息的命令(1.9将包括svn youngest。因此,从客户端获取此信息通常涉及执行svn log -r HEAD $URL,然后解析其中的修订号。如果您愿意解析XML,可以使用--xml

Subversion API

您可以使用我们的C API或语言绑定来使用svn_ra_get_latest_revnum()函数。您需要打开存储库访问(RA)会话,然后在该会话上调用该函数。 The implementation of 1.9's new youngest command is an example。但是,Subversion没有为PHP提供API绑定。所以这对你来说可能并不十分有用。

针对1.7及更新的HTTP SVN服务器的OPTIONS请求

1.7和更新的服务器在SVN-Youngest-Rev标头中提供此信息以响应OPTIONS请求(客户端确定服务器支持哪些功能)。您只需要使用XML请求请求正文中的activity-collection-set。例如,此curl命令从ASF存储库中检索HEAD修订版:

curl -si -X OPTIONS --data-binary '<?xml version="1.0" encoding="utf-8"?><D:options xmlns:D="DAV:"><D:activity-collection-set></D:activity-collection-set></D:options>' http://svn.apache.org/repos/asf | grep SVN-Youngest-Rev

针对1.6及更早版本的HTTP SVN服务器的PROPFIND请求

如果你至少没有1.7,那么你需要使用PROPFIND请求。首先,您需要通过执行带有Depth: 0标头和类似主体的PROPFIND请求来获取版本控制配置URL:

<?xml version="1.0" encoding="utf-8"?>
<propfind xmlns="DAV:">
<prop>
<version-controlled-configuration xmlns="DAV:"/>
</prop>
</propfind>

会给你一个像这样的回复:

<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
<D:response xmlns:lp1="DAV:" xmlns:lp3="http://subversion.tigris.org/xmlns/dav/">
<D:href>/repos/asf/</D:href>
<D:propstat>
<D:prop>
<lp1:version-controlled-configuration><D:href>/repos/asf/!svn/vcc/default</D:href></lp1:version-controlled-configuration>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

您希望版本控制配置标记中的href。然后,您使用Depth: 0标头和以下请求正文,相对于您再次请求的服务器根,在该URL上发出PROPFIND请求:

<?xml version="1.0" encoding="utf-8"?>
<propfind xmlns="DAV:">
<prop>
<checked-in xmlns="DAV:"/>
</prop></propfind>

这会给你一个像这样的回复:

<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
<D:response xmlns:lp1="DAV:" xmlns:lp3="http://subversion.tigris.org/xmlns/dav/">
<D:href>/repos/asf/!svn/vcc/default</D:href>
<D:propstat>
<D:prop>
<lp1:checked-in><D:href>/repos/asf/!svn/bln/1573025</D:href></lp1:checked-in>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
</D:multistatus>

签入标签的href的最后一段是HEAD的修订号。

针对svnserve服务器的

get-latest-rev命令(svn:// protocol)

我不打算详细介绍如何使用svn://协议直接执行此操作,但您需要使用documented in the protocol的get-latest-rev命令。

答案 1 :(得分:1)

Ben答案的简易版

为了获得存储库(或repo中的路径)的最新版本,您可以

  • 在PHP中调用OS-commmand svn info URL/TO/REPO,解析答案并提取相关字符串(如果你有TortoieSVN,你有或者可以拥有svn客户端的CLI版本)

来自Assembla的回购

的样本
>svn info https://subversion.assembla.com/svn/subversion-troubleshoot-b/
Path: subversion-troubleshoot-b
URL: https://subversion.assembla.com/svn/subversion-troubleshoot-b
Relative URL: ^/
Repository Root: https://subversion.assembla.com/svn/subversion-troubleshoot-b
Repository UUID: faaf0d5a-5d64-45f4-9e2a-979cddfce0d6
Revision: 7
Node Kind: directory
Last Changed Author: abream
Last Changed Rev: 7
Last Changed Date: 2012-10-17 22:14:36 +0600 (Ср, 17 окт 2012)

您将使用字符串Revision作为全局存储库(或某些子树)Revision-ID

相关问题