diff src/org/tmatesoft/hg/repo/HgDirstate.java @ 231:1792b37650f2

Introduced access to conflict resolution information (merge state)
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 01 Jun 2011 05:44:25 +0200
parents 0fd10e5016dd
children a6d19adc2636
line wrap: on
line diff
--- a/src/org/tmatesoft/hg/repo/HgDirstate.java	Tue May 31 05:33:16 2011 +0200
+++ b/src/org/tmatesoft/hg/repo/HgDirstate.java	Wed Jun 01 05:44:25 2011 +0200
@@ -23,6 +23,8 @@
 import java.util.Map;
 import java.util.TreeSet;
 
+import org.tmatesoft.hg.core.HgBadStateException;
+import org.tmatesoft.hg.core.Nodeid;
 import org.tmatesoft.hg.internal.DataAccess;
 import org.tmatesoft.hg.internal.DataAccessProvider;
 import org.tmatesoft.hg.util.Path;
@@ -44,6 +46,7 @@
 	private Map<String, Record> added;
 	private Map<String, Record> removed;
 	private Map<String, Record> merged;
+	private Nodeid p1, p2;
 
 	/*package-local*/ HgDirstate() {
 		// empty instance
@@ -71,9 +74,10 @@
 		removed = new LinkedHashMap<String, Record>();
 		merged = new LinkedHashMap<String, Record>();
 		try {
-			// XXX skip(40) if we don't need these? 
 			byte[] parents = new byte[40];
 			da.readBytes(parents, 0, 40);
+			p1 = Nodeid.fromBinary(parents, 0);
+			p2 = Nodeid.fromBinary(parents, 20);
 			parents = null;
 			// hg init; hg up produces an empty repository where dirstate has parents (40 bytes) only
 			while (!da.isEmpty()) {
@@ -115,6 +119,41 @@
 		}
 	}
 
+	// do not read whole dirstate if all we need is WC parent information
+	private void readParents() {
+		if (dirstateFile == null || !dirstateFile.exists()) {
+			return;
+		}
+		DataAccess da = accessProvider.create(dirstateFile);
+		if (da.isEmpty()) {
+			return;
+		}
+		try {
+			byte[] parents = new byte[40];
+			da.readBytes(parents, 0, 40);
+			p1 = Nodeid.fromBinary(parents, 0);
+			p2 = Nodeid.fromBinary(parents, 20);
+			parents = null;
+		} catch (IOException ex) {
+			throw new HgBadStateException(ex); // XXX in fact, our exception is not the best solution here.
+		} finally {
+			da.done();
+		}
+	}
+	
+	/**
+	 * @return array of length 2 with working copy parents, non null.
+	 */
+	public Nodeid[] parents() {
+		if (p1 == null) {
+			readParents();
+		}
+		Nodeid[] rv = new Nodeid[2];
+		rv[0] = p1;
+		rv[1] = p2;
+		return rv;
+	}
+
 	// new, modifiable collection
 	/*package-local*/ TreeSet<String> all() {
 		read();