Browse Source

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
tags/v3.4.0.201405051725-m7
Shawn Pearce 10 years ago
parent
commit
5a4e34009b

+ 17
- 3
org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java View File

@@ -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$

+ 12
- 0
org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java View File

@@ -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.
*

Loading…
Cancel
Save