1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
module Gitlab
class GitStats
attr_accessor :repo, :ref
def initialize repo, ref
@repo, @ref = repo, ref
end
def authors
@authors ||= collect_authors
end
def commits_count
@commits_count ||= repo.commit_count(ref)
end
def files_count
repo.git.sh("git ls-tree -r --name-only #{ref} | wc -l").first.to_i
end
def authors_count
authors.size
end
def graph
@graph ||= build_graph
end
protected
def collect_authors
shortlog = repo.git.shortlog({e: true, s: true }, ref)
authors = []
lines = shortlog.split("\n")
lines.each do |line|
data = line.split("\t")
commits = data.first
author = Grit::Actor.from_string(data.last)
authors << OpenStruct.new(
name: author.name,
email: author.email,
commits: commits.to_i
)
end
authors.sort_by(&:commits).reverse
end
def build_graph n = 4
from, to = (Date.today - n.weeks), Date.today
format = "--pretty=format:'%h|%at|%ai|%aE'"
commits_strings = repo.git.sh("git rev-list --since #{from.to_s(:date)} #{format} #{ref} | grep -v commit")[0].split("\n")
commits_dates = commits_strings.map do |string|
data = string.split("|")
date = data[2]
Time.parse(date).to_date.to_s(:date)
end
commits_per_day = from.upto(to).map do |day|
commits_dates.count(day.to_date.to_s(:date))
end
OpenStruct.new(
labels: from.upto(to).map { |day| day.stamp('Aug 23') },
commits: commits_per_day,
weeks: n
)
end
end
end