diff options
author | Shawn Pearce <spearce@spearce.org> | 2014-04-19 18:34:21 -0700 |
---|---|---|
committer | Shawn Pearce <spearce@spearce.org> | 2014-04-21 11:58:58 -0700 |
commit | a622451ac9e84fab150efb920f8e4ee9796be067 (patch) | |
tree | 3691a3f309e12cde40ee41dfa26bab8f67d39ffe /org.eclipse.jgit.pgm | |
parent | 2d76133ba229135fcc8a9631fe0619456290f34d (diff) | |
download | jgit-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.java | 36 |
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(); |