module GitWrapper module Commands class Log < Git ATTRIBUTES = { :commit_hash => 'H', :abbreviated_commit_hash => 'h', :tree_hash => 'T', :abbreviated_tree_hash => 't', :parent_hashes => 'P', :abbreviated_parent_hashes => 'p', :author_name => 'an', :author_name_mailmap => 'aN', :author_email => 'ae', :author_email_mailmap => 'aE', :author_date => 'ad', :author_date_rfc2822 => 'aD', :author_date_relative => 'aR', :author_date_unix => 'at', :author_date_iso => 'ai', :commiter_name => 'cn', :commiter_name_mailmap => 'cN', :commiter_email => 'ce', :commiter_email_mailmap => 'cE', :commiter_date => 'cd', :commiter_date_rfc2822 => 'cD', :commiter_date_relative => 'cR', :commiter_date_unix => 'ct', :commiter_date_iso => 'ci', :ref_names => 'd', :encoding => 'e', :subject => 's', :sanitized_subject_line => 'f', :body => 'b', :raw_body => 'B', :commit_notes => 'N', :reflog_selector => 'gD', :shortened_reflog_selector => 'gd', :reflog_subject => 'gs' } def files(files) @files = files.map{|f|to_relative_path(f)} self end def commit(commit) @commit = commit self end def author(author) @author = author self end def grep(grep) @grep = grep self end def since(date) @since = date self end def until(date) @until = date self end def skip(skip) @skip = skip self end def max_count(max_count) @max_count = max_count self end def command command = "log -i --format=\"#{xml_structure}\"" command += " #{@commit}" if @commit command += " --author \"#{@author}\"" if @author command += " --since \"#{@since}\"" if @since command += " --until \"#{@until}\"" if @until command += " --grep \"#{@grep}\"" if @grep command += " --skip #{@skip}" if @skip command += " --max-count \"#{@max_count}\"" if @max_count command += " #{@files.map{|f| "\"#{f}\"" }.join(' ')}" if @files command end def result return nil unless success? results = [] if output results = Nokogiri::XML("#{output}").xpath('logs/log').map do |element| Results::LogInfo.new(Hash[*element.children.flat_map { |node| [node.name.to_sym, node.text] }]) end end @commit ? results.first : results end private def xml_structure ATTRIBUTES.map { |attribute, placeholder| "<#{attribute}>%#{placeholder}" }.join end end end end