1

在 Subversion 1.6 中,.svn每个工作副本目录中都有一个目录。我可以使用以下代码快速检索当前修订号,而无需 shell 访问/执行。

public function getSubversionRevision() {
    if(file_exists("../.svn/entries")) {
        $svn = File("../.svn/entries");
        return (int)$svn[3];
    }
    return false;
}

Subversion 1.7 打破了这个代码。现在.svn每个本地存储库只有一个目录。此目录中有一个entries文件,但它不再对我有用。看起来我需要的一切现在都在 SQLite 数据库中。具体来说wc.db。我想我可以使用 PHP 的 SQLite 函数来获取我需要的信息,但这听起来有点太昂贵,无法在每个(或接近每个)页面加载时运行。

有任何想法吗?中断exec函数并希望安装 Subversion 二进制文件(并且在 $PATH 中!)是最后的手段。总而言之,我需要找到一种方法来定位.svn存储库根目录的目录(根据您的签出位置可能会有所不同),然后以wc.db一种经济有效的方式(可能)解析其中的文件。

4

5 回答 5

2

尝试使用 SVN 库SVN,因为它可以让您访问存储库信息和 SVN 存储库的更多功能。
查看您将收到的函数svn_status和 svn 存储库信息数组

Array (
    [0] => Array (
        [path] => /home/bob/wc/sandwich.txt
        [text_status] => 8 // item was modified
        [repos_text_status] => 1 // no information available, use update
        [prop_status] => 3 // no changes
        [repos_prop_status] => 1 // no information available, use update
        [name] => sandwich.txt
        [url] => http://www.example.com/svnroot/deli/trunk/sandwich.txt
        [repos] => http://www.example.com/svnroot/
        [revision] => 123 // <-- Current Revision
        //..
    )
)
于 2012-07-27T06:07:08.167 回答
1

svn update您可以每次都为您编写一个脚本,并将更新输出中的修订号废弃到一个文件中。以下 bash 脚本或多或少应该这样做:

#!/bin/bash

svn --non-interactive update .. 
svn --non-interactive update .. | perl -p -e "s/.* revision ([\d]*)\./\$1/" > ../version.phtml;
于 2012-07-27T08:42:12.520 回答
1

我在TheHostingTool中实现了 Subversion 1.7 修订检索的笨拙(但相对彻底)的实现。检查提交消息以获取解释。该函数包含在class_main.php 中,它是/trunk (/trunk/includes/class_main.php) 之后的一个目录。您需要根据您的特定需求调整相对路径。这是在 class_main.php 中找到的函数的略微修改版本,可在其他地方使用。

public function getSubversionRevision() {
    // This will work for Subverson 1.6 clients and below
    if(file_exists("../.svn/entries")) {
        $svn = File("../.svn/entries");
        return (int)$svn[3];
    }
    // Check the previous directories recursively looking for wc.db (Subversion 1.7)
    $searchDepth = 3; // Max search depth
    // Do we have PDO? And do we have the SQLite PDO driver?
    if(!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) {
        $searchDepth = 0; // Don't even bother...
    }
    for($i = 1; $i <= $searchDepth; $i++) {
        $dotdot .= '../';
        if(!file_exists("$dotdot.svn/wc.db")) {
            continue;
        }
        $wcdb = new PDO("sqlite:$dotdot.svn/wc.db");
        $result = $wcdb->query('SELECT "revision" FROM "NODES" WHERE "repos_path" = "'.basename(realpath('..')).'"');
        return (int)$result->fetchColumn();
    }
    if($this->canRun('exec')) {
        exec('svnversion ' . realpath('..'), $out, $return);
        // For this to work, svnversion must be in your PHP's PATH enviroment variable
        if($return === 0 && $out[0] != "Unversioned directory") {
            return (int)$out[0];
        }
    }
    return false;
}

如果您不是从 1 开始,.= '../'您可能不想使用 str_repeat。或者,您可以简单地$dotdot提前定义到您想开始的任何地方。

于 2012-09-10T03:01:21.817 回答
0

或者只是查询:

SELECT "changed_revision" FROM "NODES" ORDER BY changed_revision DESC LIMIT 1;

如果您想知道整个回购的最后一次修订!:)

于 2013-03-28T18:07:49.060 回答
0

对不起,但如果你想要可移植和防弹的解决方案,为什么不在 PHP 中调用 Subversion CLI?

如果您只想获取全局修订版,您可以svn info在 WC 的任何目录中使用(捕获、解析输出并获取一组数据)svnversion

于 2013-03-28T21:44:12.013 回答