Mercurial > jhg
comparison src/org/tmatesoft/hg/internal/RepoInitializer.java @ 493:ba36f66c32b4
Refactor to keep knowledge about repository control files and their location in respect to .hg/ in a single place (facilitate future adoption of shared repositories)
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 18 Oct 2012 18:36:13 +0200 |
| parents | b3c16d1aede0 |
| children | 4e6179bde4fc |
comparison
equal
deleted
inserted
replaced
| 492:e4eaa23e3442 | 493:ba36f66c32b4 |
|---|---|
| 22 import java.io.FileOutputStream; | 22 import java.io.FileOutputStream; |
| 23 import java.io.IOException; | 23 import java.io.IOException; |
| 24 import java.nio.charset.Charset; | 24 import java.nio.charset.Charset; |
| 25 | 25 |
| 26 import org.tmatesoft.hg.core.SessionContext; | 26 import org.tmatesoft.hg.core.SessionContext; |
| 27 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | |
| 27 import org.tmatesoft.hg.util.PathRewrite; | 28 import org.tmatesoft.hg.util.PathRewrite; |
| 28 | 29 |
| 29 /** | 30 /** |
| 30 * Responsible of `requires` processing both on repo read and repo write | 31 * Responsible of `requires` processing both on repo read and repo write |
| 31 * XXX needs better name, perhaps | 32 * XXX needs better name, perhaps |
| 37 private int requiresFlags; | 38 private int requiresFlags; |
| 38 | 39 |
| 39 public RepoInitializer() { | 40 public RepoInitializer() { |
| 40 } | 41 } |
| 41 | 42 |
| 43 public RepoInitializer initRequiresFromFile(File repoDir) throws HgInvalidControlFileException { | |
| 44 File requiresFile = new File(repoDir, "requires"); // not #getFileFromRepoDir() just in case it gets modified later | |
| 45 try { | |
| 46 int flags = new RequiresFile().parse(requiresFile); | |
| 47 return setRequires(flags); | |
| 48 } catch (IOException ex) { | |
| 49 throw new HgInvalidControlFileException("Parse failed", ex, requiresFile); | |
| 50 } | |
| 51 } | |
| 52 | |
| 42 public RepoInitializer setRequires(int flags) { | 53 public RepoInitializer setRequires(int flags) { |
| 43 requiresFlags = flags; | 54 requiresFlags = flags; |
| 44 return this; | 55 return this; |
| 45 } | 56 } |
| 46 | 57 |
| 47 public int getRequires() { | 58 public int getRequires() { |
| 48 return requiresFlags; | 59 return requiresFlags; |
| 49 } | 60 } |
| 50 | 61 |
| 51 public void initEmptyRepository(File hgDir) throws IOException { | 62 public void initEmptyRepository(File repoDir) throws IOException { |
| 52 hgDir.mkdir(); | 63 repoDir.mkdirs(); |
| 53 FileOutputStream requiresFile = new FileOutputStream(new File(hgDir, "requires")); | 64 FileOutputStream requiresFile = new FileOutputStream(new File(repoDir, "requires")); |
| 54 StringBuilder sb = new StringBuilder(40); | 65 StringBuilder sb = new StringBuilder(40); |
| 55 sb.append("revlogv1\n"); | 66 sb.append("revlogv1\n"); |
| 56 if ((requiresFlags & STORE) != 0) { | 67 if ((requiresFlags & STORE) != 0) { |
| 57 sb.append("store\n"); | 68 sb.append("store\n"); |
| 58 } | 69 } |
| 62 if ((requiresFlags & DOTENCODE) != 0) { | 73 if ((requiresFlags & DOTENCODE) != 0) { |
| 63 sb.append("dotencode\n"); | 74 sb.append("dotencode\n"); |
| 64 } | 75 } |
| 65 requiresFile.write(sb.toString().getBytes()); | 76 requiresFile.write(sb.toString().getBytes()); |
| 66 requiresFile.close(); | 77 requiresFile.close(); |
| 67 new File(hgDir, "store").mkdir(); // with that, hg verify says ok. | 78 new File(repoDir, "store").mkdir(); // with that, hg verify says ok. |
| 68 } | 79 } |
| 69 | 80 |
| 70 public PathRewrite buildDataFilesHelper(SessionContext ctx) { | 81 public PathRewrite buildDataFilesHelper(SessionContext ctx) { |
| 71 Charset cs = Internals.getFileEncoding(ctx); | 82 Charset cs = Internals.getFileEncoding(ctx); |
| 72 // StoragePathHelper needs fine-grained control over char encoding, hence doesn't use EncodingHelper | 83 // StoragePathHelper needs fine-grained control over char encoding, hence doesn't use EncodingHelper |
| 73 return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0, cs); | 84 return new StoragePathHelper((requiresFlags & STORE) != 0, (requiresFlags & FNCACHE) != 0, (requiresFlags & DOTENCODE) != 0, cs); |
| 74 } | 85 } |
| 86 | |
| 87 public PathRewrite buildStoreFilesHelper() { | |
| 88 if ((requiresFlags & STORE) != 0) { | |
| 89 return new PathRewrite() { | |
| 90 public CharSequence rewrite(CharSequence path) { | |
| 91 return "store/" + path; | |
| 92 } | |
| 93 }; | |
| 94 } else { | |
| 95 return new PathRewrite.Empty(); | |
| 96 } | |
| 97 } | |
| 75 } | 98 } |
