Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/Internals.java @ 388:b015f3918120
Work on FIXME: correct HgDataFile#workingCopy with tests; BasicSessionContext with property override; platform-specific options to internals
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 15 Feb 2012 22:57:56 +0100 |
| parents | 82336b7c54f4 |
| children | 30922c728341 7f27122011c3 |
comparison
equal
deleted
inserted
replaced
| 387:cdea37239b01 | 388:b015f3918120 |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 TMate Software Ltd | 2 * Copyright (c) 2011-2012 TMate Software Ltd |
| 3 * | 3 * |
| 4 * This program is free software; you can redistribute it and/or modify | 4 * This program is free software; you can redistribute it and/or modify |
| 5 * it under the terms of the GNU General Public License as published by | 5 * it under the terms of the GNU General Public License as published by |
| 6 * the Free Software Foundation; version 2 of the License. | 6 * the Free Software Foundation; version 2 of the License. |
| 7 * | 7 * |
| 38 * Fields/members that shall not be visible | 38 * Fields/members that shall not be visible |
| 39 * | 39 * |
| 40 * @author Artem Tikhomirov | 40 * @author Artem Tikhomirov |
| 41 * @author TMate Software Ltd. | 41 * @author TMate Software Ltd. |
| 42 */ | 42 */ |
| 43 public class Internals { | 43 public final class Internals { |
| 44 | 44 |
| 45 /** | |
| 46 * Allows to specify Mercurial installation directory to detect installation-wide configurations. | |
| 47 * Without this property set, hg4j would attempt to deduce this value locating hg executable. | |
| 48 */ | |
| 45 public static final String CFG_PROPERTY_HG_INSTALL_ROOT = "hg4j.hg.install_root"; | 49 public static final String CFG_PROPERTY_HG_INSTALL_ROOT = "hg4j.hg.install_root"; |
| 50 | |
| 51 /** | |
| 52 * Tells repository not to cache files/revlogs | |
| 53 * XXX perhaps, need to respect this property not only for data files, but for manifest and changelog as well? | |
| 54 * (@see HgRepository#getChangelog and #getManifest()) | |
| 55 */ | |
| 56 public static final String CFG_PROPERTY_REVLOG_STREAM_CACHE = "hg4j.repo.disable_revlog_cache"; | |
| 46 | 57 |
| 47 private int requiresFlags = 0; | 58 private int requiresFlags = 0; |
| 48 private List<Filter.Factory> filterFactories; | 59 private List<Filter.Factory> filterFactories; |
| 49 | 60 private final boolean isCaseSensitiveFileSystem; |
| 50 | 61 private final boolean shallCacheRevlogsInRepo; |
| 51 public Internals() { | 62 |
| 63 | |
| 64 public Internals(SessionContext ctx) { | |
| 65 isCaseSensitiveFileSystem = !runningOnWindows(); | |
| 66 Object p = ctx.getProperty(CFG_PROPERTY_REVLOG_STREAM_CACHE, true); | |
| 67 shallCacheRevlogsInRepo = p instanceof Boolean ? ((Boolean) p).booleanValue() : Boolean.parseBoolean(String.valueOf(p)); | |
| 52 } | 68 } |
| 53 | 69 |
| 54 public void parseRequires(HgRepository hgRepo, File requiresFile) { | 70 public void parseRequires(HgRepository hgRepo, File requiresFile) { |
| 55 try { | 71 try { |
| 56 new RequiresFile().parse(this, requiresFile); | 72 new RequiresFile().parse(this, requiresFile); |
| 60 } | 76 } |
| 61 } | 77 } |
| 62 | 78 |
| 63 public/*for tests, otherwise pkg*/ void setStorageConfig(int version, int flags) { | 79 public/*for tests, otherwise pkg*/ void setStorageConfig(int version, int flags) { |
| 64 requiresFlags = flags; | 80 requiresFlags = flags; |
| 81 } | |
| 82 | |
| 83 public PathRewrite buildNormalizePathRewrite() { | |
| 84 if (runningOnWindows()) { | |
| 85 return new PathRewrite() { | |
| 86 | |
| 87 public CharSequence rewrite(CharSequence p) { | |
| 88 // TODO handle . and .. (although unlikely to face them from GUI client) | |
| 89 String path = p.toString(); | |
| 90 path = path.replace('\\', '/').replace("//", "/"); | |
| 91 if (path.startsWith("/")) { | |
| 92 path = path.substring(1); | |
| 93 } | |
| 94 return path; | |
| 95 } | |
| 96 }; | |
| 97 } else { | |
| 98 return new PathRewrite.Empty(); // or strip leading slash, perhaps? | |
| 99 } | |
| 65 } | 100 } |
| 66 | 101 |
| 67 // XXX perhaps, should keep both fields right here, not in the HgRepository | 102 // XXX perhaps, should keep both fields right here, not in the HgRepository |
| 68 public PathRewrite buildDataFilesHelper() { | 103 public PathRewrite buildDataFilesHelper() { |
| 69 return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0); | 104 return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0); |
| 114 sb.append("dotencode\n"); | 149 sb.append("dotencode\n"); |
| 115 } | 150 } |
| 116 requiresFile.write(sb.toString().getBytes()); | 151 requiresFile.write(sb.toString().getBytes()); |
| 117 requiresFile.close(); | 152 requiresFile.close(); |
| 118 new File(hgDir, "store").mkdir(); // with that, hg verify says ok. | 153 new File(hgDir, "store").mkdir(); // with that, hg verify says ok. |
| 154 } | |
| 155 | |
| 156 public boolean isCaseSensitiveFileSystem() { | |
| 157 return isCaseSensitiveFileSystem; | |
| 119 } | 158 } |
| 120 | 159 |
| 121 public static boolean runningOnWindows() { | 160 public static boolean runningOnWindows() { |
| 122 return System.getProperty("os.name").indexOf("Windows") != -1; | 161 return System.getProperty("os.name").indexOf("Windows") != -1; |
| 123 } | 162 } |
| 275 } | 314 } |
| 276 } | 315 } |
| 277 // fallback to default, let calling code fail with Exception if can't write | 316 // fallback to default, let calling code fail with Exception if can't write |
| 278 return new File(System.getProperty("user.home"), ".hgrc"); | 317 return new File(System.getProperty("user.home"), ".hgrc"); |
| 279 } | 318 } |
| 319 | |
| 320 public boolean shallCacheRevlogs() { | |
| 321 return shallCacheRevlogsInRepo; | |
| 322 } | |
| 280 } | 323 } |
