我正在研究一些php库。我想跟踪类库接口的变化。
我试图用phpDocumentor比较两个版本。
phpdoc项目:parse -d文件夹
生成具有项目界面结构的xml文件。我可以将此xml文件与另一个文件进行比较。但这些包含的信息比我想要的多。像行号,文件哈希等。
所以,我想比较两个提交,分支甚至分支,找出它们的接口差异。
比较示例:http://pastebin.com/1H61dJBT
知道何时更改主要版本也很重要。
当您进行不兼容的API更改时的MAJOR版本...
答案 0 :(得分:2)
普通 diff 报告文本行方面的差异。软件是根据代码结构定义的。源代码作为文本行和作为结构的源之间的不匹配使得diff的输出难以理解。
您可以将界面定义与语义设计(我公司的) SmartDifferencer 进行比较。
这会报告对代码结构(而不是行)的最小编辑,以将一段(PHP)代码转换为另一段代码。对接口函数名称,插入或删除的参数的更改变得非常明显。换行符不相关,不会影响SmartDifferencer的结果;除非你坚持,否则都不是评论。 (SmartDifferencer不仅限于PHP;还有许多语言的版本)。
编辑:OP想知道SmartDifferencer在接口更改的特定示例(PHP文件之前和之后)上做了什么。接下来是他的两个示例文件,它们的SmartDifferencer输出和Unix-diff输出。我注意到这些非常小的示例文件有很多变化。
第一个界面:
<?php
// ----- first version -----
namespace vendor\package;
class someClass
{
private $c;
public function __construct($a, $b)
{
$c = $a + $b;
}
/**
* @return string
*/
public function returnC()
{
return $this->c;
}
public function saySomething()
{
echo 'something';
}
}
修改后的界面文件
<?php
// ----- second version -----
namespace vendor\package;
class someClass
{
private $a, $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function saySomething($something = 'something')
{
echo $something;
}
/**
* @return integer
*/
public function returnC()
{
return $this->a + $this->b;
}
}
智能差分输出(M.N表示“行M,列N”):
C:>DMSSmartDifferencer PHP~PHP5 \temp\first_version.php \temp\second_version.php
Copyright (C) 2009-2012 Semantic Designs; All Rights Reserved
PHP~PHP5 SmartDifferencer Version 1.0.14
Copyright (C) 2012 Semantic Designs, Inc; All Rights Reserved; SD Confidential
Powered by DMS (R) Software Reengineering Toolkit
*** Unregistered SmartDifferencer Version 1.0
*** Operating with evaluation limits.
*** Parsing file C:/temp/first_version.php ...
*** Parsing file C:/temp/second_version.php ...
*** Creating suffix tree ...
*** Determining maximal pairs ...
*** Sorting maximal pairs ...
*** Determining differences ...
*** Printing edits ...
Substitute 7.13-7.14 by 7.13-7.18
< $c
> $a, $b
Substitute 10.9-10.21 by 11.9-12.22
< $c = $a + $b;
> $this->a = $a;
> $this->b = $b;
At 15.12 insert 15.12-18.9 moving 19.21-19.32 to 15.21-15.32
> function saySomething($something = 'something')
> {
> echo $something;
> }
Delete 15.12-18.9 at 15.12 moving 15.21-15.27 to 23.21-23.27
< function returnC()
< {
< return $this->c;
< }
At 19.21 insert 23.21-23.27 moving 15.21-15.27 to 23.21-23.27
> returnC
Delete 19.21-19.32 at 23.21 moving 19.21-19.32 to 15.21-15.32
< saySomething
Substitute 21.9-21.25 by 25.9-25.35
< echo 'something';
> return $this->a + $this->b;
Exiting with final status 1.
您应该看到SmartDifferencer专注于代码结构中的增量, 行中没有 deltas 。您注意到的第一件事是SmartDifferencer完全忽略了注释,因为它们对代码的作用没有影响。
但是下面unix diff中最明显的例子是多个差异,它们在一个函数的末尾加上一个delta,在另一个函数的开头有一个delta;没有程序员通过这种方式解释代码的差异。当试图理解真正改变的东西时,这种混乱的差异会使阅读混乱。
unix-style diff的输出:
C:>diff \temp\first_version.php \temp\second_version.php
2c2
< // ----- first version -----
---
> // ----- second version -----
7c7,8
< private $c;
---
> private $a, $b;
>
10c11,17
< $c = $a + $b;
---
> $this->a = $a;
> $this->b = $b;
> }
>
> public function saySomething($something = 'something')
> {
> echo $something;
11a19
>
13c21
< * @return string
---
> * @return integer
17,21c25
< return $this->c;
< }
< public function saySomething()
< {
< echo 'something';
---
> return $this->a + $this->b;
22a27
>
SmartDifferencer和diff都没有做的是告诉你接口的行为发生了变化,因为 it 所依赖的代码发生了变化。唯一的方法是直接或间接支持接口的所有代码的静态语义分析,这是一个更难的问题。
答案 1 :(得分:2)
我估计你想围绕PHP Smart Differencer
建立一个工作流程可以看到PHP智能差异器结果的示例here。此页面包含SD的PHP Smart Differencer工具生成的输出示例 当应用于原始文件和同一文件的更新版本时。
如果你真的想要自己动手,你可以围绕PHP-Parser构建它,这可能会给你更多的精确度,但你需要生成自己的比较算法,其中SmartDifferencer的工具已经有内置的。
其中任何一个都会为您提供您正在寻找的东西。