Mercurial > jhg
annotate src/org/tmatesoft/hg/internal/RevlogStream.java @ 430:d280759c2a3f
branch information is not directly related to dirstate, clean API from this dependency
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Thu, 29 Mar 2012 18:48:23 +0200 | 
| parents | 48f993aa2f41 | 
| children | 299870249a28 | 
| rev | line source | 
|---|---|
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 1 /* | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 2 * Copyright (c) 2010-2012 TMate Software Ltd | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 3 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 4 * This program is free software; you can redistribute it and/or modify | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 5 * it under the terms of the GNU General Public License as published by | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 6 * the Free Software Foundation; version 2 of the License. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 7 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 8 * This program is distributed in the hope that it will be useful, | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 11 * GNU General Public License for more details. | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 12 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 13 * For information on how to redistribute this software under | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 14 * the terms of a license other than GNU General Public License | 
| 102 
a3a2e5deb320
Updated contact address to support@hg4j.com
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
88diff
changeset | 15 * contact TMate Software at support@hg4j.com | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 16 */ | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 17 package org.tmatesoft.hg.internal; | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 18 | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 19 import static org.tmatesoft.hg.repo.HgRepository.BAD_REVISION; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 20 import static org.tmatesoft.hg.repo.HgRepository.TIP; | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 21 | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 22 import java.io.File; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 23 import java.io.IOException; | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 24 import java.util.zip.Inflater; | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 25 | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 26 import org.tmatesoft.hg.core.Nodeid; | 
| 300 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
297diff
changeset | 27 import org.tmatesoft.hg.repo.HgInternals; | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 28 import org.tmatesoft.hg.repo.HgInvalidControlFileException; | 
| 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 29 import org.tmatesoft.hg.repo.HgInvalidRevisionException; | 
| 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 30 import org.tmatesoft.hg.repo.HgInvalidStateException; | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 31 import org.tmatesoft.hg.repo.HgRepository; | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 32 | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 33 | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 34 /** | 
| 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 35 * ? Single RevlogStream per file per repository with accessor to record access session (e.g. with back/forward operations), | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 36 * or numerous RevlogStream with separate representation of the underlying data (cached, lazy ChunkStream)? | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 37 * | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 38 * @see http://mercurial.selenic.com/wiki/Revlog | 
| 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 39 * @see http://mercurial.selenic.com/wiki/RevlogNG | 
| 74 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 40 * | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 41 * @author Artem Tikhomirov | 
| 
6f1b88693d48
Complete refactoring to org.tmatesoft
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
52diff
changeset | 42 * @author TMate Software Ltd. | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 43 */ | 
| 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 44 public class RevlogStream { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 45 | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 46 /* | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 47 * makes sense for index with inline data only - actual offset of the record in the .i file (record entry + revision * record size)) | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 48 * | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 49 * long[] in fact (there are 8-bytes field in the revlog) | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 50 * However, (a) DataAccess currently doesn't operate with long seek/length | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 51 * and, of greater significance, (b) files with inlined data are designated for smaller files, | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 52 * guess, about 130 Kb, and offset there won't ever break int capacity | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 53 */ | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 54 private int[] indexRecordOffset; | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 55 private int[] baseRevisions; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 56 private boolean inline = false; | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 57 private final File indexFile; | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 58 private File dataFile; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 59 private final DataAccessProvider dataAccess; | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 60 | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 61 // if we need anything else from HgRepo, might replace DAP parameter with HgRepo and query it for DAP. | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 62 public RevlogStream(DataAccessProvider dap, File indexFile) { | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 63 this.dataAccess = dap; | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 64 this.indexFile = indexFile; | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 65 } | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 66 | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 67 /*package*/ DataAccess getIndexStream() { | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 68 // TODO post 1.0 may supply a hint that I'll need really few bytes of data (perhaps, at some offset) | 
| 280 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
264diff
changeset | 69 // to avoid mmap files when only few bytes are to be read (i.e. #dataLength()) | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 70 return dataAccess.create(indexFile); | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 71 } | 
| 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 72 | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 73 /*package*/ DataAccess getDataStream() { | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 74 return dataAccess.create(getDataFile()); | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 75 } | 
| 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 76 | 
| 396 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 77 /** | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 78 * Constructs file object that corresponds to .d revlog counterpart. | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 79 * Note, it's caller responsibility to ensure this file makes any sense (i.e. check {@link #inline} attribute) | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 80 */ | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 81 private File getDataFile() { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 82 if (dataFile == null) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 83 final String indexName = indexFile.getName(); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 84 dataFile = new File(indexFile.getParentFile(), indexName.substring(0, indexName.length() - 1) + "d"); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 85 } | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 86 return dataFile; | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 87 } | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 88 | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 89 // initialize exception with the file where revlog structure information comes from | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 90 public HgInvalidControlFileException initWithIndexFile(HgInvalidControlFileException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 91 return ex.setFile(indexFile); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 92 } | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 93 | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 94 // initialize exception with the file where revlog data comes from | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 95 public HgInvalidControlFileException initWithDataFile(HgInvalidControlFileException ex) { | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 96 // exceptions are usually raised after read attepmt, hence inline shall be initialized | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 97 // although honest approach is to call #initOutline() first | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 98 return ex.setFile(inline ? indexFile : getDataFile()); | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 99 } | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 100 | 
| 
0ae53c32ecef
Straighten out exceptions thrown when file access failed - three is too much
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 101 | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 102 public int revisionCount() { | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 103 initOutline(); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 104 return baseRevisions.length; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 105 } | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 106 | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 107 /** | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 108 * @throws HgInvalidControlFileException if attempt to read index file failed | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 109 * @throws HgInvalidRevisionException if revisionIndex argument doesn't represent a valid record in the revlog | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 110 */ | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 111 public int dataLength(int revisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 112 // XXX in fact, use of iterate() instead of this implementation may be quite reasonable. | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 113 // | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 114 revisionIndex = checkRevisionIndex(revisionIndex); | 
| 280 
35125450c804
Erroneous and slow status for working copies based on non-tip revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
264diff
changeset | 115 DataAccess daIndex = getIndexStream(); | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 116 try { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 117 int recordOffset = getIndexOffsetInt(revisionIndex); | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 118 daIndex.seek(recordOffset + 12); // 6+2+4 | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 119 int actualLen = daIndex.readInt(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 120 return actualLen; | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 121 } catch (IOException ex) { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 122 throw new HgInvalidControlFileException(null, ex, indexFile); | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 123 } finally { | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 124 daIndex.done(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 125 } | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 126 } | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 127 | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 128 /** | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 129 * Read nodeid at given index | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 130 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 131 * @throws HgInvalidControlFileException if attempt to read index file failed | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 132 * @throws HgInvalidRevisionException if revisionIndex argument doesn't represent a valid record in the revlog | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 133 */ | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 134 public byte[] nodeid(int revisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 135 revisionIndex = checkRevisionIndex(revisionIndex); | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 136 DataAccess daIndex = getIndexStream(); | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 137 try { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 138 int recordOffset = getIndexOffsetInt(revisionIndex); | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 139 daIndex.seek(recordOffset + 32); | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 140 byte[] rv = new byte[20]; | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 141 daIndex.readBytes(rv, 0, 20); | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 142 return rv; | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 143 } catch (IOException ex) { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 144 throw new HgInvalidControlFileException(null, ex, indexFile); | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 145 } finally { | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 146 daIndex.done(); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 147 } | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 148 } | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 149 | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 150 /** | 
| 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 151 * Get link field from the index record. | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 152 * | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 153 * @throws HgInvalidControlFileException if attempt to read index file failed | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 154 * @throws HgInvalidRevisionException if revisionIndex argument doesn't represent a valid record in the revlog | 
| 295 
981f9f50bb6c
Issue 11: Error log facility. SessionContext to share common facilities
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
288diff
changeset | 155 */ | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 156 public int linkRevision(int revisionIndex) throws HgInvalidControlFileException, HgInvalidRevisionException { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 157 revisionIndex = checkRevisionIndex(revisionIndex); | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 158 DataAccess daIndex = getIndexStream(); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 159 try { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 160 int recordOffset = getIndexOffsetInt(revisionIndex); | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 161 daIndex.seek(recordOffset + 20); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 162 int linkRev = daIndex.readInt(); | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 163 return linkRev; | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 164 } catch (IOException ex) { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 165 throw new HgInvalidControlFileException(null, ex, indexFile); | 
| 88 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 166 } finally { | 
| 
61eedab3eb3e
Status between two revisions to recognize copy/rename
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
80diff
changeset | 167 daIndex.done(); | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 168 } | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 169 } | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 170 | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
44diff
changeset | 171 // Perhaps, RevlogStream should be limited to use of plain int revisions for access, | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
44diff
changeset | 172 // while Nodeids should be kept on the level up, in Revlog. Guess, Revlog better keep | 
| 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
44diff
changeset | 173 // map of nodeids, and once this comes true, we may get rid of this method. | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 174 // Unlike its counterpart, {@link Revlog#getLocalRevisionNumber()}, doesn't fail with exception if node not found, | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 175 /** | 
| 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 176 * @return integer in [0..revisionCount()) or {@link HgRepository#BAD_REVISION} if not found | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 177 * @throws HgInvalidControlFileException if attempt to read index file failed | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 178 */ | 
| 367 
2fadf8695f8a
Use 'revision index' instead of the vague 'local revision number' concept in the API
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
366diff
changeset | 179 public int findRevisionIndex(Nodeid nodeid) throws HgInvalidControlFileException { | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 180 // XXX this one may be implemented with iterate() once there's mechanism to stop iterations | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 181 final int indexSize = revisionCount(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 182 DataAccess daIndex = getIndexStream(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 183 try { | 
| 24 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
22diff
changeset | 184 byte[] nodeidBuf = new byte[20]; | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 185 for (int i = 0; i < indexSize; i++) { | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 186 daIndex.skip(8); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 187 int compressedLen = daIndex.readInt(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 188 daIndex.skip(20); | 
| 24 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
22diff
changeset | 189 daIndex.readBytes(nodeidBuf, 0, 20); | 
| 
d4fdd1845b3f
Nodeid with array of exactly 20 bytes
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
22diff
changeset | 190 if (nodeid.equalsTo(nodeidBuf)) { | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 191 return i; | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 192 } | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 193 daIndex.skip(inline ? 12 + compressedLen : 12); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 194 } | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 195 } catch (IOException ex) { | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 196 throw new HgInvalidControlFileException("Failed", ex, indexFile).setRevision(nodeid); | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 197 } finally { | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 198 daIndex.done(); | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 199 } | 
| 80 
4222b04f34ee
Follow history of a file
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
77diff
changeset | 200 return BAD_REVISION; | 
| 22 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 201 } | 
| 
603806cd2dc6
Status of local working dir against non-tip base revision
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
10diff
changeset | 202 | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 203 | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 204 private final int REVLOGV1_RECORD_SIZE = 64; | 
| 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 205 | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 206 // should be possible to use TIP, ALL, or -1, -2, -n notation of Hg | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 207 // ? boolean needsNodeid | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 208 public void iterate(int start, int end, boolean needData, Inspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 209 initOutline(); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 210 final int indexSize = revisionCount(); | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 211 if (indexSize == 0) { | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 212 return; | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 213 } | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 214 if (end == TIP) { | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 215 end = indexSize - 1; | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 216 } | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 217 if (start == TIP) { | 
| 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 218 start = indexSize - 1; | 
| 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 219 } | 
| 300 
650b45d290b1
Share range check code
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
297diff
changeset | 220 HgInternals.checkRevlogRange(start, end, indexSize-1); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 221 // XXX may cache [start .. end] from index with a single read (pre-read) | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 222 | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 223 ReaderN1 r = new ReaderN1(needData, inspector); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 224 try { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 225 r.start(end - start + 1); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 226 r.range(start, end); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 227 } catch (IOException ex) { | 
| 366 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 228 throw new HgInvalidControlFileException(String.format("Failed reading [%d..%d]", start, end), ex, indexFile); | 
| 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 229 } catch (HgInvalidControlFileException ex) { | 
| 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 230 throw ex; | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 231 } finally { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 232 r.finish(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 233 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 234 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 235 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 236 /** | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 237 * Effective alternative to {@link #iterate(int, int, boolean, Inspector) batch read}, when only few selected | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 238 * revisions are of interest. | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 239 * @param sortedRevisions revisions to walk, in ascending order. | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 240 * @param needData whether inspector needs access to header only | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 241 * @param inspector callback to process entries | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 242 */ | 
| 366 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 243 public void iterate(int[] sortedRevisions, boolean needData, Inspector inspector) throws HgInvalidRevisionException, HgInvalidControlFileException /*REVISIT - too general exception*/ { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 244 final int indexSize = revisionCount(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 245 if (indexSize == 0 || sortedRevisions.length == 0) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 246 return; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 247 } | 
| 347 
8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
329diff
changeset | 248 if (sortedRevisions[0] > indexSize) { | 
| 
8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
329diff
changeset | 249 throw new HgInvalidRevisionException(String.format("Can't iterate [%d, %d] in range [0..%d]", sortedRevisions[0], sortedRevisions[sortedRevisions.length - 1], indexSize), null, sortedRevisions[0]); | 
| 
8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
329diff
changeset | 250 } | 
| 
8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
329diff
changeset | 251 if (sortedRevisions[sortedRevisions.length - 1] > indexSize) { | 
| 
8da7ade36c57
Add specific IAE subclass to handle wrong (e.g. outdated after rollback) revisions
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
329diff
changeset | 252 throw new HgInvalidRevisionException(String.format("Can't iterate [%d, %d] in range [0..%d]", sortedRevisions[0], sortedRevisions[sortedRevisions.length - 1], indexSize), null, sortedRevisions[sortedRevisions.length - 1]); | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 253 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 254 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 255 ReaderN1 r = new ReaderN1(needData, inspector); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 256 try { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 257 r.start(sortedRevisions.length); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 258 for (int i = 0; i < sortedRevisions.length; ) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 259 int x = i; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 260 i++; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 261 while (i < sortedRevisions.length) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 262 if (sortedRevisions[i] == sortedRevisions[i-1] + 1) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 263 i++; | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 264 } else { | 
| 217 
e39cf474ef94
Experimental support to mix-in start and end events for inspectors. Additionally, Lifecycle may serve as iteration control
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 265 break; | 
| 
e39cf474ef94
Experimental support to mix-in start and end events for inspectors. Additionally, Lifecycle may serve as iteration control
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 266 } | 
| 
e39cf474ef94
Experimental support to mix-in start and end events for inspectors. Additionally, Lifecycle may serve as iteration control
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
202diff
changeset | 267 } | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 268 // commitRevisions[x..i-1] are sequential | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 269 if (!r.range(sortedRevisions[x], sortedRevisions[i-1])) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 270 return; | 
| 51 
9429c7bd1920
Try DataAccess to reach revision data instead of plain byte arrays
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
49diff
changeset | 271 } | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 272 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 273 } catch (IOException ex) { | 
| 366 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 274 final int c = sortedRevisions.length; | 
| 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 275 throw new HgInvalidControlFileException(String.format("Failed reading %d revisions in [%d; %d]",c, sortedRevisions[0], sortedRevisions[c-1]), ex, indexFile); | 
| 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 276 } catch (HgInvalidControlFileException ex) { | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 277 // TODO post-1.0 fill HgRuntimeException with appropriate file (either index or data, depending on error source) | 
| 366 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 278 throw ex; | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 279 } finally { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 280 r.finish(); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 281 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 282 } | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 283 | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 284 private int getBaseRevision(int revision) { | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 285 return baseRevisions[revision]; | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 286 } | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 287 | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 288 /** | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 289 * @param revisionIndex shall be valid index, [0..baseRevisions.length-1]. | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 290 * It's advised to use {@link #checkRevisionIndex(int)} to ensure argument is correct. | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 291 * @return offset of the revision's record in the index (.i) stream | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 292 */ | 
| 354 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 293 private int getIndexOffsetInt(int revisionIndex) { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 294 return inline ? indexRecordOffset[revisionIndex] : revisionIndex * REVLOGV1_RECORD_SIZE; | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 295 } | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 296 | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 297 private int checkRevisionIndex(int revisionIndex) throws HgInvalidRevisionException { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 298 final int last = revisionCount() - 1; | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 299 if (revisionIndex == TIP) { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 300 revisionIndex = last; | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 301 } | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 302 if (revisionIndex < 0 || revisionIndex > last) { | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 303 throw new HgInvalidRevisionException(revisionIndex).setRevisionIndex(revisionIndex, 0, last); | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 304 } | 
| 
5f9073eabf06
Propagate errors with exceptions up to a end client
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
347diff
changeset | 305 return revisionIndex; | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 306 } | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 307 | 
| 425 
48f993aa2f41
FIXMEs: exceptions, javadoc
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
423diff
changeset | 308 private void initOutline() throws HgInvalidControlFileException { | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 309 if (baseRevisions != null && baseRevisions.length > 0) { | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 310 return; | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 311 } | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 312 DataAccess da = getIndexStream(); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 313 try { | 
| 202 
706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
198diff
changeset | 314 if (da.isEmpty()) { | 
| 
706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
198diff
changeset | 315 // do not fail with exception if stream is empty, it's likely intentional | 
| 
706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
198diff
changeset | 316 baseRevisions = new int[0]; | 
| 
706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
198diff
changeset | 317 return; | 
| 
706bcc7cfee4
Basic test for HgIncomingCommand. Fix RepositoryComparator for cases when whole repository is unknown. Respect freshly initialized (empty) repositories in general.
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
198diff
changeset | 318 } | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 319 int versionField = da.readInt(); | 
| 170 
71ddbf8603e8
Initial clone: populate given directory from a bundle. Everything but remote server access is there, albeit prototype code style
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
158diff
changeset | 320 da.readInt(); // just to skip next 4 bytes of offset + flags | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 321 final int INLINEDATA = 1 << 16; | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 322 inline = (versionField & INLINEDATA) != 0; | 
| 288 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 323 IntVector resBases, resOffsets = null; | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 324 int entryCountGuess = Internals.ltoi(da.longLength() / REVLOGV1_RECORD_SIZE); | 
| 288 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 325 if (inline) { | 
| 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 326 entryCountGuess >>>= 2; // pure guess, assume useful data takes 3/4 of total space | 
| 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 327 resOffsets = new IntVector(entryCountGuess, 5000); | 
| 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 328 } | 
| 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 329 resBases = new IntVector(entryCountGuess, 5000); | 
| 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 330 | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 331 long offset = 0; // first offset is always 0, thus Hg uses it for other purposes | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 332 while(true) { | 
| 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 333 int compressedLen = da.readInt(); | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 334 // 8+4 = 12 bytes total read here | 
| 49 
26e3eeaa3962
branch and user filtering for log operation
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
44diff
changeset | 335 @SuppressWarnings("unused") | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 336 int actualLen = da.readInt(); | 
| 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 337 int baseRevision = da.readInt(); | 
| 5 
fc265ddeab26
File content and non-effective, although working, patch application
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
4diff
changeset | 338 // 12 + 8 = 20 bytes read here | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 339 // int linkRevision = di.readInt(); | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 340 // int parent1Revision = di.readInt(); | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 341 // int parent2Revision = di.readInt(); | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 342 // byte[] nodeid = new byte[32]; | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 343 resBases.add(baseRevision); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 344 if (inline) { | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 345 int o = Internals.ltoi(offset); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 346 if (o != offset) { | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 347 // just in case, can't happen, ever, unless HG (or some other bad tool) produces index file | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 348 // with inlined data of size greater than 2 Gb. | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 349 throw new HgInvalidStateException("Data too big, offset didn't fit to sizeof(int)"); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 350 } | 
| 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 351 resOffsets.add(o + REVLOGV1_RECORD_SIZE * resOffsets.size()); | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 352 da.skip(3*4 + 32 + compressedLen); // Check: 44 (skip) + 20 (read) = 64 (total RevlogNG record size) | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 353 } else { | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 354 da.skip(3*4 + 32); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 355 } | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 356 if (da.isEmpty()) { | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 357 // fine, done then | 
| 288 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 358 baseRevisions = resBases.toArray(true); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 359 if (inline) { | 
| 288 
b11f6a08f748
Avoid boxing int values and list resizes on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
280diff
changeset | 360 indexRecordOffset = resOffsets.toArray(true); | 
| 198 
33a7d76f067b
Performance optimization: reduce memory to keep revlog cached info
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
170diff
changeset | 361 } | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 362 break; | 
| 10 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 363 } else { | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 364 // start reading next record | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 365 long l = da.readLong(); | 
| 
382cfe9463db
Dirstate parsing. DataAccess refactored to allow reuse and control over constants
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
9diff
changeset | 366 offset = l >>> 16; | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 367 } | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 368 } | 
| 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 369 } catch (IOException ex) { | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 370 throw new HgInvalidControlFileException("Failed to analyze revlog index", ex, indexFile); | 
| 9 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 371 } finally { | 
| 
d6d2a630f4a6
Access to underlaying file data wrapped into own Access object, implemented with FileChannel and ByteBuffer
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
6diff
changeset | 372 da.done(); | 
| 2 
08db726a0fb7
Shaping out low-level Hg structures
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
0diff
changeset | 373 } | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 374 } | 
| 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 375 | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 376 /** | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 377 * operation with single file open/close and multiple diverse reads. | 
| 366 
189dc6dc1c3e
Use exceptions to expose errors reading mercurial data
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
354diff
changeset | 378 * XXX initOutline might need similar extraction to keep N1 format knowledge | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 379 */ | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 380 class ReaderN1 { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 381 private final Inspector inspector; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 382 private final boolean needData; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 383 private DataAccess daIndex = null, daData = null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 384 private Lifecycle.BasicCallback cb = null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 385 private int lastRevisionRead = BAD_REVISION; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 386 private DataAccess lastUserData; | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 387 // next are to track two major bottlenecks - patch application and actual time spent in inspector | 
| 264 
6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
263diff
changeset | 388 // private long applyTime, inspectorTime; // TIMING | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 389 | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 390 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 391 public ReaderN1(boolean needData, Inspector insp) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 392 assert insp != null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 393 this.needData = needData; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 394 inspector = insp; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 395 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 396 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 397 public void start(int totalWork) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 398 daIndex = getIndexStream(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 399 if (needData && !inline) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 400 daData = getDataStream(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 401 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 402 if (inspector instanceof Lifecycle) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 403 cb = new Lifecycle.BasicCallback(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 404 ((Lifecycle) inspector).start(totalWork, cb, cb); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 405 } | 
| 264 
6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
263diff
changeset | 406 // applyTime = inspectorTime = 0; // TIMING | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 407 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 408 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 409 public void finish() { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 410 if (lastUserData != null) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 411 lastUserData.done(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 412 lastUserData = null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 413 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 414 if (inspector instanceof Lifecycle) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 415 ((Lifecycle) inspector).finish(cb); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 416 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 417 daIndex.done(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 418 if (daData != null) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 419 daData.done(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 420 } | 
| 264 
6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
263diff
changeset | 421 // System.out.printf("applyTime:%d ms, inspectorTime: %d ms\n", applyTime, inspectorTime); // TIMING | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 422 } | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 423 | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 424 public boolean range(int start, int end) throws IOException { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 425 byte[] nodeidBuf = new byte[20]; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 426 int i; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 427 // it (i.e. replace with i >= start) | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 428 if (needData && (i = getBaseRevision(start)) < start) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 429 // if lastRevisionRead in [baseRevision(start), start) can reuse lastUserData | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 430 // doesn't make sense to reuse if lastRevisionRead == start (too much to change in the cycle below). | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 431 if (lastRevisionRead != BAD_REVISION && i <= lastRevisionRead && lastRevisionRead < start) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 432 i = lastRevisionRead + 1; // start with first not-yet-read revision | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 433 } else { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 434 if (lastUserData != null) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 435 lastUserData.done(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 436 lastUserData = null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 437 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 438 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 439 } else { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 440 // don't need to clean lastUserData as it's always null when !needData | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 441 i = start; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 442 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 443 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 444 daIndex.seek(getIndexOffsetInt(i)); | 
| 258 
e5776067b3b8
Reduce number of objects instantiated on revlog read
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
243diff
changeset | 445 // | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 446 // reuse some instances | 
| 329 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
300diff
changeset | 447 final Patch patch = new Patch(); | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 448 final Inflater inflater = new Inflater(); | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 449 // can share buffer between instances of InflaterDataAccess as I never read any two of them in parallel | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 450 final byte[] inflaterBuffer = new byte[1024]; | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 451 // | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 452 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 453 for (; i <= end; i++ ) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 454 if (inline && needData) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 455 // inspector reading data (though FilterDataAccess) may have affected index position | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 456 daIndex.seek(getIndexOffsetInt(i)); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 457 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 458 long l = daIndex.readLong(); // 0 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 459 long offset = i == 0 ? 0 : (l >>> 16); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 460 @SuppressWarnings("unused") | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 461 int flags = (int) (l & 0x0FFFF); | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 462 int compressedLen = daIndex.readInt(); // +8 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 463 int actualLen = daIndex.readInt(); // +12 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 464 int baseRevision = daIndex.readInt(); // +16 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 465 int linkRevision = daIndex.readInt(); // +20 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 466 int parent1Revision = daIndex.readInt(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 467 int parent2Revision = daIndex.readInt(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 468 // Hg has 32 bytes here, uses 20 for nodeid, and keeps 12 last bytes empty | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 469 daIndex.readBytes(nodeidBuf, 0, 20); // +32 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 470 daIndex.skip(12); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 471 DataAccess userDataAccess = null; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 472 if (needData) { | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 473 long streamOffset; | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 474 DataAccess streamDataAccess; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 475 if (inline) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 476 streamDataAccess = daIndex; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 477 streamOffset = getIndexOffsetInt(i) + REVLOGV1_RECORD_SIZE; // don't need to do seek as it's actual position in the index stream | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 478 } else { | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 479 streamOffset = offset; | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 480 streamDataAccess = daData; | 
| 420 
6c22bdc0bdfd
Respect long offsets in revlogs
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
398diff
changeset | 481 daData.longSeek(streamOffset); | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 482 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 483 final boolean patchToPrevious = baseRevision != i; // the only way I found to tell if it's a patch | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 484 if (streamDataAccess.isEmpty() || compressedLen == 0) { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 485 userDataAccess = new DataAccess(); // empty | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 486 } else { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 487 final byte firstByte = streamDataAccess.readByte(); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 488 if (firstByte == 0x78 /* 'x' */) { | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 489 inflater.reset(); | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 490 userDataAccess = new InflaterDataAccess(streamDataAccess, streamOffset, compressedLen, patchToPrevious ? -1 : actualLen, inflater, inflaterBuffer); | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 491 } else if (firstByte == 0x75 /* 'u' */) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 492 userDataAccess = new FilterDataAccess(streamDataAccess, streamOffset+1, compressedLen-1); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 493 } else { | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 494 // XXX Python impl in fact throws exception when there's not 'x', 'u' or '0' but I don't see reason not to return data as is | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 495 // | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 496 // although firstByte is already read from the streamDataAccess, FilterDataAccess#readByte would seek to | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 497 // initial offset before first attempt to read a byte | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 498 userDataAccess = new FilterDataAccess(streamDataAccess, streamOffset, compressedLen); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 499 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 500 } | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 501 // userDataAccess is revision content, either complete revision, patch of a previous content, or an empty patch | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 502 if (patchToPrevious) { | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 503 // this is a patch | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 504 if (userDataAccess.isEmpty()) { | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 505 // Issue 22, empty patch to an empty base revision | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 506 // Issue 24, empty patch to non-empty base revision | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 507 // empty patch modifies nothing, use content of a previous revision (shall present - it's a patch here) | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 508 // | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 509 assert lastUserData.length() == actualLen; // with no patch, data size shall be the same | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 510 userDataAccess = lastUserData; | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 511 } else { | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 512 patch.read(userDataAccess); | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 513 userDataAccess.done(); | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 514 // | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 515 // it shall be reset at the end of prev iteration, when it got assigned from userDataAccess | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 516 // however, actual userDataAccess and lastUserData may share Inflater object, which needs to be reset | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 517 // Alternatively, userDataAccess.done() above may be responsible to reset Inflater (if it's InflaterDataAccess) | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 518 lastUserData.reset(); | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 519 // final long startMeasuring = System.currentTimeMillis(); // TIMING | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 520 byte[] userData = patch.apply(lastUserData, actualLen); | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 521 // applyTime += (System.currentTimeMillis() - startMeasuring); // TIMING | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 522 patch.clear(); // do not keep any reference, allow byte[] data to be gc'd | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 523 userDataAccess = new ByteArrayDataAccess(userData); | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 524 } | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 525 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 526 } else { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 527 if (inline) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 528 daIndex.skip(compressedLen); | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 529 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 530 } | 
| 329 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
300diff
changeset | 531 if (i >= start) { | 
| 264 
6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
263diff
changeset | 532 // final long startMeasuring = System.currentTimeMillis(); // TIMING | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 533 inspector.next(i, actualLen, baseRevision, linkRevision, parent1Revision, parent2Revision, nodeidBuf, userDataAccess); | 
| 264 
6bb5e7ed051a
Optimize memory usage (reduce number of objects instantiated) when pooling file names and nodeids during manifest parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
263diff
changeset | 534 // inspectorTime += (System.currentTimeMillis() - startMeasuring); // TIMING | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 535 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 536 if (cb != null) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 537 if (cb.isStopped()) { | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 538 return false; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 539 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 540 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 541 if (userDataAccess != null) { | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 542 userDataAccess.reset(); // not sure this is necessary here, as lastUserData would get reset anyway before next use. | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 543 } | 
| 397 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 544 if (lastUserData != null && lastUserData != userDataAccess /* empty patch case, reuse of recent data in actual revision */) { | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 545 // release lastUserData only if we didn't reuse it in actual revision due to empty patch: | 
| 
5e95b0da26f2
Issue 24: IAE, Underflow in FilterDataAccess. Issue 26:UnsupportedOperationException when patching empty base revision. Tests
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
377diff
changeset | 546 // empty patch means we have previous revision and didn't alter it with a patch, hence use lastUserData for userDataAccess above | 
| 263 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 547 lastUserData.done(); | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 548 } | 
| 
31f67be94e71
RevlogStream - reduce number of object instances, reuse when possible
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
258diff
changeset | 549 lastUserData = userDataAccess; | 
| 242 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 550 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 551 lastRevisionRead = end; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 552 return true; | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 553 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 554 } | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 555 | 
| 
ad6a046943be
Improved reading of sparse revisions from a revlog
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
223diff
changeset | 556 | 
| 77 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 557 public interface Inspector { | 
| 
c677e1593919
Moved RevlogStream implementation into .internal
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
74diff
changeset | 558 // XXX boolean retVal to indicate whether to continue? | 
| 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
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 559 // TODO specify nodeid and data length, and reuse policy (i.e. if revlog stream doesn't reuse nodeid[] for each call) | 
| 
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
 Artem Tikhomirov <tikhomirov.artem@gmail.com>diff
changeset | 560 // implementers shall not invoke DataAccess.done(), it's accomplished by #iterate at appropraite moment | 
| 423 
9c9c442b5f2e
Major refactoring of exception handling. Low-level API uses RuntimeExceptions, while checked are left for higher level
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
420diff
changeset | 561 void next(int revisionIndex, int actualLen, int baseRevision, int linkRevision, int parent1Revision, int parent2Revision, byte[/*20*/] nodeid, DataAccess data); | 
| 3 
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: 
2diff
changeset | 562 } | 
| 0 
dbd663faec1f
Basic changelog parsing
 Artem Tikhomirov <tikhomirov.artem@gmail.com> parents: diff
changeset | 563 } | 
