我在本地使用svn 1.8,但该项目被许多客户使用,他们使用svn 1.6(主要是dev请求)。
目前使用的代码如下:
$rev = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/.svn/entries", FILE_TEXT, null, 0, 20);
$rev = explode("\n", $rev);
$rev = $rev[3];
显然,这是一个非常不灵活的解决方案,它与SVN的文件结构绑定,已经在Windows版本的SVN 1.8(以及iirc,1.7)上进行了更改。
我想使用以下内容:
$rev = 0;
// $rootDir is the absolute path to the project root
exec('svn info ' . $rootDir, $output);
foreach ($output as $line)
{
if (substr($line, 0, 8) === 'Revision')
{
$parts = explode(':', $line);
$rev = intval(trim($parts[1]));
}
}
// $rev should now contain the current revision of working copy
代码工作正常,但我被告知执行svn info
的速度太慢"这就是使用第一种方法的原因。对我来说,似乎执行svn info
最多需要几毫秒,所以我没有看到问题。 我的代码中是否有可能导致问题的内容?
此外,仅仅在项目根目录上执行svn info
就足够了,还是我需要将-R
传递给它以获得正确的结果?
编辑:啊,显然一些最新手的客户使用TortoiseSVN,由于某种原因,它会覆盖默认的svn命令并运行GUI而不是预期的东西。有没有办法检测到这种情况并使用旧方法,如果是这种情况?
答案 0 :(得分:-1)
function getRevision($dir){
$rev = 0;
$handle = opendir($dir);
while($file = readdir($handle)){
$path = $dir .'/' . $file;
if($file == '.' || $file == '..') continue;
if($file == '.svn'){
if(file_exists($path . '/entries')){
$data = file($path . '/entries');
$v = (int)$data[3];
if($v > $rev)
$rev = $v;
}
}
elseif(is_dir($path)){
$v = getRevision($path);
if($v > $rev)
$rev = $v;
}
}
return $rev;
}
它不是通过svn info获取版本的正确方法,如果您有2个不同的工作区,则需要知道哪个具有哪个版本。 使用此功能,您可以获得文件夹(和子文件夹)中所有文件的最高版本。