57 lines
1.7 KiB
Ruby
57 lines
1.7 KiB
Ruby
# -*- encoding : utf-8 -*-
|
|
module Grit
|
|
class Diff
|
|
def self.list_from_string(repo, text)
|
|
lines = text.split("\n")
|
|
|
|
diffs = []
|
|
|
|
while !lines.empty?
|
|
m, a_path, b_path = *lines.shift.match(%r{^diff --git "{0,1}a/(.+?)"{0,1} "{0,1}b/(.+?)"{0,1}$})
|
|
|
|
if lines.first =~ /^old mode/
|
|
m, a_mode = *lines.shift.match(/^old mode (\d+)/)
|
|
m, b_mode = *lines.shift.match(/^new mode (\d+)/)
|
|
end
|
|
|
|
if lines.empty? || lines.first =~ /^diff --git/
|
|
diffs << Diff.new(repo, a_path, b_path, nil, nil, a_mode, b_mode, false, false, nil)
|
|
next
|
|
end
|
|
|
|
sim_index = 0
|
|
new_file = false
|
|
deleted_file = false
|
|
renamed_file = false
|
|
|
|
if lines.first =~ /^new file/
|
|
m, b_mode = lines.shift.match(/^new file mode (.+)$/)
|
|
a_mode = nil
|
|
new_file = true
|
|
elsif lines.first =~ /^deleted file/
|
|
m, a_mode = lines.shift.match(/^deleted file mode (.+)$/)
|
|
b_mode = nil
|
|
deleted_file = true
|
|
elsif lines.first =~ /^similarity index (\d+)\%/
|
|
sim_index = $1.to_i
|
|
renamed_file = true
|
|
2.times { lines.shift } # shift away the 2 `rename from/to ...` lines
|
|
end
|
|
|
|
m, a_blob, b_blob, b_mode = *lines.shift.match(%r{^index ([0-9A-Fa-f]+)\.\.([0-9A-Fa-f]+) ?(.+)?$})
|
|
b_mode.strip! if b_mode
|
|
|
|
diff_lines = []
|
|
while lines.first && lines.first !~ /^diff/
|
|
diff_lines << lines.shift
|
|
end
|
|
diff = diff_lines.join("\n")
|
|
|
|
diffs << Diff.new(repo, a_path, b_path, a_blob, b_blob, a_mode, b_mode, new_file, deleted_file, diff, renamed_file, sim_index)
|
|
end
|
|
|
|
diffs
|
|
end
|
|
end
|
|
end
|