2011-04-07 14:20:21 +01:00
class BuildList < ActiveRecord :: Base
belongs_to :project
belongs_to :arch
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 :branch_name , :presence = > true
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 15:56:28 +01:00
2011-04-07 14:20:21 +01:00
HUMAN_STATUSES = { BuildServer :: BUILD_ERROR = > :build_error ,
2011-04-07 15:56:28 +01:00
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 ( :branch_name = > branch ) }
2011-04-07 15:56:28 +01:00
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
2011-09-16 15:15:50 +01:00
return false unless can_published?
2011-09-15 18:56:20 +01:00
BuildServer . publish_container bs_id
self . delete
end
2011-09-16 15:15:50 +01:00
def can_published?
self . status == BuildServer :: SUCCESS
end
2011-04-11 11:47:57 +01:00
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
2011-09-05 15:40:49 +01:00
self . status = BuildServer . add_build_list project . name , branch_name , project . repository . platform . name , arch . name , 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
2011-04-22 13:14:22 +01:00
end