logue / php-merge
一个使用Diff php库或命令行git的PHP合并工具。
Requires
- php: ^7.1
- sebastian/diff: ^3.0
Requires (Dev)
- cpliakas/git-wrapper: ^2.0
- pdepend/pdepend: ^2.5
- phploc/phploc: ^4.0
- phpmd/phpmd: ^2.6
- phpunit/phpunit: ^7.5 || ^8.0
- psr/log: ^1.0
- scrutinizer/ocular: ^1.5
- sebastian/phpcpd: ^4.0
- squizlabs/php_codesniffer: ^3.4
This package is auto-updated.
Last update: 2024-09-16 09:50:07 UTC
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
使用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版本将继续工作。