summaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit.pgm
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2014-04-19 18:34:21 -0700
committerShawn Pearce <spearce@spearce.org>2014-04-21 11:58:58 -0700
commita622451ac9e84fab150efb920f8e4ee9796be067 (patch)
tree3691a3f309e12cde40ee41dfa26bab8f67d39ffe /org.eclipse.jgit.pgm
parent2d76133ba229135fcc8a9631fe0619456290f34d (diff)
downloadjgit-a622451ac9e84fab150efb920f8e4ee9796be067.tar.gz
jgit-a622451ac9e84fab150efb920f8e4ee9796be067.zip
blame: Format commit and author only once per range
When a commit is blamed for multiple lines of the result file the command line interface prints the same text before each line in that span. Format these strings once and reuse them as the line prefix. For long files (e.g. 2425 lines of ReceiveCommits.java in Gerrit) this can save as much as 20ms during the output phase of the command line blame program. Change-Id: Ie42787d77c8d0cbca7ccbf59c795120494a2a891
Diffstat (limited to 'org.eclipse.jgit.pgm')
-rw-r--r--org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Blame.java36
1 files changed, 23 insertions, 13 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 307d947f39..271e934b45 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
@@ -222,19 +222,29 @@ class Blame extends TextBuiltin {
String authorFmt = MessageFormat.format(" (%-{0}s %{1}s", //$NON-NLS-1$
valueOf(authorWidth), valueOf(dateWidth));
- for (int line = begin; line < end; line++) {
- outw.print(abbreviate(blame.getSourceCommit(line)));
- if (showSourcePath)
- outw.format(pathFmt, path(line));
- if (showSourceLine)
- outw.format(numFmt, valueOf(blame.getSourceLine(line) + 1));
- if (!noAuthor)
- outw.format(authorFmt, author(line), date(line));
- outw.format(lineFmt, valueOf(line + 1));
- outw.flush();
- blame.getResultContents().writeLine(outs, line);
- outs.flush();
- outw.print('\n');
+ for (int line = begin; line < end;) {
+ RevCommit c = blame.getSourceCommit(line);
+ String commit = abbreviate(c);
+ String author = null;
+ String date = null;
+ if (!noAuthor) {
+ author = author(line);
+ date = date(line);
+ }
+ do {
+ outw.print(commit);
+ if (showSourcePath)
+ outw.format(pathFmt, path(line));
+ if (showSourceLine)
+ outw.format(numFmt, valueOf(blame.getSourceLine(line) + 1));
+ if (!noAuthor)
+ outw.format(authorFmt, author, date);
+ outw.format(lineFmt, valueOf(line + 1));
+ outw.flush();
+ blame.getResultContents().writeLine(outs, line);
+ outs.flush();
+ outw.print('\n');
+ } while (++line < end && blame.getSourceCommit(line) == c);
}
} finally {
generator.release();