# svn_diff

(PECL svn >= 0.1.0)

svn_diff — Recursively diffs two paths

### Description

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.

### 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.

  > Note: Relative paths will be resolved as if the current working directory was the one that contains the PHP binary. To use the calling script's working directory, use realpath() or 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.

### Return Values

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.

### Notes

Warning

This function is EXPERIMENTAL. The behaviour of this function, its name, and surrounding documentation may change without notice in a future release of PHP. This function should be used at your own risk.

### Examples

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

The above example will output:

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

### See Also

- » SVN documentation on svn diff