Implémentation DIFF pour PHP, prise en compte du phpunit dans un composant autonome.
Vous pouvez ajouter cette bibliothèque en tant que dépendance locale par projet à votre projet à l'aide du compositeur:
composer require sebastian/diff
Si vous n'avez besoin que de cette bibliothèque pendant le développement, par exemple pour exécuter la suite de tests de votre projet, vous devez l'ajouter en tant que dépendance à temps de développement:
composer require --dev sebastian/diff
La classe Differ
peut être utilisée pour générer une représentation textuelle de la différence entre deux chaînes:
<? PHP Declare (strict_types = 1); utilisez Sebastianbergmanndiffdiffer; utilisez SebastianbergmanndiffoutputUnifieddiffoutputBuilder; $ différente = new Différe (new UnifiedDiffOutputBuilder); print $ différend-> diff ('foo', 'bar');
Le code ci-dessus donne la sortie ci-dessous:
--- Original +++ new @@ @@ - Foo + Bar
Le UnifiedDiffOutputBuilder
utilisé dans l'exemple ci-dessus génère la sortie au format "Diff unifié" et est utilisé par PHPUnit, par exemple.
The StrictUnifiedDiffOutputBuilder
generates output in "strict unified diff" format with hunks, similar to diff -u
and compatible with patch
or git apply
.
Le DiffOnlyOutputBuilder
génère une sortie qui ne contient que les lignes qui diffèrent.
Si aucun de ces trois constructeurs de sortie ne correspond à votre cas d'utilisation, vous pouvez implémenter DiffOutputBuilderInterface
pour générer une sortie personnalisée.
La classe Parser
peut être utilisée pour analyser un Diff unifié en un graphique d'objet:
Utilisez SebastianbergmanndiffParser; Utilisez Sebastianbergmanngit; $ git = new git ('/ usr / local / src / monery'); $ diff = $ git-> getDiff ('948a1a07768d8edd10dcefa8315c1cbeffb31833',, 'C07A373D2399F3E686234C4F7F088D635EB9641B'); $ parser = new Parser; print_r ($ parser-> parse ($ diff));
Le code ci-dessus donne la sortie ci-dessous:
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')); ) ) ) ) ) )
Remarque: Si la taille du morceau est de 0 lignes, c'est-à-dire getStartRange()
ou getEndRange()
Retour 0, le nombre de lignes renvoyés par getStart()
ou getEnd()
est inférieur à ce qu'on s'attend. C'est le numéro de ligne, après quoi le morceau doit être inséré ou supprimé; Dans tous les autres cas, il donne le premier numéro de ligne de la plage de lignes remplacée.