Mercurial > hg4j
annotate src/org/tmatesoft/hg/internal/Patch.java @ 387:cdea37239b01
Issue 23: HgInvalidRevisionException for svn imported repository (changeset 0 references nullid manifest). Tests
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Mon, 13 Feb 2012 15:11: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 } |