bircher/php-merge

一个使用Diff php库或命令行git的PHP合并工具。

4.0.0 2021-12-27 15:04 UTC

This package is auto-updated.

Last update: 2024-09-05 03:04:24 UTC


README

Build Status Coverage Status GitHub license

简介

当处理文本修订版本时,有时会遇到基于同一原始文本存在多个修订版本的问题。我们不想选择一个并丢弃另一个,而是希望合并这两个修订版本。

Git已经做得很好了。在一个PHP应用程序中,我们希望有一个简单的工具来做同样的事情。有一个xdiff PECL扩展,它有一个xdiff_string_merge3函数。但是xdiff_string_merge3的行为与git不同,xdiff可能不在您的系统上可用。

PhpMerge是一个小型库,用于解决这个问题。有两个类:\PhpMerge\PhpMerge\PhpMerge\GitMerge,它们实现了\PhpMerge\PhpMergeInterface接口,该接口只有一个merge方法。

PhpMerge使用SebastianBergmann\Diff\Differ来获取不同版本之间的差异,并从中计算合并后的文本。GitMerge使用Symplify\GitWrapper\GitWrapper,将文本写入临时文件,并使用命令行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 === ["normal\n"];
    
    $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.

安装

可以使用Composer安装PhpMerge,将库作为依赖项添加到您的composer.json文件中。

{
    "require": {
        "bircher/php-merge": "~4.0"
    }
}

要使用GitMerge的命令行git

{
    "require": {
        "bircher/php-merge": "~4.0",
        "symplify/git-wrapper": "^9.1|^10.0"
    }
}

请参阅Composer文档以获取安装和用法说明。

与~3.0的差别

在~4.0版本中,我们由于前者已弃用,因此从cpliakas/git-wrapper切换到symplify/git-wrapper。这次更新意味着仅使用PhpMerge\PhpMerge时没有任何变化。