JGit pgm: Format blame output to match canonical git

Canonical git shows the zero-Id for lines without commit, and
uses the current time stamp for such lines.

Also consider lines without commit when calculating the field
widths.

Change-Id: If0bee9b3e7f90861ad0f387f68e52ecc4a53dfd7
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
This commit is contained in:
Thomas Wolf 2019-08-06 18:32:35 +02:00 committed by Matthias Sohn
parent 59f9d206c9
commit 533a81db9d
2 changed files with 52 additions and 31 deletions

View File

@ -48,6 +48,7 @@
import org.eclipse.jgit.api.MergeResult;
import org.eclipse.jgit.lib.CLIRepositoryTestCase;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevCommit;
import org.junit.Rule;
import org.junit.Test;
@ -90,7 +91,7 @@ public void testBlameStaged() throws Exception {
git.add().addFilepattern("inIndex.txt").call();
}
assertStringArrayEquals(
" (Not Committed Yet 1) index",
"00000000 (Not Committed Yet 2009-08-15 20:12:58 -0330 1) index",
execute("git blame inIndex.txt"));
}
@ -136,22 +137,24 @@ public void testBlameMergeConflict() throws Exception {
writeTrashFile("file",
"Conflicting change from side branch\n");
git.add().addFilepattern("file").call();
RevCommit side = git.commit().setMessage("side commit").call();
RevCommit side = git.commit().setMessage("side commit")
.setCommitter(new PersonIdent("gitter", "")).call();
git.checkout().setName(Constants.MASTER).call();
writeTrashFile("file", "Change on master branch\n");
git.add().addFilepattern("file").call();
git.commit().setMessage("Commit conflict on master").call();
git.commit().setMessage("Commit conflict on master")
.setCommitter(new PersonIdent("gitter", "")).call();
MergeResult result = git.merge()
.include("side", side).call();
assertTrue("Expected conflict on 'file'",
result.getConflicts().containsKey("file"));
}
String[] expected = {
" (Not Committed Yet 1) <<<<<<< HEAD",
"7a918de5 (GIT_COMMITTER_NAME 2009-08-15 20:12:58 -0330 2) Change on master branch",
" (Not Committed Yet 3) =======",
"beb52f68 (GIT_COMMITTER_NAME 2009-08-15 20:12:58 -0330 4) Conflicting change from side branch",
" (Not Committed Yet 5) >>>>>>> side" };
"00000000 (Not Committed Yet 2009-08-15 20:12:58 -0330 1) <<<<<<< HEAD",
"0f5b671c (gitter 2009-08-15 20:12:58 -0330 2) Change on master branch",
"00000000 (Not Committed Yet 2009-08-15 20:12:58 -0330 3) =======",
"ae78cff6 (gitter 2009-08-15 20:12:58 -0330 4) Conflicting change from side branch",
"00000000 (Not Committed Yet 2009-08-15 20:12:58 -0330 5) >>>>>>> side" };
assertArrayOfLinesEquals(expected, execute("git blame file"));
}
}

View File

@ -133,6 +133,9 @@ void ignoreAllSpace(@SuppressWarnings("unused") boolean on) {
private BlameResult blame;
/** Used to get a current time stamp for lines without commit. */
private final PersonIdent dummyDate = new PersonIdent("", ""); //$NON-NLS-1$ //$NON-NLS-2$
/** {@inheritDoc} */
@Override
protected void run() {
@ -214,6 +217,10 @@ protected void run() {
authorWidth = Math.max(authorWidth, author(line).length());
dateWidth = Math.max(dateWidth, date(line).length());
pathWidth = Math.max(pathWidth, path(line).length());
} else if (c == null) {
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
&& sameCommit(blame.getSourceCommit(line + 1), c)) {
@ -351,10 +358,12 @@ private String author(int line) {
}
private String date(int line) {
if (blame.getSourceCommit(line) == null)
return ""; //$NON-NLS-1$
PersonIdent author = blame.getSourceAuthor(line);
PersonIdent author;
if (blame.getSourceCommit(line) == null) {
author = dummyDate;
} else {
author = blame.getSourceAuthor(line);
}
if (author == null)
return ""; //$NON-NLS-1$
@ -372,28 +381,37 @@ private String abbreviate(ObjectReader reader, RevCommit commit)
if (r != null)
return r;
if (showBlankBoundary && commit.getParentCount() == 0)
commit = null;
if (commit == null) {
int len = showLongRevision ? OBJECT_ID_STRING_LENGTH : (abbrev + 1);
StringBuilder b = new StringBuilder(len);
for (int i = 0; i < len; i++)
b.append(' ');
r = b.toString();
} else if (!root && commit.getParentCount() == 0) {
if (showLongRevision)
r = "^" + commit.name().substring(0, OBJECT_ID_STRING_LENGTH - 1); //$NON-NLS-1$
else
r = "^" + reader.abbreviate(commit, abbrev).name(); //$NON-NLS-1$
if (showLongRevision) {
r = ObjectId.zeroId().name();
} else {
r = ObjectId.zeroId().abbreviate(abbrev + 1).name();
}
} else {
if (showLongRevision)
r = commit.name();
else
r = reader.abbreviate(commit, abbrev + 1).name();
}
if (showBlankBoundary && commit.getParentCount() == 0)
commit = null;
if (commit == null) {
int len = showLongRevision ? OBJECT_ID_STRING_LENGTH
: (abbrev + 1);
StringBuilder b = new StringBuilder(len);
for (int i = 0; i < len; i++)
b.append(' ');
r = b.toString();
} else if (!root && commit.getParentCount() == 0) {
if (showLongRevision)
r = "^" + commit.name().substring(0, //$NON-NLS-1$
OBJECT_ID_STRING_LENGTH - 1);
else
r = "^" + reader.abbreviate(commit, abbrev).name(); //$NON-NLS-1$
} else {
if (showLongRevision)
r = commit.name();
else
r = reader.abbreviate(commit, abbrev + 1).name();
}
}
abbreviatedCommits.put(commit, r);
return r;
}