summaryrefslogtreecommitdiff
path: root/app/models/commit_status.rb
diff options
context:
space:
mode:
authorKamil Trzcinski <ayufan@ayufan.eu>2016-04-12 19:57:54 +0200
committerKamil Trzcinski <ayufan@ayufan.eu>2016-04-12 20:37:57 +0200
commit8e84acbf2e7e306ba937aaae87cfed35d2632e10 (patch)
tree40a530e78e7b0be13cbd18435bb7105fb9a3eb2c /app/models/commit_status.rb
parent89f0dc713ca07fe935fa9ce2c31d0ca6febb5d6c (diff)
downloadgitlab-ce-8e84acbf2e7e306ba937aaae87cfed35d2632e10.tar.gz
Optimise CI status accessor
Diffstat (limited to 'app/models/commit_status.rb')
-rw-r--r--app/models/commit_status.rb35
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