Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
90ce84fb0142
Commit
90ce84fb
authored
Jan 22, 2016
by
Josh Frye
Browse files
First pass at deleting projects in the background.
parent
54d73948635b
Changes
11
Hide whitespace changes
Inline
Side-by-side
CHANGELOG
View file @
90ce84fb
Please view this file on the master branch, on stable branches it's out of date.
v 8.6.0 (unreleased)
- Delete project and associations in a background worker
v 8.5.0 (unreleased)
- Ensure rake tasks that don't need a DB connection can be run without one
- Add "visibility" flag to GET /projects api endpoint
...
...
app/controllers/projects_controller.rb
View file @
90ce84fb
...
...
@@ -93,6 +93,10 @@
return
end
if
@project
.
pending_delete?
flash
[
:alert
]
=
"Project queued for delete."
end
respond_to
do
|
format
|
format
.
html
do
if
@project
.
repository_exists?
...
...
@@ -120,8 +124,8 @@
def
destroy
return
access_denied!
unless
can?
(
current_user
,
:remove_project
,
@project
)
::
Projects
::
DestroyService
.
new
(
@project
,
current_user
,
{}).
execu
te
flash
[
:alert
]
=
"Project '
#{
@project
.
name
}
' w
as
deleted."
::
Projects
::
DestroyService
.
new
(
@project
,
current_user
,
{}).
pending_dele
te
!
flash
[
:alert
]
=
"Project '
#{
@project
.
name
}
' w
ill be
deleted."
redirect_to
dashboard_projects_path
rescue
Projects
::
DestroyService
::
DestroyError
=>
ex
...
...
app/models/project.rb
View file @
90ce84fb
...
...
@@ -36,6 +36,7 @@
# build_coverage_regex :string
# build_allow_git_fetch :boolean default(TRUE), not null
# build_timeout :integer default(3600), not null
# pending_delete :boolean
#
require
'carrierwave/orm/activerecord'
...
...
app/services/delete_user_service.rb
View file @
90ce84fb
...
...
@@ -13,7 +13,7 @@
user
.
personal_projects
.
each
do
|
project
|
# Skip repository removal because we remove directory with namespace
# that contain all this repositories
::
Projects
::
DestroyService
.
new
(
project
,
current_user
,
skip_repo:
true
).
execu
te
::
Projects
::
DestroyService
.
new
(
project
,
current_user
,
skip_repo:
true
).
pending_dele
te
!
end
user
.
destroy
...
...
app/services/destroy_group_service.rb
View file @
90ce84fb
...
...
@@ -9,7 +9,7 @@
@group
.
projects
.
each
do
|
project
|
# Skip repository removal because we remove directory with namespace
# that contain all this repositories
::
Projects
::
DestroyService
.
new
(
project
,
current_user
,
skip_repo:
true
).
execu
te
::
Projects
::
DestroyService
.
new
(
project
,
current_user
,
skip_repo:
true
).
pending_dele
te
!
end
@group
.
destroy
...
...
app/services/projects/destroy_service.rb
View file @
90ce84fb
...
...
@@ -6,6 +6,12 @@
DELETED_FLAG
=
'+deleted'
def
pending_delete!
project
.
update_attribute
(
:pending_delete
,
true
)
ProjectDestroyWorker
.
perform_in
(
1
.
minute
,
project
.
id
,
current_user
.
id
,
params
)
end
def
execute
return
false
unless
can?
(
current_user
,
:remove_project
,
project
)
...
...
app/workers/project_destroy_worker.rb
0 → 100644
View file @
90ce84fb
class
ProjectDestroyWorker
include
Sidekiq
::
Worker
sidekiq_options
queue: :default
def
perform
(
project_id
,
user_id
,
params
)
begin
project
=
Project
.
find
(
project_id
)
rescue
ActiveRecord
::
RecordNotFound
return
end
user
=
User
.
find
(
user_id
)
::
Projects
::
DestroyService
.
new
(
project
,
user
,
params
).
execute
end
end
db/migrate/20160122185421_add_pending_delete_to_project.rb
0 → 100644
View file @
90ce84fb
class
AddPendingDeleteToProject
<
ActiveRecord
::
Migration
def
change
add_column
:projects
,
:pending_delete
,
:boolean
end
end
db/schema.rb
View file @
90ce84fb
...
...
@@ -677,6 +677,7 @@
t
.
string
"build_coverage_regex"
t
.
boolean
"build_allow_git_fetch"
,
default:
true
,
null:
false
t
.
integer
"build_timeout"
,
default:
3600
,
null:
false
t
.
boolean
"pending_delete"
end
add_index
"projects"
,
[
"builds_enabled"
,
"shared_runners_enabled"
],
name:
"index_projects_on_builds_enabled_and_shared_runners_enabled"
,
using: :btree
...
...
@@ -728,9 +729,9 @@
t
.
string
"type"
t
.
string
"title"
t
.
integer
"project_id"
t
.
datetime
"created_at"
,
null:
false
t
.
datetime
"updated_at"
,
null:
false
t
.
boolean
"active"
,
null:
false
t
.
datetime
"created_at"
t
.
datetime
"updated_at"
t
.
boolean
"active"
,
default:
false
,
null:
false
t
.
text
"properties"
t
.
boolean
"template"
,
default:
false
t
.
boolean
"push_events"
,
default:
true
...
...
lib/api/projects.rb
View file @
90ce84fb
...
...
@@ -187,7 +187,7 @@
else
present
@forked_project
,
with:
Entities
::
Project
,
user_can_admin_project:
can?
(
current_user
,
:admin_project
,
@forked_project
)
end
end
end
# Update an existing project
...
...
@@ -246,7 +246,7 @@
# DELETE /projects/:id
delete
":id"
do
authorize!
:remove_project
,
user_project
::
Projects
::
DestroyService
.
new
(
user_project
,
current_user
,
{}).
execu
te
::
Projects
::
DestroyService
.
new
(
user_project
,
current_user
,
{}).
pending_dele
te
!
end
# Mark this project as forked from another
...
...
spec/models/hooks/system_hook_spec.rb
View file @
90ce84fb
...
...
@@ -36,7 +36,7 @@
it
"project_destroy hook"
do
user
=
create
(
:user
)
project
=
create
(
:empty_project
,
namespace:
user
.
namespace
)
Projects
::
DestroyService
.
new
(
project
,
user
,
{}).
execu
te
Projects
::
DestroyService
.
new
(
project
,
user
,
{}).
pending_dele
te
!
expect
(
WebMock
).
to
have_requested
(
:post
,
@system_hook
.
url
).
with
(
body:
/project_destroy/
,
headers:
{
'Content-Type'
=>
'application/json'
,
'X-Gitlab-Event'
=>
'System Hook'
}
...
...
@@ -65,7 +65,7 @@
project
=
create
(
:project
)
project
.
team
<<
[
user
,
:master
]
expect
(
WebMock
).
to
have_requested
(
:post
,
@system_hook
.
url
).
with
(
body:
/user_add_to_team/
,
body:
/user_add_to_team/
,
headers:
{
'Content-Type'
=>
'application/json'
,
'X-Gitlab-Event'
=>
'System Hook'
}
).
once
end
...
...
@@ -76,7 +76,7 @@
project
.
team
<<
[
user
,
:master
]
project
.
project_members
.
destroy_all
expect
(
WebMock
).
to
have_requested
(
:post
,
@system_hook
.
url
).
with
(
body:
/user_remove_from_team/
,
body:
/user_remove_from_team/
,
headers:
{
'Content-Type'
=>
'application/json'
,
'X-Gitlab-Event'
=>
'System Hook'
}
).
once
end
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment