diff --git a/app/controllers/platforms/repositories_controller.rb b/app/controllers/platforms/repositories_controller.rb index 305019909..27734252f 100644 --- a/app/controllers/platforms/repositories_controller.rb +++ b/app/controllers/platforms/repositories_controller.rb @@ -22,7 +22,7 @@ class Platforms::RepositoriesController < Platforms::BaseController end def update - if @repository.update_attributes params[:repository].slice(:description, :synchronizing_publications, :forbid_to_publish_builds_not_from).merge(publish_without_qa: (params[:repository][:publish_without_qa] || @repository.publish_without_qa)) + if @repository.update_attributes params[:repository].slice(:description, :synchronizing_publications, :publish_builds_only_from_branch).merge(publish_without_qa: (params[:repository][:publish_without_qa] || @repository.publish_without_qa)) flash[:notice] = I18n.t("flash.repository.updated") redirect_to platform_repository_path(@platform, @repository) else diff --git a/app/models/ability.rb b/app/models/ability.rb index 38eadba95..4c33f0534 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -187,7 +187,7 @@ class Ability cannot(:cancel, MassBuild) {|mass_build| mass_build.stop_build} if @user.system? - can :key_pair, Repository + can %i(key_pair add_repo_lock_file remove_repo_lock_file), Repository else cannot :key_pair, Repository end diff --git a/app/models/advisory.rb b/app/models/advisory.rb index c53a4bdcd..07528e880 100644 --- a/app/models/advisory.rb +++ b/app/models/advisory.rb @@ -11,7 +11,7 @@ class Advisory < ActiveRecord::Base after_create :generate_advisory_id before_save :normalize_references, if: :references_changed? - attr_accessible :description + attr_accessible :description, :references ID_TEMPLATE = 'ROSA-%s-%d:%04d' ID_STRING_TEMPLATE = 'ROSA-%s-%04s:%04s' diff --git a/app/models/build_list.rb b/app/models/build_list.rb index 8a5d8be3f..6f6b4439b 100644 --- a/app/models/build_list.rb +++ b/app/models/build_list.rb @@ -598,7 +598,7 @@ class BuildList < ActiveRecord::Base end def delayed_add_job_to_abf_worker_queue(*args) - restart_job if status == BUILD_PENDING + restart_job if valid? && status == BUILD_PENDING end later :delayed_add_job_to_abf_worker_queue, delay: 60, queue: :middle @@ -606,12 +606,12 @@ class BuildList < ActiveRecord::Base def valid_branch_for_publish? return true if save_to_platform.personal? || - save_to_repository.forbid_to_publish_builds_not_from.blank? || - ( project_version == save_to_repository.forbid_to_publish_builds_not_from ) + save_to_repository.publish_builds_only_from_branch.blank? || + ( project_version == save_to_repository.publish_builds_only_from_branch ) project.repo.git.native(:branch, {}, '--contains', commit_hash). gsub(/\*/, '').split(/\n/).map(&:strip). - include?(save_to_repository.forbid_to_publish_builds_not_from) + include?(save_to_repository.publish_builds_only_from_branch) end diff --git a/app/models/build_list/package.rb b/app/models/build_list/package.rb index 026dad4a1..82e111ad2 100644 --- a/app/models/build_list/package.rb +++ b/app/models/build_list/package.rb @@ -1,11 +1,14 @@ class BuildList::Package < ActiveRecord::Base PACKAGE_TYPES = %w(source binary) - belongs_to :build_list + belongs_to :build_list, touch: true belongs_to :project belongs_to :platform - attr_accessible :fullname, :name, :release, :version, :sha1, :epoch + serialize :dependent_packages, Array + serialize :dependent_projects, Array + + attr_accessible :fullname, :name, :release, :version, :sha1, :epoch, :dependent_packages validates :build_list_id, :project_id, :platform_id, :fullname, :package_type, :name, :release, :version, @@ -23,6 +26,8 @@ class BuildList::Package < ActiveRecord::Base scope :like_name, ->(name) { where("#{table_name}.name ILIKE ?", "%#{name}%") if name.present? } before_create :set_epoch + before_create :normalize_dependent_packages + after_commit(on: :create) { |p| p.find_dependent_projects if p.dependent_packages.present? } # later with resque def assignee project.maintainer @@ -45,8 +50,17 @@ class BuildList::Package < ActiveRecord::Base end end + def find_dependent_projects + # TODO + end + later :find_dependent_projects, queue: :middle + protected + def normalize_dependent_packages + self.dependent_packages = dependent_packages.to_s.split(/\s/).select(&:present?) + end + def set_epoch self.epoch = nil if epoch.blank? || epoch == 0 end diff --git a/app/models/repository.rb b/app/models/repository.rb index f02cc7551..cb9fc2b36 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -23,7 +23,7 @@ class Repository < ActiveRecord::Base validates :description, presence: true validates :name, uniqueness: { scope: :platform_id, case_sensitive: false }, presence: true, format: { with: /\A[a-z0-9_\-]+\z/ } - validates :forbid_to_publish_builds_not_from, length: { maximum: 255 } + validates :publish_builds_only_from_branch, length: { maximum: 255 } scope :recent, -> { order(:name) } scope :main, -> { where(name: %w(main base)) } @@ -34,7 +34,7 @@ class Repository < ActiveRecord::Base :description, :publish_without_qa, :synchronizing_publications, - :forbid_to_publish_builds_not_from + :publish_builds_only_from_branch attr_readonly :name, :platform_id attr_accessor :projects_list diff --git a/app/views/platforms/repositories/_form.html.haml b/app/views/platforms/repositories/_form.html.haml index e44b03b5a..2343c718e 100644 --- a/app/views/platforms/repositories/_form.html.haml +++ b/app/views/platforms/repositories/_form.html.haml @@ -13,8 +13,8 @@ - if @platform.main? .both - .leftlist= f.label :forbid_to_publish_builds_not_from - .rightlist= f.text_field :forbid_to_publish_builds_not_from + .leftlist= f.label :publish_builds_only_from_branch + .rightlist= f.text_field :publish_builds_only_from_branch .both diff --git a/app/views/projects/build_lists/show.html.haml b/app/views/projects/build_lists/show.html.haml index 36d9fbc38..c7dc90de0 100644 --- a/app/views/projects/build_lists/show.html.haml +++ b/app/views/projects/build_lists/show.html.haml @@ -215,7 +215,7 @@ method: :put, data: { confirm: t('layout.confirm') }, class: 'btn btn-primary', 'ng-show' => 'build_list.can_reject_publish' - - if can?(:rerun_tests, @build_list) && (current_user.tester? || current_user.admin?) + - if can?(:rerun_tests, @build_list) = link_to t('layout.build_lists.rerun_tests'), rerun_tests_build_list_path(@build_list), method: :put, diff --git a/app/views/projects/build_lists/show.json.jbuilder b/app/views/projects/build_lists/show.json.jbuilder index 79cddbe17..7b0f13f13 100644 --- a/app/views/projects/build_lists/show.json.jbuilder +++ b/app/views/projects/build_lists/show.json.jbuilder @@ -1,65 +1,74 @@ json.build_list do - json.(@build_list, :id, :container_status, :status) - json.(@build_list, :update_type) - json.updated_at @build_list.updated_at - if !@build_list.in_work? && @build_list.started_at json.human_duration @build_list.human_duration elsif @build_list.in_work? json.human_duration "#{@build_list.human_current_duration} / #{@build_list.human_average_build_time}" end - json.can_publish can?(:publish, @build_list) - json.can_publish_into_testing can?(:publish_into_testing, @build_list) && @build_list.can_publish_into_testing? - json.can_cancel @build_list.can_cancel? - json.can_create_container @build_list.can_create_container? - json.can_reject_publish @build_list.can_reject_publish? - - json.extra_build_lists_published @build_list.extra_build_lists_published? - json.can_publish_in_future can_publish_in_future?(@build_list) - json.can_publish_into_repository @build_list.can_publish_into_repository? + json.cache! [@build_list, current_user], expires_in: 1.minute do + json.(@build_list, :id, :container_status, :status) + json.(@build_list, :update_type) + json.updated_at @build_list.updated_at + json.updated_at_utc @build_list.updated_at.strftime('%Y-%m-%d %H:%M:%S UTC') - json.container_path container_url if @build_list.container_published? + json.can_publish can?(:publish, @build_list) + json.can_publish_into_testing can?(:publish_into_testing, @build_list) && @build_list.can_publish_into_testing? + json.can_cancel @build_list.can_cancel? + json.can_create_container @build_list.can_create_container? + json.can_reject_publish @build_list.can_reject_publish? - json.publisher do - json.fullname @build_list.publisher.try(:fullname) - json.path user_path(@build_list.publisher) - end if @build_list.publisher + json.extra_build_lists_published @build_list.extra_build_lists_published? + json.can_publish_in_future can_publish_in_future?(@build_list) + json.can_publish_into_repository @build_list.can_publish_into_repository? - json.builder do - json.fullname @build_list.builder.try(:fullname) - json.path user_path(@build_list.builder) - end if @build_list.builder && (!@build_list.builder.system? || current_user.try(:admin?)) - json.advisory do - json.(@build_list.advisory, :description, :advisory_id) - json.path advisory_path(@build_list.advisory) - end if @build_list.advisory + json.container_path container_url if @build_list.container_published? - json.results @build_list.results do |result| - json.file_name result['file_name'] - json.sha1 result['sha1'] - json.size result['size'] + json.publisher do + json.fullname @build_list.publisher.try(:fullname) + json.path user_path(@build_list.publisher) + end if @build_list.publisher - json.created_at Time.zone.at(result['timestamp']).to_s if result['timestamp'] + json.builder do + json.fullname @build_list.builder.try(:fullname) + json.path user_path(@build_list.builder) + end if @build_list.builder && (!@build_list.builder.system? || current_user.try(:admin?)) - json.url file_store_results_url(result['sha1'], result['file_name']) - end if @build_list.new_core? && @build_list.results.present? + json.advisory do + json.(@build_list.advisory, :description, :advisory_id) + json.path advisory_path(@build_list.advisory) + end if @build_list.advisory - json.packages @build_list.packages do |package| - json.(package, :id, :name, :fullname, :release, :version, :sha1, :epoch) - json.url "#{APP_CONFIG['file_store_url']}/api/v1/file_stores/#{package.sha1}" if package.sha1 - end if @build_list.packages.present? + json.results @build_list.results do |result| + json.file_name result['file_name'] + json.sha1 result['sha1'] + json.size result['size'] - json.item_groups do |group| - @item_groups.each_with_index do |group, level| - json.group group do |item| - json.(item, :name, :status) - json.path build_list_item_version_link item - json.level level + json.created_at Time.zone.at(result['timestamp']).to_s if result['timestamp'] + + json.url file_store_results_url(result['sha1'], result['file_name']) + end if @build_list.new_core? && @build_list.results.present? + + json.packages @build_list.packages do |package| + json.(package, :id, :name, :fullname, :release, :version, :sha1, :epoch) + json.url "#{APP_CONFIG['file_store_url']}/api/v1/file_stores/#{package.sha1}" if package.sha1 + + json.dependent_projects Project.where(id: package.dependent_projects).to_a do |project| + json.project_path project_path(project) + json.new_project_build_list_path new_project_build_list_path(@project) end - end - end if @item_groups.present? + end if @build_list.packages.present? + + json.item_groups do |group| + @item_groups.each_with_index do |group, level| + json.group group do |item| + json.(item, :name, :status) + json.path build_list_item_version_link item + json.level level + end + end + end if @item_groups.present? + end end diff --git a/app/views/projects/git/base/_choose_fork.html.haml b/app/views/projects/git/base/_choose_fork.html.haml index 6f36e07de..0d8ec5b4e 100644 --- a/app/views/projects/git/base/_choose_fork.html.haml +++ b/app/views/projects/git/base/_choose_fork.html.haml @@ -4,7 +4,7 @@ - if owner.own_projects.exists? name: name %p.center =t 'layout.projects.already_exists' - =link_to full_name, project_path(@project) + =link_to full_name, project_path("#{owner.uname}/#{name}") - else = form_for @project, url: fork_project_path(@project), html: { class: :form, multipart: true, method: :post } do |f| = hidden_field_tag :group, owner.id if owner.class == Group diff --git a/config/locales/models/repository.en.yml b/config/locales/models/repository.en.yml index 90b9b5767..83660c017 100644 --- a/config/locales/models/repository.en.yml +++ b/config/locales/models/repository.en.yml @@ -71,4 +71,4 @@ en: updated_at: Updated owner: Owner synchronizing_publications: Publish only on success all build_lists for each arch (checking by commit hash) - forbid_to_publish_builds_not_from: "Publish builds only from branch" + publish_builds_only_from_branch: "Publish builds only from branch" diff --git a/config/locales/models/repository.ru.yml b/config/locales/models/repository.ru.yml index 287361713..a2decc530 100644 --- a/config/locales/models/repository.ru.yml +++ b/config/locales/models/repository.ru.yml @@ -71,5 +71,5 @@ ru: updated_at: Обновлен owner: Владелец synchronizing_publications: Публиковать сборочные листы только при успешной сборке под каждую архитектуру (проверка по хэшу коммита) - forbid_to_publish_builds_not_from: "Публикация сборок только из ветки" + publish_builds_only_from_branch: "Публикация сборок только из ветки" diff --git a/db/migrate/20140602164337_rename_repositories_forbid_to_publish_builds_not_from_to_publish_builds_only_from_branch.rb b/db/migrate/20140602164337_rename_repositories_forbid_to_publish_builds_not_from_to_publish_builds_only_from_branch.rb new file mode 100644 index 000000000..32425dbf9 --- /dev/null +++ b/db/migrate/20140602164337_rename_repositories_forbid_to_publish_builds_not_from_to_publish_builds_only_from_branch.rb @@ -0,0 +1,7 @@ +class RenameRepositoriesForbidToPublishBuildsNotFromToPublishBuildsOnlyFromBranch < ActiveRecord::Migration + def change + change_table :repositories do |t| + t.rename :forbid_to_publish_builds_not_from, :publish_builds_only_from_branch + end + end +end diff --git a/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb b/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb new file mode 100644 index 000000000..c2d1db1db --- /dev/null +++ b/db/migrate/20140606193047_add_dependent_packages_and_dependent_projects_to_build_list_packages.rb @@ -0,0 +1,6 @@ +class AddDependentPackagesAndDependentProjectsToBuildListPackages < ActiveRecord::Migration + def change + add_column :build_list_packages, :dependent_packages, :text + add_column :build_list_packages, :dependent_projects, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index a0d15fbad..3bc0ac99d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140530193652) do +ActiveRecord::Schema.define(version: 20140606193047) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -90,11 +90,13 @@ ActiveRecord::Schema.define(version: 20140530193652) do t.string "version" t.string "release" t.string "package_type" - t.datetime "created_at", null: false - t.datetime "updated_at", null: false - t.boolean "actual", default: false + t.datetime "created_at", null: false + t.datetime "updated_at", null: false + t.boolean "actual", default: false t.string "sha1" t.integer "epoch" + t.text "dependent_packages" + t.text "dependent_projects" t.index ["actual", "platform_id"], :name => "index_build_list_packages_on_actual_and_platform_id" t.index ["build_list_id"], :name => "index_build_list_packages_on_build_list_id" t.index ["name", "project_id"], :name => "index_build_list_packages_on_name_and_project_id" @@ -522,14 +524,14 @@ ActiveRecord::Schema.define(version: 20140530193652) do end create_table "repositories", force: true do |t| - t.string "description", null: false - t.integer "platform_id", null: false + t.string "description", null: false + t.integer "platform_id", null: false t.datetime "created_at" t.datetime "updated_at" - t.string "name", null: false - t.boolean "publish_without_qa", default: true - t.boolean "synchronizing_publications", default: false, null: false - t.string "forbid_to_publish_builds_not_from" + t.string "name", null: false + t.boolean "publish_without_qa", default: true + t.boolean "synchronizing_publications", default: false, null: false + t.string "publish_builds_only_from_branch" t.index ["platform_id"], :name => "index_repositories_on_platform_id" end diff --git a/lib/abf_worker/rpm_worker_observer.rb b/lib/abf_worker/rpm_worker_observer.rb index 747169af9..85f568719 100644 --- a/lib/abf_worker/rpm_worker_observer.rb +++ b/lib/abf_worker/rpm_worker_observer.rb @@ -72,9 +72,9 @@ module AbfWorker def fill_container_data (options['packages'] || []).each do |package| package = subject.packages.build(package) - package.package_type = package['fullname'] =~ /.*\.src\.rpm$/ ? 'source' : 'binary' - package.project_id = subject.project_id - package.platform_id = subject.save_to_platform_id + package.package_type = package['fullname'] =~ /.*\.src\.rpm$/ ? 'source' : 'binary' + package.project_id = subject.project_id + package.platform_id = subject.save_to_platform_id package.save! end update_results