Git FileRevision 获取多行注释 - 仅获取第一行
Git FileRevision get comment with multiple lines - gets only first line
我正在开发 Eclipse 插件。我尝试使用以下信息提取所有源代码修订(来自 git repo 或 svn 或任何其他存储库):提交 ID、日期、作者、消息。
而且我对提交消息有问题,那些有多行的消息。 TL;DR 我只从包含多行的提交消息中获取第一行。关于如何获取整个消息内容的任何想法?
下面是一个工作代码。只需将连接 SCM 的工作区中的项目名称放在第一行即可。
IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("testGit");
IJavaProject javaProject = JavaCore.create(selectedProject);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment mypackage : packages) {
if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
IResource file = unit.getResource();
IFileRevision[] revisions = getFileRevisions(javaProject, file);
if (revisions != null && revisions.length > 0) {
for (IFileRevision revision : revisions) {
System.out.println(revision.getComment());
System.out.println("============================================");
}
}
}
}
}
private IFileRevision[] getFileRevisions(IJavaProject project, IResource file) {
RepositoryProvider repositoryProvider = RepositoryProvider.getProvider(project.getProject());
IFileRevision[] revisions = null;
IFileHistoryProvider fileHistoryProvider = repositoryProvider.getFileHistoryProvider();
if (fileHistoryProvider == null)
return null;
IFileHistory iFileHistory = fileHistoryProvider.getFileHistoryFor(file,
FileHistoryProvider.SINGLE_LINE_OF_DESCENT, null);
if (iFileHistory != null) {
revisions = iFileHistory.getFileRevisions();
}
return revisions;
}
请注意,您需要创建新的插件项目,而不是Java 项目。然后需要添加 dependencies 然后修复丢失的导入:
org.eclipse.jdt.core,
org.eclipse.core.resources,
org.eclipse.team.core,
org.eclipse.team.ui
代码可以在任何地方运行。最简单的方法是创建 Hello World 插件并在构造函数中的某处运行代码。
主要问题是EGitclassCommitFileRevision
只有returns一个短消息,见source code.
为了获得完整的评论,我 - 绝不是专家 - 相信你必须使用 JGit,特别是 RevCommit.getFullMessage()
. Maybe you want to look into the JGit user guide 以获得更多信息。 SO这里也有几个关于这个话题的问题,请自行搜索。
更新:
这是从 (non-public, 但 package-local) EGit class CommitFileRevision
通过反射。我将代码放在 "Hello world" 插件的菜单操作中:
public void run(IAction action) {
//MessageDialog.openInformation(window.getShell(), "SO_GitPlugin", "Hello, Eclipse world");
try {
IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("SoccerTable");
IJavaProject javaProject = JavaCore.create(selectedProject);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment mypackage : packages) {
if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
IResource file = unit.getResource();
IFileRevision[] revisions = getFileRevisions(javaProject, file);
if (revisions != null && revisions.length > 0) {
for (IFileRevision revision : revisions) {
Method method = revision.getClass().getMethod("getRevCommit");
method.setAccessible(true);
RevCommit revCommit = (RevCommit) method.invoke(revision);
System.out.println(revision);
//System.out.println(revision.getComment());
System.out.println(revCommit.getFullMessage());
System.out.println("============================================");
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
孩子们,不要在家里这样做! ;-) 这只是一个 hacky 的概念证明,实际上不必 bootstrap 使用 JGit 的所有内容。顺便说一句,您必须将插件依赖项 org.eclipse.jgit
添加到您的项目中。
我正在开发 Eclipse 插件。我尝试使用以下信息提取所有源代码修订(来自 git repo 或 svn 或任何其他存储库):提交 ID、日期、作者、消息。
而且我对提交消息有问题,那些有多行的消息。 TL;DR 我只从包含多行的提交消息中获取第一行。关于如何获取整个消息内容的任何想法?
下面是一个工作代码。只需将连接 SCM 的工作区中的项目名称放在第一行即可。
IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("testGit");
IJavaProject javaProject = JavaCore.create(selectedProject);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment mypackage : packages) {
if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
IResource file = unit.getResource();
IFileRevision[] revisions = getFileRevisions(javaProject, file);
if (revisions != null && revisions.length > 0) {
for (IFileRevision revision : revisions) {
System.out.println(revision.getComment());
System.out.println("============================================");
}
}
}
}
}
private IFileRevision[] getFileRevisions(IJavaProject project, IResource file) {
RepositoryProvider repositoryProvider = RepositoryProvider.getProvider(project.getProject());
IFileRevision[] revisions = null;
IFileHistoryProvider fileHistoryProvider = repositoryProvider.getFileHistoryProvider();
if (fileHistoryProvider == null)
return null;
IFileHistory iFileHistory = fileHistoryProvider.getFileHistoryFor(file,
FileHistoryProvider.SINGLE_LINE_OF_DESCENT, null);
if (iFileHistory != null) {
revisions = iFileHistory.getFileRevisions();
}
return revisions;
}
请注意,您需要创建新的插件项目,而不是Java 项目。然后需要添加 dependencies 然后修复丢失的导入:
org.eclipse.jdt.core,
org.eclipse.core.resources,
org.eclipse.team.core,
org.eclipse.team.ui
代码可以在任何地方运行。最简单的方法是创建 Hello World 插件并在构造函数中的某处运行代码。
主要问题是EGitclassCommitFileRevision
只有returns一个短消息,见source code.
为了获得完整的评论,我 - 绝不是专家 - 相信你必须使用 JGit,特别是 RevCommit.getFullMessage()
. Maybe you want to look into the JGit user guide 以获得更多信息。 SO这里也有几个关于这个话题的问题,请自行搜索。
更新:
这是从 (non-public, 但 package-local) EGit class CommitFileRevision
通过反射。我将代码放在 "Hello world" 插件的菜单操作中:
public void run(IAction action) {
//MessageDialog.openInformation(window.getShell(), "SO_GitPlugin", "Hello, Eclipse world");
try {
IProject selectedProject = ResourcesPlugin.getWorkspace().getRoot().getProject("SoccerTable");
IJavaProject javaProject = JavaCore.create(selectedProject);
IPackageFragment[] packages = javaProject.getPackageFragments();
for (IPackageFragment mypackage : packages) {
if (mypackage.getKind() == IPackageFragmentRoot.K_SOURCE) {
for (ICompilationUnit unit : mypackage.getCompilationUnits()) {
IResource file = unit.getResource();
IFileRevision[] revisions = getFileRevisions(javaProject, file);
if (revisions != null && revisions.length > 0) {
for (IFileRevision revision : revisions) {
Method method = revision.getClass().getMethod("getRevCommit");
method.setAccessible(true);
RevCommit revCommit = (RevCommit) method.invoke(revision);
System.out.println(revision);
//System.out.println(revision.getComment());
System.out.println(revCommit.getFullMessage());
System.out.println("============================================");
}
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
孩子们,不要在家里这样做! ;-) 这只是一个 hacky 的概念证明,实际上不必 bootstrap 使用 JGit 的所有内容。顺便说一句,您必须将插件依赖项 org.eclipse.jgit
添加到您的项目中。