comparison src/org/tmatesoft/hg/repo/HgDirstate.java @ 252:a6d19adc2636

HgRepository.getWorkingCopyBranchName() to retrieve branch associated with working directory
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Mon, 15 Aug 2011 18:51:41 +0200
parents 1792b37650f2
children 35125450c804
comparison
equal deleted inserted replaced
251:8c951645bea0 252:a6d19adc2636
14 * the terms of a license other than GNU General Public License 14 * the terms of a license other than GNU General Public License
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 java.io.BufferedReader;
19 import java.io.File; 20 import java.io.File;
21 import java.io.FileReader;
20 import java.io.IOException; 22 import java.io.IOException;
21 import java.util.Collections; 23 import java.util.Collections;
22 import java.util.LinkedHashMap; 24 import java.util.LinkedHashMap;
23 import java.util.Map; 25 import java.util.Map;
24 import java.util.TreeSet; 26 import java.util.TreeSet;
25 27
26 import org.tmatesoft.hg.core.HgBadStateException; 28 import org.tmatesoft.hg.core.HgBadStateException;
27 import org.tmatesoft.hg.core.Nodeid; 29 import org.tmatesoft.hg.core.Nodeid;
28 import org.tmatesoft.hg.internal.DataAccess; 30 import org.tmatesoft.hg.internal.DataAccess;
29 import org.tmatesoft.hg.internal.DataAccessProvider;
30 import org.tmatesoft.hg.util.Path; 31 import org.tmatesoft.hg.util.Path;
31 32
32 33
33 /** 34 /**
34 * @see http://mercurial.selenic.com/wiki/DirState 35 * @see http://mercurial.selenic.com/wiki/DirState
35 * @see http://mercurial.selenic.com/wiki/FileFormats#dirstate 36 * @see http://mercurial.selenic.com/wiki/FileFormats#dirstate
36 * 37 *
37 * @author Artem Tikhomirov 38 * @author Artem Tikhomirov
38 * @author TMate Software Ltd. 39 * @author TMate Software Ltd.
39 */ 40 */
40 class HgDirstate { 41 class HgDirstate /* XXX RepoChangeListener */{
41 42
42 private final DataAccessProvider accessProvider; 43 private final HgRepository repo;
43 private final File dirstateFile; 44 private final File dirstateFile;
44 // deliberate String, not Path as it seems useless to keep Path here 45 // deliberate String, not Path as it seems useless to keep Path here
45 private Map<String, Record> normal; 46 private Map<String, Record> normal;
46 private Map<String, Record> added; 47 private Map<String, Record> added;
47 private Map<String, Record> removed; 48 private Map<String, Record> removed;
48 private Map<String, Record> merged; 49 private Map<String, Record> merged;
49 private Nodeid p1, p2; 50 private Nodeid p1, p2;
50 51 private String currentBranch;
51 /*package-local*/ HgDirstate() { 52
52 // empty instance 53 public HgDirstate(HgRepository hgRepo, File dirstate) {
53 accessProvider = null; 54 repo = hgRepo;
54 dirstateFile = null; 55 dirstateFile = dirstate; // XXX decide whether file names shall be kept local to reader (see #branches()) or passed from outside
55 }
56
57 public HgDirstate(DataAccessProvider dap, File dirstate) {
58 accessProvider = dap;
59 dirstateFile = dirstate;
60 } 56 }
61 57
62 private void read() { 58 private void read() {
63 normal = added = removed = merged = Collections.<String, Record>emptyMap(); 59 normal = added = removed = merged = Collections.<String, Record>emptyMap();
64 if (dirstateFile == null || !dirstateFile.exists()) { 60 if (dirstateFile == null || !dirstateFile.exists()) {
65 return; 61 return;
66 } 62 }
67 DataAccess da = accessProvider.create(dirstateFile); 63 DataAccess da = repo.getDataAccess().create(dirstateFile);
68 if (da.isEmpty()) { 64 if (da.isEmpty()) {
69 return; 65 return;
70 } 66 }
71 // not sure linked is really needed here, just for ease of debug 67 // not sure linked is really needed here, just for ease of debug
72 normal = new LinkedHashMap<String, Record>(); 68 normal = new LinkedHashMap<String, Record>();
122 // do not read whole dirstate if all we need is WC parent information 118 // do not read whole dirstate if all we need is WC parent information
123 private void readParents() { 119 private void readParents() {
124 if (dirstateFile == null || !dirstateFile.exists()) { 120 if (dirstateFile == null || !dirstateFile.exists()) {
125 return; 121 return;
126 } 122 }
127 DataAccess da = accessProvider.create(dirstateFile); 123 DataAccess da = repo.getDataAccess().create(dirstateFile);
128 if (da.isEmpty()) { 124 if (da.isEmpty()) {
129 return; 125 return;
130 } 126 }
131 try { 127 try {
132 byte[] parents = new byte[40]; 128 byte[] parents = new byte[40];
151 Nodeid[] rv = new Nodeid[2]; 147 Nodeid[] rv = new Nodeid[2];
152 rv[0] = p1; 148 rv[0] = p1;
153 rv[1] = p2; 149 rv[1] = p2;
154 return rv; 150 return rv;
155 } 151 }
152
153 /**
154 * @return branch associated with the working directory
155 */
156 public String branch() {
157 if (currentBranch == null) {
158 currentBranch = HgRepository.DEFAULT_BRANCH_NAME;
159 File branchFile = new File(repo.getRepositoryRoot(), "branch");
160 if (branchFile.exists()) {
161 try {
162 BufferedReader r = new BufferedReader(new FileReader(branchFile));
163 String b = r.readLine();
164 if (b != null) {
165 b = b.trim().intern();
166 }
167 currentBranch = b == null || b.length() == 0 ? HgRepository.DEFAULT_BRANCH_NAME : b;
168 r.close();
169 } catch (IOException ex) {
170 ex.printStackTrace(); // XXX log verbose debug, exception might be legal here (i.e. FileNotFound)
171 // IGNORE
172 }
173 }
174 }
175 return currentBranch;
176 }
156 177
157 // new, modifiable collection 178 // new, modifiable collection
158 /*package-local*/ TreeSet<String> all() { 179 /*package-local*/ TreeSet<String> all() {
159 read(); 180 read();
160 TreeSet<String> rv = new TreeSet<String>(); 181 TreeSet<String> rv = new TreeSet<String>();