From bb55f5aec092b22ee4b86152c0e0111df48eb34e Mon Sep 17 00:00:00 2001
From: James Moger <james.moger@gitblit.com>
Date: Thu, 02 Aug 2012 15:53:51 -0400
Subject: [PATCH] Compile regex patterns once and use matches instead of find (issue 103)

---
 src/com/gitblit/utils/JGitUtils.java |   26 +++++++++++++-------------
 1 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java
index 9d2e471..4415982 100644
--- a/src/com/gitblit/utils/JGitUtils.java
+++ b/src/com/gitblit/utils/JGitUtils.java
@@ -288,8 +288,14 @@
 		if (repositoriesFolder == null || !repositoriesFolder.exists()) {
 			return list;
 		}
+		List<Pattern> patterns = new ArrayList<Pattern>();
+		if (!ArrayUtils.isEmpty(exclusions)) {
+			for (String regex : exclusions) {
+				patterns.add(Pattern.compile(regex));
+			}
+		}
 		list.addAll(getRepositoryList(repositoriesFolder.getAbsolutePath(), repositoriesFolder,
-				onlyBare, searchSubfolders, depth, exclusions));
+				onlyBare, searchSubfolders, depth, patterns));
 		StringUtils.sortRepositorynames(list);
 		return list;
 	}
@@ -308,22 +314,16 @@
 	 *            recurse into subfolders to find grouped repositories
 	 * @param depth
 	 *            recursion depth, -1 = infinite recursion
-	 * @param exclusions
-	 *            list of regex exclusions for matching to folder names
+	 * @param patterns
+	 *            list of regex patterns for matching to folder names
 	 * @return
 	 */
 	private static List<String> getRepositoryList(String basePath, File searchFolder,
-			boolean onlyBare, boolean searchSubfolders, int depth, List<String> exclusions) {
+			boolean onlyBare, boolean searchSubfolders, int depth, List<Pattern> patterns) {
 		File baseFile = new File(basePath);
 		List<String> list = new ArrayList<String>();
 		if (depth == 0) {
 			return list;
-		}
-		List<Pattern> patterns = new ArrayList<Pattern>();
-		if (!ArrayUtils.isEmpty(exclusions)) {
-			for (String regex : exclusions) {
-				patterns.add(Pattern.compile(regex));
-			}
 		}
 		
 		int nextDepth = (depth == -1) ? -1 : depth - 1;
@@ -332,7 +332,7 @@
 				boolean exclude = false;
 				for (Pattern pattern : patterns) {
 					String path = FileUtils.getRelativePath(baseFile, file).replace('\\',  '/');
-					if (pattern.matcher(path).find()) {
+					if (pattern.matcher(path).matches()) {
 						LOGGER.debug(MessageFormat.format("excluding {0} because of rule {1}", path, pattern.pattern()));
 						exclude = true;
 						break;
@@ -355,12 +355,12 @@
 					} else if (searchSubfolders && file.canRead()) {
 						// look for repositories in subfolders
 						list.addAll(getRepositoryList(basePath, file, onlyBare, searchSubfolders,
-								nextDepth, exclusions));
+								nextDepth, patterns));
 					}
 				} else if (searchSubfolders && file.canRead()) {
 					// look for repositories in subfolders
 					list.addAll(getRepositoryList(basePath, file, onlyBare, searchSubfolders,
-							nextDepth, exclusions));
+							nextDepth, patterns));
 				}
 			}
 		}

--
Gitblit v1.9.1