Mercurial > hg4j
comparison src/com/tmate/hgkit/ll/RevlogStream.java @ 4:aa1912c70b36
Fix offset issue for inline revlogs. Commandline processing.
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 20 Dec 2010 04:20:52 +0100 |
parents | 24bb4f365164 |
children | fc265ddeab26 |
comparison
equal
deleted
inserted
replaced
3:24bb4f365164 | 4:aa1912c70b36 |
---|---|
89 diIndex = getIndexStream(); | 89 diIndex = getIndexStream(); |
90 if (needData && !inline) { | 90 if (needData && !inline) { |
91 diData = getDataStream(); | 91 diData = getDataStream(); |
92 } | 92 } |
93 try { | 93 try { |
94 diIndex.skipBytes(inline ? (int) index.get(start).offset : start * 64); | 94 int skipped = diIndex.skipBytes(inline ? (int) index.get(start).offset : start * 64); |
95 byte[] lastData = null; | 95 byte[] lastData = null; |
96 for (int i = start; i <= end; i++ ) { | 96 for (int i = start; i <= end; i++ ) { |
97 IndexEntry ie = index.get(i); | 97 IndexEntry ie = index.get(i); |
98 long l = diIndex.readLong(); | 98 long l = diIndex.readLong(); |
99 long offset = l >>> 16; | 99 long offset = l >>> 16; |
201 // int baseRevision = di.readInt(); | 201 // int baseRevision = di.readInt(); |
202 // int linkRevision = di.readInt(); | 202 // int linkRevision = di.readInt(); |
203 // int parent1Revision = di.readInt(); | 203 // int parent1Revision = di.readInt(); |
204 // int parent2Revision = di.readInt(); | 204 // int parent2Revision = di.readInt(); |
205 // byte[] nodeid = new byte[32]; | 205 // byte[] nodeid = new byte[32]; |
206 res.add(new IndexEntry(offset, compressedLen)); | |
207 if (inline) { | 206 if (inline) { |
207 res.add(new IndexEntry(offset + 64*res.size(), compressedLen)); | |
208 di.skipBytes(5*4 + 32 + compressedLen); // Check: 52 (skip) + 12 (read) = 64 (total RevlogNG record size) | 208 di.skipBytes(5*4 + 32 + compressedLen); // Check: 52 (skip) + 12 (read) = 64 (total RevlogNG record size) |
209 } else { | 209 } else { |
210 res.add(new IndexEntry(offset, compressedLen)); | |
210 di.skipBytes(5*4 + 32); | 211 di.skipBytes(5*4 + 32); |
211 } | 212 } |
212 long l = di.readLong(); | 213 long l = di.readLong(); |
213 offset = l >>> 16; | 214 offset = l >>> 16; |
214 } | 215 } |
239 } | 240 } |
240 | 241 |
241 | 242 |
242 // perhaps, package-local or protected, if anyone else from low-level needs them | 243 // perhaps, package-local or protected, if anyone else from low-level needs them |
243 private static class IndexEntry { | 244 private static class IndexEntry { |
244 public final long offset; | 245 public final long offset; // for separate .i and .d - copy of index record entry, for inline index - actual offset of the record in the .i file (record entry + revision * record size)) |
245 public final int length; // data past fixed record (need to decide whether including header size or not), and whether length is of compressed data or not | 246 public final int length; // data past fixed record (need to decide whether including header size or not), and whether length is of compressed data or not |
246 | 247 |
247 public IndexEntry(long o, int l) { | 248 public IndexEntry(long o, int l) { |
248 offset = o; | 249 offset = o; |
249 length = l; | 250 length = l; |