svn info - 在PHP中获取当前工作副本的修订版

时间:2014-08-11 13:36:18

标签: php svn

我在本地使用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而不是预期的东西。有没有办法检测到这种情况并使用旧方法,如果是这种情况?

1 个答案:

答案 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个不同的工作区,则需要知道哪个具有哪个版本。 使用此功能,您可以获得文件夹(和子文件夹)中所有文件的最高版本。