class Git::Lib::RawLogParser

@api private
A private parser class to process the output of ‘git log –pretty=raw`

def finalize_commit

def finalize_commit
  @commits << @current_commit if @current_commit
end

def initialize(lines)

def initialize(lines)
  @lines = lines
  @commits = []
  @current_commit = nil
  @in_message = false
end

def parse

def parse
  @lines.each { |line| process_line(line.chomp) }
  finalize_commit
  @commits
end

def process_line(line)

def process_line(line)
  if line.empty?
    @in_message = !@in_message
    return
  end
  @in_message = false if @in_message && !line.start_with?('    ')
  @in_message ? process_message_line(line) : process_metadata_line(line)
end

def process_message_line(line)

def process_message_line(line)
  @current_commit['message'] << "#{line[4..]}\n"
end

def process_metadata_line(line)

def process_metadata_line(line)
  key, *value = line.split
  value = value.join(' ')
  case key
  when 'commit'
    start_new_commit(value)
  when 'parent'
    @current_commit['parent'] << value
  else
    @current_commit[key] = value
  end
end

def start_new_commit(sha)

def start_new_commit(sha)
  finalize_commit
  @current_commit = { 'sha' => sha, 'message' => +'', 'parent' => [] }
end