Mercurial > hg > soundsoftware-site
comparison lib/diff.rb @ 1115:433d4f72a19b redmine-2.2
Update to Redmine SVN revision 11137 on 2.2-stable branch
author | Chris Cannam |
---|---|
date | Mon, 07 Jan 2013 12:01:42 +0000 |
parents | cbb26bc654de |
children |
comparison
equal
deleted
inserted
replaced
929:5f33065ddc4b | 1115:433d4f72a19b |
---|---|
31 (astart..afinish).each { |aindex| | 31 (astart..afinish).each { |aindex| |
32 aelem = a[aindex] | 32 aelem = a[aindex] |
33 next unless bmatches.has_key? aelem | 33 next unless bmatches.has_key? aelem |
34 k = nil | 34 k = nil |
35 bmatches[aelem].reverse.each { |bindex| | 35 bmatches[aelem].reverse.each { |bindex| |
36 if k && (thresh[k] > bindex) && (thresh[k-1] < bindex) | 36 if k && (thresh[k] > bindex) && (thresh[k-1] < bindex) |
37 thresh[k] = bindex | 37 thresh[k] = bindex |
38 else | 38 else |
39 k = thresh.replacenextlarger(bindex, k) | 39 k = thresh.replacenextlarger(bindex, k) |
40 end | 40 end |
41 links[k] = [ (k==0) ? nil : links[k-1], aindex, bindex ] if k | 41 links[k] = [ (k==0) ? nil : links[k-1], aindex, bindex ] if k |
42 } | 42 } |
43 } | 43 } |
44 | 44 |
45 if !thresh.empty? | 45 if !thresh.empty? |
46 link = links[thresh.length-1] | 46 link = links[thresh.length-1] |
47 while link | 47 while link |
48 mvector[link[1]] = link[2] | 48 mvector[link[1]] = link[2] |
49 link = link[0] | 49 link = link[0] |
50 end | 50 end |
51 end | 51 end |
52 | 52 |
53 return mvector | 53 return mvector |
54 end | 54 end |
57 mvector = Diff.lcs(a, b) | 57 mvector = Diff.lcs(a, b) |
58 ai = bi = 0 | 58 ai = bi = 0 |
59 while ai < mvector.length | 59 while ai < mvector.length |
60 bline = mvector[ai] | 60 bline = mvector[ai] |
61 if bline | 61 if bline |
62 while bi < bline | 62 while bi < bline |
63 discardb(bi, b[bi]) | 63 discardb(bi, b[bi]) |
64 bi += 1 | 64 bi += 1 |
65 end | 65 end |
66 match(ai, bi) | 66 match(ai, bi) |
67 bi += 1 | 67 bi += 1 |
68 else | 68 else |
69 discarda(ai, a[ai]) | 69 discarda(ai, a[ai]) |
70 end | 70 end |
71 ai += 1 | 71 ai += 1 |
72 end | 72 end |
73 while ai < a.length | 73 while ai < a.length |
74 discarda(ai, a[ai]) | 74 discarda(ai, a[ai]) |
86 diffs = [] | 86 diffs = [] |
87 @diffs.each { |df| | 87 @diffs.each { |df| |
88 i = 0 | 88 i = 0 |
89 curdiff = [] | 89 curdiff = [] |
90 while i < df.length | 90 while i < df.length |
91 whot = df[i][0] | 91 whot = df[i][0] |
92 s = @isstring ? df[i][2].chr : [df[i][2]] | 92 s = @isstring ? df[i][2].chr : [df[i][2]] |
93 p = df[i][1] | 93 p = df[i][1] |
94 last = df[i][1] | 94 last = df[i][1] |
95 i += 1 | 95 i += 1 |
96 while df[i] && df[i][0] == whot && df[i][1] == last+1 | 96 while df[i] && df[i][0] == whot && df[i][1] == last+1 |
97 s << df[i][2] | 97 s << df[i][2] |
98 last = df[i][1] | 98 last = df[i][1] |
99 i += 1 | 99 i += 1 |
100 end | 100 end |
101 curdiff.push [whot, p, s] | 101 curdiff.push [whot, p, s] |
102 end | 102 end |
103 diffs.push curdiff | 103 diffs.push curdiff |
104 } | 104 } |
105 return diffs | 105 return diffs |
106 end | 106 end |
158 def reverse_hash(range = (0...self.length)) | 158 def reverse_hash(range = (0...self.length)) |
159 revmap = {} | 159 revmap = {} |
160 range.each { |i| | 160 range.each { |i| |
161 elem = self[i] | 161 elem = self[i] |
162 if revmap.has_key? elem | 162 if revmap.has_key? elem |
163 revmap[elem].push i | 163 revmap[elem].push i |
164 else | 164 else |
165 revmap[elem] = [i] | 165 revmap[elem] = [i] |
166 end | 166 end |
167 } | 167 } |
168 return revmap | 168 return revmap |
169 end | 169 end |
170 | 170 |
179 while low < high | 179 while low < high |
180 index = (high+low)/2 | 180 index = (high+low)/2 |
181 found = self[index] | 181 found = self[index] |
182 return nil if value == found | 182 return nil if value == found |
183 if value > found | 183 if value > found |
184 low = index + 1 | 184 low = index + 1 |
185 else | 185 else |
186 high = index | 186 high = index |
187 end | 187 end |
188 end | 188 end |
189 | 189 |
190 self[low] = value | 190 self[low] = value |
191 # $stderr << "replace #{value} : 0/#{low}/#{init_high} (#{steps} steps) (#{init_high-low} off )\n" | 191 # $stderr << "replace #{value} : 0/#{low}/#{init_high} (#{steps} steps) (#{init_high-low} off )\n" |
204 end | 204 end |
205 ai = 0 | 205 ai = 0 |
206 bi = 0 | 206 bi = 0 |
207 diff.diffs.each { |d| | 207 diff.diffs.each { |d| |
208 d.each { |mod| | 208 d.each { |mod| |
209 case mod[0] | 209 case mod[0] |
210 when '-' | 210 when '-' |
211 while ai < mod[1] | 211 while ai < mod[1] |
212 newary << self[ai] | 212 newary << self[ai] |
213 ai += 1 | 213 ai += 1 |
214 bi += 1 | 214 bi += 1 |
215 end | 215 end |
216 ai += 1 | 216 ai += 1 |
217 when '+' | 217 when '+' |
218 while bi < mod[1] | 218 while bi < mod[1] |
219 newary << self[ai] | 219 newary << self[ai] |
220 ai += 1 | 220 ai += 1 |
221 bi += 1 | 221 bi += 1 |
222 end | 222 end |
223 newary << mod[2] | 223 newary << mod[2] |
224 bi += 1 | 224 bi += 1 |
225 else | 225 else |
226 raise "Unknown diff action" | 226 raise "Unknown diff action" |
227 end | 227 end |
228 } | 228 } |
229 } | 229 } |
230 while ai < self.length | 230 while ai < self.length |
231 newary << self[ai] | 231 newary << self[ai] |
232 ai += 1 | 232 ai += 1 |