diff options
author | Kamil Trzcinski <ayufan@ayufan.eu> | 2016-04-12 19:57:54 +0200 |
---|---|---|
committer | Kamil Trzcinski <ayufan@ayufan.eu> | 2016-04-12 20:37:57 +0200 |
commit | 8e84acbf2e7e306ba937aaae87cfed35d2632e10 (patch) | |
tree | 40a530e78e7b0be13cbd18435bb7105fb9a3eb2c /app/models/commit_status.rb | |
parent | 89f0dc713ca07fe935fa9ce2c31d0ca6febb5d6c (diff) | |
download | gitlab-ce-8e84acbf2e7e306ba937aaae87cfed35d2632e10.tar.gz |
Optimise CI status accessor
Diffstat (limited to 'app/models/commit_status.rb')
-rw-r--r-- | app/models/commit_status.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index e8a331e720c..8a7b1f00cde 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -49,6 +49,7 @@ class CommitStatus < ActiveRecord::Base scope :latest, -> { where(id: unscope(:select).select('max(id)').group(:name, :commit_id)) } scope :ordered, -> { order(:ref, :stage_idx, :name) } + scope :ignored, -> { where(allow_failure: true, status: [:failed, :canceled]) } AVAILABLE_STATUSES = ['pending', 'running', 'success', 'failed', 'canceled'] @@ -84,6 +85,40 @@ class CommitStatus < ActiveRecord::Base delegate :before_sha, :sha, :short_sha, to: :commit, prefix: false + def self.stages + order_by = 'max(stage_idx)' + group('stage').order(order_by).pluck(:stage, order_by).map(&:first).compact + end + + def self.status_sql + builds = all.select('count(id)').to_sql + success = all.success.select('count(id)').to_sql + ignored = all.failed.where(allow_failure: true).select('count(id)').to_sql if all.try(:ignored) + ignored ||= '0' + pending = all.pending.select('count(id)').to_sql + running = all.running.select('count(id)').to_sql + canceled = all.canceled.select('count(id)').to_sql + + deduce_status = "(CASE + WHEN (#{builds})=0 THEN 'skipped' + WHEN (#{builds})=(#{success})+(#{ignored}) THEN 'success' + WHEN (#{builds})=(#{pending}) THEN 'pending' + WHEN (#{builds})=(#{canceled}) THEN 'canceled' + WHEN (#{running})+(#{pending})>0 THEN 'running' + ELSE 'failed' + END)" + + deduce_status + end + + def self.status + pluck(self.status_sql).first + end + + def self.stages_status + Hash[group(:stage).pluck(:stage, self.status_sql)] + end + def ignored? allow_failure? && (failed? || canceled?) end |