2015-01-06 64 views
2

我正在使用Eclipse插件。我尝试使用以下信息提取所有源代码版本(从git repo或svn或任何其他存储库):提交id,日期,作者,消息。Git FileRevision用多行获得评论 - 只获得第一行

而我有提交消息,有多行的问题。 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项目。然后,它需要添加依赖,然后修复缺失的进口:

org.eclipse.jdt.core, 
org.eclipse.core.resources, 
org.eclipse.team.core, 
org.eclipse.team.ui 

代码可在任何地方运行。最简单的方法是创建Hello World插件并在构造函数的某处运行代码。

回答

0

的主要问题是,例如:It CommitFileRevision返回一个短消息,见source code

为了得到完整的评论,我 - 绝不是专家 - 相信你必须使用JGit,特别是RevCommit.getFullMessage()。也许你想看看JGit user guide欲了解更多信息。这里也有一些关于这个话题的问题,请搜索一下。


更新:

这里是一个快速&肮脏的代码片段取出由该RevCommit(非公开的,但是包本地)例如:It通过反射类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(); 
    } 
} 

不要在家里这样做,孩子们! ;-)这只是一个概念验证,而实际上并没有用JGit来引导所有的东西。顺便说一句,你必须添加插件依赖项org.eclipse.jgit到你的项目。