James Moger
2012-08-02 bb55f5aec092b22ee4b86152c0e0111df48eb34e
Compile regex patterns once and use matches instead of find (issue-103)
2 files modified
28 ■■■■ changed files
src/com/gitblit/utils/JGitUtils.java 26 ●●●● patch | view | raw | blame | history
tests/com/gitblit/tests/JGitUtilsTest.java 2 ●●● patch | view | raw | blame | history
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));
                }
            }
        }
tests/com/gitblit/tests/JGitUtilsTest.java
@@ -86,7 +86,7 @@
        list = JGitUtils.getRepositoryList(GitBlitSuite.REPOSITORIES, false, true, -1, Arrays.asList("test/*"));
        assertFalse("Repository exclusion failed!", list.contains("test/jgit.git"));
        list = JGitUtils.getRepositoryList(GitBlitSuite.REPOSITORIES, false, true, -1, Arrays.asList("(jgit)+"));
        list = JGitUtils.getRepositoryList(GitBlitSuite.REPOSITORIES, false, true, -1, Arrays.asList(".*jgit.*"));
        assertFalse("Repository exclusion failed!", list.contains("test/jgit.git"));
        assertFalse("Repository exclusion failed!", list.contains("working/jgit"));
        assertFalse("Repository exclusion failed!", list.contains("working/jgit2"));