diff options
-rwxr-xr-x | hooks/post-receive | 7 | ||||
-rwxr-xr-x | hooks/pre-receive | 5 | ||||
-rwxr-xr-x | hooks/update | 17 | ||||
-rw-r--r-- | lib/gitlab_access.rb | 2 | ||||
-rw-r--r-- | lib/gitlab_custom_hook.rb | 42 | ||||
-rw-r--r-- | lib/gitlab_post_receive.rb | 7 |
6 files changed, 72 insertions, 8 deletions
diff --git a/hooks/post-receive b/hooks/post-receive index d85ad42..301f639 100755 --- a/hooks/post-receive +++ b/hooks/post-receive @@ -2,15 +2,16 @@ # This file was placed here by GitLab. It makes sure that your pushed commits # will be processed properly. -# You can add your own hooks to this file, but be careful when updating gitlab-shell! -changes = ARGF.read +refs = ARGF.read key_id = ENV['GL_ID'] repo_path = Dir.pwd +require_relative '../lib/gitlab_custom_hook' require_relative '../lib/gitlab_post_receive' -if GitlabPostReceive.new(repo_path, key_id, changes).exec +if GitlabPostReceive.new(repo_path, key_id, refs).exec && + GitlabCustomHook.new.post_receive(refs, repo_path) exit 0 else exit 1 diff --git a/hooks/pre-receive b/hooks/pre-receive index 2b979fa..7f9c0c0 100755 --- a/hooks/pre-receive +++ b/hooks/pre-receive @@ -2,15 +2,16 @@ # This file was placed here by GitLab. It makes sure that your pushed commits # will be processed properly. -# You can add your own hooks to this file, but be careful when updating gitlab-shell! refs = ARGF.read key_id = ENV['GL_ID'] repo_path = Dir.pwd +require_relative '../lib/gitlab_custom_hook' require_relative '../lib/gitlab_access' -if GitlabAccess.new(repo_path, key_id, refs).exec +if GitlabAccess.new(repo_path, key_id, refs).exec && + GitlabCustomHook.new.pre_receive(refs, repo_path) exit 0 else exit 1 diff --git a/hooks/update b/hooks/update new file mode 100755 index 0000000..f1ac8e7 --- /dev/null +++ b/hooks/update @@ -0,0 +1,17 @@ +#!/usr/bin/env ruby + +# This file was placed here by GitLab. It makes sure that your pushed commits +# will be processed properly. + +ref_name = ARGV[0] +old_value = ARGV[1] +new_value = ARGV[2] +repo_path = Dir.pwd + +require_relative '../lib/gitlab_custom_hook' + +if GitlabCustomHook.new.update(ref_name, old_value, new_value, repo_path) + exit 0 +else + exit 1 +end diff --git a/lib/gitlab_access.rb b/lib/gitlab_access.rb index 804d06d..78d353c 100644 --- a/lib/gitlab_access.rb +++ b/lib/gitlab_access.rb @@ -23,7 +23,7 @@ class GitlabAccess # reset GL_ID env since we stop git push here ENV['GL_ID'] = nil puts "GitLab: You are not allowed to access some of the refs!" - exit 1 + return false end end diff --git a/lib/gitlab_custom_hook.rb b/lib/gitlab_custom_hook.rb new file mode 100644 index 0000000..d6fa83d --- /dev/null +++ b/lib/gitlab_custom_hook.rb @@ -0,0 +1,42 @@ +class GitlabCustomHook + def pre_receive(refs, repo_path) + if receive('pre-receive', refs, repo_path) + return true + else + # reset GL_ID env since we stop git push here + ENV['GL_ID'] = nil + return false + end + end + + def post_receive(refs, repo_path) + receive('post-receive', refs, repo_path) + end + + def update(ref_name, old_value, new_value, repo_path) + hook = hook_file('update', repo_path) + return true if hook.nil? + system(*hook, ref_name, old_value, new_value) ? true : false + end + + private + + def receive(type, refs, repo_path) + unless type == 'pre-receive' || type == 'post-receive' + puts 'GitLab: An unexpected error occurred ' \ + '(invalid pre/post-receive hook type)' + return false + end + + hook = hook_file(type, repo_path) + return true if hook.nil? + cmd = "#{hook} #{refs}" + system(*cmd) ? true : false + end + + def hook_file(hook_type, repo_path) + hook_path = File.join(repo_path.strip, 'custom_hooks') + hook_file = "#{hook_path}/#{hook_type}" + hook_file if File.exist?(hook_file) + end +end diff --git a/lib/gitlab_post_receive.rb b/lib/gitlab_post_receive.rb index bd80408..b4770d9 100644 --- a/lib/gitlab_post_receive.rb +++ b/lib/gitlab_post_receive.rb @@ -23,9 +23,12 @@ class GitlabPostReceive def update_redis queue = "#{config.redis_namespace}:queue:post_receive" msg = JSON.dump({'class' => 'PostReceive', 'args' => [@repo_path, @actor, @changes]}) - unless system(*config.redis_command, 'rpush', queue, msg, err: '/dev/null', out: '/dev/null') + if system(*config.redis_command, 'rpush', queue, msg, + err: '/dev/null', out: '/dev/null') + return true + else puts "GitLab: An unexpected error occurred (redis-cli returned #{$?.exitstatus})." - exit 1 + return false end end end |