Originally, blame's walk to find a scapegoat to blame for a file walking backward from a commit used the test treeWalk.getFileMode(0).getObjectType() != OBJ_BLOB to throw out gitlink (submodule) entries. Later,tags/v3.4.0.201406041058-rc352500d3264
(blame: Micro optimize blob lookup in tree, 2014-04-17) changed that test to (treeWalk.getRawMode(0) & TYPE_FILE) != TYPE_FILE These checks are not the same, though: the older test accepts files and symlinks, while the newer one accepts files, symlinks, and gitlink (submodule) entries. This is particularly broken in the submodule case --- trying to parse the referred-to commit as a blob produces caught an exception: GET /gerrit/+blame/master/plugins/reviewnotes HTTP/1.1 org.eclipse.jgit.errors.MissingObjectException: Missing blob61702414c0
Stick to just (possibly executable) files instead. Symlinks are not line-oriented data so blame on a symlink is not likely to be useful. A quick grep for '& TYPE_' doesn't find any other instances of this bug. Change-Id: Iebcc91f1bee3c91adda51dccd6372e8302bf23fe Signed-off-by: Jonathan Nieder <jrn@google.com>
@@ -45,6 +45,7 @@ package org.eclipse.jgit.blame; | |||
import static org.eclipse.jgit.lib.Constants.OBJ_BLOB; | |||
import static org.eclipse.jgit.lib.FileMode.TYPE_FILE; | |||
import static org.eclipse.jgit.lib.FileMode.TYPE_MASK; | |||
import java.io.IOException; | |||
import java.util.Collection; | |||
@@ -955,7 +956,7 @@ public class BlameGenerator { | |||
} | |||
private static final boolean isFile(int rawMode) { | |||
return (rawMode & TYPE_FILE) == TYPE_FILE; | |||
return (rawMode & TYPE_MASK) == TYPE_FILE; | |||
} | |||
private DiffEntry findRename(RevCommit parent, RevCommit commit, |