diff --git a/app/models/product.rb b/app/models/product.rb index a802150d7..96d94dbbe 100644 --- a/app/models/product.rb +++ b/app/models/product.rb @@ -1,26 +1,14 @@ class Product < ActiveRecord::Base include Modules::Models::TimeLiving + include Modules::Models::Autostart belongs_to :platform belongs_to :project has_many :product_build_lists, dependent: :destroy - ONCE_A_12_HOURS = 0 - ONCE_A_DAY = 1 - ONCE_A_WEEK = 2 - - AUTOSTART_STATUSES = [ONCE_A_12_HOURS, ONCE_A_DAY, ONCE_A_WEEK] - HUMAN_AUTOSTART_STATUSES = { - ONCE_A_12_HOURS => :once_a_12_hours, - ONCE_A_DAY => :once_a_day, - ONCE_A_WEEK => :once_a_week - } - validates :name, presence: true, uniqueness: {scope: :platform_id} validates :project_id, presence: true validates :main_script, :params, length: { maximum: 255 } - validates :autostart_status, numericality: true, - inclusion: {in: AUTOSTART_STATUSES}, allow_blank: true scope :recent, order("#{table_name}.name ASC") @@ -30,7 +18,6 @@ class Product < ActiveRecord::Base :main_script, :params, :platform_id, - :autostart_status, :project_version attr_readonly :platform_id @@ -44,16 +31,8 @@ class Product < ActiveRecord::Base end end - def human_autostart_status - self.class.human_autostart_status(autostart_status) - end - - def self.human_autostart_status(autostart_status) - I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[autostart_status]}") - end - class << self - HUMAN_AUTOSTART_STATUSES.each do |autostart_status, human_autostart_status| + Modules::Models::Autostart::HUMAN_AUTOSTART_STATUSES.each do |autostart_status, human_autostart_status| define_method "autostart_iso_builds_#{human_autostart_status}" do autostart_iso_builds autostart_status end diff --git a/app/models/project.rb b/app/models/project.rb index b6b2844b5..edfb3391e 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -1,4 +1,6 @@ class Project < ActiveRecord::Base + include Modules::Models::Autostart + VISIBILITIES = ['open', 'hidden'] MAX_OWN_PROJECTS = 32000 NAME_REGEXP = /[\w\-\+\.]+/ @@ -50,6 +52,8 @@ class Project < ActiveRecord::Base :url, :srpms_list, :mass_import, :add_to_repository_id, :architecture_dependent attr_readonly :owner_id, :owner_type + serialize :default_platforms, Array + scope :recent, order("lower(#{table_name}.name) ASC") scope :search_order, order("CHAR_LENGTH(#{table_name}.name) ASC") scope :search, lambda {|q| @@ -171,13 +175,7 @@ class Project < ActiveRecord::Base main_rep_id = build_for_platform.repositories.find_by_name(%w(main base)).try(:id) include_repos = ([main_rep_id] << (save_to_platform.main? ? repository_id : nil)).compact.uniq - project_version = if repo.commits("#{save_to_platform.name}").try(:first).try(:id) - save_to_platform.name - elsif repo.commits("#{build_for_platform.name}").try(:first).try(:id) - build_for_platform.name - else - default_branch - end + project_version = project_version_for save_to_platform, build_for_platform increase_release_tag(project_version, user, "MassBuild##{mass_build.id}: Increase release tag") if increase_rt @@ -199,6 +197,16 @@ class Project < ActiveRecord::Base build_list.save end + def project_version_for(save_to_platform, build_for_platform) + if repo.commits("#{save_to_platform.name}").try(:first).try(:id) + save_to_platform.name + elsif repo.commits("#{build_for_platform.name}").try(:first).try(:id) + build_for_platform.name + else + default_branch + end + end + def fork(new_owner, new_name = name) new_name = new_name.presence || name dup.tap do |c| @@ -290,6 +298,34 @@ class Project < ActiveRecord::Base end end + class << self + Modules::Models::Autostart::HUMAN_AUTOSTART_STATUSES.each do |autostart_status, human_autostart_status| + define_method "autostart_build_lists_#{human_autostart_status}" do + autostart_iso_builds autostart_status + end + end + end + + def self.autostart_build_lists(autostart_status) + Project.where(autostart_status: autostart_status).find_each do |p| + Platform.where(id: p.default_platforms).each do |platform| + platform.platform_arch_settings.pluck(:arch_id).each do |arch_id| + build_list = build_lists.build do |bl| + bl.save_to_platform = platform + bl.build_for_platform = platform + bl.update_type = 'newpackage' + bl.arch_id = arch_id + bl.project_version = project_version_for(platform, platform) + bl.user = p.owner.is_a?(Group) ? p.owner.owner : p.owner + bl.auto_publish = true # TODO: ??? + bl.save_to_repository_id = p.repositories.where(platform_id: platform).first + end + build_list.save + end + end + end + end + protected def increase_release_tag(project_version, user, message) diff --git a/app/views/projects/projects/_form.html.haml b/app/views/projects/projects/_form.html.haml index 22f864135..bc313eb3b 100644 --- a/app/views/projects/projects/_form.html.haml +++ b/app/views/projects/projects/_form.html.haml @@ -55,6 +55,17 @@ autocomplete_maintainers_path(@project.owner, @project), id_element: '#project_maintainer_id', placeholder: @project.maintainer.fullname + + %h3= t("layout.projects.build_schedule") + = form_for @project, html: { class: :form, multipart: true } do |f| + .leftlist= f.label :default_platforms + .rightlist= f.select :default_platforms, Platform.main.map{ |p| [p.name, p.id] }, {include_blank: true}, multiple: true, size: 5 + .both + + .leftlist= f.label :autostart_status + .rightlist= f.select :autostart_status, Project::AUTOSTART_STATUSES.collect{|status| [Project.human_autostart_status(status), status]}, {include_blank: true, selected: @project.autostart_status} + .both + - if [:new, :create].include? act .leftlist= f.label :srpm .rightlist= f.file_field :srpm, class: 'file_field' diff --git a/config/locales/models/project.en.yml b/config/locales/models/project.en.yml index fceb6f333..e2b776706 100644 --- a/config/locales/models/project.en.yml +++ b/config/locales/models/project.en.yml @@ -1,6 +1,7 @@ en: layout: projects: + build_schedule: Build schedule mass_import: Mass import branches: Branches delete_branch: Delete branch diff --git a/config/locales/models/project.ru.yml b/config/locales/models/project.ru.yml index fae79540c..1f495364a 100644 --- a/config/locales/models/project.ru.yml +++ b/config/locales/models/project.ru.yml @@ -1,6 +1,7 @@ ru: layout: projects: + build_schedule: Расписание сборок mass_import: Массовый импорт branches: Ветки delete_branch: Удалить ветку diff --git a/config/schedule.rb b/config/schedule.rb index b8ff21e63..b0b7e6031 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -39,16 +39,20 @@ every 1.hour do end every :day, at: '4am' do - runner 'Product.autostart_iso_builds_once_a_12_hours', output: 'log/autostart_iso_builds.log' - runner 'Product.autostart_iso_builds_once_a_day', output: 'log/autostart_iso_builds.log' + runner 'Product.autostart_iso_builds_once_a_12_hours', output: 'log/autostart_iso_builds.log' + runner 'Product.autostart_iso_builds_once_a_day', output: 'log/autostart_iso_builds.log' + runner 'BuildList.autostart_build_lists_once_a_12_hours', output: 'log/autostart_build_lists.log' + runner 'BuildList.autostart_build_lists_once_a_day', output: 'log/autostart_build_lists.log' end every :day, at: '4pm' do - runner 'Product.autostart_iso_builds_once_a_12_hours', output: 'log/autostart_iso_builds.log' + runner 'Product.autostart_iso_builds_once_a_12_hours', output: 'log/autostart_iso_builds.log' + runner 'BuildList.autostart_build_lists_once_a_12_hours', output: 'log/autostart_build_lists.log' end every :sunday, at: '4am' do - runner 'Product.autostart_iso_builds_once_a_week', output: 'log/autostart_iso_builds.log' + runner 'Product.autostart_iso_builds_once_a_week', output: 'log/autostart_iso_builds.log' + runner 'BuildList.autostart_build_lists_once_a_week', output: 'log/autostart_build_lists.log' end every :day, at: '1am' do diff --git a/db/migrate/20140216203553_add_autostart_status_to_projects.rb b/db/migrate/20140216203553_add_autostart_status_to_projects.rb new file mode 100644 index 000000000..0176b97ba --- /dev/null +++ b/db/migrate/20140216203553_add_autostart_status_to_projects.rb @@ -0,0 +1,6 @@ +class AddAutostartStatusToProjects < ActiveRecord::Migration + def change + add_column :projects, :autostart_status, :integer + add_column :projects, :default_platforms, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 92c3bfa6f..793c9bffb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20140211175858) do +ActiveRecord::Schema.define(:version => 20140216203553) do create_table "activity_feeds", :force => true do |t| t.integer "user_id", :null => false @@ -441,6 +441,8 @@ ActiveRecord::Schema.define(:version => 20140211175858) do t.boolean "publish_i686_into_x86_64", :default => false t.string "owner_uname", :null => false t.boolean "architecture_dependent", :default => false, :null => false + t.integer "autostart_status" + t.text "default_platforms" end add_index "projects", ["owner_id", "name", "owner_type"], :name => "index_projects_on_name_and_owner_id_and_owner_type", :unique => true, :case_sensitive => false diff --git a/lib/modules/models/autostart.rb b/lib/modules/models/autostart.rb new file mode 100644 index 000000000..397989b9a --- /dev/null +++ b/lib/modules/models/autostart.rb @@ -0,0 +1,35 @@ +module Modules + module Models + module Autostart + extend ActiveSupport::Concern + + ONCE_A_12_HOURS = 0 + ONCE_A_DAY = 1 + ONCE_A_WEEK = 2 + + AUTOSTART_STATUSES = [ONCE_A_12_HOURS, ONCE_A_DAY, ONCE_A_WEEK] + HUMAN_AUTOSTART_STATUSES = { + ONCE_A_12_HOURS => :once_a_12_hours, + ONCE_A_DAY => :once_a_day, + ONCE_A_WEEK => :once_a_week + } + + included do + validates :autostart_status, numericality: true, + inclusion: {in: AUTOSTART_STATUSES}, allow_blank: true + + attr_accessible :autostart_status + end + + def human_autostart_status + self.class.human_autostart_status(autostart_status) + end + + module ClassMethods + def human_autostart_status(autostart_status) + I18n.t("layout.products.autostart_statuses.#{HUMAN_AUTOSTART_STATUSES[autostart_status]}") + end + end + end + end +end \ No newline at end of file