lib/git/log.rb
module Git
# object that holds the last X commits on given branch
class Log
include Enumerable
def initialize(base, count = 30)
dirty_log
@base = base
@count = count
end
def all
dirty_log
@all = true
self
end
def object(objectish)
dirty_log
@object = objectish
return self
end
def author(regex)
dirty_log
@author = regex
return self
end
def grep(regex)
dirty_log
@grep = regex
return self
end
def path(path)
dirty_log
@path = path
return self
end
def skip(num)
dirty_log
@skip = num
return self
end
def since(date)
dirty_log
@since = date
return self
end
def until(date)
dirty_log
@until = date
return self
end
def between(sha1, sha2 = nil)
dirty_log
@between = [sha1, sha2]
return self
end
def cherry
dirty_log
@cherry = true
return self
end
def to_s
self.map { |c| c.to_s }.join("\n")
end
# forces git log to run
def size
check_log
@commits.size rescue nil
end
def each(&block)
check_log
@commits.each(&block)
end
def first
check_log
@commits.first rescue nil
end
def last
check_log
@commits.last rescue nil
end
def [](index)
check_log
@commits[index] rescue nil
end
private
def dirty_log
@dirty_flag = true
end
def check_log
if @dirty_flag
run_log
@dirty_flag = false
end
end
# actually run the 'git log' command
def run_log
log = @base.lib.full_log_commits(
count: @count, all: @all, object: @object, path_limiter: @path, since: @since,
author: @author, grep: @grep, skip: @skip, until: @until, between: @between,
cherry: @cherry
)
@commits = log.map { |c| Git::Object::Commit.new(@base, c['sha'], c) }
end
end
end