Merge branch 'remote_user' into 'master'
Add GL_USERNAME environment variable for hooks See merge request gitlab-org/gitlab-ce!13264
This commit is contained in:
commit
a030dc4199
12 changed files with 69 additions and 40 deletions
|
@ -1 +1,2 @@
|
|||
5.9.2
|
||||
5.9.3
|
||||
|
||||
|
|
4
changelogs/unreleased/remote_user.yml
Normal file
4
changelogs/unreleased/remote_user.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
title: Add username as GL_USERNAME in hooks
|
||||
merge_request:
|
||||
author:
|
|
@ -31,6 +31,12 @@ module API
|
|||
protocol = params[:protocol]
|
||||
|
||||
actor.update_last_used_at if actor.is_a?(Key)
|
||||
user =
|
||||
if actor.is_a?(Key)
|
||||
actor.user
|
||||
else
|
||||
actor
|
||||
end
|
||||
|
||||
access_checker_klass = wiki? ? Gitlab::GitAccessWiki : Gitlab::GitAccess
|
||||
access_checker = access_checker_klass
|
||||
|
@ -47,6 +53,7 @@ module API
|
|||
{
|
||||
status: true,
|
||||
gl_repository: gl_repository,
|
||||
gl_username: user&.username,
|
||||
repository_path: repository_path,
|
||||
gitaly: gitaly_payload(params[:action])
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -80,9 +81,13 @@ 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)
|
||||
env = {
|
||||
'GL_ID' => gl_id,
|
||||
'GL_USERNAME' => gl_username
|
||||
}
|
||||
stdout, stderr, status = Open3.capture3(env, path, ref, oldrev, newrev)
|
||||
[status.success?, (stderr.presence || stdout).gsub(/\R/, "<br>").html_safe]
|
||||
end
|
||||
end
|
||||
|
|
|
@ -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)
|
||||
|
@ -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
|
||||
|
|
|
@ -1,24 +1,21 @@
|
|||
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 self.from_gitaly(gitaly_user)
|
||||
new(gitaly_user.name, gitaly_user.email, gitaly_user.gl_id)
|
||||
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
|
||||
|
|
|
@ -22,9 +22,9 @@ module Gitlab
|
|||
params = {
|
||||
GL_ID: Gitlab::GlId.gl_id(user),
|
||||
GL_REPOSITORY: Gitlab::GlRepository.gl_repository(project, is_wiki),
|
||||
GL_USERNAME: user&.username,
|
||||
RepoPath: repo_path
|
||||
}
|
||||
|
||||
server = {
|
||||
address: Gitlab::GitalyClient.address(project.repository_storage),
|
||||
token: Gitlab::GitalyClient.token(project.repository_storage)
|
||||
|
|
|
@ -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'))
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
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 }
|
||||
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
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
|
||||
|
|
|
@ -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) }
|
||||
|
@ -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) }
|
||||
|
|
|
@ -1681,11 +1681,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…
Reference in a new issue