Mercurial > hg4j
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) { + } +}