Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/Patch.java @ 343:58016b1b8554
HgIgnore: glob patterns not to match substring when not meant to
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> | 
|---|---|
| date | Sat, 19 Nov 2011 01:07:27 +0100 | 
| parents | 9747a786a34d | 
| children | 7f136a3fa671 | 
| rev | line source | 
|---|---|
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
1 /* | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
2 * Copyright (c) 2011 TMate Software Ltd | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
3 * | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
4 * This program is free software; you can redistribute it and/or modify | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
5 * it under the terms of the GNU General Public License as published by | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
6 * the Free Software Foundation; version 2 of the License. | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
7 * | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
8 * This program is distributed in the hope that it will be useful, | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
11 * GNU General Public License for more details. | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
12 * | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
13 * For information on how to redistribute this software under | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
14 * the terms of a license other than GNU General Public License | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
15 * contact TMate Software at support@hg4j.com | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
16 */ | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
17 package org.tmatesoft.hg.internal; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
18 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
19 import java.io.IOException; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
20 import java.util.ArrayList; | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
21 import java.util.Formatter; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
22 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
23 /** | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
24 * @see http://mercurial.selenic.com/wiki/BundleFormat, in Changelog group description | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
25 * | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
26 * range [start..end] in original source gets replaced with data of length (do not keep, use data.length instead) | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
27 * range [end(i)..start(i+1)] is copied from the source | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
28 * | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
29 * @author Artem Tikhomirov | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
30 * @author TMate Software Ltd. | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
31 */ | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
32 public final class Patch { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
33 private final IntVector starts, ends; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
34 private final ArrayList<byte[]> data; | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
35 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
36 private static byte[] generate(int c) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
37 byte[] rv = new byte[c]; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
38 for (int i = 0; i < c; i++) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
39 byte x = (byte) ('a' + i); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
40 rv[i] = x; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
41 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
42 return rv; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
43 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
44 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
45 public static void main(String[] args) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
46 Patch p1 = new Patch(), p2 = new Patch(); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
47 // simple cases (one element in either patch) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
48 // III: (1,10 20) & (5,15,15) p2End from [p1End..p1AppliedEnd] (i.e. within p1 range but index is past p2 end index) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
49 // II: (1,10,7) & (3,15,15) insideP2 = true and no more p1 entries | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
50 // II: (1,1,10) & (3,11,15) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
51 // independent: (1,10,10) & (15,25,10); (15, 25, 10) & (1, 10, 10) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
52 // I: (15, 25, 10) & (10, 20, 10). result: [10, 20, 10] [20, 25, 5] | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
53 // IV: (15, 25, 10) & (10, 30, 20) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
54 // | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
55 // cycle with insideP2 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
56 // | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
57 // cycle with insideP1 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
58 // | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
59 // multiple elements in patches (offsets) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
60 p1.add(15, 25, generate(10)); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
61 p2.add(10, 30, generate(20)); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
62 System.out.println("p1: " + p1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
63 System.out.println("p2: " + p2); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
64 Patch r = p1.apply(p2); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
65 System.out.println("r: " + r); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
66 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
67 | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
68 public Patch() { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
69 starts = new IntVector(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
70 ends = new IntVector(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
71 data = new ArrayList<byte[]>(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
72 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
73 | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
74 public String toString() { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
75 StringBuilder sb = new StringBuilder(); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
76 Formatter f = new Formatter(sb); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
77 for (int i = 0; i < count(); i++) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
78 f.format("[%d, %d, %d] ", starts.get(i), ends.get(i), data.get(i).length); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
79 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
80 return sb.toString(); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
81 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
82 | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
83 public int count() { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
84 return data.size(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
85 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
86 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
87 // number of bytes this patch will add (or remove, if negative) from the base revision | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
88 private int patchSizeDelta() { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
89 int rv = 0; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
90 int prevEnd = 0; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
91 for (int i = 0, x = data.size(); i < x; i++) { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
92 final int start = starts.get(i); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
93 final int len = data.get(i).length; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
94 rv += start - prevEnd; // would copy from original | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
95 rv += len; // and add new | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
96 prevEnd = ends.get(i); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
97 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
98 rv -= prevEnd; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
99 return rv; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
100 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
101 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
102 public byte[] apply(DataAccess baseRevisionContent, int outcomeLen) throws IOException { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
103 if (outcomeLen == -1) { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
104 outcomeLen = baseRevisionContent.length() + patchSizeDelta(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
105 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
106 int prevEnd = 0, destIndex = 0; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
107 byte[] rv = new byte[outcomeLen]; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
108 for (int i = 0, x = data.size(); i < x; i++) { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
109 final int start = starts.get(i); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
110 baseRevisionContent.seek(prevEnd); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
111 // copy source bytes that were not modified (up to start of the record) | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
112 baseRevisionContent.readBytes(rv, destIndex, start - prevEnd); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
113 destIndex += start - prevEnd; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
114 // insert new data from the patch, if any | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
115 byte[] d = data.get(i); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
116 System.arraycopy(d, 0, rv, destIndex, d.length); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
117 destIndex += d.length; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
118 prevEnd = ends.get(i); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
119 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
120 baseRevisionContent.seek(prevEnd); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
121 // copy everything in the source past last record's end | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
122 baseRevisionContent.readBytes(rv, destIndex, (int) (baseRevisionContent.length() - prevEnd)); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
123 return rv; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
124 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
125 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
126 public void clear() { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
127 starts.clear(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
128 ends.clear(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
129 data.clear(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
130 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
131 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
132 /** | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
133 * Initialize instance from stream. Any previous patch information (i.e. if instance if reused) is cleared first. | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
134 * Read up to the end of DataAccess and interpret data as patch records. | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
135 */ | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
136 public void read(DataAccess da) throws IOException { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
137 clear(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
138 while (!da.isEmpty()) { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
139 readOne(da); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
140 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
141 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
142 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
143 /** | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
144 * Caller is responsible to ensure stream got some data to read | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
145 */ | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
146 public void readOne(DataAccess da) throws IOException { | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
147 int s = da.readInt(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
148 int e = da.readInt(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
149 int len = da.readInt(); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
150 byte[] src = new byte[len]; | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
151 da.readBytes(src, 0, len); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
152 starts.add(s); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
153 ends.add(e); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
154 data.add(src); | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
155 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
156 | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
157 private void add(Patch p, int i) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
158 add(p.starts.get(i), p.ends.get(i), p.data.get(i)); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
159 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
160 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
161 private void add(int start, int end, byte[] d) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
162 starts.add(start); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
163 ends.add(end); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
164 data.add(d); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
165 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
166 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
167 private static byte[] subarray(byte[] d, int start, int end) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
168 byte[] r = new byte[end-start+1]; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
169 System.arraycopy(d, start, r, 0, r.length); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
170 return r; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
171 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
172 | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
173 /** | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
174 * Modify this patch with subsequent patch | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
175 */ | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
176 private /*SHALL BE PUBLIC ONCE TESTING ENDS*/ Patch apply(Patch another) { | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
177 Patch r = new Patch(); | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
178 int p1TotalAppliedDelta = 0; // value to add to start and end indexes of the older patch to get their values as if | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
179 // in the patched text, iow, directly comparable with respective indexes from the newer patch. | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
180 int p1EntryStart = 0, p1EntryEnd = 0, p1EntryLen = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
181 byte[] p1Data = null; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
182 boolean insideP1entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
183 int p2 = 0, p1 = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
184 final int p2Max = another.count(), p1Max = this.count(); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
185 L0: for (; p2 < p2Max; p2++) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
186 int p2EntryStart = another.starts.get(p2); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
187 int p2EntryEnd = another.ends.get(p2); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
188 final int p2EntryRange = p2EntryEnd - p2EntryStart; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
189 final byte[] p2Data = another.data.get(p2); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
190 boolean insideP2entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
191 int p2EntryStartOffset = -1; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
192 /// | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
193 p1EntryStart = p1EntryEnd = p1EntryLen = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
194 p1Data = null; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
195 | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
196 L1: while (p1 < p1Max) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
197 if (!insideP1entry) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
198 p1EntryStart = starts.get(p1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
199 p1EntryEnd = ends.get(p1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
200 p1Data = data.get(p1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
201 p1EntryLen = p1Data.length; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
202 }// else keep values | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
203 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
204 final int p1EntryDelta = p1EntryLen - (p1EntryEnd - p1EntryStart); // number of actually inserted(+) or deleted(-) chars | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
205 final int p1EntryAppliedStart = p1TotalAppliedDelta + p1EntryStart; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
206 final int p1EntryAppliedEnd = p1EntryAppliedStart + p1EntryLen; // end of j'th patch entry in the text which is source for p2 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
207 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
208 if (insideP2entry) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
209 if (p2EntryEnd < p1EntryAppliedStart) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
210 r.add(p2EntryStart - p2EntryStartOffset, p2EntryEnd - p1TotalAppliedDelta, p2Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
211 insideP2entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
212 continue L0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
213 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
214 if (p2EntryEnd >= p1EntryAppliedEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
215 // when p2EntryEnd == p1EntryAppliedEnd, I assume p1TotalAppliedDelta can't be used for p2EntryEnd to get it to p1 range, but rather shall be | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
216 // augmented with current p1 entry and at the next p1 entry (likely to hit p1EntryAppliedStart > p2EntryEnd above) would do the rest | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
217 insideP1entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
218 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
219 p1TotalAppliedDelta += p1EntryDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
220 continue L1; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
221 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
222 // p1EntryAppliedStart <= p2EntryEnd < p1EntryAppliedEnd | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
223 r.add(p2EntryStart - p2EntryStartOffset, p2EntryEnd - p1TotalAppliedDelta, p2Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
224 p1EntryStart = p2EntryEnd - p1TotalAppliedDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
225 final int p1DataPartShift = p2EntryEnd - p1EntryAppliedStart + 1; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
226 if (p1DataPartShift >= p1EntryLen) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
227 p1EntryLen = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
228 p1Data = new byte[0]; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
229 } else { | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
230 p1EntryLen -= p1DataPartShift; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
231 p1Data = subarray(p1Data, p1DataPartShift, p1Data.length); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
232 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
233 insideP1entry = true; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
234 insideP2entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
235 continue L0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
236 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
237 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
238 if (p1EntryAppliedStart < p2EntryStart) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
239 if (p1EntryAppliedEnd <= p2EntryStart) { // p1EntryAppliedEnd in fact index of the first char *after* patch | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
240 // completely independent, copy and continue | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
241 r.add(p1EntryStart, p1EntryEnd, p1Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
242 insideP1entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
243 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
244 // fall-through to get p1TotalAppliedDelta incremented | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
245 } else { // SKETCH: II or III | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
246 // remember, p1EntryDelta may be negative | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
247 // shall break j'th entry into few | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
248 // fix p1's end/length | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
249 // p1EntryAppliedStart < p2EntryStart < p1EntryAppliedEnd | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
250 int s = p2EntryStart - p1TotalAppliedDelta; // p2EntryStart in p1 scale. Is within p1 range | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
251 if (s > p1EntryEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
252 s = p1EntryEnd; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
253 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
254 int p1DataPartEnd = p2EntryStart - p1EntryAppliedStart; // index, not count. <= (p1EntryEnd-p1EntryStart). | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
255 // add what left from p1 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
256 if (p1DataPartEnd < p1EntryLen) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
257 r.add(p1EntryStart, s, subarray(p1Data, 0, p1DataPartEnd)); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
258 } else { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
259 p1DataPartEnd = p1EntryLen-1; // record factual number of p1 bytes we consumed. | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
260 r.add(p1EntryStart, s, p1Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
261 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
262 p1TotalAppliedDelta += p1DataPartEnd - (s - p1EntryStart); // (s2 - (s1+delta)) - (s2 - delta - s1) = s2-s1-delta-s2+delta+s1 = 0, unless p1DataPartEnd >= p1Data.length | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
263 p1EntryLen -= (p1DataPartEnd+1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
264 if (p2EntryEnd < p1EntryAppliedEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
265 // SKETCH: III | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
266 insideP1entry = true; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
267 // p2 completely fits into changes of p1 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
268 int e = p2EntryEnd - p1TotalAppliedDelta; // p2EntryEnd in p1 scale | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
269 if (e > p1EntryEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
270 // any index past p1 end shall be calculated with respect to p1 end, thus it's unsafe to go past p1 end (there may be more p1 entries there) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
271 e = p1EntryEnd; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
272 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
273 r.add(s, e, p2Data); // add p2 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
274 // modify p1 leftover | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
275 p1EntryStart = e; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
276 if (p2EntryRange >= p1EntryLen) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
277 p1EntryLen = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
278 p1Data = new byte[0]; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
279 } else { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
280 p1Data = subarray(p1Data, p1DataPartEnd + p2EntryRange, p1Data.length-1 /*up to the last one*/); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
281 p1EntryLen -= p2EntryRange; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
282 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
283 // p2 is handled, but there are leftovers of p1 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
284 continue L0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
285 } else { // p2EntryEnd >= p1EntryAppliedEnd | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
286 // SKETCH: II | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
287 insideP1entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
288 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
289 if (p1EntryAppliedStart + p1EntryDelta >= p2EntryEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
290 // here we know next p1 entry would be past p2 entry and thus can put p2 right away | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
291 r.add(p2EntryStart - p1TotalAppliedDelta, p1EntryEnd, p2Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
292 p1TotalAppliedDelta += p1EntryDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
293 continue L0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
294 } else { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
295 // there are chances there are more p1 entries till p2 ends | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
296 insideP2entry = true; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
297 p2EntryStartOffset = p1TotalAppliedDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
298 // p2EntryEnd is past delta, no chances for p1Data leftovers to be in use | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
299 // p2 processing is not over, need to fix end, depending on what else fits into p2 range (if nothing, can put p2.end right away) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
300 // fall-through to get p1TotalAppliedDelta incremented; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
301 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
302 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
303 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
304 } else { // p1EntryAppliedStart >= p2EntryStart | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
305 if (p2EntryEnd < p1EntryAppliedStart) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
306 // newer patch completely fits between two older patches | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
307 r.add(p2EntryStart - p1TotalAppliedDelta, p2EntryEnd - p1TotalAppliedDelta, p2Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
308 // SHALL NOT increment p1TotalAppliedDelta as we didn't use any of p1 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
309 continue L0; // next p2 | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
310 } else { // p2EntryEnd >= p1EntryAppliedStart | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
311 // SKETCH: I or IV | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
312 // p2EntryEnd is either < p1EntryAppliedEnd or past it | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
313 if (p2EntryEnd <= p1EntryAppliedEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
314 // SKETCH: I: copy p2, strip p1 to start from p2EntryEnd, next i (p2) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
315 insideP1entry = true; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
316 int e = p2EntryEnd - p1TotalAppliedDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
317 if (e > p1EntryEnd) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
318 e = p1EntryEnd; // added by analogy with above. Is needed? | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
319 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
320 r.add(p2EntryStart - p1TotalAppliedDelta, e, p2Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
321 p1EntryStart = e; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
322 int p1DataShift = p2EntryEnd - p1EntryAppliedStart; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
323 if (p1DataShift >= p1EntryLen) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
324 p1EntryLen = 0; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
325 p1Data = new byte[0]; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
326 } else { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
327 p1EntryLen -= p1DataShift; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
328 p1Data = subarray(p1Data, p1DataShift, p1Data.length - 1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
329 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
330 // p1TotalAppliedDelta would get incremented once this modified p1 is handled | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
331 continue L0; // next p2; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
332 } else { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
333 // p2EntryEnd > p1EntryAppliedEnd | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
334 // SKETCH IV: skip (rest of) p1 completely, continue the same unless found p1 with start or end past p2EntryEnd. | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
335 insideP1entry = false; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
336 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
337 insideP2entry = true; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
338 p2EntryStartOffset = p1TotalAppliedDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
339 // fall-through to get p1TotalAppliedDelta incremented | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
340 } | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
341 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
342 } | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
343 p1TotalAppliedDelta += p1EntryDelta; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
344 } // while (p1 < p1Max) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
345 { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
346 // no more p1 entries, shall close p2 (if it's handled, code above jumps directly to L0) | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
347 // regardless of whether insideP2 is .t | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
348 int s = p2EntryStart; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
349 // p2EntryStartOffset != -1 when we started p2 entry processing, but not completed | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
350 // if we handled last p1 entry but didn't start with p2 entry processing, it's -1 and regular p1 delta shall be used | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
351 s -= p2EntryStartOffset == -1 ? p1TotalAppliedDelta : p2EntryStartOffset; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
352 r.add(s, p2EntryEnd - p1TotalAppliedDelta, p2Data); | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
353 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
354 } | 
| 
330
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
355 if (p1 < p1Max && insideP1entry) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
356 r.add(p1EntryStart, p1EntryEnd, p1Data); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
357 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
358 } | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
359 while (p1 < p1Max) { | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
360 r.add(this, p1); | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
361 p1++; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
362 }; | 
| 
 
9747a786a34d
Patch merging algorithm complete trial
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents: 
329 
diff
changeset
 | 
363 return r; | 
| 
329
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
364 } | 
| 
 
694ebabb5cb3
Refactor revlog patch mechanism, towards patch merging
 
Artem Tikhomirov <tikhomirov.artem@gmail.com> 
parents:  
diff
changeset
 | 
365 } | 
