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