From a622451ac9e84fab150efb920f8e4ee9796be067 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Sat, 19 Apr 2014 18:34:21 -0700 Subject: [PATCH] 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 --- .../src/org/eclipse/jgit/pgm/Blame.java | 36 ++++++++++++------- 1 file 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 307d947f3..271e934b4 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();