عند العمل مع مراجعات النص، يواجه المرء أحيانًا مشكلة وجود العديد من المراجعات المستندة إلى نفس النص الأصلي. بدلاً من اختيار إحداهما وتجاهل الأخرى، نريد دمج النسختين.
يقوم Git بذلك بشكل رائع بالفعل. في تطبيق PHP نريد أداة بسيطة تقوم بنفس الشيء. يوجد امتداد xdiff PECL الذي يحتوي على وظيفة xdiff_string_merge3. لكن xdiff_string_merge3
لا يعمل بنفس الطريقة التي قد لا يكون بها git وxdiff متاحين على نظامك.
PhpMerge هي مكتبة صغيرة تحل هذه المشكلة. هناك فئتان: PhpMergePhpMerge
و PhpMergeGitMerge
اللتان تنفذان PhpMergePhpMergeInterface
الذي يحتوي على طريقة merge
فقط.
يستخدم 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 عن طريق إضافة المكتبة باعتبارها تبعية لملف Composer.json الخاص بك.
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
لاستخدام git سطر الأوامر مع GitMerge
:
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
الرجاء الرجوع إلى وثائق Composer للحصول على تعليمات التثبيت والاستخدام.
في الإصدار 4.0 تقريبًا، قمنا بالتبديل من cpliakas/git-wrapper
إلى symplify/git-wrapper
حيث تم إهمال الإصدار الأول. يعني هذا التحديث أنه لا يوجد أي تغيير عند استخدام PhpMergePhpMerge
فقط.