Git FileRevision obtiene comentarios con varias líneas: obtiene solo la primera línea

Estoy trabajando en el plugin de Eclipse. Intento extraer todas las revisiones del código fuente (desde git repo o svn o cualquier otro repository) con información: identificador de commit, date, autor, post.

Y tengo un problema con los posts de confirmación, aquellos con múltiples líneas. TL; DR Obtengo solo la primera línea de los posts de confirmación que tienen varias líneas. ¿Alguna idea de cómo get contenido de post completo?

A continuación hay un código de trabajo. Simplemente ponga en primera línea el nombre del proyecto de su área de trabajo que ha conectado 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 (IComstacktionUnit unit : mypackage.getComstacktionUnits()) { 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; } 

Tenga en count que necesita crear un nuevo proyecto de complemento , no un proyecto de Java. Luego es necesario agregar dependencies y luego corregir las importaciones faltantes:

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

El código se puede ejecutar en cualquier lugar. La forma más sencilla es crear el complemento Hello World y ejecutar el código en algún lugar del constructor.

El principal problema es que la class de CommitFileRevision solo devuelve un post corto, vea el código fuente .

Para get el comentario completo, de ninguna manera soy un experto, creo que debe usar JGit , específicamente RevCommit.getFullMessage() . Tal vez quiera consultar la guía del usuario de JGit para get más información. También hay algunas preguntas aquí en SO sobre este tema, por favor búscalo tú mismo.


Actualizar:

Aquí hay un fragment de código rápido y sucio que RevCommit de la class CommitFileRevision (no pública, pero local del package) CommitFileRevision través de la reflexión. Puse el código dentro de la acción de menu del complemento "Hola mundo":

 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 (IComstacktionUnit unit : mypackage.getComstacktionUnits()) { 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(); } } 

¡No hagas esto en casa, niños! 😉 Es simplemente una testing de concepto hacky sin tener que arrancar todo con JGit . Y, por cierto, debe agregar la dependencia del complemento org.eclipse.jgit a su proyecto.