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 } |