Implementación diff para PHP, factorizada fuera de PHPUnit en un componente independiente.
Puede agregar esta biblioteca como una dependencia local por proyecto a su proyecto usando el compositor:
composer require sebastian/diff
Si solo necesita esta biblioteca durante el desarrollo, por ejemplo, para ejecutar el conjunto de pruebas de su proyecto, entonces debe agregarla como dependencia del tiempo de desarrollo:
composer require --dev sebastian/diff
La clase Differ
se puede usar para generar una representación textual de la diferencia entre dos cadenas:
<? Php declarar (strict_types = 1); use Sebastianbergmanndiffdiffer; use SebastianbergmanndiffoutputUnifiedfiffoutputBuilder; $ diferir = new Differ (new UnifiedDiffoutputBuilder); imprimir $ diferir-> diff ('foo', 'bar');
El código anterior produce la siguiente salida:
--- original +++ nuevo @@ @@-foo+bar
El UnifiedDiffOutputBuilder
utilizado en el ejemplo anterior genera salida en formato "Unificado Diff" y es utilizado por PHPUNIT, por ejemplo.
StrictUnifiedDiffOutputBuilder
genera salida en formato "Diff Strict Unified" con Hunks, similar a diff -u
y compatible con patch
o git apply
.
DiffOnlyOutputBuilder
genera salida que solo contiene las líneas que difieren.
Si ninguno de estos tres constructores de salida coincide con su caso de uso, puede implementar DiffOutputBuilderInterface
para generar salida personalizada.
La clase Parser
se puede usar para analizar una diferencia unificada en un gráfico de objeto:
Use SebastianbergmanndiffParser; use Sebastianbergmanngit; $ git = new Git ('/usr/local/src/dinero'); $ diff = $ git-> getdiff ('948a1a077768d8edd10dcefa8315c1cbeffb31833',,,,,,,,,,,, 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ parser = new Parser; print_r ($ parser-> parse ($ diff));
El código anterior produce la siguiente salida:
Array ( [0] => SebastianBergmannDiffDiff Object ( [from:SebastianBergmannDiffDiff:private] => a/tests/MoneyTest.php [to:SebastianBergmannDiffDiff:private] => b/tests/MoneyTest.php [chunks:SebastianBergmannDiffDiff:private] => Array ( [0] => SebastianBergmannDiffChunk Object ( [start:SebastianBergmannDiffChunk:private] => 87 [startRange:SebastianBergmannDiffChunk:private] => 7 [end:SebastianBergmannDiffChunk:private] => 87 [endRange:SebastianBergmannDiffChunk:private] => 7 [lines:SebastianBergmannDiffChunk:private] => Array ( [0] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => * @covers SebastianBergmannMoneyMoney::add ) [1] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => * @covers SebastianBergmannMoneyMoney::newMoney ) [2] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => */ ) [3] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 2 [content:SebastianBergmannDiffLine:private] => public function testAnotherMoneyWithSameCurrencyObjectCanBeAdded() ) [4] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 1 [content:SebastianBergmannDiffLine:private] => public function testAnotherMoneyObjectWithSameCurrencyCanBeAdded() ) [5] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => { ) [6] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => $a = new Money(1, new Currency('EUR')); ) [7] => SebastianBergmannDiffLine Object ( [type:SebastianBergmannDiffLine:private] => 3 [content:SebastianBergmannDiffLine:private] => $b = new Money(2, new Currency('EUR')); ) ) ) ) ) )
Nota: Si el tamaño del fragmento es 0 líneas, es decir, getStartRange()
o getEndRange()
return 0, el número de línea devuelto por getStart()
o getEnd()
es uno más bajo de lo que cabría esperar. Es el número de línea después del cual el fragmento debe insertarse o eliminarse; En todos los demás casos, proporciona el número de primera línea del rango de líneas reemplazado.