package com.atlassian.labs.speakeasy.util; import bsh.commands.dir; import com.google.common.collect.Lists; import java.io.File; import java.io.FilenameFilter; import java.net.URI; import java.util.*; import static com.google.common.collect.Lists.newArrayList; /** * */ public class RepositoryDirectoryUtil { private static final FilenameFilter NO_GIT = new FilenameFilter() { public boolean accept(File dir, String name) { return !name.equals(".git"); } }; public static List<String> getEntries(File root) { return walk(root.toURI(), root); } public static List<String> walk(URI root, File dir) { TreeMap<String,List<String>> dirs = new TreeMap<String, List<String>>(); TreeMap<String, File> files = new TreeMap<String, File>(); for (File entry : dir.listFiles(NO_GIT)) { String path = entry.getName(); if (entry.isDirectory()) { dirs.put(path + "/", walk(root, entry)); } else { files.put(path, entry); } } List<String> contents = newArrayList(); for (String dirName : dirs.keySet()) { contents.add(root.relativize(new File(dir, dirName).toURI()).getPath()); contents.addAll(dirs.get(dirName)); } for (File file : files.values()) { contents.add(root.relativize(file.toURI()).getPath()); } return contents; } private static String stackToPath(List<File> stack, File leaf) { StringBuilder sb = new StringBuilder(); for (int x=1; x < stack.size() && stack.size() > 1; x++) { File cur = stack.get(x); addEntry(sb, cur); } addEntry(sb, leaf); return sb.toString(); } private static void addEntry(StringBuilder sb, File cur) { sb.append(cur.getName()); if (cur.isDirectory()) { sb.append("/"); } } }