Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgChangelog.java @ 157:d5268ca7715b
Merged branch wrap-data-access into default for resource-friendly data access. Updated API to promote that friendliness to clients (channels, not byte[]). More exceptions
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Wed, 09 Mar 2011 05:22:17 +0100 |
| parents | src/com/tmate/hgkit/ll/Changelog.java@9429c7bd1920 src/com/tmate/hgkit/ll/Changelog.java@ba2bf656f00f |
| children | 9423235ca77b |
comparison
equal
deleted
inserted
replaced
| 156:643ddec3be36 | 157:d5268ca7715b |
|---|---|
| 14 * the terms of a license other than GNU General Public License | 14 * the terms of a license other than GNU General Public License |
| 15 * contact TMate Software at support@hg4j.com | 15 * contact TMate Software at support@hg4j.com |
| 16 */ | 16 */ |
| 17 package org.tmatesoft.hg.repo; | 17 package org.tmatesoft.hg.repo; |
| 18 | 18 |
| 19 import java.io.IOException; | |
| 19 import java.io.UnsupportedEncodingException; | 20 import java.io.UnsupportedEncodingException; |
| 20 import java.util.ArrayList; | 21 import java.util.ArrayList; |
| 21 import java.util.Arrays; | 22 import java.util.Arrays; |
| 22 import java.util.Calendar; | 23 import java.util.Calendar; |
| 23 import java.util.Collections; | 24 import java.util.Collections; |
| 28 import java.util.Locale; | 29 import java.util.Locale; |
| 29 import java.util.Map; | 30 import java.util.Map; |
| 30 import java.util.TimeZone; | 31 import java.util.TimeZone; |
| 31 | 32 |
| 32 import org.tmatesoft.hg.core.Nodeid; | 33 import org.tmatesoft.hg.core.Nodeid; |
| 34 import org.tmatesoft.hg.internal.DataAccess; | |
| 33 import org.tmatesoft.hg.internal.RevlogStream; | 35 import org.tmatesoft.hg.internal.RevlogStream; |
| 34 | 36 |
| 35 /** | 37 /** |
| 36 * Representation of the Mercurial changelog file (list of ChangeSets) | 38 * Representation of the Mercurial changelog file (list of ChangeSets) |
| 37 * | 39 * |
| 49 } | 51 } |
| 50 | 52 |
| 51 public void range(int start, int end, final HgChangelog.Inspector inspector) { | 53 public void range(int start, int end, final HgChangelog.Inspector inspector) { |
| 52 RevlogStream.Inspector i = new RevlogStream.Inspector() { | 54 RevlogStream.Inspector i = new RevlogStream.Inspector() { |
| 53 | 55 |
| 54 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 56 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { |
| 55 RawChangeset cset = RawChangeset.parse(data, 0, data.length); | 57 RawChangeset cset = RawChangeset.parse(da); |
| 56 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse | 58 // XXX there's no guarantee for Changeset.Callback that distinct instance comes each time, consider instance reuse |
| 57 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); | 59 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); |
| 58 } | 60 } |
| 59 }; | 61 }; |
| 60 content.iterate(start, end, true, i); | 62 content.iterate(start, end, true, i); |
| 62 | 64 |
| 63 public List<RawChangeset> range(int start, int end) { | 65 public List<RawChangeset> range(int start, int end) { |
| 64 final ArrayList<RawChangeset> rv = new ArrayList<RawChangeset>(end - start + 1); | 66 final ArrayList<RawChangeset> rv = new ArrayList<RawChangeset>(end - start + 1); |
| 65 RevlogStream.Inspector i = new RevlogStream.Inspector() { | 67 RevlogStream.Inspector i = new RevlogStream.Inspector() { |
| 66 | 68 |
| 67 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 69 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { |
| 68 RawChangeset cset = RawChangeset.parse(data, 0, data.length); | 70 RawChangeset cset = RawChangeset.parse(da); |
| 69 rv.add(cset); | 71 rv.add(cset); |
| 70 } | 72 } |
| 71 }; | 73 }; |
| 72 content.iterate(start, end, true, i); | 74 content.iterate(start, end, true, i); |
| 73 return rv; | 75 return rv; |
| 77 if (revisions == null || revisions.length == 0) { | 79 if (revisions == null || revisions.length == 0) { |
| 78 return; | 80 return; |
| 79 } | 81 } |
| 80 RevlogStream.Inspector i = new RevlogStream.Inspector() { | 82 RevlogStream.Inspector i = new RevlogStream.Inspector() { |
| 81 | 83 |
| 82 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, byte[] data) { | 84 public void next(int revisionNumber, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[] nodeid, DataAccess da) { |
| 83 if (Arrays.binarySearch(revisions, revisionNumber) >= 0) { | 85 if (Arrays.binarySearch(revisions, revisionNumber) >= 0) { |
| 84 RawChangeset cset = RawChangeset.parse(data, 0, data.length); | 86 RawChangeset cset = RawChangeset.parse(da); |
| 85 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); | 87 inspector.next(revisionNumber, Nodeid.fromBinary(nodeid, 0), cset); |
| 86 } | 88 } |
| 87 } | 89 } |
| 88 }; | 90 }; |
| 89 Arrays.sort(revisions); | 91 Arrays.sort(revisions); |
| 196 } catch (CloneNotSupportedException ex) { | 198 } catch (CloneNotSupportedException ex) { |
| 197 throw new InternalError(ex.toString()); | 199 throw new InternalError(ex.toString()); |
| 198 } | 200 } |
| 199 } | 201 } |
| 200 | 202 |
| 201 public static RawChangeset parse(byte[] data, int offset, int length) { | 203 public static RawChangeset parse(DataAccess da) { |
| 202 RawChangeset rv = new RawChangeset(); | 204 try { |
| 203 rv.init(data, offset, length); | 205 byte[] data = da.byteArray(); |
| 204 return rv; | 206 RawChangeset rv = new RawChangeset(); |
| 207 rv.init(data, 0, data.length); | |
| 208 return rv; | |
| 209 } catch (IOException ex) { | |
| 210 throw new IllegalArgumentException(ex); // FIXME better handling of IOExc | |
| 211 } | |
| 205 } | 212 } |
| 206 | 213 |
| 207 /* package-local */void init(byte[] data, int offset, int length) { | 214 /* package-local */void init(byte[] data, int offset, int length) { |
| 208 final int bufferEndIndex = offset + length; | 215 final int bufferEndIndex = offset + length; |
| 209 final byte lineBreak = (byte) '\n'; | 216 final byte lineBreak = (byte) '\n'; |
