Use an exception to pass messages
This commit is contained in:
parent
0beae70efa
commit
30b36c92c3
|
@ -170,12 +170,17 @@ class ProjectsController < ApplicationController
|
|||
end
|
||||
|
||||
def housekeeping
|
||||
message = ::Projects::HousekeepingService.new(@project).execute
|
||||
::Projects::HousekeepingService.new(@project).execute
|
||||
|
||||
respond_to do |format|
|
||||
flash[:notice] = message
|
||||
format.html { redirect_to project_path(@project) }
|
||||
end
|
||||
redirect_to(
|
||||
project_path(@project),
|
||||
notice: "Housekeeping successfully started"
|
||||
)
|
||||
rescue ::Projects::HousekeepingService::LeaseTaken => ex
|
||||
redirect_to(
|
||||
edit_project_path(@project),
|
||||
alert: ex.to_s
|
||||
)
|
||||
end
|
||||
|
||||
def toggle_star
|
||||
|
|
|
@ -79,6 +79,7 @@ class GitPushService < BaseService
|
|||
housekeeping = Projects::HousekeepingService.new(@project)
|
||||
housekeeping.increment!
|
||||
housekeeping.execute if housekeeping.needed?
|
||||
rescue Projects::HousekeepingService::LeaseTaken
|
||||
end
|
||||
|
||||
def process_default_branch
|
||||
|
|
|
@ -11,20 +11,22 @@ module Projects
|
|||
|
||||
LEASE_TIMEOUT = 3600
|
||||
|
||||
class LeaseTaken < StandardError
|
||||
def to_s
|
||||
"Somebody already triggered housekeeping for this project in the past #{LEASE_TIMEOUT / 60} minutes"
|
||||
end
|
||||
end
|
||||
|
||||
def initialize(project)
|
||||
@project = project
|
||||
end
|
||||
|
||||
def execute
|
||||
if !try_obtain_lease
|
||||
return "Housekeeping was already triggered in the past #{LEASE_TIMEOUT / 60} minutes"
|
||||
end
|
||||
raise LeaseTaken if !try_obtain_lease
|
||||
|
||||
GitlabShellWorker.perform_async(:gc, @project.path_with_namespace)
|
||||
@project.pushes_since_gc = 0
|
||||
@project.save!
|
||||
|
||||
"Housekeeping successfully started"
|
||||
ensure
|
||||
@project.update_column(:pushes_since_gc, 0)
|
||||
end
|
||||
|
||||
def needed?
|
||||
|
@ -32,8 +34,7 @@ module Projects
|
|||
end
|
||||
|
||||
def increment!
|
||||
@project.pushes_since_gc += 1
|
||||
@project.save!
|
||||
@project.increment!(:pushes_since_gc)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
@ -402,7 +402,7 @@ describe GitPushService, services: true do
|
|||
end
|
||||
|
||||
describe "housekeeping" do
|
||||
let(:housekeeping) { instance_double('Projects::HousekeepingService', increment!: nil, needed?: false) }
|
||||
let(:housekeeping) { Projects::HousekeepingService.new(project) }
|
||||
|
||||
before do
|
||||
allow(Projects::HousekeepingService).to receive(:new).and_return(housekeeping)
|
||||
|
@ -414,13 +414,25 @@ describe GitPushService, services: true do
|
|||
execute_service(project, user, @oldrev, @newrev, @ref)
|
||||
end
|
||||
|
||||
it 'performs housekeeping when needed' do
|
||||
expect(housekeeping).to receive(:needed?).and_return(true)
|
||||
context 'when housekeeping is needed' do
|
||||
before do
|
||||
allow(housekeeping).to receive(:needed?).and_return(true)
|
||||
end
|
||||
|
||||
it 'performs housekeeping' do
|
||||
expect(housekeeping).to receive(:execute)
|
||||
|
||||
execute_service(project, user, @oldrev, @newrev, @ref)
|
||||
end
|
||||
|
||||
it 'does not raise an exception' do
|
||||
allow(housekeeping).to receive(:try_obtain_lease).and_return(false)
|
||||
|
||||
execute_service(project, user, @oldrev, @newrev, @ref)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
it 'increments the push counter' do
|
||||
expect(housekeeping).to receive(:increment!)
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ describe Projects::HousekeepingService do
|
|||
expect(subject).to receive(:try_obtain_lease).and_return(true)
|
||||
expect(GitlabShellWorker).to receive(:perform_async).with(:gc, project.path_with_namespace)
|
||||
|
||||
expect(subject.execute).to include('successfully started')
|
||||
subject.execute
|
||||
expect(project.pushes_since_gc).to eq(0)
|
||||
end
|
||||
|
||||
|
@ -22,8 +22,8 @@ describe Projects::HousekeepingService do
|
|||
expect(subject).to receive(:try_obtain_lease).and_return(false)
|
||||
expect(GitlabShellWorker).not_to receive(:perform_async)
|
||||
|
||||
expect(subject.execute).to include('already triggered')
|
||||
expect(project.pushes_since_gc).to eq(3)
|
||||
expect { subject.execute }.to raise_error(Projects::HousekeepingService::LeaseTaken)
|
||||
expect(project.pushes_since_gc).to eq(0)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in New Issue