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