if (showRawTimestamp)
dateFmt = new SimpleDateFormat("ZZZZ"); //$NON-NLS-1$
else
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);
if (!reverseRange.isEmpty()) {
RevCommit rangeStart = null;
List<RevCommit> rangeEnd = new ArrayList<RevCommit>(2);
for (RevCommit c : reverseRange) {
if (c.has(RevFlag.UNINTERESTING))
rangeStart = c;
else
rangeEnd.add(c);
}
generator.reverse(rangeStart, rangeEnd);
} else if (revision != null) {
generator.push(null, db.resolve(revision + "^{commit}")); //$NON-NLS-1$
} else {
generator.push(null, db.resolve(Constants.HEAD));
if (!db.isBare()) {
DirCache dc = db.readDirCache();
int entry = dc.findEntry(file);
if (0 <= entry)
generator.push(null, dc.getEntry(entry).getObjectId());
File inTree = new File(db.getWorkTree(), file);
if (db.getFS().isFile(inTree))
generator.push(null, new RawText(inTree));
}
}
blame = BlameResult.create(generator);
begin = 0;
end = blame.getResultContents().size();
if (rangeString != null)
parseLineRangeOption();
blame.computeRange(begin, end);
int authorWidth = 8;
int dateWidth = 8;
int pathWidth = 1;
int maxSourceLine = 1;
for (int line = begin; line < end; line++) {
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));
}
String pathFmt = MessageFormat.format(" %{0}s", valueOf(pathWidth)); //$NON-NLS-1$
String numFmt = MessageFormat.format(" %{0}d", //$NON-NLS-1$
valueOf(1 + (int) Math.log10(maxSourceLine + 1)));
String lineFmt = MessageFormat.format(" %{0}d) ", //$NON-NLS-1$
valueOf(1 + (int) Math.log10(end + 1)));
String authorFmt = MessageFormat.format(" (%-{0}s %{1}s", //$NON-NLS-1$
valueOf(authorWidth), valueOf(dateWidth));
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();
reader.release();
}
}