Mercurial > hg4j
annotate test/org/tmatesoft/hg/test/TestRevlog.java @ 583:47dfa0ec7e35
Effective revlog patching
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 24 Apr 2013 15:39:53 +0200 |
parents | |
children | ed243b668502 |
rev | line source |
---|---|
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
1 /* |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
2 * Copyright (c) 2013 TMate Software Ltd |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
3 * |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
4 * This program is free software; you can redistribute it and/or modify |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
6 * the Free Software Foundation; version 2 of the License. |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
7 * |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
8 * This program is distributed in the hope that it will be useful, |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
11 * GNU General Public License for more details. |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
12 * |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
13 * For information on how to redistribute this software under |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
14 * the terms of a license other than GNU General Public License |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
15 * contact TMate Software at support@hg4j.com |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
16 */ |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
17 package org.tmatesoft.hg.test; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
18 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
19 import java.io.ByteArrayOutputStream; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
20 import java.io.File; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
21 import java.io.IOException; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
22 import java.nio.ByteBuffer; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
23 import java.util.Arrays; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
24 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
25 import org.tmatesoft.hg.core.HgRepositoryNotFoundException; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
26 import org.tmatesoft.hg.core.Nodeid; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
27 import org.tmatesoft.hg.internal.ByteArrayDataAccess; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
28 import org.tmatesoft.hg.internal.DiffHelper; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
29 import org.tmatesoft.hg.internal.Patch; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
30 import org.tmatesoft.hg.internal.DiffHelper.LineSequence; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
31 import org.tmatesoft.hg.internal.RevlogDump.RevlogReader; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
32 import org.tmatesoft.hg.repo.HgLookup; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
33 import org.tmatesoft.hg.repo.HgManifest; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
34 import org.tmatesoft.hg.repo.HgManifest.Flags; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
35 import org.tmatesoft.hg.repo.HgRepository; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
36 import org.tmatesoft.hg.util.Path; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
37 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
38 /** |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
39 * Not a real JUnit test now |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
40 * |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
41 * @author Artem Tikhomirov |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
42 * @author TMate Software Ltd. |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
43 */ |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
44 public class TestRevlog { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
45 private ByteBuffer patchData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
46 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
47 public static void main(String[] args) throws Exception { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
48 File indexFile = new File("/home/artem/hg/cpython/.hg/store/00manifest.i"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
49 new TestRevlog().run(indexFile); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
50 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
51 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
52 private void run(File indexFile) throws Exception { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
53 final boolean shallDumpDiff = Boolean.TRUE.booleanValue(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
54 final boolean thoroughCheck = Boolean.TRUE.booleanValue(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
55 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
56 RevlogReader rr = new RevlogReader(indexFile); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
57 rr.init(true); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
58 rr.needData(true); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
59 int startEntryIndex = 76507; // 150--87 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
60 rr.startFrom(startEntryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
61 rr.readNext(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
62 ByteBuffer baseRevision = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
63 if (rr.isPatch()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
64 byte[] cc = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
65 baseRevision = ByteBuffer.wrap(cc); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
66 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
67 baseRevision = ByteBuffer.allocate(rr.getDataLength()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
68 rr.getData(baseRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
69 baseRevision.flip(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
70 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
71 ByteArrayDataAccess baseRevisionContent = new ByteArrayDataAccess(baseRevision.array(), baseRevision.arrayOffset(), baseRevision.remaining()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
72 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
73 final long start = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
74 int n = 1419; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
75 Patch seqPatch = null, normalizedPatch = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
76 while (rr.hasMore() && n-- > 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
77 rr.readNext(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
78 if (!rr.isPatch()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
79 break; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
80 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
81 if (rr.getDataLength() == 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
82 System.out.printf("Empty content of revision %d\n", rr.entryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
83 continue; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
84 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
85 Patch p1 = createPatch(rr); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
86 if (seqPatch != null) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
87 if (n < 1) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
88 System.out.println("+" + p1); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
89 System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
90 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
91 seqPatch = seqPatch.apply(p1); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
92 Patch ppp = normalizedPatch.apply(p1); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
93 normalizedPatch = ppp.normalize(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
94 if (n <= 1) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
95 System.out.println("=" + seqPatch); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
96 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
97 if (n == 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
98 System.out.println("A" + ppp); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
99 System.out.println("N" + normalizedPatch); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
100 normalizedPatch = ppp; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
101 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
102 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
103 if (!thoroughCheck) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
104 if (baseRevisionContent.length() + seqPatch.patchSizeDelta() != rr.actualLen) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
105 System.out.printf("Sequential patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
106 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
107 if (baseRevisionContent.length() + normalizedPatch.patchSizeDelta() != rr.actualLen) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
108 System.out.printf("Normalized patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
109 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
110 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
111 byte[] origin = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
112 try { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
113 byte[] result1 = seqPatch.apply(baseRevisionContent, rr.actualLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
114 if (!Arrays.equals(result1, origin)) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
115 System.out.printf("Sequential patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
116 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
117 } catch (ArrayIndexOutOfBoundsException ex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
118 System.err.printf("Failure at entry %d (+%d)\n", rr.entryIndex, rr.entryIndex - startEntryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
119 ex.printStackTrace(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
120 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
121 try { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
122 byte[] result2 = normalizedPatch.apply(baseRevisionContent, rr.actualLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
123 if (!Arrays.equals(result2, origin)) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
124 System.out.printf("Normalized patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
125 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
126 } catch (ArrayIndexOutOfBoundsException ex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
127 System.err.printf("Failure at entry %d (+%d)\n", rr.entryIndex, rr.entryIndex - startEntryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
128 ex.printStackTrace(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
129 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
130 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
131 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
132 seqPatch = p1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
133 normalizedPatch = p1.normalize(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
134 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
135 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
136 final long end1 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
137 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
138 // byte[] result = seqPatch.apply(baseRevisionContent, rr.actualLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
139 byte[] result = normalizedPatch.apply(baseRevisionContent, rr.actualLen); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
140 final long end2 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
141 byte[] origin = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
142 final long end3 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
143 rr.done(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
144 System.out.printf("Collected patches up to revision %d. Patches total: %d, last contains %d elements\n", rr.entryIndex, rr.entryIndex - startEntryIndex + 1, seqPatch.count()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
145 if (!Arrays.equals(result, origin)) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
146 if (shallDumpDiff) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
147 diff(result, origin); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
148 dumpLineDifference(result, origin); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
149 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
150 System.out.println("FAILURE!"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
151 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
152 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
153 System.out.println("OK!"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
154 System.out.printf("Iterate: %d ms, apply collected: %d ms, total=%d ms; Conventional: %d ms\n", (end1-start), (end2-end1), (end2-start), (end3-end2)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
155 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
156 Patch normalized = normalizedPatch; //seqPatch.normalize(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
157 System.out.printf("N%s\n%d => %d patch elements\n", normalized, seqPatch.count(), normalized.count()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
158 // System.out.println(rs); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
159 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
160 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
161 private void dumpLineDifference(byte[] result, byte[] origin) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
162 String rs = new String(result).replace('\0', '\t'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
163 String os = new String(origin).replace('\0', '\t'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
164 String[] rsLines = rs.split("\n"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
165 String[] osLines = os.split("\n"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
166 int approxPos = 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
167 for (int i = 0; i < Math.min(rsLines.length, osLines.length); i++) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
168 if (!rsLines[i].equals(osLines[i])) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
169 System.out.printf("@%d (offset ~%d)\n\t%s\n\t%s\n", i, approxPos, osLines[i], rsLines[i]); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
170 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
171 approxPos += rsLines[i].length() + 1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
172 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
173 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
174 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
175 private void diff(byte[] result, byte[] origin) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
176 DiffHelper<LineSequence> pg = new DiffHelper<LineSequence>(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
177 pg.init(LineSequence.newlines(origin), LineSequence.newlines(result)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
178 pg.findMatchingBlocks(new DiffHelper.DeltaDumpInspector<LineSequence>()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
179 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
180 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
181 private Patch createPatch(RevlogReader rr) throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
182 assert rr.isPatch(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
183 if (patchData == null || patchData.capacity() < rr.getDataLength()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
184 patchData = ByteBuffer.allocate(rr.getDataLength()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
185 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
186 patchData.clear(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
187 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
188 rr.getData(patchData); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
189 patchData.flip(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
190 Patch patch1 = new Patch(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
191 patch1.read(new ByteArrayDataAccess(patchData.array(), patchData.arrayOffset(), patchData.remaining())); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
192 return patch1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
193 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
194 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
195 private byte[] getRevisionTrueContent(File repoLoc, final int manifestRev, int clogRev) throws HgRepositoryNotFoundException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
196 HgRepository hgRepo = new HgLookup().detect(repoLoc); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
197 final ByteArrayOutputStream out = new ByteArrayOutputStream(1024 * 1000); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
198 hgRepo.getManifest().walk(clogRev, clogRev, new HgManifest.Inspector() { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
199 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
200 public boolean next(Nodeid nid, Path fname, Flags flags) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
201 try { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
202 out.write(fname.toString().getBytes()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
203 out.write(0); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
204 out.write(nid.toString().getBytes()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
205 if (flags == Flags.Exec) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
206 out.write('x'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
207 } else if (flags == Flags.Link) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
208 out.write('l'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
209 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
210 out.write('\n'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
211 } catch (IOException e) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
212 throw new IllegalStateException(e); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
213 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
214 return true; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
215 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
216 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
217 public boolean end(int manifestRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
218 return false; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
219 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
220 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
221 public boolean begin(int manifestRevisionIndex, Nodeid manifestRevision, int changelogRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
222 if (manifestRev != manifestRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
223 throw new IllegalStateException(String.valueOf(manifestRevisionIndex)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
224 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
225 return true; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
226 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
227 }); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
228 return out.toByteArray(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
229 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
230 } |