From: James Moger Date: Wed, 28 Mar 2012 21:57:35 +0000 (-0400) Subject: Fixed symlink absolute path/canonical path mixup with JGit (issue 78) X-Git-Tag: v0.9.2~9 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=1aa6e081ffe319ff3ddfa246783cb65dc1c71b3b;p=gitblit.git Fixed symlink absolute path/canonical path mixup with JGit (issue 78) --- diff --git a/docs/04_releases.mkd b/docs/04_releases.mkd index 51d3a1ac..322aed46 100644 --- a/docs/04_releases.mkd +++ b/docs/04_releases.mkd @@ -6,6 +6,12 @@ #### fixes +- Fixed absolute path/canonical path discrepancy between Gitblit and JGit regarding use of symlinks (issue 78) + +**0.9.1** *released 2012-03-27* + +#### fixes + - Lucene folder was stored in working copy instead of in .git folder **0.9.0** *released 2012-03-27* diff --git a/src/com/gitblit/GitServlet.java b/src/com/gitblit/GitServlet.java index 3b60e9f1..73c6eaa4 100644 --- a/src/com/gitblit/GitServlet.java +++ b/src/com/gitblit/GitServlet.java @@ -50,6 +50,7 @@ import org.slf4j.LoggerFactory; import com.gitblit.models.RepositoryModel; import com.gitblit.models.UserModel; +import com.gitblit.utils.FileUtils; import com.gitblit.utils.HttpUtils; import com.gitblit.utils.StringUtils; @@ -207,9 +208,7 @@ public class GitServlet extends org.eclipse.jgit.http.server.GitServlet { */ protected RepositoryModel getRepositoryModel(ReceivePack rp) { Repository repository = rp.getRepository(); - String rootPath = GitBlit.getRepositoriesFolder().getAbsolutePath(); - String repositoryName = StringUtils.getRelativePath(rootPath, repository.getDirectory() - .getAbsolutePath()); + String repositoryName = FileUtils.getRelativePath(GitBlit.getRepositoriesFolder(), repository.getDirectory()); RepositoryModel model = GitBlit.self().getRepositoryModel(repositoryName); return model; } 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 diff --git a/tests/com/gitblit/tests/IssuesTest.java b/tests/com/gitblit/tests/IssuesTest.java index e329f667..11f95514 100644 --- a/tests/com/gitblit/tests/IssuesTest.java +++ b/tests/com/gitblit/tests/IssuesTest.java @@ -34,9 +34,9 @@ import com.gitblit.models.IssueModel.Field; import com.gitblit.models.IssueModel.Priority; import com.gitblit.models.IssueModel.Status; import com.gitblit.models.SearchResult; +import com.gitblit.utils.FileUtils; import com.gitblit.utils.IssueUtils; import com.gitblit.utils.IssueUtils.IssueFilter; -import com.gitblit.utils.StringUtils; /** * Tests the mechanics of distributed issue management on the gb-issues branch. @@ -49,8 +49,7 @@ public class IssuesTest { @Test public void testLifecycle() throws Exception { Repository repository = GitBlitSuite.getIssuesTestRepository(); - String name = StringUtils.getRelativePath(GitBlitSuite.REPOSITORIES.getAbsolutePath(), - repository.getDirectory().getAbsolutePath()); + String name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory()); // create and insert an issue Change c1 = newChange("testCreation() " + Long.toHexString(System.currentTimeMillis())); diff --git a/tests/com/gitblit/tests/LuceneExecutorTest.java b/tests/com/gitblit/tests/LuceneExecutorTest.java index d221744c..ec81fd8e 100644 --- a/tests/com/gitblit/tests/LuceneExecutorTest.java +++ b/tests/com/gitblit/tests/LuceneExecutorTest.java @@ -23,10 +23,12 @@ import java.util.List; import org.eclipse.jgit.lib.Repository; import org.junit.Test; +import com.gitblit.GitBlit; import com.gitblit.LuceneExecutor; import com.gitblit.models.RefModel; import com.gitblit.models.RepositoryModel; import com.gitblit.models.SearchResult; +import com.gitblit.utils.FileUtils; import com.gitblit.utils.JGitUtils; import com.gitblit.utils.StringUtils; @@ -44,8 +46,7 @@ public class LuceneExecutorTest { private RepositoryModel newRepositoryModel(Repository repository) { RepositoryModel model = new RepositoryModel(); - model.name = StringUtils.getRelativePath(GitBlitSuite.REPOSITORIES.getAbsolutePath(), - repository.getDirectory().getAbsolutePath()); + model.name = FileUtils.getRelativePath(GitBlitSuite.REPOSITORIES, repository.getDirectory()); model.hasCommits = JGitUtils.hasCommits(repository); // index all local branches