在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
)以具有成本效益的方式。
答案 0 :(得分: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
//..
)
)
答案 1 :(得分:1)
您可以每次为您编写一个脚本svn update
,并将修订号从更新的输出中删除到文件中。以下bash脚本应该或多或少地执行此操作:
#!/bin/bash
svn --non-interactive update ..
svn --non-interactive update .. | perl -p -e "s/.* revision ([\d]*)\./\$1/" > ../version.phtml;
答案 2 :(得分: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
到你想要开始的任何地方。
答案 3 :(得分:0)
或者只是查询:
SELECT "changed_revision" FROM "NODES" ORDER BY changed_revision DESC LIMIT 1;
如果您想知道整个回购的最后修订版! :)
答案 4 :(得分:0)
对不起,如果你想要便携式和防弹解决方案,为什么不在PHP中调用Subversion CLI?
如果您只想获得全局修订,可以在svn info
的任何WC目录(捕获,解析输出和获取一组数据)中使用svnversion