From 6da38b9474f943b66c6594c58510aec234742669 Mon Sep 17 00:00:00 2001
From: Robin Rosenberg <robin.rosenberg@dewire.com>
Date: Tue, 13 Apr 2010 23:00:53 +0200
Subject: [PATCH] Optimize ref scanning

We can avoid one stat call by trying to perform a directory
listing without checking if the reference File is a directory.
Attempting a directory listing is defined to return. The other
case for null returns from list is when an I/O error occcurs.

Both cases are now intepreted as a possible plain reference. I/O
errors when reading plain references will be handled (ignored)
in scanRef().

Change-Id: I9906ed8c42eab4d6029c781aab87b3b07c1a1d2c
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
 .../src/org/eclipse/jgit/lib/RefDirectory.java        | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDirectory.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDirectory.java
index 90ac0bf47..faebbf67c 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDirectory.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDirectory.java
@@ -331,18 +331,19 @@ void scan(String prefix) {
 			}
 		}
 
-		private void scanTree(String prefix, File dir) {
+		private boolean scanTree(String prefix, File dir) {
 			final String[] entries = dir.list(LockFile.FILTER);
-			if (entries != null && 0 < entries.length) {
+			if (entries == null) // not a directory or an I/O error
+				return false;
+			if (0 < entries.length) {
 				Arrays.sort(entries);
 				for (String name : entries) {
 					File e = new File(dir, name);
-					if (e.isDirectory())
-						scanTree(prefix + name + '/', e);
-					else
+					if (!scanTree(prefix + name + '/', e))
 						scanOne(prefix + name);
 				}
 			}
+			return true;
 		}
 
 		private void scanOne(String name) {
-- 
GitLab