diff options
author | Shawn Pearce <spearce@spearce.org> | 2014-04-17 15:03:18 -0700 |
---|---|---|
committer | Shawn Pearce <spearce@spearce.org> | 2014-04-17 15:51:50 -0700 |
commit | 52500d3264d2557cc8ff272b1df9ab12aba0c43b (patch) | |
tree | ca39cd2399da8a7e003cf1e652581678b7318862 /org.eclipse.jgit/src/org/eclipse/jgit/blame | |
parent | 5a4e34009be6ab108d3165a436da38cb23fb8a0f (diff) | |
download | jgit-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.java | 18 |
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) |