svn_diff

Recursively diffs two paths

&reftitle.description; `array` `svn_diff` `string` `path1` `int` `rev1` `string` `path2` `int` `rev2`

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

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

&reftitle.parameters;

`path1`

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

  &svn.relativepath;

  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.

&reftitle.returnvalues;

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.

&reftitle.examples;

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

&example.outputs;

    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

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

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

&reftitle.notes; &warn.experimental.func;
&reftitle.seealso;

- SVN documentation on svn diff