From 1aa6e081ffe319ff3ddfa246783cb65dc1c71b3b Mon Sep 17 00:00:00 2001 From: James Moger Date: Wed, 28 Mar 2012 17:57:35 -0400 Subject: Fixed symlink absolute path/canonical path mixup with JGit (issue 78) --- src/com/gitblit/utils/FileUtils.java | 29 +++++++++++++++++++++++++++++ src/com/gitblit/utils/JGitUtils.java | 4 ++-- 2 files changed, 31 insertions(+), 2 deletions(-) (limited to 'src/com/gitblit/utils') diff --git a/src/com/gitblit/utils/FileUtils.java b/src/com/gitblit/utils/FileUtils.java index 29c9d0fe..f8d35c84 100644 --- a/src/com/gitblit/utils/FileUtils.java +++ b/src/com/gitblit/utils/FileUtils.java @@ -149,4 +149,33 @@ public class FileUtils { } } } + + /** + * Determine the relative path between two files. Takes into account + * canonical paths, if possible. + * + * @param basePath + * @param path + * @return a relative path from basePath to path + */ + public static String getRelativePath(File basePath, File path) { + File exactBase = getExactFile(basePath); + File exactPath = getExactFile(path); + return StringUtils.getRelativePath(exactBase.getPath(), exactPath.getPath()); + } + + /** + * Returns the exact path for a file. This path will be the canonical path + * unless an exception is thrown in which case it will be the absolute path. + * + * @param path + * @return the exact file + */ + public static File getExactFile(File path) { + try { + return path.getCanonicalFile(); + } catch (IOException e) { + return path.getAbsoluteFile(); + } + } } diff --git a/src/com/gitblit/utils/JGitUtils.java b/src/com/gitblit/utils/JGitUtils.java index f495a38f..72e948cc 100644 --- a/src/com/gitblit/utils/JGitUtils.java +++ b/src/com/gitblit/utils/JGitUtils.java @@ -301,6 +301,7 @@ public class JGitUtils { */ private static List getRepositoryList(String basePath, File searchFolder, boolean onlyBare, boolean searchSubfolders) { + File baseFile = new File(basePath); List list = new ArrayList(); for (File file : searchFolder.listFiles()) { if (file.isDirectory()) { @@ -310,8 +311,7 @@ public class JGitUtils { continue; } // determine repository name relative to base path - String repository = StringUtils.getRelativePath(basePath, - file.getAbsolutePath()); + String repository = FileUtils.getRelativePath(baseFile, file); list.add(repository); } else if (searchSubfolders && file.canRead()) { // look for repositories in subfolders -- cgit v1.2.3