Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgRepository.java @ 142:37a34044e6bd
More reasonable use of path normalizer and path.source
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Thu, 17 Feb 2011 05:06:07 +0100 |
parents | 8248aae33f7d |
children | acc6151b1b7a |
comparison
equal
deleted
inserted
replaced
141:8248aae33f7d | 142:37a34044e6bd |
---|---|
55 } | 55 } |
56 | 56 |
57 private final File repoDir; // .hg folder | 57 private final File repoDir; // .hg folder |
58 private final String repoLocation; | 58 private final String repoLocation; |
59 private final DataAccessProvider dataAccess; | 59 private final DataAccessProvider dataAccess; |
60 private final PathRewrite normalizePath = new PathRewrite() { | 60 private final PathRewrite normalizePath; |
61 | |
62 public String rewrite(String path) { | |
63 // TODO handle . and .. (although unlikely to face them from GUI client) | |
64 path = path.replace('\\', '/').replace("//", "/"); | |
65 if (path.startsWith("/")) { | |
66 path = path.substring(1); | |
67 } | |
68 return path; | |
69 } | |
70 }; | |
71 private final PathRewrite dataPathHelper; | 61 private final PathRewrite dataPathHelper; |
72 private final PathRewrite repoPathHelper; | 62 private final PathRewrite repoPathHelper; |
73 | 63 |
74 private HgChangelog changelog; | 64 private HgChangelog changelog; |
75 private HgManifest manifest; | 65 private HgManifest manifest; |
84 HgRepository(String repositoryPath) { | 74 HgRepository(String repositoryPath) { |
85 repoDir = null; | 75 repoDir = null; |
86 repoLocation = repositoryPath; | 76 repoLocation = repositoryPath; |
87 dataAccess = null; | 77 dataAccess = null; |
88 dataPathHelper = repoPathHelper = null; | 78 dataPathHelper = repoPathHelper = null; |
79 normalizePath = null; | |
89 } | 80 } |
90 | 81 |
91 HgRepository(File repositoryRoot) throws IOException { | 82 HgRepository(File repositoryRoot) throws IOException { |
92 assert ".hg".equals(repositoryRoot.getName()) && repositoryRoot.isDirectory(); | 83 assert ".hg".equals(repositoryRoot.getName()) && repositoryRoot.isDirectory(); |
93 repoDir = repositoryRoot; | 84 repoDir = repositoryRoot; |
94 repoLocation = repositoryRoot.getParentFile().getCanonicalPath(); | 85 repoLocation = repositoryRoot.getParentFile().getCanonicalPath(); |
95 dataAccess = new DataAccessProvider(); | 86 dataAccess = new DataAccessProvider(); |
87 final boolean runningOnWindows = System.getProperty("os.name").indexOf("Windows") != -1; | |
88 if (runningOnWindows) { | |
89 normalizePath = new PathRewrite() { | |
90 | |
91 public String rewrite(String path) { | |
92 // TODO handle . and .. (although unlikely to face them from GUI client) | |
93 path = path.replace('\\', '/').replace("//", "/"); | |
94 if (path.startsWith("/")) { | |
95 path = path.substring(1); | |
96 } | |
97 return path; | |
98 } | |
99 }; | |
100 } else { | |
101 normalizePath = new PathRewrite.Empty(); // or strip leading slash, perhaps? | |
102 } | |
96 parseRequires(); | 103 parseRequires(); |
97 dataPathHelper = impl.buildDataFilesHelper(); | 104 dataPathHelper = impl.buildDataFilesHelper(); |
98 repoPathHelper = impl.buildRepositoryFilesHelper(); | 105 repoPathHelper = impl.buildRepositoryFilesHelper(); |
99 } | 106 } |
100 | 107 |
156 return new HgDataFile(this, path); | 163 return new HgDataFile(this, path); |
157 } | 164 } |
158 return new HgDataFile(this, path, content); | 165 return new HgDataFile(this, path, content); |
159 } | 166 } |
160 | 167 |
161 public PathRewrite getPathHelper() { // Really need to be public? | 168 /* clients need to rewrite path from their FS to a repository-friendly paths, and, perhaps, vice versa*/ |
169 public PathRewrite getToRepoPathHelper() { | |
162 return normalizePath; | 170 return normalizePath; |
163 } | 171 } |
164 | 172 |
165 // local to hide use of io.File. | 173 // local to hide use of io.File. |
166 /*package-local*/ File getRepositoryRoot() { | 174 /*package-local*/ File getRepositoryRoot() { |
192 } | 200 } |
193 | 201 |
194 // FIXME not sure repository shall create walkers | 202 // FIXME not sure repository shall create walkers |
195 /*package-local*/ FileIterator createWorkingDirWalker() { | 203 /*package-local*/ FileIterator createWorkingDirWalker() { |
196 File repoRoot = repoDir.getParentFile(); | 204 File repoRoot = repoDir.getParentFile(); |
197 Path.Source pathSrc = new Path.SimpleSource(new PathRewrite.Composite(new RelativePathRewrite(repoRoot), getPathHelper())); | 205 Path.Source pathSrc = new Path.SimpleSource(new PathRewrite.Composite(new RelativePathRewrite(repoRoot), getToRepoPathHelper())); |
198 // Impl note: simple source is enough as files in the working dir are all unique | 206 // Impl note: simple source is enough as files in the working dir are all unique |
199 // even if they might get reused (i.e. after FileIterator#reset() and walking once again), | 207 // even if they might get reused (i.e. after FileIterator#reset() and walking once again), |
200 // path caching is better to be done in the code which knows that path are being reused | 208 // path caching is better to be done in the code which knows that path are being reused |
201 return new FileWalker(repoRoot, pathSrc); | 209 return new FileWalker(repoRoot, pathSrc); |
202 } | 210 } |