aboutsummaryrefslogtreecommitdiffstats
path: root/org.eclipse.jgit/src/org/eclipse/jgit/blame
diff options
context:
space:
mode:
authorShawn Pearce <spearce@spearce.org>2014-04-17 15:03:18 -0700
committerShawn Pearce <spearce@spearce.org>2014-04-17 15:51:50 -0700
commit52500d3264d2557cc8ff272b1df9ab12aba0c43b (patch)
treeca39cd2399da8a7e003cf1e652581678b7318862 /org.eclipse.jgit/src/org/eclipse/jgit/blame
parent5a4e34009be6ab108d3165a436da38cb23fb8a0f (diff)
downloadjgit-52500d3264d2557cc8ff272b1df9ab12aba0c43b.tar.gz
jgit-52500d3264d2557cc8ff272b1df9ab12aba0c43b.zip
blame: Micro optimize blob lookup in tree
Avoid converting the raw mode to FileMode. This is an expensive if-else-if sort of test to just check if the thing is a blob. Instead test the bit mask directly, which is at least a few instructions shorter. The TreeWalk is already recursive and will auto-dive into any subtrees found. isSubtree check is unnecessary, as is the loop, as only one result will ever be returned by next(). Change-Id: I9fb25229ebed857469427bfbdf74aedebfddfac8
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/blame')
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java18
1 files changed, 8 insertions, 10 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
index 63d0fb2cfb..34e15475c3 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
@@ -44,6 +44,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 java.io.IOException;
import java.util.Collection;
@@ -942,20 +943,17 @@ public class BlameGenerator {
private boolean find(RevCommit commit, PathFilter path) throws IOException {
treeWalk.setFilter(path);
treeWalk.reset(commit.getTree());
- while (treeWalk.next()) {
- if (path.isDone(treeWalk)) {
- if (treeWalk.getFileMode(0).getObjectType() != OBJ_BLOB)
- return false;
- treeWalk.getObjectId(idBuf, 0);
- return true;
- }
-
- if (treeWalk.isSubtree())
- treeWalk.enterSubtree();
+ if (treeWalk.next() && isFile(treeWalk.getRawMode(0))) {
+ treeWalk.getObjectId(idBuf, 0);
+ return true;
}
return false;
}
+ private static final boolean isFile(int rawMode) {
+ return (rawMode & TYPE_FILE) == TYPE_FILE;
+ }
+
private DiffEntry findRename(RevCommit parent, RevCommit commit,
PathFilter path) throws IOException {
if (renameDetector == null)