Skip to content

Repository files navigation

sebastian/diff

CI StatusType 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:

<?phpuseSebastianBergmann\Diff\Differ;
$differ = newDiffer;
print$differ->diff('foo', 'bar');

The code above yields the output below:

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

<?phpuseSebastianBergmann\Diff\Differ;
useSebastianBergmann\Diff\Output\UnifiedDiffOutputBuilder;
$builder = newUnifiedDiffOutputBuilder(
"--- Original\n+++ New\n", // custom headerfalse// do not add line numbers to the diff 
);
$differ = newDiffer($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.

<?phpuseSebastianBergmann\Diff\Differ;
useSebastianBergmann\Diff\Output\StrictUnifiedDiffOutputBuilder;
$builder = newStrictUnifiedDiffOutputBuilder([
'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 = newDiffer($builder);
print$differ->diff('foo', 'bar');

DiffOnlyOutputBuilder

Output only the lines that differ.

<?phpuseSebastianBergmann\Diff\Differ;
useSebastianBergmann\Diff\Output\DiffOnlyOutputBuilder;
$builder = newDiffOnlyOutputBuilder(
"--- Original\n+++ New\n"
);
$differ = newDiffer($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:

useSebastianBergmann\Diff\Parser;
useSebastianBergmann\Git;
$git = newGit('/usr/local/src/money');
$diff = $git->getDiff(
'948a1a07768d8edd10dcefa8315c1cbeffb31833',
'c07a373d2399f3e686234c4f7f088d635eb9641b'
);
$parser = newParser;
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'));
)
)
)
)
)
)

About

Diff implementation

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages