Merge branch '30708-stop-using-deleted-at-to-filter-namespaces' into 'master'
refactors Project#search namespace join Closes #30708 See merge request !12091
This commit is contained in:
commit
c89f7c71f6
15 changed files with 23 additions and 40 deletions
|
@ -97,7 +97,7 @@ class ProjectsController < Projects::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
if @project.pending_delete?
|
if @project.pending_delete?
|
||||||
flash[:alert] = _("Project '%{project_name}' queued for deletion.") % { project_name: @project.name }
|
flash.now[:alert] = _("Project '%{project_name}' queued for deletion.") % { project_name: @project.name }
|
||||||
end
|
end
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
|
|
|
@ -83,6 +83,8 @@ class TodosFinder
|
||||||
if project?
|
if project?
|
||||||
@project = Project.find(params[:project_id])
|
@project = Project.find(params[:project_id])
|
||||||
|
|
||||||
|
@project = nil if @project.pending_delete?
|
||||||
|
|
||||||
unless Ability.allowed?(current_user, :read_project, @project)
|
unless Ability.allowed?(current_user, :read_project, @project)
|
||||||
@project = nil
|
@project = nil
|
||||||
end
|
end
|
||||||
|
|
|
@ -47,6 +47,8 @@ class Namespace < ActiveRecord::Base
|
||||||
before_destroy(prepend: true) { prepare_for_destroy }
|
before_destroy(prepend: true) { prepare_for_destroy }
|
||||||
after_destroy :rm_dir
|
after_destroy :rm_dir
|
||||||
|
|
||||||
|
default_scope { with_deleted }
|
||||||
|
|
||||||
scope :for_user, -> { where('type IS NULL') }
|
scope :for_user, -> { where('type IS NULL') }
|
||||||
|
|
||||||
scope :with_statistics, -> do
|
scope :with_statistics, -> do
|
||||||
|
|
|
@ -19,7 +19,7 @@ class NotificationSetting < ActiveRecord::Base
|
||||||
# pending delete).
|
# pending delete).
|
||||||
#
|
#
|
||||||
scope :for_projects, -> do
|
scope :for_projects, -> do
|
||||||
includes(:project).references(:projects).where(source_type: 'Project').where.not(projects: { id: nil })
|
includes(:project).references(:projects).where(source_type: 'Project').where.not(projects: { id: nil, pending_delete: true })
|
||||||
end
|
end
|
||||||
|
|
||||||
EMAIL_EVENTS = [
|
EMAIL_EVENTS = [
|
||||||
|
|
|
@ -222,9 +222,8 @@ class Project < ActiveRecord::Base
|
||||||
has_many :uploads, as: :model, dependent: :destroy
|
has_many :uploads, as: :model, dependent: :destroy
|
||||||
|
|
||||||
# Scopes
|
# Scopes
|
||||||
default_scope { where(pending_delete: false) }
|
scope :pending_delete, -> { where(pending_delete: true) }
|
||||||
|
scope :without_deleted, -> { where(pending_delete: false) }
|
||||||
scope :with_deleted, -> { unscope(where: :pending_delete) }
|
|
||||||
|
|
||||||
scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) }
|
scope :sorted_by_activity, -> { reorder(last_activity_at: :desc) }
|
||||||
scope :sorted_by_stars, -> { reorder('projects.star_count DESC') }
|
scope :sorted_by_stars, -> { reorder('projects.star_count DESC') }
|
||||||
|
@ -1460,7 +1459,7 @@ class Project < ActiveRecord::Base
|
||||||
def pending_delete_twin
|
def pending_delete_twin
|
||||||
return false unless path
|
return false unless path
|
||||||
|
|
||||||
Project.unscoped.where(pending_delete: true).find_by_full_path(path_with_namespace)
|
Project.pending_delete.find_by_full_path(path_with_namespace)
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
@ -54,7 +54,7 @@ module Ci
|
||||||
def builds_for_shared_runner
|
def builds_for_shared_runner
|
||||||
new_builds.
|
new_builds.
|
||||||
# don't run projects which have not enabled shared runners and builds
|
# don't run projects which have not enabled shared runners and builds
|
||||||
joins(:project).where(projects: { shared_runners_enabled: true })
|
joins(:project).where(projects: { shared_runners_enabled: true, pending_delete: false })
|
||||||
.joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
|
.joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id')
|
||||||
.where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0').
|
.where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0').
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def builds_for_specific_runner
|
def builds_for_specific_runner
|
||||||
new_builds.where(project: runner.projects.with_builds_enabled).order('created_at ASC')
|
new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('created_at ASC')
|
||||||
end
|
end
|
||||||
|
|
||||||
def running_builds_for_shared_runners
|
def running_builds_for_shared_runners
|
||||||
|
|
|
@ -10,7 +10,7 @@ module Groups
|
||||||
def execute
|
def execute
|
||||||
group.prepare_for_destroy
|
group.prepare_for_destroy
|
||||||
|
|
||||||
group.projects.with_deleted.each do |project|
|
group.projects.each do |project|
|
||||||
# Execute the destruction of the models immediately to ensure atomic cleanup.
|
# Execute the destruction of the models immediately to ensure atomic cleanup.
|
||||||
# Skip repository removal because we remove directory with namespace
|
# Skip repository removal because we remove directory with namespace
|
||||||
# that contain all these repositories
|
# that contain all these repositories
|
||||||
|
|
|
@ -35,7 +35,7 @@ module Users
|
||||||
Groups::DestroyService.new(group, current_user).execute
|
Groups::DestroyService.new(group, current_user).execute
|
||||||
end
|
end
|
||||||
|
|
||||||
user.personal_projects.with_deleted.each do |project|
|
user.personal_projects.each do |project|
|
||||||
# Skip repository removal because we remove directory with namespace
|
# Skip repository removal because we remove directory with namespace
|
||||||
# that contain all this repositories
|
# that contain all this repositories
|
||||||
::Projects::DestroyService.new(project, current_user, skip_repo: true).execute
|
::Projects::DestroyService.new(project, current_user, skip_repo: true).execute
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
- if projects.any?
|
- if projects.any?
|
||||||
%ul.projects-list
|
%ul.projects-list
|
||||||
- projects.each_with_index do |project, i|
|
- projects.each_with_index do |project, i|
|
||||||
- css_class = (i >= projects_limit) ? 'hide' : nil
|
- css_class = (i >= projects_limit) || project.pending_delete? ? 'hide' : nil
|
||||||
= render "shared/projects/project", project: project, skip_namespace: skip_namespace,
|
= render "shared/projects/project", project: project, skip_namespace: skip_namespace,
|
||||||
avatar: avatar, stars: stars, css_class: css_class, ci: ci, use_creator_avatar: use_creator_avatar,
|
avatar: avatar, stars: stars, css_class: css_class, ci: ci, use_creator_avatar: use_creator_avatar,
|
||||||
forks: forks, show_last_commit_as_description: show_last_commit_as_description
|
forks: forks, show_last_commit_as_description: show_last_commit_as_description
|
||||||
|
|
|
@ -45,7 +45,7 @@ class StuckCiJobsWorker
|
||||||
|
|
||||||
def search(status, timeout)
|
def search(status, timeout)
|
||||||
builds = Ci::Build.where(status: status).where('ci_builds.updated_at < ?', timeout.ago)
|
builds = Ci::Build.where(status: status).where('ci_builds.updated_at < ?', timeout.ago)
|
||||||
builds.joins(:project).includes(:tags, :runner, project: :namespace).find_each(batch_size: 50).each do |build|
|
builds.joins(:project).merge(Project.without_deleted).includes(:tags, :runner, project: :namespace).find_each(batch_size: 50).each do |build|
|
||||||
yield(build)
|
yield(build)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
---
|
||||||
|
title: Removes deleted_at and pending_delete occurrences in Project related queries
|
||||||
|
merge_request: 12091
|
||||||
|
author:
|
|
@ -46,7 +46,8 @@ module API
|
||||||
|
|
||||||
yield if block_given?
|
yield if block_given?
|
||||||
|
|
||||||
forbidden!('Project has been deleted!') unless job.project
|
project = job.project
|
||||||
|
forbidden!('Project has been deleted!') if project.nil? || project.pending_delete?
|
||||||
forbidden!('Job has been erased!') if job.erased?
|
forbidden!('Job has been erased!') if job.erased?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,8 @@ module Ci
|
||||||
|
|
||||||
yield if block_given?
|
yield if block_given?
|
||||||
|
|
||||||
forbidden!('Project has been deleted!') unless build.project
|
project = build.project
|
||||||
|
forbidden!('Project has been deleted!') if project.nil? || project.pending_delete?
|
||||||
forbidden!('Build has been erased!') if build.erased?
|
forbidden!('Build has been erased!') if build.erased?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -317,23 +317,6 @@ feature 'Dashboard Todos' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'User has a Todo in a project pending deletion' do
|
|
||||||
before do
|
|
||||||
deleted_project = create(:project, :public, pending_delete: true)
|
|
||||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author)
|
|
||||||
create(:todo, :mentioned, user: user, project: deleted_project, target: issue, author: author, state: :done)
|
|
||||||
sign_in(user)
|
|
||||||
visit dashboard_todos_path
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'shows "All done" message' do
|
|
||||||
within('.todos-count') { expect(page).to have_content '0' }
|
|
||||||
expect(page).to have_content 'To do 0'
|
|
||||||
expect(page).to have_content 'Done 0'
|
|
||||||
expect(page).to have_selector('.todos-all-done', count: 1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'User has a Build Failed todo' do
|
context 'User has a Build Failed todo' do
|
||||||
let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: author) }
|
let!(:todo) { create(:todo, :build_failed, user: user, project: project, author: author) }
|
||||||
|
|
||||||
|
|
|
@ -284,15 +284,6 @@ describe Project, models: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'default_scope' do
|
|
||||||
it 'excludes projects pending deletion from the results' do
|
|
||||||
project = create(:empty_project)
|
|
||||||
create(:empty_project, pending_delete: true)
|
|
||||||
|
|
||||||
expect(Project.all).to eq [project]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'project token' do
|
describe 'project token' do
|
||||||
it 'sets an random token if none provided' do
|
it 'sets an random token if none provided' do
|
||||||
project = FactoryGirl.create :empty_project, runners_token: ''
|
project = FactoryGirl.create :empty_project, runners_token: ''
|
||||||
|
|
Loading…
Reference in a new issue