Commit 30b36c92 authored by Jacob Vosmaer's avatar Jacob Vosmaer

Use an exception to pass messages

parent 0beae70e
......@@ -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,16 +414,28 @@ 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)
expect(housekeeping).to receive(:execute)
context 'when housekeeping is needed' do
before do
allow(housekeeping).to receive(:needed?).and_return(true)
end
execute_service(project, user, @oldrev, @newrev, @ref)
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!)
execute_service(project, user, @oldrev, @newrev, @ref)
end
end
......
......@@ -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
......
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