logue/php-merge

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

2.0.1 2019-02-24 02:42 UTC

This package is auto-updated.

Last update: 2024-09-16 09:50:07 UTC


README

Build Status Code Coverage Scrutinizer Code Quality SensioLabsInsight 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使用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'];
    
    $version2_lines = $conflicts[0]->getRemote();
    // $version2_lines == ['normal??'];
    
    $conflicting_lines = $conflicts[0]->getLocal();
    // $conflicting_lines == ['normal!!'];
    
    $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": "~2.0"
    }
}

要使用GitMerge的命令行git

{
    "require": {
        "bircher/php-merge": "~2.0",
        "cpliakas/git-wrapper": "~1.0"
    }
}

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

与~1.0版本的区别

在~2.0版本中,我们放弃了php 5的支持,并使用php 7结构。这意味着PhpMergeInterface将参数和返回类型类型提示为字符串。除此之外,所有类现在都是final的,API更加清晰。如果需要,我们可以考虑使类可继承,而不会破坏API,但反之则不行。

如果您只是像本文件中描述的那样使用~1.0版本,那么~2.0版本将继续工作。