(PECL svn >= 0.1.0)
svn_diff — Рекурсивно сравнивает два файла
Функция рекурсивно сравнивает два файла по путям path1
и path2
.
Замечание:
Функция — не универсальная утилита сравнения файлов. Функция сравнивает только локальные файлы с версиями: сравнение других файлов вызовет ошибку.
path1
Первый путь к файлу, который требуется сравнить. Параметр принимает URL-адрес файла или директории в SVN-репозитории или путь к локальным файлу или директории.
Замечание: Функция вычислит относительные пути так, как если бы текущая рабочая директория была домашней папкой самого PHP. Чтобы использовать рабочую директорию вызывающего скрипта, пользуются функцией realpath() или dirname(__FILE__).
Модуль не найдёт путь, если путь к локальному файлу содержит только обратные слеши (\) и не содержит прямые слеши (/). При работе с функцией обратные слеши (\) заменяют прямыми слешми (/).
rev1
Номер ревизии первого файла. Последнюю ревизию задают
константой SVN_REVISION_HEAD
.
path2
Второй путь к файлу по аналогии с параметром path1
.
rev2
Номер ревизии второго файла по аналогии с параметром rev1
.
Функция возвращает массив со списком из двух потоков:
первый — вывод различий файлов; второй — вывод потока ошибок.
Потоки считывают функцией fread().
Функция возвращает false
или null
, если возникла ошибка.
По умолчанию функция выводит различия в унифицированном пользовательском формате 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) // Остальной вывод diff
Пример #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. За включение функции в код отвечает программист.