Mercurial > jhg
diff src/org/tmatesoft/hg/repo/HgRepository.java @ 292:a415fe296a50
Refactor PathRewrite to accept any char sequence, not only string
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 14 Sep 2011 02:16:19 +0200 |
parents | 086a326f181f |
children | 981f9f50bb6c |
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgRepository.java Wed Sep 14 02:12:47 2011 +0200 +++ b/src/org/tmatesoft/hg/repo/HgRepository.java Wed Sep 14 02:16:19 2011 +0200 @@ -32,6 +32,7 @@ import org.tmatesoft.hg.internal.DataAccessProvider; import org.tmatesoft.hg.internal.Experimental; import org.tmatesoft.hg.internal.Filter; +import org.tmatesoft.hg.internal.Internals; import org.tmatesoft.hg.internal.RequiresFile; import org.tmatesoft.hg.internal.RevlogStream; import org.tmatesoft.hg.internal.SubrepoManager; @@ -71,6 +72,7 @@ private final PathRewrite normalizePath; private final PathRewrite dataPathHelper; private final PathRewrite repoPathHelper; + private final boolean isCaseSensitiveFileSystem; private HgChangelog changelog; private HgManifest manifest; @@ -93,6 +95,7 @@ dataAccess = null; dataPathHelper = repoPathHelper = null; normalizePath = null; + isCaseSensitiveFileSystem = !Internals.runningOnWindows(); } HgRepository(String repositoryPath, File repositoryRoot) { @@ -106,12 +109,14 @@ } repoLocation = repositoryPath; dataAccess = new DataAccessProvider(); - final boolean runningOnWindows = System.getProperty("os.name").indexOf("Windows") != -1; + final boolean runningOnWindows = Internals.runningOnWindows(); + isCaseSensitiveFileSystem = !runningOnWindows; if (runningOnWindows) { normalizePath = new PathRewrite() { - public String rewrite(String path) { + public CharSequence rewrite(CharSequence p) { // TODO handle . and .. (although unlikely to face them from GUI client) + String path = p.toString(); path = path.replace('\\', '/').replace("//", "/"); if (path.startsWith("/")) { path = path.substring(1); @@ -142,7 +147,7 @@ public HgChangelog getChangelog() { if (this.changelog == null) { - String storagePath = repoPathHelper.rewrite("00changelog.i"); + CharSequence storagePath = repoPathHelper.rewrite("00changelog.i"); RevlogStream content = resolve(Path.create(storagePath), true); this.changelog = new HgChangelog(this, content); } @@ -207,8 +212,8 @@ } public HgDataFile getFileNode(String path) { - String nPath = normalizePath.rewrite(path); - String storagePath = dataPathHelper.rewrite(nPath); + CharSequence nPath = normalizePath.rewrite(path); + CharSequence storagePath = dataPathHelper.rewrite(nPath); RevlogStream content = resolve(Path.create(storagePath), false); Path p = Path.create(nPath); if (content == null) { @@ -218,7 +223,7 @@ } public HgDataFile getFileNode(Path path) { - String storagePath = dataPathHelper.rewrite(path.toString()); + CharSequence storagePath = dataPathHelper.rewrite(path.toString()); RevlogStream content = resolve(Path.create(storagePath), false); // XXX no content when no file? or HgDataFile.exists() to detect that? if (content == null) { @@ -273,7 +278,16 @@ // XXX package-local, unless there are cases when required from outside (guess, working dir/revision walkers may hide dirstate access and no public visibility needed) // XXX consider passing Path pool or factory to produce (shared) Path instead of Strings /*package-local*/ final HgDirstate loadDirstate(PathPool pathPool) { - return new HgDirstate(this, new File(repoDir, "dirstate"), pathPool); + PathRewrite canonicalPath = null; + if (!isCaseSensitiveFileSystem) { + canonicalPath = new PathRewrite() { + + public CharSequence rewrite(CharSequence path) { + return path.toString().toLowerCase(); + } + }; + } + return new HgDirstate(this, new File(repoDir, "dirstate"), pathPool, canonicalPath); } /**