PHP Conference Japan 2024

svn_diff

(PECL svn >= 0.1.0)

svn_diff遞迴比較兩個路徑的差異

說明

svn_diff(
    字串 $path1,
    整數 $rev1,
    字串 $path2,
    整數 $rev2
): 陣列

遞迴比較兩個路徑 path1path2 的差異。

注意:

這不是一個通用的差異比較工具。只有版本控制下的本地檔案可以進行比較:其他檔案將會失敗。

參數

path1

要比較差異的第一個路徑。這可以是 SVN 儲存庫中檔案/目錄的 URL 或本地檔案/目錄路徑。

注意事項相對路徑將會解析為如同目前工作目錄是包含 PHP 執行檔的目錄。要使用呼叫腳本的工作目錄,請使用 realpath() 或 dirname(__FILE__)。

警告

如果本地檔案路徑只有反斜線而沒有正斜線,此擴充功能將無法找到路徑。使用此函式時,請務必將所有反斜線替換為正斜線。

rev1

第一個路徑的版本號碼。使用 SVN_REVISION_HEAD 指定最新版本。

path2

要比較的第二個路徑。有關說明,請參閱 path1

rev2

第二個路徑的版本號碼。有關說明,請參閱 rev1

傳回值

傳回一個由兩個串流組成的陣列列表:第一個是 diff 輸出,第二個包含錯誤串流輸出。可以使用 fread() 讀取串流。發生錯誤時傳回 falsenull

預設情況下,diff 輸出將採用 Subversion 的自訂統一 diff 格式,但可能會根據 Subversion 的設定使用 » 外部 diff 引擎

範例

範例 #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 版本中可能會有所變更,恕不另行通知。使用此函式需自行承擔風險。

新增註釋

使用者貢獻的註釋

此頁面沒有使用者貢獻的註釋。
To Top