diff options
author | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-02-14 14:02:18 +0200 |
---|---|---|
committer | Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com> | 2013-02-14 14:02:18 +0200 |
commit | 12331a552b5921d6d212db774360a8f154fbffb0 (patch) | |
tree | dbcd2ec80f1ec70a5e92ba97bdcf5ae743da489c | |
parent | ba68af63031a396df644807e1a428b5364f457da (diff) | |
download | gitlab-shell-12331a552b5921d6d212db774360a8f154fbffb0.tar.gz |
Use update hook to add post event to redis. Use GL_ID instead of GL_USER
-rw-r--r-- | CHANGELOG | 5 | ||||
-rwxr-xr-x | hooks/post-receive | 13 | ||||
-rwxr-xr-x | hooks/update | 2 | ||||
-rw-r--r-- | lib/gitlab_shell.rb | 2 | ||||
-rw-r--r-- | lib/gitlab_update.rb | 46 |
5 files changed, 41 insertions, 27 deletions
diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..968da00 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,5 @@ +v1.0.4 + - requires gitlab b698094 + - dont use post-receive file any more. Make all updates in update + - fixed issue with invalid GL_USER + - use GL_ID instead of GL_USER diff --git a/hooks/post-receive b/hooks/post-receive index ebd9e1a..acb1e40 100755 --- a/hooks/post-receive +++ b/hooks/post-receive @@ -1,11 +1,6 @@ -#!/usr/bin/env bash +#!/usr/bin/env ruby -# This file was placed here by GitLab. It makes sure that your pushed commits -# will be processed properly. +# This file was placed here by GitLab. +# IT IS DEPRECATED NOW. +# All GitLab logic handled by update hook -while read oldrev newrev ref -do - # For every branch or tag that was pushed, create a Resque job in redis. - repo_path=`pwd` - env -i redis-cli rpush "resque:gitlab:queue:post_receive" "{\"class\":\"PostReceive\",\"args\":[\"$repo_path\",\"$oldrev\",\"$newrev\",\"$ref\",\"$GL_USER\"]}" > /dev/null 2>&1 -done diff --git a/hooks/update b/hooks/update index f483cc0..39ea196 100755 --- a/hooks/update +++ b/hooks/update @@ -4,7 +4,7 @@ # will be processed properly. refname = ARGV[0] -key_id = ENV['GL_USER'] +key_id = ENV['GL_ID'] repo_path = `pwd` require_relative '../lib/gitlab_update' diff --git a/lib/gitlab_shell.rb b/lib/gitlab_shell.rb index d821299..842714e 100644 --- a/lib/gitlab_shell.rb +++ b/lib/gitlab_shell.rb @@ -16,7 +16,7 @@ class GitlabShell parse_cmd if git_cmds.include?(@git_cmd) - ENV['GL_USER'] = @key_id + ENV['GL_ID'] = @key_id if validate_access process_cmd diff --git a/lib/gitlab_update.rb b/lib/gitlab_update.rb index 7bbb288..d6d135b 100644 --- a/lib/gitlab_update.rb +++ b/lib/gitlab_update.rb @@ -3,33 +3,38 @@ require_relative 'gitlab_net' class GitlabUpdate def initialize(repo_path, key_id, refname) + @repo_path = repo_path.strip @repo_name = repo_path @repo_name.gsub!(GitlabConfig.new.repos_path.to_s, "") @repo_name.gsub!(/.git$/, "") @repo_name.gsub!(/^\//, "") @key_id = key_id - @refname = /refs\/heads\/([\w\.-]+)/.match(refname).to_a.last + @refname = refname + @branch_name = /refs\/heads\/([\w\.-]+)/.match(refname).to_a.last + + @oldrev = ARGV[1] + @newrev = ARGV[2] end def exec - # Skip update hook for local push when key_id is nil - # It required for gitlab instance to make local pushes - # without validation of access - exit 0 if @key_id.nil? - - # Also skip update hook for non-gitlab keys - # and reset GL_USER env - unless @key_id =~ /\Akey\-\d+\Z/ - ENV['GL_USER'] = nil - exit 0 - end + # reset GL_USER env since we already + # get value from it + ENV['GL_ID'] = nil - if api.allowed?('git-receive-pack', @repo_name, @key_id, @refname) - exit 0 + # If its push over ssh + # we need to check user persmission per branch first + if ssh? + if api.allowed?('git-receive-pack', @repo_name, @key_id, @branch_name) + update_redis + exit 0 + else + puts "GitLab: You are not allowed to access #{@branch_name}! " + exit 1 + end else - puts "GitLab: You are not allowed to access #{@refname}! " - exit 1 + update_redis + exit 0 end end @@ -38,4 +43,13 @@ class GitlabUpdate def api GitlabNet.new end + + def ssh? + @key_id =~ /\Akey\-\d+\Z/ + end + + def update_redis + command = "env -i redis-cli rpush 'resque:gitlab:queue:post_receive' '{\"class\":\"PostReceive\",\"args\":[\"#{@repo_path}\",\"#{@oldrev}\",\"#{@newrev}\",\"#{@refname}\",\"#{@key_id}\"]}' > /dev/null 2>&1" + system(command) + end end |