Saat mengerjakan revisi teks, terkadang kita menghadapi masalah yaitu ada beberapa revisi berdasarkan teks asli yang sama. Daripada memilih salah satu dan membuang yang lain, kami ingin menggabungkan kedua revisi tersebut.
Git sudah melakukannya dengan luar biasa. Dalam aplikasi php kita menginginkan alat sederhana yang melakukan hal yang sama. Ada ekstensi xdiff PECL yang memiliki fungsi xdiff_string_merge3. Namun xdiff_string_merge3
tidak berperilaku sama seperti git dan xdiff mungkin tidak tersedia di sistem Anda.
PhpMerge adalah perpustakaan kecil yang memecahkan masalah ini. Ada dua kelas: PhpMergePhpMerge
dan PhpMergeGitMerge
yang mengimplementasikan PhpMergePhpMergeInterface
yang baru saja memiliki metode merge
.
PhpMerge
menggunakan SebastianBergmannDiffDiffer
untuk mendapatkan perbedaan antara versi yang berbeda dan menghitung teks yang digabungkan darinya. GitMerge
menggunakan SymplifyGitWrapperGitWrapper
, menulis teks ke file sementara dan menggunakan baris perintah git untuk menggabungkan teks.
Contoh sederhana:
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;
Dengan konflik penggabungan:
// 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.
}
Menggunakan baris perintah git untuk melakukan penggabungan:
use PhpMerge GitMerge ;
$ merger = new GitMerge ();
// Use as the previous example.
PhpMerge dapat diinstal dengan Composer dengan menambahkan perpustakaan sebagai dependensi ke file composer.json Anda.
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
Untuk menggunakan baris perintah git dengan GitMerge
:
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
Silakan merujuk ke dokumentasi Komposer untuk petunjuk instalasi dan penggunaan.
Dalam versi ~4.0 kami beralih dari cpliakas/git-wrapper
ke symplify/git-wrapper
karena yang pertama sudah tidak digunakan lagi. Pembaruan ini berarti tidak ada perubahan ketika hanya menggunakan PhpMergePhpMerge
.