summaryrefslogtreecommitdiff
path: root/app/models/commit.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/commit.rb')
-rw-r--r--app/models/commit.rb89
1 files changed, 81 insertions, 8 deletions
diff --git a/app/models/commit.rb b/app/models/commit.rb
index 665f136..4abe0da 100644
--- a/app/models/commit.rb
+++ b/app/models/commit.rb
@@ -2,25 +2,30 @@
#
# Table name: commits
#
-# id :integer not null, primary key
-# project_id :integer
-# ref :string(255)
-# sha :string(255)
-# before_sha :string(255)
-# push_data :text
-# created_at :datetime
-# updated_at :datetime
+# id :integer not null, primary key
+# project_id :integer
+# ref :string(255)
+# sha :string(255)
+# before_sha :string(255)
+# push_data :text
+# created_at :datetime
+# updated_at :datetime
#
class Commit < ActiveRecord::Base
belongs_to :project
has_many :builds
+ has_many :jobs, through: :builds
serialize :push_data
validates_presence_of :ref, :sha, :before_sha, :push_data
validate :valid_commit_sha
+ def to_param
+ sha
+ end
+
def last_build
builds.last
end
@@ -94,4 +99,72 @@ class Commit < ActiveRecord::Base
recipients << git_author_email if project.email_add_committer?
recipients.uniq
end
+
+ def create_builds
+ project.jobs.active.map do |job|
+ build = builds.new(commands: job.commands)
+ build.job = job
+ build.save
+ build
+ end
+ end
+
+ def builds_without_retry
+ @builds_without_retry ||=
+ begin
+ grouped_builds = builds.group_by(&:job)
+ grouped_builds.map do |job, builds|
+ builds.sort_by(&:id).last
+ end
+ end
+ end
+
+ def status
+ if success?
+ 'success'
+ elsif pending?
+ 'pending'
+ elsif running?
+ 'running'
+ else
+ 'failed'
+ end
+ end
+
+ def pending?
+ builds_without_retry.all? do |build|
+ build.pending?
+ end
+ end
+
+ def running?
+ builds_without_retry.any? do |build|
+ build.running? || build.pending?
+ end
+ end
+
+ def success?
+ builds_without_retry.all? do |build|
+ build.success?
+ end
+ end
+
+ def failed?
+ status == 'failed'
+ end
+
+ def canceled?
+ end
+
+ def duration
+ end
+
+ def finished_at
+ end
+
+ def coverage
+ if builds.size == 1
+ builds.first.coverage
+ end
+ end
end