Mercurial > jhg
comparison src/com/tmate/hgkit/ll/RevlogStream.java @ 36:205f9b59b400
Strip parsing logic out from console frontend
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Thu, 13 Jan 2011 23:31:39 +0100 |
| parents | 6061aa826a9e |
| children | e45e75e22523 |
comparison
equal
deleted
inserted
replaced
| 35:6061aa826a9e | 36:205f9b59b400 |
|---|---|
| 188 if (baseRevision != i) { // XXX not sure if this is the right way to detect a patch | 188 if (baseRevision != i) { // XXX not sure if this is the right way to detect a patch |
| 189 // this is a patch | 189 // this is a patch |
| 190 LinkedList<PatchRecord> patches = new LinkedList<PatchRecord>(); | 190 LinkedList<PatchRecord> patches = new LinkedList<PatchRecord>(); |
| 191 int patchElementIndex = 0; | 191 int patchElementIndex = 0; |
| 192 do { | 192 do { |
| 193 final int x = patchElementIndex; // shorthand | 193 PatchRecord pr = PatchRecord.read(data, patchElementIndex); |
| 194 int p1 = ((data[x] & 0xFF)<< 24) | ((data[x+1] & 0xFF) << 16) | ((data[x+2] & 0xFF) << 8) | (data[x+3] & 0xFF); | 194 patches.add(pr); |
| 195 int p2 = ((data[x+4] & 0xFF) << 24) | ((data[x+5] & 0xFF) << 16) | ((data[x+6] & 0xFF) << 8) | (data[x+7] & 0xFF); | 195 patchElementIndex += 12 + pr.len; |
| 196 int len = ((data[x+8] & 0xFF) << 24) | ((data[x+9] & 0xFF) << 16) | ((data[x+10] & 0xFF) << 8) | (data[x+11] & 0xFF); | |
| 197 patchElementIndex += 12 + len; | |
| 198 patches.add(new PatchRecord(p1, p2, len, data, x+12)); | |
| 199 } while (patchElementIndex < data.length); | 196 } while (patchElementIndex < data.length); |
| 200 // | 197 // |
| 201 byte[] baseRevContent = lastData; | 198 byte[] baseRevContent = lastData; |
| 202 data = apply(baseRevContent, actualLen, patches); | 199 data = apply(baseRevContent, actualLen, patches); |
| 203 } | 200 } |
| 303 System.arraycopy(tempBuf, 0, rv, 0, destIndex); | 300 System.arraycopy(tempBuf, 0, rv, 0, destIndex); |
| 304 return rv; | 301 return rv; |
| 305 } | 302 } |
| 306 | 303 |
| 307 // @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description | 304 // @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description |
| 308 static class PatchRecord { // copy of struct frag from mpatch.c | 305 /*package-local*/ static class PatchRecord { // copy of struct frag from mpatch.c |
| 309 int start, end, len; | 306 int start, end, len; |
| 310 byte[] data; | 307 byte[] data; |
| 311 | 308 |
| 312 public PatchRecord(int p1, int p2, int len, byte[] src, int srcOffset) { | 309 // TODO consider PatchRecord that only records data position (absolute in data source), and acquires data as needed |
| 313 start = p1; | 310 private PatchRecord(int p1, int p2, int length, byte[] src) { |
| 314 end = p2; | 311 start = p1; |
| 315 this.len = len; | 312 end = p2; |
| 316 data = new byte[len]; | 313 len = length; |
| 317 System.arraycopy(src, srcOffset, data, 0, len); | 314 data = src; |
| 318 } | 315 } |
| 316 | |
| 317 /*package-local*/ static PatchRecord read(byte[] data, int offset) { | |
| 318 final int x = offset; // shorthand | |
| 319 int p1 = ((data[x] & 0xFF)<< 24) | ((data[x+1] & 0xFF) << 16) | ((data[x+2] & 0xFF) << 8) | (data[x+3] & 0xFF); | |
| 320 int p2 = ((data[x+4] & 0xFF) << 24) | ((data[x+5] & 0xFF) << 16) | ((data[x+6] & 0xFF) << 8) | (data[x+7] & 0xFF); | |
| 321 int len = ((data[x+8] & 0xFF) << 24) | ((data[x+9] & 0xFF) << 16) | ((data[x+10] & 0xFF) << 8) | (data[x+11] & 0xFF); | |
| 322 byte[] dataCopy = new byte[len]; | |
| 323 System.arraycopy(data, x+12, dataCopy, 0, len); | |
| 324 return new PatchRecord(p1, p2, len, dataCopy); | |
| 325 } | |
| 326 | |
| 327 /*package-local*/ static PatchRecord read(DataAccess da) throws IOException { | |
| 328 int p1 = da.readInt(); | |
| 329 int p2 = da.readInt(); | |
| 330 int len = da.readInt(); | |
| 331 byte[] src = new byte[len]; | |
| 332 da.readBytes(src, 0, len); | |
| 333 return new PatchRecord(p1, p2, len, src); | |
| 334 } | |
| 335 | |
| 336 | |
| 319 } | 337 } |
| 320 } | 338 } |
