Mercurial > hg4j
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>(); |
