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