class DeepBlame::Blame

Attributes

data[R]

Public Class Methods

find(rev, path, start_line, end_line = nil) click to toggle source
# File lib/deep_blame.rb, line 47
def self.find(rev, path, start_line, end_line = nil)
  end_line ||= start_line
  command = "git blame -b --incremental -l -L #{start_line},#{end_line} #{rev} #{path}"
  # puts "Running: #{command}"
  result = `#{command}`
  segments = result.scan(/[\s\S]+?filename.+/)
  segments.collect do |segment|
    new parse_segment(segment)
  end
end
find_recursive_uniq(*args) click to toggle source
# File lib/deep_blame.rb, line 58
def self.find_recursive_uniq(*args)
  result = find(*args)
  result.collect {|r| r.recursive }.flatten.uniq {|b| b.sha }
end
new(data) click to toggle source
# File lib/deep_blame.rb, line 79
def initialize(data)
  @data = data
end
parse_segment(blame) click to toggle source
# File lib/deep_blame.rb, line 63
def self.parse_segment(blame)
  first_line = blame.slice!(/.+/)
  hsh = [:sha, :line_number_original_file, :line_number_final_file,
   :line_number_group].inject({}) do |h, attr|
    h[attr] = first_line.slice!(/\w+/) ; h
  end
  hsh[:line_number_group] = nil if hsh[:line_number_group] == 0
  blame.strip.split("\n").inject(hsh) do |h, line|
    key = line.slice!(/\S+/)
    key = key.gsub("-","_").to_sym
    h[key] = line.strip.empty? ? true : line.strip
    h
  end
end

Public Instance Methods

committed_at() click to toggle source
# File lib/deep_blame.rb, line 98
def committed_at
  @committed_at ||= Time.at(committer_time.to_i)
end
parent() click to toggle source

rev, path, start_line, end_line = nil

# File lib/deep_blame.rb, line 123
def parent
  if previous?
    @parent_results = self.class.find(previous_sha, previous_file, previous_line_number)
    puts "#{@parent_result.length} results for #{previous_sha}. Interesting." if @parent_results.length > 1
    @parent_results.first
  end
end
previous?() click to toggle source
# File lib/deep_blame.rb, line 106
def previous?
  previous # or !boundary # ?
end
previous_file() click to toggle source
# File lib/deep_blame.rb, line 114
def previous_file
  previous.sub(/^\S+\s+/,'')
end
previous_line_number() click to toggle source
# File lib/deep_blame.rb, line 118
def previous_line_number
  line_number_original_file
end
previous_sha() click to toggle source
# File lib/deep_blame.rb, line 110
def previous_sha
  previous[/^\S+/]
end
recursive() click to toggle source
# File lib/deep_blame.rb, line 92
def recursive
  all = [self]
  all += parent.recursive if parent
  all
end
short_sha() click to toggle source
# File lib/deep_blame.rb, line 102
def short_sha
  sha[0..6]
end