diff

by sebastianbergmann

sebastianbergmann / diff

Diff implementation

6.4K Stars 64 Forks Last release: Not found Other 261 Commits 16 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

sebastian/diff

CI Status Type Coverage

Diff implementation for PHP, factored out of PHPUnit into a stand-alone component.

Installation

You can add this library as a local, per-project dependency to your project using Composer:

composer require sebastian/diff

If you only need this library during development, for instance to run your project's test suite, then you should add it as a development-time dependency:

composer require --dev sebastian/diff

Usage

Generating diff

The

Differ
class can be used to generate a textual representation of the difference between two strings:
$differ = new Differ;
print $differ->diff('foo', 'bar');

The code above yields the output below:

diff
--- Original
+++ New
@@ @@
-foo
+bar

There are three output builders available in this package:

UnifiedDiffOutputBuilder

This is default builder, which generates the output close to udiff and is used by PHPUnit.

$builder = new UnifiedDiffOutputBuilder(
    "--- Original\n+++ New\n", // custom header
    false                      // do not add line numbers to the diff 
);

$differ = new Differ($builder); print $differ->diff('foo', 'bar');

StrictUnifiedDiffOutputBuilder

Generates (strict) Unified diff's (unidiffs) with hunks, similar to

diff -u
and compatible with
patch
and
git apply
.
$builder = new StrictUnifiedDiffOutputBuilder([
    'collapseRanges'      => true, // ranges of length one are rendered with the trailing ,1
    'commonLineThreshold' => 6,    // number of same lines before ending a new hunk and creating a new one (if needed)
    'contextLines'        => 3,    // like diff:  -u, -U NUM, --unified[=NUM], for patch/git apply compatibility best to keep at least @ 3
    'fromFile'            => null,
    'fromFileDate'        => null,
    'toFile'              => null,
    'toFileDate'          => null,
]);

$differ = new Differ($builder); print $differ->diff('foo', 'bar');

DiffOnlyOutputBuilder

Output only the lines that differ.

$builder = new DiffOnlyOutputBuilder(
    "--- Original\n+++ New\n"
);

$differ = new Differ($builder); print $differ->diff('foo', 'bar');

DiffOutputBuilderInterface

You can pass any output builder to the

Differ
class as longs as it implements the
DiffOutputBuilderInterface
.

Parsing diff

The

Parser
class can be used to parse a unified diff into an object graph:
use SebastianBergmann\Diff\Parser;
use SebastianBergmann\Git;

$git = new Git('/usr/local/src/money');

$diff = $git->getDiff( '948a1a07768d8edd10dcefa8315c1cbeffb31833', 'c07a373d2399f3e686234c4f7f088d635eb9641b' );

$parser = new Parser;

print_r($parser->parse($diff));

The code above yields the output below:

Array
(
    [0] => SebastianBergmann\Diff\Diff Object
        (
            [from:SebastianBergmann\Diff\Diff:private] => a/tests/MoneyTest.php
            [to:SebastianBergmann\Diff\Diff:private] => b/tests/MoneyTest.php
            [chunks:SebastianBergmann\Diff\Diff:private] => Array
                (
                    [0] => SebastianBergmann\Diff\Chunk Object
                        (
                            [start:SebastianBergmann\Diff\Chunk:private] => 87
                            [startRange:SebastianBergmann\Diff\Chunk:private] => 7
                            [end:SebastianBergmann\Diff\Chunk:private] => 87
                            [endRange:SebastianBergmann\Diff\Chunk:private] => 7
                            [lines:SebastianBergmann\Diff\Chunk:private] => Array
                                (
                                    [0] => SebastianBergmann\Diff\Line Object
                                        (
                                            [type:SebastianBergmann\Diff\Line:private] => 3
                                            [content:SebastianBergmann\Diff\Line:private] =>      * @covers SebastianBergmann\Money\Money::add
                                        )

                                [1] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 3
                                        [content:SebastianBergmann\Diff\Line:private] =>      * @covers SebastianBergmann\Money\Money::newMoney
                                    )

                                [2] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 3
                                        [content:SebastianBergmann\Diff\Line:private] =>      */
                                    )

                                [3] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 2
                                        [content:SebastianBergmann\Diff\Line:private] =>     public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded()
                                    )

                                [4] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 1
                                        [content:SebastianBergmann\Diff\Line:private] =>     public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded()
                                    )

                                [5] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 3
                                        [content:SebastianBergmann\Diff\Line:private] =>     {
                                    )

                                [6] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 3
                                        [content:SebastianBergmann\Diff\Line:private] =>         $a = new Money(1, new Currency('EUR'));
                                    )

                                [7] => SebastianBergmann\Diff\Line Object
                                    (
                                        [type:SebastianBergmann\Diff\Line:private] => 3
                                        [content:SebastianBergmann\Diff\Line:private] =>         $b = new Money(2, new Currency('EUR'));
                                    )
                            )
                    )
            )
    )

)

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.