Add option to keep repo on project delete
Update the project API controller to use `Projects::DestroyService` instead of calling `Project#destroy` directly. Also add an optional parameter, `:keep_repo`, that allows a project to be deleted without deleting the repository, wiki, and satellite from disk.
This commit is contained in:
parent
51ed8b7edd
commit
68b5ac7f18
|
@ -100,7 +100,8 @@ class ProjectsController < ApplicationController
|
|||
def destroy
|
||||
return access_denied! unless can?(current_user, :remove_project, project)
|
||||
|
||||
::Projects::DestroyService.new(@project, current_user, {}).execute
|
||||
::Projects::DestroyService.new(@project, current_user,
|
||||
keep_repo: params[:keep_repo]).execute
|
||||
|
||||
respond_to do |format|
|
||||
format.html do
|
||||
|
|
|
@ -6,7 +6,10 @@ module Projects
|
|||
project.team.truncate
|
||||
project.repository.expire_cache unless project.empty_repo?
|
||||
|
||||
if project.destroy
|
||||
result = project.destroy
|
||||
return false unless result
|
||||
|
||||
unless params[:keep_repo]
|
||||
GitlabShellWorker.perform_async(
|
||||
:remove_repository,
|
||||
project.path_with_namespace
|
||||
|
@ -18,11 +21,11 @@ module Projects
|
|||
)
|
||||
|
||||
project.satellite.destroy
|
||||
|
||||
log_info("Project \"#{project.name}\" was removed")
|
||||
system_hook_service.execute_hooks_for(project, :destroy)
|
||||
true
|
||||
end
|
||||
|
||||
log_info("Project \"#{project.name}\" was removed")
|
||||
system_hook_service.execute_hooks_for(project, :destroy)
|
||||
result
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -174,11 +174,17 @@ module API
|
|||
#
|
||||
# Parameters:
|
||||
# id (required) - The ID of a project
|
||||
# keep_repo (optional) - If true, then delete the project from the
|
||||
# database but keep the repo, wiki, and satellite on disk.
|
||||
# Example Request:
|
||||
# DELETE /projects/:id
|
||||
delete ":id" do
|
||||
authorize! :remove_project, user_project
|
||||
user_project.destroy
|
||||
::Projects::DestroyService.new(
|
||||
user_project,
|
||||
current_user,
|
||||
keep_repo: params[:keep_repo]
|
||||
).execute
|
||||
end
|
||||
|
||||
# Mark this project as forked from another
|
||||
|
|
|
@ -10,7 +10,12 @@ describe "Projects", feature: true do
|
|||
visit edit_project_path(@project)
|
||||
end
|
||||
|
||||
it "should be correct path" do
|
||||
it 'should delete the project from the database and disk' do
|
||||
expect(GitlabShellWorker).to(
|
||||
receive(:perform_async).with(:remove_repository,
|
||||
/#{@project.path_with_namespace}/)
|
||||
).twice
|
||||
|
||||
expect { click_link "Remove project" }.to change {Project.count}.by(-1)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -632,10 +632,25 @@ describe API::API, api: true do
|
|||
describe "DELETE /projects/:id" do
|
||||
context "when authenticated as user" do
|
||||
it "should remove project" do
|
||||
expect(GitlabShellWorker).to(
|
||||
receive(:perform_async).with(:remove_repository,
|
||||
/#{project.path_with_namespace}/)
|
||||
).twice
|
||||
|
||||
delete api("/projects/#{project.id}", user)
|
||||
response.status.should == 200
|
||||
end
|
||||
|
||||
it 'should keep repo when "keep_repo" param is true' do
|
||||
expect(GitlabShellWorker).not_to(
|
||||
receive(:perform_async).with(:remove_repository,
|
||||
/#{project.path_with_namespace}/)
|
||||
)
|
||||
|
||||
delete api("/projects/#{project.id}?keep_repo=true", user)
|
||||
response.status.should == 200
|
||||
end
|
||||
|
||||
it "should not remove a project if not an owner" do
|
||||
user3 = create(:user)
|
||||
project.team << [user3, :developer]
|
||||
|
|
Loading…
Reference in New Issue