commits_helper.rb
3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
module CommitsHelper
def commit_msg_with_link_to_issues(project, message)
return '' unless message
out = ''
message.split(/(#[0-9]+)/m).each do |m|
if m =~ /(#([0-9]+))/m
begin
issue = project.issues.find($2)
out += link_to($1, project_issue_path(project, $2))
rescue
out += $1
end
else
out += m
end
end
preserve out
end
def identification_type(line)
if line[0] == "+"
"new"
elsif line[0] == "-"
"old"
else
nil
end
end
def build_line_anchor(index, line_new, line_old)
"#{index}_#{line_old}_#{line_new}"
end
def each_diff_line(diff_arr, index)
line_old = 1
line_new = 1
type = nil
lines_arr = inline_diff diff_arr
#lines_arr = diff_arr
lines_arr.each do |line|
next if line.match(/^\-\-\- \/dev\/null/)
next if line.match(/^\+\+\+ \/dev\/null/)
next if line.match(/^\-\-\- a/)
next if line.match(/^\+\+\+ b/)
full_line = html_escape(line.gsub(/\n/, ''))
full_line.gsub!("#!idiff-start!#", "<span class='idiff'>")
full_line.gsub!("#!idiff-finish!#", "</span>")
if line.match(/^@@ -/)
type = "match"
line_old = line.match(/\-[0-9]*/)[0].to_i.abs rescue 0
line_new = line.match(/\+[0-9]*/)[0].to_i.abs rescue 0
next if line_old == 1 && line_new == 1 #top of file
yield(full_line, type, nil, nil, nil)
next
else
type = identification_type(line)
line_code = build_line_anchor(index, line_new, line_old)
yield(full_line, type, line_code, line_new, line_old)
end
if line[0] == "+"
line_new += 1
elsif line[0] == "-"
line_old += 1
else
line_new += 1
line_old += 1
end
end
end
def image_diff_class(diff)
if diff.deleted_file
"diff_image_removed"
elsif diff.new_file
"diff_image_added"
else
nil
end
end
def inline_diff diff_arr
chain_of_first_symbols = ""
diff_arr.each_with_index do |line, i|
chain_of_first_symbols += line[0]
end
chain_of_first_symbols.gsub!(/[^\-\+]/, "#")
offset = 0
indexes = []
while index = chain_of_first_symbols.index("#-+#", offset)
indexes << index
offset = index + 1
end
indexes.each do |index|
first_line = diff_arr[index+1]
second_line = diff_arr[index+2]
max_length = [first_line.size, second_line.size].max
first_the_same_symbols = 0
(0..max_length + 1).each do |i|
first_the_same_symbols = i - 1
if first_line[i] != second_line[i] && i > 0
break
end
end
first_token = first_line[0..first_the_same_symbols][1..-1]
diff_arr[index+1].sub!(first_token, first_token + "#!idiff-start!#")
diff_arr[index+2].sub!(first_token, first_token + "#!idiff-start!#")
last_the_same_symbols = 0
(1..max_length + 1).each do |i|
last_the_same_symbols = -i
if first_line[-i] != second_line[-i]
break
end
end
last_the_same_symbols += 1
last_token = first_line[last_the_same_symbols..-1]
diff_arr[index+1].sub!(/#{last_token}$/, "#!idiff-finish!#" + last_token)
diff_arr[index+2].sub!(/#{last_token}$/, "#!idiff-finish!#" + last_token)
end
diff_arr
end
end