diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameHandler.java index 4cfe8467ec..da96b65274 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameHandler.java @@ -35,7 +35,12 @@ package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.SVNLogEntry; +import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.ISVNAnnotateHandler; import sonia.scm.util.Util; @@ -44,8 +49,11 @@ import sonia.scm.util.Util; import java.io.File; +import java.util.Collection; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @@ -54,14 +62,26 @@ import java.util.List; public class SvnBlameHandler implements ISVNAnnotateHandler { + /** the logger for SvnBlameHandler */ + private static final Logger logger = + LoggerFactory.getLogger(SvnBlameHandler.class); + + //~--- constructors --------------------------------------------------------- + /** * Constructs ... * * + * + * @param svnRepository + * @param path * @param blameLines */ - public SvnBlameHandler(List blameLines) + public SvnBlameHandler(SVNRepository svnRepository, String path, + List blameLines) { + this.svnRepository = svnRepository; + this.path = path; this.blameLines = blameLines; } @@ -132,8 +152,10 @@ public class SvnBlameHandler implements ISVNAnnotateHandler when = date.getTime(); } + String description = getDescription(revision); + blameLines.add(new BlameLine(lineNumber + 1, String.valueOf(revision), - when, authorPerson, null, line)); + when, authorPerson, description, line)); } /** @@ -157,8 +179,61 @@ public class SvnBlameHandler implements ISVNAnnotateHandler return false; } + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param revision + * + * @return + */ + private String getDescription(long revision) + { + String description = descriptionCache.get(revision); + + if (description == null) + { + try + { + Collection entries = svnRepository.log(new String[] { + path }, null, revision, revision, + true, true); + + for (SVNLogEntry entry : entries) + { + if (revision == entry.getRevision()) + { + description = entry.getMessage(); + descriptionCache.put(revision, description); + + break; + } + } + } + catch (SVNException ex) + { + logger.warn( + "could not retrive description for revision ".concat( + String.valueOf(revision)), ex); + } + } + + return description; + } + //~--- fields --------------------------------------------------------------- /** Field description */ private List blameLines; + + /** Field description */ + private Map descriptionCache = new HashMap(); + + /** Field description */ + private String path; + + /** Field description */ + private SVNRepository svnRepository; } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameViewer.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameViewer.java index f171427945..b273d6ca47 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameViewer.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnBlameViewer.java @@ -123,7 +123,8 @@ public class SvnBlameViewer implements BlameViewer svnLogClient.doAnnotate(svnurl, SVNRevision.UNDEFINED, SVNRevision.create(1l), endRevision, - new SvnBlameHandler(blameLines)); + new SvnBlameHandler(svnRepository, path, + blameLines)); } catch (Exception ex) {