diff options
Diffstat (limited to 'app/models/cycle_analytics/summary.rb')
-rw-r--r-- | app/models/cycle_analytics/summary.rb | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/app/models/cycle_analytics/summary.rb b/app/models/cycle_analytics/summary.rb new file mode 100644 index 00000000000..b46db449bf3 --- /dev/null +++ b/app/models/cycle_analytics/summary.rb @@ -0,0 +1,42 @@ +class CycleAnalytics + class Summary + def initialize(project, from:) + @project = project + @from = from + end + + def new_issues + @project.issues.created_after(@from).count + end + + def commits + ref = @project.default_branch.presence + count_commits_for(ref) + end + + def deploys + @project.deployments.where("created_at > ?", @from).count + end + + private + + # Don't use the `Gitlab::Git::Repository#log` method, because it enforces + # a limit. Since we need a commit count, we _can't_ enforce a limit, so + # the easiest way forward is to replicate the relevant portions of the + # `log` function here. + def count_commits_for(ref) + return unless ref + + repository = @project.repository.raw_repository + sha = @project.repository.commit(ref).sha + + cmd = %W(git --git-dir=#{repository.path} log) + cmd << '--format=%H' + cmd << "--after=#{@from.iso8601}" + cmd << sha + + raw_output = IO.popen(cmd) { |io| io.read } + raw_output.lines.count + end + end +end |