From 5a4e34009be6ab108d3165a436da38cb23fb8a0f Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Thu, 17 Apr 2014 14:19:23 -0700 Subject: [PATCH] blame: Automatically increase commit abbreviation length Ensure commit object names are unique by extending the default abbreviation as long as necessary. This allows `jgit blame` to more closely match the formatted output of `git blame` on large histories like Gerrit Code Review's ReceiveCommits.java file. Change-Id: I5f7c4855769ee9dcba973389df9e109005dcdb5b --- .../src/org/eclipse/jgit/pgm/Blame.java | 20 ++++++++++++++++--- .../eclipse/jgit/blame/BlameGenerator.java | 12 +++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java index 164da3f1d..307d947f3 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java @@ -143,6 +143,7 @@ class Blame extends TextBuiltin { revision = null; } + boolean autoAbbrev = abbrev == 0; if (abbrev == 0) abbrev = db.getConfig().getInt("core", "abbrev", 7); //$NON-NLS-1$ //$NON-NLS-2$ if (!showBlankBoundary) @@ -156,6 +157,7 @@ class Blame extends TextBuiltin { dateFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ZZZZ"); //$NON-NLS-1$ BlameGenerator generator = new BlameGenerator(db, file); + RevFlag scanned = generator.newFlag("SCANNED"); //$NON-NLS-1$ reader = db.newObjectReader(); try { generator.setTextComparator(comparator); @@ -198,9 +200,17 @@ class Blame extends TextBuiltin { int pathWidth = 1; int maxSourceLine = 1; for (int line = begin; line < end; line++) { - authorWidth = Math.max(authorWidth, author(line).length()); - dateWidth = Math.max(dateWidth, date(line).length()); - pathWidth = Math.max(pathWidth, path(line).length()); + RevCommit c = blame.getSourceCommit(line); + if (c != null && !c.has(scanned)) { + c.add(scanned); + if (autoAbbrev) + abbrev = Math.max(abbrev, uniqueAbbrevLen(c)); + authorWidth = Math.max(authorWidth, author(line).length()); + dateWidth = Math.max(dateWidth, date(line).length()); + pathWidth = Math.max(pathWidth, path(line).length()); + } + while (line + 1 < end && blame.getSourceCommit(line + 1) == c) + line++; maxSourceLine = Math.max(maxSourceLine, blame.getSourceLine(line)); } @@ -232,6 +242,10 @@ class Blame extends TextBuiltin { } } + private int uniqueAbbrevLen(RevCommit commit) throws IOException { + return reader.abbreviate(commit, abbrev).length(); + } + private void parseLineRangeOption() { String beginStr, endStr; if (rangeString.startsWith("/")) { //$NON-NLS-1$ diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java index c198385e8..63d0fb2cf 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java @@ -422,6 +422,18 @@ public class BlameGenerator { return this; } + /** + * Allocate a new RevFlag for use by the caller. + * + * @param name + * unique name of the flag in the blame context. + * @return the newly allocated flag. + * @since 3.4 + */ + public RevFlag newFlag(String name) { + return revPool.newFlag(name); + } + /** * Execute the generator in a blocking fashion until all data is ready. *