Skip to content
Snippets Groups Projects
Commit dbcf48af authored by David Turner's avatar David Turner Committed by David Turner
Browse files

Add username as GL_USERNAME in hooks (http)

When calling pre-receive, post-receive, and update hooks, add the GitLab
username as the GL_USERNAME environment variable.

This patch only handles cases where pushes are over http, or via
the web interface.  Later, we will address the ssh case.
parent 999b7e55
No related branches found
No related tags found
No related merge requests found
---
title: Add username as GL_USERNAME in hooks
merge_request:
author:
Loading
Loading
@@ -22,22 +22,22 @@ module Gitlab
File.exist?(path)
end
 
def trigger(gl_id, oldrev, newrev, ref)
def trigger(gl_id, gl_username, oldrev, newrev, ref)
return [true, nil] unless exists?
 
Bundler.with_clean_env do
case name
when "pre-receive", "post-receive"
call_receive_hook(gl_id, oldrev, newrev, ref)
call_receive_hook(gl_id, gl_username, oldrev, newrev, ref)
when "update"
call_update_hook(gl_id, oldrev, newrev, ref)
call_update_hook(gl_id, gl_username, oldrev, newrev, ref)
end
end
end
 
private
 
def call_receive_hook(gl_id, oldrev, newrev, ref)
def call_receive_hook(gl_id, gl_username, oldrev, newrev, ref)
changes = [oldrev, newrev, ref].join(" ")
 
exit_status = false
Loading
Loading
@@ -45,6 +45,7 @@ module Gitlab
 
vars = {
'GL_ID' => gl_id,
'GL_USERNAME' => gl_username,
'PWD' => repo_path,
'GL_PROTOCOL' => GL_PROTOCOL,
'GL_REPOSITORY' => repository.gl_repository
Loading
Loading
@@ -80,9 +81,14 @@ module Gitlab
[exit_status, exit_message]
end
 
def call_update_hook(gl_id, oldrev, newrev, ref)
def call_update_hook(gl_id, gl_username, oldrev, newrev, ref)
Dir.chdir(repo_path) do
stdout, stderr, status = Open3.capture3({ 'GL_ID' => gl_id }, path, ref, oldrev, newrev)
stdout, stderr, status = Open3.capture3(
{
'GL_ID' => gl_id,
'GL_USERNAME' => gl_username
},
path, ref, oldrev, newrev)
[status.success?, (stderr.presence || stdout).gsub(/\R/, "<br>").html_safe]
end
end
Loading
Loading
Loading
Loading
@@ -5,12 +5,13 @@ module Gitlab
 
attr_accessor :oldrev, :newrev, :ref
 
def execute(committer, repository, oldrev, newrev, ref)
@repository = repository
@gl_id = committer.gl_id
@oldrev = oldrev
@newrev = newrev
@ref = ref
def execute(pusher, repository, oldrev, newrev, ref)
@repository = repository
@gl_id = pusher.gl_id
@gl_username = pusher.name
@oldrev = oldrev
@newrev = newrev
@ref = ref
 
%w(pre-receive update).each do |hook_name|
status, message = run_hook(hook_name)
Loading
Loading
@@ -29,7 +30,7 @@ module Gitlab
 
def run_hook(name)
hook = Gitlab::Git::Hook.new(name, @repository)
hook.trigger(@gl_id, oldrev, newrev, ref)
hook.trigger(@gl_id, @gl_username, oldrev, newrev, ref)
end
end
end
Loading
Loading
module Gitlab
module Git
class User
attr_reader :name, :email, :gl_id
attr_reader :username, :name, :email, :gl_id
 
def self.from_gitlab(gitlab_user)
new(gitlab_user.name, gitlab_user.email, Gitlab::GlId.gl_id(gitlab_user))
new(gitlab_user.username, gitlab_user.name, gitlab_user.email, Gitlab::GlId.gl_id(gitlab_user))
end
 
def initialize(name, email, gl_id)
def initialize(username, name, email, gl_id)
@username = username
@name = name
@email = email
@gl_id = gl_id
end
 
def ==(other)
[name, email, gl_id] == [other.name, other.email, other.gl_id]
[username, name, email, gl_id] == [other.username, other.name, other.email, other.gl_id]
end
end
end
Loading
Loading
Loading
Loading
@@ -14,6 +14,7 @@ describe Gitlab::Git::Hook do
let(:repo_path) { repository.path }
let(:user) { create(:user) }
let(:gl_id) { Gitlab::GlId.gl_id(user) }
let(:gl_username) { user.username }
 
def create_hook(name)
FileUtils.mkdir_p(File.join(repo_path, 'hooks'))
Loading
Loading
@@ -42,6 +43,7 @@ describe Gitlab::Git::Hook do
let(:env) do
{
'GL_ID' => gl_id,
'GL_USERNAME' => gl_username,
'PWD' => repo_path,
'GL_PROTOCOL' => 'web',
'GL_REPOSITORY' => gl_repository
Loading
Loading
@@ -59,7 +61,7 @@ describe Gitlab::Git::Hook do
.with(env, hook_path, chdir: repo_path).and_call_original
end
 
status, errors = hook.trigger(gl_id, blank, blank, ref)
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
expect(status).to be true
expect(errors).to be_blank
end
Loading
Loading
@@ -72,7 +74,7 @@ describe Gitlab::Git::Hook do
blank = Gitlab::Git::BLANK_SHA
ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
 
status, errors = hook.trigger(gl_id, blank, blank, ref)
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
expect(status).to be false
expect(errors).to eq("error message from the hook<br>error message from the hook line 2<br>")
end
Loading
Loading
@@ -86,7 +88,7 @@ describe Gitlab::Git::Hook do
blank = Gitlab::Git::BLANK_SHA
ref = Gitlab::Git::BRANCH_REF_PREFIX + 'new_branch'
 
status, errors = hook.trigger(gl_id, blank, blank, ref)
status, errors = hook.trigger(gl_id, gl_username, blank, blank, ref)
expect(status).to be true
expect(errors).to be_nil
end
Loading
Loading
require 'spec_helper'
 
describe Gitlab::Git::HooksService, seed_helper: true do
let(:user) { Gitlab::Git::User.new('Jane Doe', 'janedoe@example.com', 'user-456') }
let(:user) { Gitlab::Git::User.new('janedoe', 'Jane Doe', 'janedoe@example.com', 'user-456') }
let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH, 'project-123') }
let(:service) { described_class.new }
 
