Рекурсивно сравнивает два файла

# svn_diff

(PECL svn >= 0.1.0)

svn_diff — Рекурсивно сравнивает два файла

### Описание

function svn_diff(
string `$path1`,
int `$rev1`,
string `$path2`,
int `$rev2`
): array

Функция рекурсивно сравнивает два файла по путям `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 изменяют без уведомления. За включение функции в код отвечает программист.

### Смотрите также

- » SVN-документация к команде svn diff

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open