Mercurial > jhg
annotate src/org/tmatesoft/hg/internal/RevlogDump.java @ 709:497e697636fc
Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 21 Aug 2013 16:23:27 +0200 |
parents | 47dfa0ec7e35 |
children |
rev | line source |
---|---|
22
603806cd2dc6
Status of local working dir against non-tip base revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
17
diff
changeset
|
1 /* |
533
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
2 * Copyright (c) 2010-2013 TMate Software Ltd |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
3 * |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
4 * This program is free software; you can redistribute it and/or modify |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
6 * the Free Software Foundation; version 2 of the License. |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
7 * |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
8 * This program is distributed in the hope that it will be useful, |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
11 * GNU General Public License for more details. |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
12 * |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
13 * For information on how to redistribute this software under |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
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:
88
diff
changeset
|
15 * contact TMate Software at support@hg4j.com |
22
603806cd2dc6
Status of local working dir against non-tip base revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
17
diff
changeset
|
16 */ |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
17 package org.tmatesoft.hg.internal; |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
18 |
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
19 import java.io.BufferedInputStream; |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
20 import java.io.ByteArrayInputStream; |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
21 import java.io.DataInput; |
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
22 import java.io.DataInputStream; |
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
23 import java.io.File; |
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
24 import java.io.FileInputStream; |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
25 import java.io.IOException; |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
26 import java.io.UnsupportedEncodingException; |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
27 import java.math.BigInteger; |
376
d45ad07dc94c
Allow content dump for separate .i and .d files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
189
diff
changeset
|
28 import java.nio.ByteBuffer; |
d45ad07dc94c
Allow content dump for separate .i and .d files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
189
diff
changeset
|
29 import java.nio.channels.FileChannel; |
533
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
30 import java.util.regex.Matcher; |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
31 import java.util.regex.Pattern; |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
32 import java.util.zip.DataFormatException; |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
33 import java.util.zip.Inflater; |
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 /** |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
36 * Utility to test/debug/troubleshoot |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
37 * |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
38 * @author Artem Tikhomirov |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
39 * @author TMate Software Ltd. |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
40 */ |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
41 public class RevlogDump { |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
42 |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
43 /** |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
44 * Takes 3 command line arguments - |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
45 * repository path, |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
46 * path to index file (i.e. store/data/hello.c.i) in the repository (relative) |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
47 * and "dumpData" whether to print actual content or just revlog headers |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
48 */ |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
49 public static void main(String[] args) throws Exception { |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
50 String repo = "/temp/hg/hello/.hg/"; |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
51 String filename = "store/00changelog.i"; |
22
603806cd2dc6
Status of local working dir against non-tip base revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
17
diff
changeset
|
52 // String filename = "store/data/hello.c.i"; |
4
aa1912c70b36
Fix offset issue for inline revlogs. Commandline processing.
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
3
diff
changeset
|
53 // String filename = "store/data/docs/readme.i"; |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
54 // System.out.println(escape("abc\0def\nzxc\tmnb")); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
55 boolean dumpDataFull = true; |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
56 boolean dumpDataStats = false; |
88
61eedab3eb3e
Status between two revisions to recognize copy/rename
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
73
diff
changeset
|
57 if (args.length > 1) { |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
58 repo = args[0]; |
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
59 filename = args[1]; |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
60 dumpDataFull = args.length > 2 ? "dumpData".equals(args[2]) : false; |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
61 dumpDataStats = args.length > 2 ? "dumpDataStats".equals(args[2]) : false; |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
62 } |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
63 final boolean needRevData = dumpDataFull || dumpDataStats; |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
64 // |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
65 RevlogReader rr = new RevlogReader(new File(repo, filename)).needData(needRevData); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
66 rr.init(needRevData); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
67 System.out.printf("%#8x, inline: %b\n", rr.versionField, rr.inlineData); |
73
0d279bcc4442
Utility for future troubleshooting
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
47
diff
changeset
|
68 System.out.println("Index Offset Flags Packed Actual Base Rev Link Rev Parent1 Parent2 nodeid"); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
69 ByteBuffer data = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
70 while (rr.hasMore()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
71 rr.readNext(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
72 System.out.printf("%4d:%14d %6X %10d %10d %10d %10d %8d %8d %040x\n", rr.entryIndex, rr.offset, rr.flags, rr.compressedLen, rr.actualLen, rr.baseRevision, rr.linkRevision, rr.parent1Revision, rr.parent2Revision, new BigInteger(rr.nodeid)); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
73 if (needRevData) { |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
74 String resultString; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
75 if (rr.getDataLength() == 0) { |
376
d45ad07dc94c
Allow content dump for separate .i and .d files
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
189
diff
changeset
|
76 resultString = "<NO DATA>"; |
3
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
2
diff
changeset
|
77 } else { |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
78 data = ensureCapacity(data, rr.getDataLength()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
79 rr.getData(data); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
80 data.flip(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
81 resultString = buildString(data, rr.isPatch(), dumpDataFull); |
3
24bb4f365164
Rudimentary log functionality with basic infrastructure is in place
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
2
diff
changeset
|
82 } |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
83 if (resultString.endsWith("\n")) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
84 System.out.print(resultString); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
85 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
86 System.out.println(resultString); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
87 } |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
88 } |
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
89 } |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
90 rr.done(); |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
91 } |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
92 |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
93 private static ByteBuffer ensureCapacity(ByteBuffer src, int requiredCap) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
94 if (src == null || src.capacity() < requiredCap) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
95 return ByteBuffer.allocate((1 + requiredCap) * 3 / 2); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
96 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
97 src.clear(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
98 return src; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
99 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
100 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
101 private static String buildString(ByteBuffer data, boolean isPatch, boolean completeDataDump) throws IOException, UnsupportedEncodingException { |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
102 if (isPatch) { |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
103 DataInputStream dis = new DataInputStream(new ByteArrayInputStream(data.array(), data.arrayOffset(), data.remaining())); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
104 StringBuilder sb = new StringBuilder(); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
105 sb.append("<PATCH>:\n"); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
106 while (dis.available() > 0) { |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
107 int s = dis.readInt(); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
108 int e = dis.readInt(); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
109 int l = dis.readInt(); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
110 sb.append(String.format("%d..%d, %d", s, e, l)); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
111 if (completeDataDump) { |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
112 byte[] src = new byte[l]; |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
113 dis.read(src, 0, l); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
114 sb.append(":"); |
533
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
115 sb.append(escape(new String(src, 0, l, "UTF-8"))); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
116 } else { |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
117 dis.skipBytes(l); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
118 } |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
119 sb.append('\n'); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
120 } |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
121 return sb.toString(); |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
122 } else { |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
123 if (completeDataDump) { |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
124 return escape(new String(data.array(), data.arrayOffset(), data.remaining(), "UTF-8")); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
125 } |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
126 return String.format("<DATA>:%d bytes", data.remaining()); |
392
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
127 } |
656a6c1346ff
Extra debug option (dumpDataStats) and patch structure decoding for RevlogDump debug utility
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
376
diff
changeset
|
128 } |
533
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
129 |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
130 private static Pattern controlCharPattern = Pattern.compile("\\p{Cntrl}"); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
131 // \p{Cntrl} A control character: [\x00-\x1F\x7F] |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
132 private static String[] replacements = new String[33]; |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
133 static { |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
134 for (int i = 0; i < 32; i++) { |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
135 // no idea why need FOUR backslashes to get only one in printout |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
136 replacements[i] = String.format("\\\\%X", i); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
137 } |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
138 replacements[32] = String.format("\\\\%X", 127); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
139 } |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
140 // handy to get newline-separated data printed on newlines. |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
141 // set to false for non-printable data (e.g. binaries, where \n doesn't make sense) |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
142 private static boolean leaveNewlineInData = true; |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
143 |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
144 private static String escape(CharSequence possiblyWithBinary) { |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
145 Matcher m = controlCharPattern.matcher(possiblyWithBinary); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
146 StringBuffer rv = new StringBuffer(); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
147 while (m.find()) { |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
148 char c = m.group().charAt(0); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
149 if (leaveNewlineInData && c == '\n') { |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
150 continue; |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
151 } |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
152 int x = (int) c; |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
153 m.appendReplacement(rv, replacements[x == 127 ? 32 : x]); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
154 } |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
155 m.appendTail(rv); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
156 return rv.toString(); |
e6f72c9829a6
Generate patches using diff algorithm
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
420
diff
changeset
|
157 } |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
158 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
159 public static class RevlogReader { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
160 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
161 private final File file; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
162 private boolean needRevData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
163 private DataInputStream dis; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
164 private boolean inlineData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
165 public int versionField; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
166 private FileChannel dataStream; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
167 public int entryIndex; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
168 private byte[] data; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
169 private int dataOffset, dataLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
170 public long offset; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
171 public int flags; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
172 public int baseRevision; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
173 public int linkRevision; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
174 public int parent1Revision; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
175 public int parent2Revision; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
176 public int compressedLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
177 public int actualLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
178 public byte[] nodeid = new byte[21]; // need 1 byte in the front to be 0 to avoid negative BigInts |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
179 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
180 public RevlogReader(File f) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
181 assert f.getName().endsWith(".i"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
182 file = f; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
183 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
184 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
185 // affects #readNext() |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
186 public RevlogReader needData(boolean needData) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
187 needRevData = needData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
188 return this; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
189 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
190 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
191 public void init(boolean mayRequireData) throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
192 dis = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
193 DataInput di = dis; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
194 dis.mark(10); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
195 versionField = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
196 dis.reset(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
197 final int INLINEDATA = 1 << 16; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
198 inlineData = (versionField & INLINEDATA) != 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
199 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
200 dataStream = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
201 if (!inlineData && mayRequireData) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
202 String fname = file.getAbsolutePath(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
203 dataStream = new FileInputStream(new File(fname.substring(0, fname.length()-2) + ".d")).getChannel(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
204 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
205 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
206 entryIndex = -1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
207 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
208 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
209 public void startFrom(int startEntryIndex) throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
210 if (dis == null) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
211 throw new IllegalStateException("Call #init() first"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
212 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
213 if (entryIndex != -1 && startEntryIndex != 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
214 throw new IllegalStateException("Can't seek once iteration has started"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
215 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
216 if (dataStream == null) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
217 throw new IllegalStateException("Sorry, initial seek is now supported for separate .i/.d only"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
218 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
219 long newPos = startEntryIndex * Internals.REVLOGV1_RECORD_SIZE, actualSkip; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
220 do { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
221 actualSkip = dis.skip(newPos); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
222 if (actualSkip <= 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
223 throw new IllegalStateException(String.valueOf(actualSkip)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
224 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
225 newPos -= actualSkip; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
226 } while (newPos > 0); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
227 entryIndex = startEntryIndex - 1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
228 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
229 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
230 public boolean hasMore() throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
231 return dis.available() > 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
232 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
233 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
234 public void readNext() throws IOException, DataFormatException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
235 entryIndex++; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
236 DataInput di = dis; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
237 long l = di.readLong(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
238 offset = entryIndex == 0 ? 0 : (l >>> 16); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
239 flags = (int) (l & 0x0FFFF); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
240 compressedLen = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
241 actualLen = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
242 baseRevision = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
243 linkRevision = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
244 parent1Revision = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
245 parent2Revision = di.readInt(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
246 di.readFully(nodeid, 1, 20); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
247 dis.skipBytes(12); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
248 // CAN'T USE skip() here without extra precautions. E.g. I ran into situation when |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
249 // buffer was 8192 and BufferedInputStream was at position 8182 before attempt to skip(12). |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
250 // BIS silently skips available bytes and leaves me two extra bytes that ruin the rest of the code. |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
251 data = new byte[compressedLen]; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
252 if (inlineData) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
253 di.readFully(data); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
254 } else if (needRevData) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
255 dataStream.position(offset); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
256 dataStream.read(ByteBuffer.wrap(data)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
257 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
258 if (needRevData) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
259 if (compressedLen == 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
260 data = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
261 dataOffset = dataLen = 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
262 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
263 if (data[0] == 0x78 /* 'x' */) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
264 Inflater zlib = new Inflater(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
265 zlib.setInput(data, 0, compressedLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
266 byte[] result = new byte[actualLen * 3]; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
267 int resultLen = zlib.inflate(result); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
268 zlib.end(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
269 data = result; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
270 dataOffset = 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
271 dataLen = resultLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
272 } else if (data[0] == 0x75 /* 'u' */) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
273 dataOffset = 1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
274 dataLen = data.length - 1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
275 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
276 dataOffset = 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
277 dataLen = data.length; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
278 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
279 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
280 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
281 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
282 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
283 public int getDataLength() { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
284 // NOT actualLen - there are empty patch revisions (dataLen == 0, but actualLen == previous length) |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
285 // NOT compressedLen - zip data is uncompressed |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
286 return dataLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
287 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
288 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
289 public void getData(ByteBuffer bb) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
290 assert bb.remaining() >= dataLen; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
291 bb.put(data, dataOffset, dataLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
292 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
293 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
294 public boolean isPatch() { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
295 assert entryIndex != -1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
296 return baseRevision != entryIndex; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
297 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
298 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
299 public boolean isInline() { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
300 assert dis != null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
301 return inlineData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
302 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
303 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
304 public void done() throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
305 dis.close(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
306 dis = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
307 if (dataStream != null) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
308 dataStream.close(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
309 dataStream = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
310 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
311 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
533
diff
changeset
|
312 } |
0
dbd663faec1f
Basic changelog parsing
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
313 } |