bircher / php-merge
一个使用Diff php库或命令行git的PHP合并工具。
4.0.0
2021-12-27 15:04 UTC
Requires
- php: >=7.3
- sebastian/diff: ^2.0|^3.0|^4.0
Requires (Dev)
- escapestudios/symfony2-coding-standard: ^3.5
- phpstan/phpstan: ~1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpunit/phpunit: ~6|~7|~8|~9
- squizlabs/php_codesniffer: ~3
- symplify/git-wrapper: ^9.1|^10.0
README
简介
当处理文本修订版本时,有时会遇到基于同一原始文本存在多个修订版本的问题。我们不想选择一个并丢弃另一个,而是希望合并这两个修订版本。
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时没有任何变化。