(PECL svn >= 0.1.0)
svn_diff — 递归比较两个路径
递归比较两个路径,path1
和 path2
。
注意:
这不是一个通用的 diff 工具。只有版本控制的本地文件才能进行比较:其他文件将失败。
path1
要比较的第一个路径。可以是 SVN 存储库中文件/目录的 URL,也可以是本地文件/目录路径。
注意: 相对路径将被解析,就好像当前工作目录是包含 PHP 二进制文件的目录一样。要使用调用脚本的工作目录,请使用 realpath() 或 dirname(__FILE__)。
如果本地文件路径只有反斜杠,没有正斜杠,则此扩展将无法找到该路径。使用此函数时,始终将所有反斜杠替换为正斜杠。
rev1
第一个路径的版本号。使用 SVN_REVISION_HEAD
指定最新版本。
path2
要比较的第二个路径。有关描述,请参见 path1
。
rev2
第二个路径的版本号。有关描述,请参见 rev1
。
返回一个数组列表,包含两个流:第一个是 diff 输出,第二个包含错误流输出。可以使用 fread() 读取这些流。如果发生错误,则返回 false
或 null
。
默认情况下,diff 输出将采用 Subversion 的自定义统一 diff 格式,但可能会使用 » 外部 diff 引擎,具体取决于 Subversion 的配置。
示例 #1 基本示例
此示例演示了此函数的基本用法以及从流中检索内容的方法
<?php
list($diff, $errors) = svn_diff(
'http://www.example.com/svnroot/trunk/foo', SVN_REVISION_HEAD,
'http://www.example.com/svnroot/branches/dev/foo', SVN_REVISION_HEAD
);
if (!$diff) exit;
$contents = '';
while (!feof($diff)) {
$contents .= fread($diff, 8192);
}
fclose($diff);
fclose($errors);
var_dump($contents);
?>
上面的示例将输出
Index: http://www.example.com/svnroot/trunk/foo =================================================================== --- http://www.example.com/svnroot/trunk/foo (.../foo) (revision 23) +++ http://www.example.com/svnroot/branches/dev/foo (.../foo) (revision 27) // further diff output
示例 #2 比较存储库路径的两个版本
此示例实现了一个包装函数,允许用户使用外部存储库路径轻松比较同一项目的两个版本(默认语法有些冗长)
<?php
function svn_diff_same_item($path, $rev1, $rev2) {
return svn_diff($path, $rev1, $path, $rev2);
}
?>
示例 #3 可移植地比较两个本地文件
此示例实现了一个包装函数,可移植地比较两个本地文件,补偿 realpath() 修复和反斜杠错误
<?php
function svn_diff_local($path1, $rev1, $path2, $rev2) {
$path1 = str_replace('\\', '/', realpath($path1));
$path2 = str_replace('\\', '/', realpath($path2));
return svn_diff($path1, $rev1, $path2, $rev2);
}
?>
此函数是实验性的。此函数的行为、名称和周围的文档可能在 PHP 的未来版本中发生变化,恕不另行通知。使用此函数的风险自负。