Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgDirstate.java @ 490:b3c16d1aede0
Refactoring: move HgRepository's implementation aspects to Internals (which is now its imlementation counterpart and primary repository class to be used by other parts of the library)
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 16 Aug 2012 17:08:34 +0200 | 
| parents | 909306e412e2 | 
| children | d2f6ab541330 | 
   comparison
  equal
  deleted
  inserted
  replaced
| 489:9c0138cda59a | 490:b3c16d1aede0 | 
|---|---|
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com | 
| 16 */ | 16 */ | 
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; | 
| 18 | 18 | 
| 19 import static org.tmatesoft.hg.core.Nodeid.NULL; | 19 import static org.tmatesoft.hg.core.Nodeid.NULL; | 
| 20 import static org.tmatesoft.hg.repo.HgRepositoryFiles.Dirstate; | |
| 20 import static org.tmatesoft.hg.util.LogFacility.Severity.Debug; | 21 import static org.tmatesoft.hg.util.LogFacility.Severity.Debug; | 
| 21 | 22 | 
| 22 import java.io.BufferedReader; | 23 import java.io.BufferedReader; | 
| 23 import java.io.File; | 24 import java.io.File; | 
| 24 import java.io.FileNotFoundException; | 25 import java.io.FileNotFoundException; | 
| 31 import java.util.TreeSet; | 32 import java.util.TreeSet; | 
| 32 | 33 | 
| 33 import org.tmatesoft.hg.core.Nodeid; | 34 import org.tmatesoft.hg.core.Nodeid; | 
| 34 import org.tmatesoft.hg.internal.DataAccess; | 35 import org.tmatesoft.hg.internal.DataAccess; | 
| 35 import org.tmatesoft.hg.internal.EncodingHelper; | 36 import org.tmatesoft.hg.internal.EncodingHelper; | 
| 37 import org.tmatesoft.hg.internal.Internals; | |
| 36 import org.tmatesoft.hg.util.Pair; | 38 import org.tmatesoft.hg.util.Pair; | 
| 37 import org.tmatesoft.hg.util.Path; | 39 import org.tmatesoft.hg.util.Path; | 
| 38 import org.tmatesoft.hg.util.PathRewrite; | 40 import org.tmatesoft.hg.util.PathRewrite; | 
| 39 import org.tmatesoft.hg.util.LogFacility.Severity; | 41 import org.tmatesoft.hg.util.LogFacility.Severity; | 
| 40 | 42 | 
| 50 | 52 | 
| 51 public enum EntryKind { | 53 public enum EntryKind { | 
| 52 Normal, Added, Removed, Merged, // order is being used in code of this class, don't change unless any use is checked | 54 Normal, Added, Removed, Merged, // order is being used in code of this class, don't change unless any use is checked | 
| 53 } | 55 } | 
| 54 | 56 | 
| 55 private final HgRepository repo; | 57 private final Internals repo; | 
| 56 private final File dirstateFile; | |
| 57 private final Path.Source pathPool; | 58 private final Path.Source pathPool; | 
| 58 private final PathRewrite canonicalPathRewrite; | 59 private final PathRewrite canonicalPathRewrite; | 
| 59 private Map<Path, Record> normal; | 60 private Map<Path, Record> normal; | 
| 60 private Map<Path, Record> added; | 61 private Map<Path, Record> added; | 
| 61 private Map<Path, Record> removed; | 62 private Map<Path, Record> removed; | 
| 65 */ | 66 */ | 
| 66 private Map<Path, Path> canonical2dirstateName; | 67 private Map<Path, Path> canonical2dirstateName; | 
| 67 private Pair<Nodeid, Nodeid> parents; | 68 private Pair<Nodeid, Nodeid> parents; | 
| 68 | 69 | 
| 69 // canonicalPath may be null if we don't need to check for names other than in dirstate | 70 // canonicalPath may be null if we don't need to check for names other than in dirstate | 
| 70 /*package-local*/ HgDirstate(HgRepository hgRepo, File dirstate, Path.Source pathSource, PathRewrite canonicalPath) { | 71 /*package-local*/ HgDirstate(Internals hgRepo, Path.Source pathSource, PathRewrite canonicalPath) { | 
| 71 repo = hgRepo; | 72 repo = hgRepo; | 
| 72 dirstateFile = dirstate; // XXX decide whether file names shall be kept local to reader (see #branches()) or passed from outside | |
| 73 pathPool = pathSource; | 73 pathPool = pathSource; | 
| 74 canonicalPathRewrite = canonicalPath; | 74 canonicalPathRewrite = canonicalPath; | 
| 75 } | 75 } | 
| 76 | 76 | 
| 77 /*package-local*/ void read(EncodingHelper encodingHelper) throws HgInvalidControlFileException { | 77 /*package-local*/ void read() throws HgInvalidControlFileException { | 
| 78 EncodingHelper encodingHelper = repo.buildFileNameEncodingHelper(); | |
| 78 normal = added = removed = merged = Collections.<Path, Record>emptyMap(); | 79 normal = added = removed = merged = Collections.<Path, Record>emptyMap(); | 
| 79 parents = new Pair<Nodeid,Nodeid>(Nodeid.NULL, Nodeid.NULL); | 80 parents = new Pair<Nodeid,Nodeid>(Nodeid.NULL, Nodeid.NULL); | 
| 80 if (canonicalPathRewrite != null) { | 81 if (canonicalPathRewrite != null) { | 
| 81 canonical2dirstateName = new HashMap<Path,Path>(); | 82 canonical2dirstateName = new HashMap<Path,Path>(); | 
| 82 } else { | 83 } else { | 
| 83 canonical2dirstateName = Collections.emptyMap(); | 84 canonical2dirstateName = Collections.emptyMap(); | 
| 84 } | 85 } | 
| 86 File dirstateFile = getDirstateFile(repo); | |
| 85 if (dirstateFile == null || !dirstateFile.exists()) { | 87 if (dirstateFile == null || !dirstateFile.exists()) { | 
| 86 return; | 88 return; | 
| 87 } | 89 } | 
| 88 DataAccess da = repo.getDataAccess().create(dirstateFile); | 90 DataAccess da = repo.getDataAccess().create(dirstateFile); | 
| 89 try { | 91 try { | 
| 168 public Pair<Nodeid,Nodeid> parents() { | 170 public Pair<Nodeid,Nodeid> parents() { | 
| 169 assert parents != null; // instance not initialized with #read() | 171 assert parents != null; // instance not initialized with #read() | 
| 170 return parents; | 172 return parents; | 
| 171 } | 173 } | 
| 172 | 174 | 
| 175 private static File getDirstateFile(Internals repo) { | |
| 176 return repo.getFileFromRepoDir(Dirstate.getName()); | |
| 177 } | |
| 178 | |
| 173 /** | 179 /** | 
| 174 * @return pair of parents, both {@link Nodeid#NULL} if dirstate is not available | 180 * @return pair of parents, both {@link Nodeid#NULL} if dirstate is not available | 
| 175 */ | 181 */ | 
| 176 /*package-local*/ static Pair<Nodeid, Nodeid> readParents(HgRepository repo, File dirstateFile) throws HgInvalidControlFileException { | 182 /*package-local*/ static Pair<Nodeid, Nodeid> readParents(Internals internalRepo) throws HgInvalidControlFileException { | 
| 177 // do not read whole dirstate if all we need is WC parent information | 183 // do not read whole dirstate if all we need is WC parent information | 
| 184 File dirstateFile = getDirstateFile(internalRepo); | |
| 178 if (dirstateFile == null || !dirstateFile.exists()) { | 185 if (dirstateFile == null || !dirstateFile.exists()) { | 
| 179 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 186 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 
| 180 } | 187 } | 
| 181 DataAccess da = repo.getDataAccess().create(dirstateFile); | 188 DataAccess da = internalRepo.getDataAccess().create(dirstateFile); | 
| 182 try { | 189 try { | 
| 183 if (da.isEmpty()) { | 190 if (da.isEmpty()) { | 
| 184 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 191 return new Pair<Nodeid,Nodeid>(NULL, NULL); | 
| 185 } | 192 } | 
| 186 return internalReadParents(da); | 193 return internalReadParents(da); | 
| 193 | 200 | 
| 194 /** | 201 /** | 
| 195 * TODO [post-1.0] it's really not a proper place for the method, need WorkingCopyContainer or similar | 202 * TODO [post-1.0] it's really not a proper place for the method, need WorkingCopyContainer or similar | 
| 196 * @return branch associated with the working directory | 203 * @return branch associated with the working directory | 
| 197 */ | 204 */ | 
| 198 /*package-local*/ static String readBranch(HgRepository repo, File branchFile) throws HgInvalidControlFileException { | 205 /*package-local*/ static String readBranch(Internals internalRepo) throws HgInvalidControlFileException { | 
| 206 File branchFile = internalRepo.getFileFromRepoDir("branch"); | |
| 199 String branch = HgRepository.DEFAULT_BRANCH_NAME; | 207 String branch = HgRepository.DEFAULT_BRANCH_NAME; | 
| 200 if (branchFile.exists()) { | 208 if (branchFile.exists()) { | 
| 201 try { | 209 try { | 
| 202 BufferedReader r = new BufferedReader(new FileReader(branchFile)); | 210 BufferedReader r = new BufferedReader(new FileReader(branchFile)); | 
| 203 String b = r.readLine(); | 211 String b = r.readLine(); | 
| 205 b = b.trim().intern(); | 213 b = b.trim().intern(); | 
| 206 } | 214 } | 
| 207 branch = b == null || b.length() == 0 ? HgRepository.DEFAULT_BRANCH_NAME : b; | 215 branch = b == null || b.length() == 0 ? HgRepository.DEFAULT_BRANCH_NAME : b; | 
| 208 r.close(); | 216 r.close(); | 
| 209 } catch (FileNotFoundException ex) { | 217 } catch (FileNotFoundException ex) { | 
| 210 repo.getContext().getLog().dump(HgDirstate.class, Debug, ex, null); // log verbose debug, exception might be legal here | 218 internalRepo.getContext().getLog().dump(HgDirstate.class, Debug, ex, null); // log verbose debug, exception might be legal here | 
| 211 // IGNORE | 219 // IGNORE | 
| 212 } catch (IOException ex) { | 220 } catch (IOException ex) { | 
| 213 throw new HgInvalidControlFileException("Error reading file with branch information", ex, branchFile); | 221 throw new HgInvalidControlFileException("Error reading file with branch information", ex, branchFile); | 
| 214 } | 222 } | 
| 215 } | 223 } | 