Loading
Loading
require 'spec_helper'
 
describe Gitlab::Git::User do
let(:username) { 'janedo' }
let(:name) { 'Jane Doe' }
let(:email) { 'janedoe@example.com' }
let(:gl_id) { 'user-123' }
 
subject { described_class.new(name, email, gl_id) }
subject { described_class.new(username, name, email, gl_id) }
 
describe '#==' do
def eq_other(name, email, gl_id)
eq(described_class.new(name, email, gl_id))
def eq_other(username, name, email, gl_id)
eq(described_class.new(username, name, email, gl_id))
end
 
it { expect(subject).to eq_other(name, email, gl_id) }
it { expect(subject).to eq_other(username, name, email, gl_id) }
 
it { expect(subject).not_to eq_other(nil, nil, nil) }
it { expect(subject).not_to eq_other(name + 'x', email, gl_id) }
it { expect(subject).not_to eq_other(name, email + 'x', gl_id) }
it { expect(subject).not_to eq_other(name, email, gl_id + 'x') }
it { expect(subject).not_to eq_other(nil, nil, nil, nil) }
it { expect(subject).not_to eq_other(username + 'x', name, email, gl_id) }
it { expect(subject).not_to eq_other(username, name + 'x', email, gl_id) }
it { expect(subject).not_to eq_other(username, name, email + 'x', gl_id) }
it { expect(subject).not_to eq_other(username, name, email, gl_id + 'x') }
end
end
Loading
Loading
@@ -182,7 +182,12 @@ describe Gitlab::Workhorse do
let(:repo_path) { repository.path_to_repo }
let(:action) { 'info_refs' }
let(:params) do
{ GL_ID: "user-#{user.id}", GL_REPOSITORY: "project-#{project.id}", RepoPath: repo_path }
{
GL_ID: "user-#{user.id}",
GL_USERNAME: user.username,
GL_REPOSITORY: "project-#{project.id}",
RepoPath: repo_path
}
end
 
subject { described_class.git_http_ok(repository, false, user, action) }
Loading
Loading
@@ -191,7 +196,12 @@ describe Gitlab::Workhorse do
 
context 'when is_wiki' do
let(:params) do
{ GL_ID: "user-#{user.id}", GL_REPOSITORY: "wiki-#{project.id}", RepoPath: repo_path }
{
GL_ID: "user-#{user.id}",
GL_USERNAME: user.username,
GL_REPOSITORY: "wiki-#{project.id}",
RepoPath: repo_path
}
end
 
subject { described_class.git_http_ok(repository, true, user, action) }
Loading
Loading
Loading
Loading
@@ -1679,11 +1679,11 @@ describe Repository do
tag_sha = tag.target
 
expect(pre_receive_hook).to have_received(:trigger)
.with(anything, anything, commit_sha, anything)
.with(anything, anything, anything, commit_sha, anything)
expect(update_hook).to have_received(:trigger)
.with(anything, anything, commit_sha, anything)
.with(anything, anything, anything, commit_sha, anything)
expect(post_receive_hook).to have_received(:trigger)
.with(anything, anything, tag_sha, anything)
.with(anything, anything, anything, tag_sha, anything)
end
end
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment