Browse Source

blame: Un-break isFile check in tree walk

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, 52500d3264 (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 blob 61702414c0

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>
tags/v3.4.0.201406041058-rc3
Jonathan Nieder 10 years ago
parent
commit
9b46a47fb7
1 changed files with 2 additions and 1 deletions
  1. 2
    1
      org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java

+ 2
- 1
org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java View File

@@ -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,

Loading…
Cancel
Save