diff src/org/tmatesoft/hg/internal/RevlogStreamWriter.java @ 530:0f6fa88e2162

Towards commit command: refactor clone, extract pieces to reuse. Describe a defect discovered when bundle has few patches with 0,0 parents
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Wed, 23 Jan 2013 17:46:12 +0100
parents
children 688c1ab113bb
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/tmatesoft/hg/internal/RevlogStreamWriter.java	Wed Jan 23 17:46:12 2013 +0100
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2013 TMate Software Ltd
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@hg4j.com
+ */
+package org.tmatesoft.hg.internal;
+
+import static org.tmatesoft.hg.internal.Internals.REVLOGV1_RECORD_SIZE;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+
+import org.tmatesoft.hg.core.Nodeid;
+
+/**
+ * 
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+public class RevlogStreamWriter {
+
+	
+	public static class HeaderWriter {
+		private final ByteBuffer header;
+		private final boolean isInline;
+		private long offset;
+		private int length, compressedLength;
+		private int baseRev, linkRev, p1, p2;
+		private Nodeid nodeid;
+		
+		public HeaderWriter(boolean inline) {
+			isInline = inline;
+			header = ByteBuffer.allocate(REVLOGV1_RECORD_SIZE);
+		}
+		
+		public HeaderWriter offset(long offset) {
+			this.offset = offset;
+			return this;
+		}
+		
+		public HeaderWriter baseRevision(int baseRevision) {
+			this.baseRev = baseRevision;
+			return this;
+		}
+		
+		public HeaderWriter length(int len, int compressedLen) {
+			this.length = len;
+			this.compressedLength = compressedLen;
+			return this;
+		}
+		
+		public HeaderWriter parents(int parent1, int parent2) {
+			p1 = parent1;
+			p2 = parent2;
+			return this;
+		}
+		
+		public HeaderWriter linkRevision(int linkRevision) {
+			this.linkRev = linkRevision;
+			return this;
+		}
+		
+		public HeaderWriter nodeid(Nodeid n) {
+			this.nodeid = n;
+			return this;
+		}
+
+		public void write(OutputStream out) throws IOException {
+			header.clear();
+			if (offset == 0) {
+				int version = 1 /* RevlogNG */;
+				if (isInline) {
+					final int INLINEDATA = 1 << 16; // FIXME extract constant
+					version |= INLINEDATA;
+				}
+				header.putInt(version);
+				header.putInt(0);
+			} else {
+				header.putLong(offset << 16);
+			}
+			header.putInt(compressedLength);
+			header.putInt(length);
+			header.putInt(baseRev);
+			header.putInt(linkRev);
+			header.putInt(p1);
+			header.putInt(p2);
+			header.put(nodeid.toByteArray());
+			// assume 12 bytes left are zeros
+			out.write(header.array());
+
+			// regardless whether it's inline or separate data,
+			// offset field always represent cumulative compressedLength 
+			// (while offset in the index file with inline==true differs by n*sizeof(header), where n is entry's position in the file) 
+			offset += compressedLength;
+		}
+	}
+	
+	public void addRevision(String text, int baseRevision, int linkRevision, int p1, int p2) {
+	}
+}