ahebrank/diff

此包已被废弃且不再维护。没有建议的替代包。

Diff实现

dev-master / 3.0.x-dev 2019-04-01 01:40 UTC

This package is not auto-updated.

Last update: 2021-03-02 16:11:20 UTC


README

PHP的Diff实现,从PHPUnit中提取出来成为一个独立的组件。

安装

您可以使用Composer将此库作为本地、项目特定的依赖项添加到您的项目中

composer require sebastian/diff

如果您只需在开发期间使用此库,例如运行项目测试套件,那么您应该将其添加为开发时间依赖项

composer require --dev sebastian/diff

使用方法

生成diff

可以使用Differ类生成两个字符串之间的差异的文本表示

<?php
use Tmp\Diff\Differ;

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

上面的代码产生以下输出

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

本包中有三个输出构建器可用

UnifiedDiffOutputBuilder

这是默认构建器,生成接近udiff的输出,并被PHPUnit使用。

<?php

use Tmp\Diff\Differ;
use Tmp\Diff\Output\UnifiedDiffOutputBuilder;

$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

生成(严格的)统一diff(unidiffs),带有块,类似于diff -u,与patchgit apply兼容。

<?php

use Tmp\Diff\Differ;
use Tmp\Diff\Output\StrictUnifiedDiffOutputBuilder;

$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

仅输出有差异的行。

<?php

use Tmp\Diff\Differ;
use Tmp\Diff\Output\DiffOnlyOutputBuilder;

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

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

DiffOutputBuilderInterface

只要实现了DiffOutputBuilderInterface,您就可以将任何输出构建器传递给Differ类。

解析diff

可以使用Parser类将统一diff解析为对象图

use Tmp\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));

上面的代码产生以下输出

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

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

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

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

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

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

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

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