Mercurial > hg4j
annotate test/org/tmatesoft/hg/test/TestRevlog.java @ 653:629a7370554c
Tests for recent changes in HgParentChildMap and RepositoryComparator (outgoing to respect drafts and Issue 47)
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 03 Jul 2013 14:38:30 +0200 |
parents | 6526d8adbc0f |
children | 7839ff0bfd78 |
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; |
628
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
586
diff
changeset
|
36 import org.tmatesoft.hg.repo.HgRuntimeException; |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
37 import org.tmatesoft.hg.util.Path; |
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 /** |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
40 * Not a real JUnit test now |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
41 * |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
42 * @author Artem Tikhomirov |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
43 * @author TMate Software Ltd. |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
44 */ |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
45 public class TestRevlog { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
46 private ByteBuffer patchData; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
47 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
48 public static void main(String[] args) throws Exception { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
49 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
|
50 new TestRevlog().run(indexFile); |
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 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
53 private void run(File indexFile) throws Exception { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
54 final boolean shallDumpDiff = Boolean.TRUE.booleanValue(); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
55 final boolean thoroughCheck = Boolean.FALSE.booleanValue(); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
56 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
57 RevlogReader rr = new RevlogReader(indexFile); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
58 rr.init(true); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
59 rr.needData(true); |
586
73c20c648c1f
HgCommitCommand initial support
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
584
diff
changeset
|
60 int startEntryIndex = 76507; // 150--87 |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
61 rr.startFrom(startEntryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
62 rr.readNext(); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
63 final long s0 = System.currentTimeMillis(); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
64 ByteBuffer baseRevision = null; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
65 if (rr.isPatch()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
66 byte[] cc = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
67 baseRevision = ByteBuffer.wrap(cc); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
68 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
69 baseRevision = ByteBuffer.allocate(rr.getDataLength()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
70 rr.getData(baseRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
71 baseRevision.flip(); |
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 ByteArrayDataAccess baseRevisionContent = new ByteArrayDataAccess(baseRevision.array(), baseRevision.arrayOffset(), baseRevision.remaining()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
74 // |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
75 final long start = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
76 int n = 1419; |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
77 Patch seqPatch = new Patch(false), normalizedPatch = new Patch(true); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
78 while (rr.hasMore() && n-- > 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
79 rr.readNext(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
80 if (!rr.isPatch()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
81 break; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
82 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
83 if (rr.getDataLength() == 0) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
84 System.out.printf("Empty content of revision %d\n", rr.entryIndex); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
85 continue; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
86 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
87 Patch p1 = createPatch(rr); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
88 if (n < 1) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
89 System.out.println("+" + p1); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
90 System.currentTimeMillis(); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
91 } |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
92 seqPatch = seqPatch.apply(p1); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
93 normalizedPatch = normalizedPatch.apply(p1); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
94 // if (n <= 1) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
95 // System.out.println("=" + seqPatch); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
96 // } |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
97 // if (n == 0) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
98 // System.out.println("A" + ppp); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
99 // System.out.println("N" + normalizedPatch); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
100 // normalizedPatch = ppp; |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
101 // } |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
102 // |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
103 if (!thoroughCheck) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
104 if (baseRevisionContent.length() + seqPatch.patchSizeDelta() != rr.actualLen) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
105 System.out.printf("Sequential patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
106 } |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
107 if (baseRevisionContent.length() + normalizedPatch.patchSizeDelta() != rr.actualLen) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
108 System.out.printf("Normalized patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
109 } |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
110 } else { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
111 byte[] origin = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
112 try { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
113 byte[] result1 = seqPatch.apply(baseRevisionContent, rr.actualLen); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
114 if (!Arrays.equals(result1, origin)) { |
583
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 } |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
117 } catch (ArrayIndexOutOfBoundsException ex) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
118 System.err.printf("Failure at entry %d (+%d)\n", rr.entryIndex, rr.entryIndex - startEntryIndex); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
119 ex.printStackTrace(); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
120 } |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
121 // try { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
122 // byte[] result2 = normalizedPatch.apply(baseRevisionContent, rr.actualLen); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
123 // if (!Arrays.equals(result2, origin)) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
124 // System.out.printf("Normalized patches:\tPatchRevision #%d (+%d, cset:%d) failed\n", rr.entryIndex, rr.entryIndex - startEntryIndex, rr.linkRevision); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
125 // } |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
126 // } catch (ArrayIndexOutOfBoundsException ex) { |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
127 // System.err.printf("Failure at entry %d (+%d)\n", rr.entryIndex, rr.entryIndex - startEntryIndex); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
128 // ex.printStackTrace(); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
129 // } |
583
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 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
132 final long end1 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
133 // |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
134 byte[] result = seqPatch.apply(baseRevisionContent, rr.actualLen); |
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
135 // byte[] result = normalizedPatch.apply(baseRevisionContent, rr.actualLen); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
136 final long end2 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
137 byte[] origin = getRevisionTrueContent(indexFile.getParentFile(), rr.entryIndex, rr.linkRevision); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
138 final long end3 = System.currentTimeMillis(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
139 rr.done(); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
140 System.out.printf("Collected patches up to revision %d. Patches total: %d, sequentialPatch contains %d elements, normalized: %d\n", rr.entryIndex, rr.entryIndex - startEntryIndex + 1, seqPatch.count(), normalizedPatch.count()); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
141 if (!Arrays.equals(result, origin)) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
142 if (shallDumpDiff) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
143 diff(result, origin); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
144 dumpLineDifference(result, origin); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
145 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
146 System.out.println("FAILURE!"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
147 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
148 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
149 System.out.println("OK!"); |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
150 System.out.printf("Iterate: %d ms, read base:%d, apply collected: %d ms, total=%d ms; Conventional: %d ms\n", (end1-start), (start-s0), (end2-end1), (end2-s0), (end3-end2)); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
151 } |
584
ed243b668502
Conditionally enable effective patch merge alternative for revlog reading
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
583
diff
changeset
|
152 Patch normalized = seqPatch.normalize(); |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
153 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
|
154 // System.out.println(rs); |
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 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
157 private void dumpLineDifference(byte[] result, byte[] origin) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
158 String rs = new String(result).replace('\0', '\t'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
159 String os = new String(origin).replace('\0', '\t'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
160 String[] rsLines = rs.split("\n"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
161 String[] osLines = os.split("\n"); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
162 int approxPos = 0; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
163 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
|
164 if (!rsLines[i].equals(osLines[i])) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
165 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
|
166 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
167 approxPos += rsLines[i].length() + 1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
168 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
169 } |
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 private void diff(byte[] result, byte[] origin) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
172 DiffHelper<LineSequence> pg = new DiffHelper<LineSequence>(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
173 pg.init(LineSequence.newlines(origin), LineSequence.newlines(result)); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
174 pg.findMatchingBlocks(new DiffHelper.DeltaDumpInspector<LineSequence>()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
175 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
176 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
177 private Patch createPatch(RevlogReader rr) throws IOException { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
178 assert rr.isPatch(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
179 if (patchData == null || patchData.capacity() < rr.getDataLength()) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
180 patchData = ByteBuffer.allocate(rr.getDataLength()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
181 } else { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
182 patchData.clear(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
183 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
184 rr.getData(patchData); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
185 patchData.flip(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
186 Patch patch1 = new Patch(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
187 patch1.read(new ByteArrayDataAccess(patchData.array(), patchData.arrayOffset(), patchData.remaining())); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
188 return patch1; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
189 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
190 |
628
6526d8adbc0f
Explicit HgRuntimeException to facilitate easy switch from runtime to checked exceptions
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
586
diff
changeset
|
191 private byte[] getRevisionTrueContent(File repoLoc, final int manifestRev, int clogRev) throws HgRepositoryNotFoundException, IllegalArgumentException, HgRuntimeException { |
583
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
192 HgRepository hgRepo = new HgLookup().detect(repoLoc); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
193 final ByteArrayOutputStream out = new ByteArrayOutputStream(1024 * 1000); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
194 hgRepo.getManifest().walk(clogRev, clogRev, new HgManifest.Inspector() { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
195 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
196 public boolean next(Nodeid nid, Path fname, Flags flags) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
197 try { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
198 out.write(fname.toString().getBytes()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
199 out.write(0); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
200 out.write(nid.toString().getBytes()); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
201 if (flags == Flags.Exec) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
202 out.write('x'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
203 } else if (flags == Flags.Link) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
204 out.write('l'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
205 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
206 out.write('\n'); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
207 } catch (IOException e) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
208 throw new IllegalStateException(e); |
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 return true; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
211 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
212 |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
213 public boolean end(int manifestRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
214 return false; |
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 begin(int manifestRevisionIndex, Nodeid manifestRevision, int changelogRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
218 if (manifestRev != manifestRevisionIndex) { |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
219 throw new IllegalStateException(String.valueOf(manifestRevisionIndex)); |
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 return true; |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
222 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
223 }); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
224 return out.toByteArray(); |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
225 } |
47dfa0ec7e35
Effective revlog patching
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
226 } |