Commit 68b5ac7f authored by Vinnie Okada's avatar Vinnie Okada

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.
parent 51ed8b7e
...@@ -100,7 +100,8 @@ class ProjectsController < ApplicationController ...@@ -100,7 +100,8 @@ class ProjectsController < ApplicationController
def destroy def destroy
return access_denied! unless can?(current_user, :remove_project, project) 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| respond_to do |format|
format.html do format.html do
......
...@@ -6,7 +6,10 @@ module Projects ...@@ -6,7 +6,10 @@ module Projects
project.team.truncate project.team.truncate
project.repository.expire_cache unless project.empty_repo? 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( GitlabShellWorker.perform_async(
:remove_repository, :remove_repository,
project.path_with_namespace project.path_with_namespace
...@@ -18,11 +21,11 @@ module Projects ...@@ -18,11 +21,11 @@ module Projects
) )
project.satellite.destroy project.satellite.destroy
end
log_info("Project \"#{project.name}\" was removed") log_info("Project \"#{project.name}\" was removed")
system_hook_service.execute_hooks_for(project, :destroy) system_hook_service.execute_hooks_for(project, :destroy)
true result
end
end end
end end
end end
...@@ -174,11 +174,17 @@ module API ...@@ -174,11 +174,17 @@ module API
# #
# Parameters: # Parameters:
# id (required) - The ID of a project # 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: # Example Request:
# DELETE /projects/:id # DELETE /projects/:id
delete ":id" do delete ":id" do
authorize! :remove_project, user_project authorize! :remove_project, user_project
user_project.destroy ::Projects::DestroyService.new(
user_project,
current_user,
keep_repo: params[:keep_repo]
).execute
end end
# Mark this project as forked from another # Mark this project as forked from another
......
...@@ -10,7 +10,12 @@ describe "Projects", feature: true do ...@@ -10,7 +10,12 @@ describe "Projects", feature: true do
visit edit_project_path(@project) visit edit_project_path(@project)
end 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) expect { click_link "Remove project" }.to change {Project.count}.by(-1)
end end
end end
......
...@@ -632,10 +632,25 @@ describe API::API, api: true do ...@@ -632,10 +632,25 @@ describe API::API, api: true do
describe "DELETE /projects/:id" do describe "DELETE /projects/:id" do
context "when authenticated as user" do context "when authenticated as user" do
it "should remove project" 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) delete api("/projects/#{project.id}", user)
response.status.should == 200 response.status.should == 200
end 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 it "should not remove a project if not an owner" do
user3 = create(:user) user3 = create(:user)
project.team << [user3, :developer] project.team << [user3, :developer]
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment