From c8614cbbe76a97dc70576451a75907059b4f876c Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Thu, 13 Aug 2015 14:29:13 +0200 Subject: [PATCH] Capture pre-receive exception Signed-off-by: Dmitriy Zaporozhets --- app/services/commit_service.rb | 24 ++++++++++++++++++------ app/services/files/base_service.rb | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/app/services/commit_service.rb b/app/services/commit_service.rb index a5603f26692..92d1585840b 100644 --- a/app/services/commit_service.rb +++ b/app/services/commit_service.rb @@ -1,29 +1,41 @@ require 'securerandom' class CommitService + class PreReceiveError < StandardError; end + class CommitError < StandardError; end + def self.transaction(project, current_user, ref) repository = project.repository path_to_repo = repository.path_to_repo + empty_repo = repository.empty? # Create temporary ref random_string = SecureRandom.hex tmp_ref = "refs/tmp/#{random_string}/head" - target = repository.find_branch(ref).target - repository.rugged.references.create(tmp_ref, target) + + unless empty_repo + target = repository.find_branch(ref).target + repository.rugged.references.create(tmp_ref, target) + end # Make commit in tmp ref sha = yield(tmp_ref) unless sha - raise 'Failed to create commit' + raise CommitError.new('Failed to create commit') end # Run GitLab pre-receive hook status = PreCommitService.new(project, current_user).execute(sha, ref) if status - # Update head - repository.rugged.references.update(Gitlab::Git::BRANCH_REF_PREFIX + ref, sha) + if empty_repo + # Create branch + repository.rugged.references.create(Gitlab::Git::BRANCH_REF_PREFIX + ref, sha) + else + # Update head + repository.rugged.references.update(Gitlab::Git::BRANCH_REF_PREFIX + ref, sha) + end # Run GitLab post receive hook PostCommitService.new(project, current_user).execute(sha, ref) @@ -31,7 +43,7 @@ class CommitService # Remove tmp ref and return error to user repository.rugged.references.delete(tmp_ref) - raise 'Commit was rejected by pre-reveive hook' + raise PreReceiveError.new('Commit was rejected by pre-reveive hook') end end end diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb index 1f7b92e222b..507e21f5818 100644 --- a/app/services/files/base_service.rb +++ b/app/services/files/base_service.rb @@ -26,7 +26,7 @@ module Files else error("Something went wrong. Your changes were not committed") end - rescue ValidationError => ex + rescue CommitService::CommitError, CommitService::PreReceiveError, ValidationError => ex error(ex.message) end -- GitLab