class Olelo::PatchParser
Public Class Methods
parse(patch, *h)
click to toggle source
# File lib/olelo/patch.rb, line 115 def self.parse(patch, *h) h = h.size == 1 ? h[0] : Adapter.new(h) src = dst = nil state = :start h.initialize! patch.split("\n").each do |line| case state when :start case line when %r{^diff.* ("?a/.*"?) ("?b/.*"?)$} src, dst = unescape_path($1), unescape_path($2) state = :header when /^\+\+\+ (.*)/ dst = unescape_path($1) state = :header when /^\-\-\- (.*)/ src = unescape_path($1) state = :header end when :header case line when %r{^diff.* ("?a/.*"?) ("?b/.*"?)$} a, b = $1, $2 h.begin!(src, dst) dst ? h.no_changes! : h.deleted! h.end! src, dst = unescape_path(a), unescape_path(b) when /^\+\+\+ (.*)/ dst = unescape_path($1) when /^\-\-\- (.*)/ src = unescape_path($1) when /^deleted file/ dst = nil when /^Binary files (.*) and (.*) differ/ src, dst = unescape_path($1), unescape_path($2) h.begin!(src, dst) h.binary! h.end! state = :start when /^@/ state = :body h.begin!(src, dst) end when :body case line when %r{^diff.* ("?a/.*"?) ("?b/.*"?)$} src, dst = unescape_path($1), unescape_path($2) h.end! state = :header else h.line!(line) end end end case state when :header h.begin!(src, dst) dst ? h.no_changes! : h.deleted! h.end! when :body h.end! end h.finalize! h end
unescape_path(path)
click to toggle source
# File lib/olelo/patch.rb, line 181 def self.unescape_path(path) path = unescape_backslash(path[1..-2]) if path.starts_with? '"' path == '/dev/null' ? nil : path[2..-1] end