テキストの改訂版を扱う場合、同じ元のテキストに基づいた改訂版が複数存在するという問題に直面することがあります。一方を選択して他方を破棄するのではなく、2 つのリビジョンをマージしたいと考えています。
Git はすでにそれを見事に実現しています。 PHP アプリケーションでも、同じことを行うシンプルなツールが必要です。 xdiff_string_merge3 関数を備えた xdiff PECL 拡張機能があります。ただし、 xdiff_string_merge3
git と同じように動作しないため、システムでは xdiff を使用できない可能性があります。
PhpMerge は、この問題を解決する小さなライブラリです。 merge
メソッドのみを持つPhpMergePhpMergeInterface
を実装するPhpMergePhpMerge
とPhpMergeGitMerge
の 2 つのクラスがあります。
PhpMerge
SebastianBergmannDiffDiffer
使用して異なるバージョン間の差異を取得し、そこからマージされたテキストを計算します。 GitMerge
SymplifyGitWrapperGitWrapper
使用し、テキストを一時ファイルに書き込み、コマンド ライン git を使用してテキストをマージします。
簡単な例:
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;
マージ競合がある場合:
// 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.
}
コマンドライン git を使用してマージを実行します。
use PhpMerge GitMerge ;
$ merger = new GitMerge ();
// Use as the previous example.
PhpMerge は、composer.json ファイルに依存関係としてライブラリを追加することで、Composer とともにインストールできます。
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
GitMerge
でコマンド ライン git を使用するには:
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
インストールと使用方法については、Composer のドキュメントを参照してください。
~4.0 バージョンでは、 cpliakas/git-wrapper
が非推奨になったため、 symplify/git-wrapper
に切り替えます。この更新は、 PhpMergePhpMerge
のみを使用する場合には変更がないことを意味します。