2011-04-07 14:20:21 +01:00
class BuildList < ActiveRecord :: Base
belongs_to :project
belongs_to :arch
2011-10-22 16:28:41 +01:00
belongs_to :pl , :class_name = > 'Platform'
belongs_to :bpl , :class_name = > 'Platform'
2011-12-20 17:09:29 +00:00
belongs_to :user
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
2011-12-21 14:01:50 +00:00
validates :project_id , :project_version , :arch , :include_repos , :presence = > true
2011-10-22 16:28:41 +01:00
UPDATE_TYPES = %w[ security bugfix enhancement recommended newpackage ]
validates :update_type , :inclusion = > UPDATE_TYPES
validate lambda {
2011-10-29 13:18:41 +01:00
errors . add ( :bpl , I18n . t ( 'flash.build_list.wrong_platform' ) ) if pl . platform_type == 'main' && pl_id != bpl_id
2011-10-22 16:28:41 +01:00
}
2011-12-12 12:34:20 +00:00
# The kernel does not send these statuses directly
2011-10-22 16:28:41 +01:00
BUILD_CANCELED = 5000
2011-04-11 17:37:09 +01:00
WAITING_FOR_RESPONSE = 4000
BUILD_PENDING = 2000
2011-11-11 10:38:17 +00:00
BUILD_PUBLISHED = 6000
2011-12-22 00:53:55 +00:00
BUILD_PUBLISH = 7000
FAILED_PUBLISH = 8000
2011-04-11 17:37:09 +01:00
2011-12-12 12:34:20 +00:00
STATUSES = [ WAITING_FOR_RESPONSE ,
BUILD_CANCELED ,
BUILD_PENDING ,
BUILD_PUBLISHED ,
2011-12-22 00:53:55 +00:00
BUILD_PUBLISH ,
FAILED_PUBLISH ,
2011-12-12 12:34:20 +00:00
BuildServer :: SUCCESS ,
BuildServer :: BUILD_STARTED ,
BuildServer :: BUILD_ERROR ,
BuildServer :: PLATFORM_NOT_FOUND ,
BuildServer :: PLATFORM_PENDING ,
BuildServer :: PROJECT_NOT_FOUND ,
BuildServer :: PROJECT_VERSION_NOT_FOUND ,
BuildServer :: BINARY_TEST_FAILED ,
BuildServer :: DEPENDENCY_TEST_FAILED ]
2011-04-07 15:56:28 +01:00
2011-12-12 12:34:20 +00:00
HUMAN_STATUSES = { WAITING_FOR_RESPONSE = > :waiting_for_response ,
2011-12-12 16:16:05 +00:00
BUILD_CANCELED = > :build_canceled ,
2011-04-07 15:56:28 +01:00
BUILD_PENDING = > :build_pending ,
2011-12-12 12:34:20 +00:00
BUILD_PUBLISHED = > :build_published ,
2011-12-22 00:53:55 +00:00
BUILD_PUBLISH = > :build_publish ,
FAILED_PUBLISH = > :failed_publish ,
2011-12-12 12:34:20 +00:00
BuildServer :: BUILD_ERROR = > :build_error ,
BuildServer :: BUILD_STARTED = > :build_started ,
2011-04-11 17:37:09 +01:00
BuildServer :: SUCCESS = > :success ,
BuildServer :: PLATFORM_NOT_FOUND = > :platform_not_found ,
BuildServer :: PLATFORM_PENDING = > :platform_pending ,
BuildServer :: PROJECT_NOT_FOUND = > :project_not_found ,
2011-10-29 18:50:47 +01:00
BuildServer :: PROJECT_VERSION_NOT_FOUND = > :project_version_not_found ,
2011-12-12 12:49:15 +00:00
BuildServer :: DEPENDENCY_TEST_FAILED = > :dependency_test_failed ,
2011-12-12 16:16:05 +00:00
BuildServer :: BINARY_TEST_FAILED = > :binary_test_failed
2011-04-07 14:20:21 +01:00
}
2011-12-13 13:00:15 +00:00
scope :recent , order ( " #{ table_name } .updated_at DESC " )
2011-04-11 17:37:09 +01:00
scope :current , lambda {
2011-10-23 11:34:42 +01:00
outdatable_statuses = [ BuildServer :: SUCCESS , BuildServer :: ERROR , BuildServer :: PLATFORM_NOT_FOUND , BuildServer :: PLATFORM_PENDING , BuildServer :: PROJECT_NOT_FOUND , BuildServer :: PROJECT_VERSION_NOT_FOUND ]
2011-12-12 16:51:38 +00:00
where ( [ " status in (?) OR (status in (?) AND notified_at >= ?) " , [ WAITING_FOR_RESPONSE , BUILD_PENDING , BuildServer :: BUILD_STARTED ] , outdatable_statuses , Time . now - 2 . days ] )
2011-04-11 17:37:09 +01:00
}
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 ) }
2011-10-23 11:34:42 +01:00
scope :scoped_to_project_version , lambda { | project_version | where ( :project_version = > project_version ) }
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
2011-12-13 13:00:15 +00:00
where ( [ " #{ table_name } .created_at BETWEEN ? AND ? " , start_date , end_date ] )
2011-04-07 14:20:21 +01:00
elsif start_date && ! end_date
2011-12-13 13:00:15 +00:00
where ( [ " #{ table_name } .created_at >= ? " , start_date ] )
2011-04-07 14:20:21 +01:00
elsif ! start_date && end_date
2011-12-13 13:00:15 +00:00
where ( [ " #{ table_name } .created_at <= ? " , end_date ] )
2011-04-07 14:20:21 +01:00
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-12-07 22:46:01 +00:00
scope :scoped_to_project_name , lambda { | project_name | joins ( :project ) . where ( 'projects.name LIKE ?' , " % #{ project_name } % " ) }
2011-04-07 14:20:21 +01:00
2011-04-11 11:47:57 +01:00
serialize :additional_repos
2011-12-21 14:01:50 +00:00
serialize :include_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 |
2011-10-29 15:05:40 +01:00
self . items << self . items . build ( :name = > item [ 'name' ] , :version = > item [ 'version' ] , :level = > level . to_i )
2011-04-11 11:47:57 +01:00
end
end
end
2011-12-21 23:31:05 +00:00
2011-09-15 18:56:20 +01:00
def publish
2011-12-22 02:08:11 +00:00
return false unless can_publish?
2011-12-21 23:31:05 +00:00
has_published = BuildServer . publish_container bs_id
2011-12-22 00:53:55 +00:00
update_attribute ( :status , BUILD_PUBLISH ) if has_published == 0
2011-12-21 23:31:05 +00:00
return has_published == 0
2011-09-15 18:56:20 +01:00
end
2011-12-22 02:08:11 +00:00
2011-12-21 21:42:06 +00:00
def can_publish?
2011-12-22 00:53:55 +00:00
status == BuildServer :: SUCCESS or status == FAILED_PUBLISH
2011-09-16 15:15:50 +01:00
end
2011-04-11 11:47:57 +01:00
2011-12-21 21:42:06 +00:00
def cancel
2011-12-22 02:08:11 +00:00
return false unless can_cancel?
2011-10-22 16:28:41 +01:00
has_canceled = BuildServer . delete_build_list bs_id
2011-10-30 14:06:33 +00:00
update_attribute ( :status , BUILD_CANCELED ) if has_canceled == 0
2011-10-22 16:28:41 +01:00
return has_canceled == 0
end
#TODO: Share this checking on product owner.
2011-11-30 22:55:47 +00:00
def can_cancel?
2011-12-22 00:53:55 +00:00
status == BUILD_PENDING && bs_id
2011-10-22 16:28:41 +01:00
end
2011-10-29 15:50:22 +01:00
def event_log_message
2011-11-28 15:41:42 +00:00
{ :project = > project . name , :version = > project_version , :arch = > arch . name } . inspect
2011-10-29 15:50:22 +01:00
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
2011-12-21 14:01:50 +00:00
#XML-RPC params: project_name, project_version, plname, arch, bplname, update_type, build_requires, id_web, include_repos
self . status = BuildServer . add_build_list project . name , project_version , pl . name , arch . name , ( pl_id == bpl_id ? '' : bpl . name ) , update_type , build_requires , id , include_repos
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-11-28 15:41:42 +00:00
end