rosa-build/app/models/build_list.rb

134 lines
4.6 KiB
Ruby
Raw Normal View History

2011-04-07 14:20:21 +01:00
class BuildList < ActiveRecord::Base
belongs_to :project
belongs_to :arch
belongs_to :pl, :class_name => 'Platform'
belongs_to :bpl, :class_name => 'Platform'
2011-04-11 11:47:57 +01:00
has_many :items, :class_name => "BuildList::Item", :dependent => :destroy
2011-04-07 14:20:21 +01:00
validates :project_id, :presence => true
validates :project_version, :presence => true
#validates_inclusion_of :update_type, :in => UPDATE_TYPES#, :message => "extension %s is not included in the list"
2011-04-07 14:20:21 +01:00
UPDATE_TYPES = %w[security bugfix enhancement recommended newpackage]
validates :update_type, :inclusion => UPDATE_TYPES
validate lambda {
errors.add(:pl, I18n.t('flash.build_list.wrong_platform')) if bpl.platform_type == 'main' && pl_id != bpl_id
}
BUILD_CANCELED = 5000
2011-04-11 17:37:09 +01:00
WAITING_FOR_RESPONSE = 4000
BUILD_PENDING = 2000
BUILD_STARTED = 3000
STATUSES = [WAITING_FOR_RESPONSE,
BuildServer::SUCCESS,
BUILD_PENDING,
BUILD_STARTED,
BuildServer::BUILD_ERROR,
BuildServer::PLATFORM_NOT_FOUND,
BuildServer::PLATFORM_PENDING,
BuildServer::PROJECT_NOT_FOUND,
BuildServer::BRANCH_NOT_FOUND]
2011-04-07 14:20:21 +01:00
HUMAN_STATUSES = { BuildServer::BUILD_ERROR => :build_error,
BUILD_PENDING => :build_pending,
BUILD_STARTED => :build_started,
2011-04-11 17:37:09 +01:00
BuildServer::SUCCESS => :success,
WAITING_FOR_RESPONSE => :waiting_for_response,
BuildServer::PLATFORM_NOT_FOUND => :platform_not_found,
BuildServer::PLATFORM_PENDING => :platform_pending,
BuildServer::PROJECT_NOT_FOUND => :project_not_found,
BuildServer::BRANCH_NOT_FOUND => :branch_not_found
2011-04-07 14:20:21 +01:00
}
scope :recent, order("created_at DESC")
2011-04-11 17:37:09 +01:00
scope :current, lambda {
outdatable_statuses = [BuildServer::SUCCESS, BuildServer::ERROR, BuildServer::PLATFORM_NOT_FOUND, BuildServer::PLATFORM_PENDING, BuildServer::PROJECT_NOT_FOUND, BuildServer::BRANCH_NOT_FOUND]
where(["status in (?) OR (status in (?) AND notified_at >= ?)", [WAITING_FOR_RESPONSE, BUILD_PENDING, BUILD_STARTED], outdatable_statuses, Time.now - 2.days])
}
2011-04-07 14:20:21 +01:00
scope :for_status, lambda {|status| where(:status => status) }
scope :scoped_to_arch, lambda {|arch| where(:arch_id => arch) }
scope :scoped_to_branch, lambda {|branch| where(:project_version => branch) }
scope :scoped_to_is_circle, lambda {|is_circle| where(:is_circle => is_circle) }
2011-04-07 14:20:21 +01:00
scope :for_creation_date_period, lambda{|start_date, end_date|
if start_date && end_date
where(["created_at BETWEEN ? AND ?", start_date, end_date])
elsif start_date && !end_date
where(["created_at >= ?", start_date])
elsif !start_date && end_date
where(["created_at <= ?", end_date])
end
}
scope :for_notified_date_period, lambda{|start_date, end_date|
if start_date && end_date
where(["notified_at BETWEEN ? AND ?", start_date, end_date])
elsif start_date && !end_date
where(["notified_at >= ?", start_date])
elsif !start_date && end_date
where(["notified_at <= ?", end_date])
end
}
2011-04-11 11:47:57 +01:00
serialize :additional_repos
2011-04-11 17:37:09 +01:00
before_create :set_default_status
after_create :place_build
2011-04-11 11:47:57 +01:00
2011-04-07 14:20:21 +01:00
def self.human_status(status)
I18n.t("layout.build_lists.statuses.#{HUMAN_STATUSES[status]}")
end
def human_status
self.class.human_status(status)
end
2011-04-11 11:47:57 +01:00
def set_items(items_hash)
self.items = []
items_hash.each do |level, items|
items.each do |item|
self.items << self.items.build(:name => item, :level => level.to_i)
end
end
end
2011-09-15 18:56:20 +01:00
def publish
return false unless can_published?
2011-09-15 18:56:20 +01:00
BuildServer.publish_container bs_id
self.delete
end
def can_published?
self.status == BuildServer::SUCCESS
end
2011-04-11 11:47:57 +01:00
def delete_build_list
has_canceled = BuildServer.delete_build_list bs_id
update_attribute(:status, BUILD_CANCELED) if has_canceled
return has_canceled == 0
end
#TODO: Share this checking on product owner.
def can_canceled?
self.status == BUILD_PENDING
end
2011-04-11 17:37:09 +01:00
private
def set_default_status
self.status = WAITING_FOR_RESPONSE unless self.status.present?
2011-04-22 16:13:26 +01:00
return true
2011-04-11 17:37:09 +01:00
end
def place_build
#XML-RPC params: project_name, project_version, plname, arch, bplname, update_type, build_requires, id_web
self.status = BuildServer.add_build_list project.name, project_version, pl.unixname, arch.name, bpl.unixname, update_type, build_requires, id
2011-04-11 17:37:09 +01:00
self.status = BUILD_PENDING if self.status == 0
save
end
2011-04-22 16:21:57 +01:00
#handle_asynchronously :place_build
2011-04-11 17:37:09 +01:00
end