28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
# File 'lib/diff.rb', line 28
def self.diff(old, old_name, new, new_name)
if old == new
return true
end
old_index = 0
new_index = 0
state = :matching
old_trigger_pulled = false
while old_index < old.length || new_index < new.length
old_line = old[old_index]
new_line = new[new_index]
case state
when :matching
if old_line == new_line
puts old_line
old_index += 1
new_index += 1
else
if old_line
state = :old
old_trigger_pulled = true
else
puts Diff.separator('>', new_name)
state = :old_eof
end
end
when :old
idx = new_line ? new[new_index..-1].find_index(old_line) : nil
if idx
idx += new_index
if idx > new_index
puts Diff.separator('>', new_name)
end
for i in new_index...idx
puts new[i]
end
puts Diff.separator('=', 'common')
new_index = idx
state = :matching
else
if old_trigger_pulled
puts Diff.separator('<', old_name)
old_trigger_pulled = false
end
puts old_line
old_index += 1
end
when :old_eof
if new_line
puts new_line
new_index += 1
end
end
end
false
end
|