Lorsque l'on travaille avec des révisions de texte, on est parfois confronté au problème qu'il existe plusieurs révisions basées sur le même texte original. Plutôt que d’en choisir une et d’écarter l’autre, nous souhaitons fusionner les deux révisions.
Git le fait déjà à merveille. Dans une application PHP, nous voulons un outil simple qui fasse la même chose. Il existe l'extension xdiff PECL qui a la fonction xdiff_string_merge3. Mais xdiff_string_merge3
ne se comporte pas de la même manière que git et xdiff peut ne pas être disponible sur votre système.
PhpMerge est une petite bibliothèque qui résout ce problème. Il existe deux classes : PhpMergePhpMerge
et PhpMergeGitMerge
qui implémentent PhpMergePhpMergeInterface
qui n'a qu'une méthode merge
.
PhpMerge
utilise SebastianBergmannDiffDiffer
pour obtenir les différences entre les différentes versions et en calcule le texte fusionné. GitMerge
utilise SymplifyGitWrapperGitWrapper
, écrit le texte dans un fichier temporaire et utilise la ligne de commande git pour fusionner le texte.
Exemple simple :
use PhpMerge PhpMerge ;
// Create a merger instance.
$ merger = new PhpMerge ();
// Get the texts to merge.
$ original = <<<'EOD'
unchanged
replaced
unchanged
normal
unchanged
unchanged
removed
EOD;
$ version1 = <<<'EOD'
added
unchanged
replacement
unchanged
normal
unchanged
unchanged
EOD;
$ version2 = <<<'EOD'
unchanged
replaced
unchanged
normal??
unchanged
unchanged
EOD;
$ expected = <<<'EOD'
added
unchanged
replacement
unchanged
normal??
unchanged
unchanged
EOD;
$ result = $ merger -> merge ( $ original , $ version1 , $ version2 );
// $result === $expected;
Avec les conflits de fusion :
// Continuing from before with:
use Phpmerge MergeException ;
use PhpMerge MergeConflict ;
$ conflicting = <<<'EOD'
unchanged
replaced
unchanged
normal!!
unchanged
unchanged
EOD;
try {
$ merger -> merge ( $ original , $ version2 , $ conflicting );
} catch ( MergeException $ exception ) {
/** @var MergeConflict[] $conflicts */
$ conflicts = $ exception -> getConflicts ();
$ original_lines = $ conflicts [ 0 ]-> getBase ();
// $original_lines === ["normaln"];
$ version2_lines = $ conflicts [ 0 ]-> getRemote ();
// $version2_lines === ["normal??n"];
$ conflicting_lines = $ conflicts [ 0 ]-> getLocal ();
// $conflicting_lines === ["normal!!n"];
$ line_numer_of_conflict = $ conflicts [ 0 ]-> getBaseLine ();
// $line_numer_of_conflict === 3; // Count starts with 0.
// It is also possible to get the merged version using the first version
// to resolve conflicts.
$ merged = $ exception -> getMerged ();
// $merged === $version2;
// In this case, but in general there could be non-conflicting changes.
$ line_in_merged = $ conflicts [ 0 ]-> getMergedLine ();
// $line_in_merged === 3; // Count starts with 0.
}
Utilisation de la ligne de commande git pour effectuer la fusion :
use PhpMerge GitMerge ;
$ merger = new GitMerge ();
// Use as the previous example.
PhpMerge peut être installé avec Composer en ajoutant la bibliothèque en tant que dépendance à votre fichier composer.json.
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
Pour utiliser la ligne de commande git avec GitMerge
:
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
Veuillez vous référer à la documentation de Composer pour les instructions d'installation et d'utilisation.
Dans la version ~4.0, nous passons de cpliakas/git-wrapper
à symplify/git-wrapper
puisque le premier est obsolète. Cette mise à jour signifie qu'il n'y a aucun changement lors de l'utilisation uniquement PhpMergePhpMerge
.