# svn_diff

(PECL svn >= 0.1.0)

svn_diff — Recursively diffs two paths

### 说明

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

Recursively diffs two paths, `path1` and `path2`.

> Note:

> This is not a general-purpose diff utility. Only local files that are versioned may be diffed: other files will fail.

### 参数

`path1`

  First path to diff. This can be a URL to a file/directory in an SVN repository or a local file/directory path.

  > Note: 相对路径将会以PHP执行文件所在目录作为当前工作目录进行解析。如果希望依据脚本所在目录解析, 使用realpath() 或 dirname(__FILE__)。

  Warning

  If a local file path has only backslashes and no forward slashes, this extension will fail to find the path. Always replace all backslashes with forward slashes when using this function.

`rev1`

  First path's revision number. Use `SVN_REVISION_HEAD` to specify the most recent revision.

`path2`

  Second path to diff. See `path1` for description.

`rev2`

  Second path's revision number. See `rev1` for description.

### 返回值

Returns an array-list consisting of two streams: the first is the diff output and the second contains error stream output. The streams can be read using fread(). Returns `FALSE` or `NULL` on error.

The diff output will, by default, be in the form of Subversion's custom unified diff format, but an » external diff engine may be used depending on Subversion's configuration.

### 注释

Warning

此函数是实验性的。此函数的表象，包括名称及其相关文档都可能在未来的 PHP 发布版本中未通知就被修改。使用本函数风险自担 。

### 范例

Example #1 Basic example

This example demonstrates the basic usage of this function, and the retrieval of contents from the stream:

    <?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

Example #2 Diffing two revisions of a repository path

This example implements a wrapper function that allows a user to easily diff two revisions of the same item using an external repository path (the default syntax is somewhat verbose):

    <?php
    function svn_diff_same_item($path, $rev1, $rev2) {
        return svn_diff($path, $rev1, $path, $rev2);
    }
    ?>

Example #3 Portably diffing two local files

This example implements a wrapper function that portably diffs two local files, compensating for the realpath() fix and the backslashes bug:

    <?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);
    }
    ?>

### 参见

- » SVN documentation on svn diff