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