【发布时间】:2011-09-17 22:26:57
【问题描述】:
这是我的问题:
作为毕业论文的一部分,我正在研究一个项目。我正在尝试连接到不同的开源项目存储库并从源文件中获取信息。实际上,我们分析了这个项目的代码以及在此期间对其所做的更改。换句话说,我们想看看软件是如何发展的并指定所做的更改。因此,我们需要使用 SVNKit 连接到存储库,并为每个源文件下载它的内容,以便每个修订版本更改。
例如,假设我们有一个具有初始目录结构的项目:
-
目录/
--file1.java
--file2.java
第一次提交更改 dirA/file1.java,第二次提交更改 dirA/file2.java 和 file1.java。我们要分析初始状态下两个文件(file1.java 和 file2.java)的代码,然后分析在第一次和第二次提交期间在 file1.java 上所做的更改以及在第二次提交期间在 file2.java 上所做的更改。
第三次提交创建目录和文件:
-
目录/
--file3.java
-
目录/目录
--file4.java
和上面描述的一样,我们要分析dirB/file3.java和dirA/dirC/file4.java的代码,以及我们要分析(主)目录结构是如何变化的。
第 4 次提交将文件 file3.java 复制到 dirA/dirC/ 目录并对此文件进行更改。同理我们要分析复制操作是如何改变目录结构的,分析提交前后file3.java的内容。
因为我们是面向代码的,所以我们希望从存储库中获取所有源文件及其所有修订版。对于特定文件的每个修订版,我们想要当前修订版(从第一个修订版开始)和前一个修订版的内容,直到最后一个修订版。因为不需要在每次提交时更改文件(可能会被复制或删除),所以无需下载具有相同内容的重复文件。
我知道有一种方法可以检索文件的原始状态,方法是通过递归地对其内容执行向后差异,使其内容处于其最后修订版。例如,在最后一次修订(在第二次提交期间创建的那个)具有 dirA/file1.java 的内容并具有 diff 输出,我们可以检索在此修订之前(第二次提交之前)的文件状态。这样就不需要为每个修订下载每个文件的内容。所以我们只需要在第一个修订版下载文件的内容,然后为每个修订版下载每个差异输出(如果有的话),并执行前向差异来检索提交后的状态。
解释:
1 - 在修订版 1 file1.java 中包含以下内容:
"Content at revision 1 (initial state)"
2 - 在修订版 2 中,此文件已修改为,并具有以下内容:
"Content at revision 1 (initial state)
Modification at revision 2 (line added)"
3 - 在修订版 3 中,此文件已修改为并具有以下内容:
"Modification at revision 2 (line added)
Modification at revision 3 (line added)
First line from revision 1 was removed"
如果我们获得 file1.java 的日志,我们将有三个条目,每个修改一个条目(对应于 rev 1、2、3)。对于所有三个修订,我们都想检索文件内容,因为每次对源文件进行提交(更改)时,我们都会分析代码修改。 我们知道如何以一种简单的方式做到这一点:SVNRepository.getFile(...)。这种方法的问题是,如果我们有 1 个已修改 1000 次的文件,我们必须下载其内容 1000 次(每次使用不同的版本号)。也就是说,对于一个有 100 个源文件和每个文件大约 1000 次修改的小项目,我们应该得到 100,000 个不同的内容!!!另一种方法是获取最后一个修订版的文件内容,并为每个先前的修订版获取差异输出。比我们可以应用差异输出(向后)来检索所有先前版本的文件内容。也就是说,我们最小化带宽。 这是我正在寻找的解决方案,或者如果有更好的解决方案您很乐意贡献。
您能否就如何使用 SVNKit 实现此类功能提供一些帮助。如果您提供一些简短的代码示例,或者我必须使用哪些类和方法,这将非常有用,这样我就可以阅读 java 文档。每一个帮助将不胜感激。
提前谢谢你, 猫王。
【问题讨论】: