Mercurial > jhg
comparison src/com/tmate/hgkit/ll/RevlogStream.java @ 43:1b26247d7367
Calculate result length of the patch operarion, when unknown
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 14 Jan 2011 04:41:05 +0100 |
| parents | e45e75e22523 |
| children | b79cf0118dd3 |
comparison
equal
deleted
inserted
replaced
| 42:92c3d0920d58 | 43:1b26247d7367 |
|---|---|
| 284 | 284 |
| 285 // mpatch.c : apply() | 285 // mpatch.c : apply() |
| 286 // FIXME need to implement patch merge (fold, combine, gather and discard from aforementioned mpatch.[c|py]), also see Revlog and Mercurial PDF | 286 // FIXME need to implement patch merge (fold, combine, gather and discard from aforementioned mpatch.[c|py]), also see Revlog and Mercurial PDF |
| 287 // FIXME why 2 arrays (rv and tempBuf)???. Think over in-place merging (perhaps some sparse byte chunk list?) - to minimize mem use. | 287 // FIXME why 2 arrays (rv and tempBuf)???. Think over in-place merging (perhaps some sparse byte chunk list?) - to minimize mem use. |
| 288 /*package-local for HgBundle; until moved to better place*/static byte[] apply(byte[] baseRevisionContent, int outcomeLen, List<PatchRecord> patch) { | 288 /*package-local for HgBundle; until moved to better place*/static byte[] apply(byte[] baseRevisionContent, int outcomeLen, List<PatchRecord> patch) { |
| 289 byte[] tempBuf = new byte[outcomeLen]; // XXX | |
| 290 int last = 0, destIndex = 0; | 289 int last = 0, destIndex = 0; |
| 290 if (outcomeLen == -1) { | |
| 291 outcomeLen = baseRevisionContent.length; | |
| 292 for (PatchRecord pr : patch) { | |
| 293 outcomeLen += pr.start - last + pr.len; | |
| 294 last = pr.end; | |
| 295 } | |
| 296 outcomeLen -= last; | |
| 297 last = 0; | |
| 298 } | |
| 299 byte[] rv = new byte[outcomeLen]; | |
| 291 for (PatchRecord pr : patch) { | 300 for (PatchRecord pr : patch) { |
| 292 System.arraycopy(baseRevisionContent, last, tempBuf, destIndex, pr.start-last); | 301 System.arraycopy(baseRevisionContent, last, rv, destIndex, pr.start-last); |
| 293 destIndex += pr.start - last; | 302 destIndex += pr.start - last; |
| 294 System.arraycopy(pr.data, 0, tempBuf, destIndex, pr.data.length); | 303 System.arraycopy(pr.data, 0, rv, destIndex, pr.data.length); |
| 295 destIndex += pr.data.length; | 304 destIndex += pr.data.length; |
| 296 last = pr.end; | 305 last = pr.end; |
| 297 } | 306 } |
| 298 System.arraycopy(baseRevisionContent, last, tempBuf, destIndex, baseRevisionContent.length - last); | 307 System.arraycopy(baseRevisionContent, last, rv, destIndex, baseRevisionContent.length - last); |
| 299 destIndex += baseRevisionContent.length - last; // total length | |
| 300 byte[] rv = new byte[destIndex]; | |
| 301 System.arraycopy(tempBuf, 0, rv, 0, destIndex); | |
| 302 return rv; | 308 return rv; |
| 303 } | 309 } |
| 304 | 310 |
| 305 // @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description | 311 // @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description |
| 306 /*package-local*/ static class PatchRecord { // copy of struct frag from mpatch.c | 312 /*package-local*/ static class PatchRecord { // copy of struct frag from mpatch.c |
