summaryrefslogtreecommitdiff
path: root/app/services/commit_service.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/commit_service.rb')
-rw-r--r--app/services/commit_service.rb27
1 files changed, 16 insertions, 11 deletions
diff --git a/app/services/commit_service.rb b/app/services/commit_service.rb
index d158f103530..5000e73b473 100644
--- a/app/services/commit_service.rb
+++ b/app/services/commit_service.rb
@@ -4,48 +4,53 @@ class CommitService
class PreReceiveError < StandardError; end
class CommitError < StandardError; end
- def self.transaction(project, current_user, ref)
+ def self.transaction(project, current_user, branch)
repository = project.repository
path_to_repo = repository.path_to_repo
empty_repo = repository.empty?
+ oldrev = Gitlab::Git::BLANK_SHA
+ ref = Gitlab::Git::BRANCH_REF_PREFIX + branch
+ gl_id = Gitlab::ShellEnv.gl_id(current_user)
# Create temporary ref
random_string = SecureRandom.hex
tmp_ref = "refs/tmp/#{random_string}/head"
unless empty_repo
- target = repository.find_branch(ref).target
- repository.rugged.references.create(tmp_ref, target)
+ oldrev = repository.find_branch(branch).target
+ repository.rugged.references.create(tmp_ref, oldrev)
end
# Make commit in tmp ref
- sha = yield(tmp_ref)
+ newrev = yield(tmp_ref)
- unless sha
+ unless newrev
raise CommitError.new('Failed to create commit')
end
# Run GitLab pre-receive hook
- status = PreCommitService.new(project, current_user).execute(sha, ref)
+ pre_receive_hook = Gitlab::Git::Hook.new('pre-receive', path_to_repo)
+ status = pre_receive_hook.trigger(gl_id, oldrev, newrev, ref)
if status
if empty_repo
# Create branch
- repository.rugged.references.create(Gitlab::Git::BRANCH_REF_PREFIX + ref, sha)
+ repository.rugged.references.create(ref, newrev)
else
# Update head
- current_target = repository.find_branch(ref).target
+ current_head = repository.find_branch(branch).target
# Make sure target branch was not changed during pre-receive hook
- if current_target == target
- repository.rugged.references.update(Gitlab::Git::BRANCH_REF_PREFIX + ref, sha)
+ if current_head == oldrev
+ repository.rugged.references.update(ref, newrev)
else
raise CommitError.new('Commit was rejected because branch received new push')
end
end
# Run GitLab post receive hook
- PostCommitService.new(project, current_user).execute(sha, ref)
+ post_receive_hook = Gitlab::Git::Hook.new('post-receive', path_to_repo)
+ status = post_receive_hook.trigger(gl_id, oldrev, newrev, ref)
else
# Remove tmp ref and return error to user
repository.rugged.references.delete(tmp_ref)