summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/api/helpers/internal_helpers.rb12
-rw-r--r--lib/api/internal.rb3
-rw-r--r--lib/gitlab/git/hook_env.rb (renamed from lib/gitlab/git/env.rb)26
-rw-r--r--lib/gitlab/git/repository.rb14
-rw-r--r--lib/gitlab/gitaly_client/util.rb8
5 files changed, 18 insertions, 45 deletions
diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb
index 14648588dfd..abe3d353984 100644
--- a/lib/api/helpers/internal_helpers.rb
+++ b/lib/api/helpers/internal_helpers.rb
@@ -29,18 +29,6 @@ module API
{}
end
- def fix_git_env_repository_paths(env, repository_path)
- if obj_dir_relative = env['GIT_OBJECT_DIRECTORY_RELATIVE'].presence
- env['GIT_OBJECT_DIRECTORY'] = File.join(repository_path, obj_dir_relative)
- end
-
- if alt_obj_dirs_relative = env['GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE'].presence
- env['GIT_ALTERNATE_OBJECT_DIRECTORIES'] = alt_obj_dirs_relative.map { |dir| File.join(repository_path, dir) }
- end
-
- env
- end
-
def log_user_activity(actor)
commands = Gitlab::GitAccess::DOWNLOAD_COMMANDS
diff --git a/lib/api/internal.rb b/lib/api/internal.rb
index b3660e4a1d0..fcbc248fc3b 100644
--- a/lib/api/internal.rb
+++ b/lib/api/internal.rb
@@ -21,8 +21,7 @@ module API
# Stores some Git-specific env thread-safely
env = parse_env
- env = fix_git_env_repository_paths(env, repository_path) if project
- Gitlab::Git::Env.set(env)
+ Gitlab::Git::HookEnv.set(gl_repository, env) if project
actor =
if params[:key_id]
diff --git a/lib/gitlab/git/env.rb b/lib/gitlab/git/hook_env.rb
index 9d0b47a1a6d..455e8451c10 100644
--- a/lib/gitlab/git/env.rb
+++ b/lib/gitlab/git/hook_env.rb
@@ -3,37 +3,39 @@
module Gitlab
module Git
# Ephemeral (per request) storage for environment variables that some Git
- # commands may need.
+ # commands need during internal API calls made from Git push hooks.
#
# For example, in pre-receive hooks, new objects are put in a temporary
# $GIT_OBJECT_DIRECTORY. Without it set, the new objects cannot be retrieved
# (this would break push rules for instance).
#
# This class is thread-safe via RequestStore.
- class Env
+ class HookEnv
WHITELISTED_VARIABLES = %w[
- GIT_OBJECT_DIRECTORY
GIT_OBJECT_DIRECTORY_RELATIVE
- GIT_ALTERNATE_OBJECT_DIRECTORIES
GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE
].freeze
- def self.set(env)
+ def self.set(gl_repository, env)
return unless RequestStore.active?
- RequestStore.store[:gitlab_git_env] = whitelist_git_env(env)
+ raise "missing gl_repository" if gl_repository.blank?
+
+ RequestStore.store[:gitlab_git_env] ||= {}
+ RequestStore.store[:gitlab_git_env][gl_repository] = whitelist_git_env(env)
end
- def self.all
+ def self.all(gl_repository)
return {} unless RequestStore.active?
- RequestStore.fetch(:gitlab_git_env) { {} }
+ h = RequestStore.fetch(:gitlab_git_env) { {} }
+ h.fetch(gl_repository, {})
end
- def self.to_env_hash
+ def self.to_env_hash(gl_repository)
env = {}
- all.compact.each do |key, value|
+ all(gl_repository).compact.each do |key, value|
value = value.join(File::PATH_SEPARATOR) if value.is_a?(Array)
env[key.to_s] = value
end
@@ -41,10 +43,6 @@ module Gitlab
env
end
- def self.[](key)
- all[key]
- end
-
def self.whitelist_git_env(env)
env.select { |key, _| WHITELISTED_VARIABLES.include?(key.to_s) }.with_indifferent_access
end
diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb
index 2d16a81c888..e692c9ce342 100644
--- a/lib/gitlab/git/repository.rb
+++ b/lib/gitlab/git/repository.rb
@@ -1745,21 +1745,11 @@ module Gitlab
end
def alternate_object_directories
- relative_paths = relative_object_directories
-
- if relative_paths.any?
- relative_paths.map { |d| File.join(path, d) }
- else
- absolute_object_directories.flat_map { |d| d.split(File::PATH_SEPARATOR) }
- end
+ relative_object_directories.map { |d| File.join(path, d) }
end
def relative_object_directories
- Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
- end
-
- def absolute_object_directories
- Gitlab::Git::Env.all.values_at(*ALLOWED_OBJECT_DIRECTORIES_VARIABLES).flatten.compact
+ Gitlab::Git::HookEnv.all(gl_repository).values_at(*ALLOWED_OBJECT_RELATIVE_DIRECTORIES_VARIABLES).flatten.compact
end
# Get the content of a blob for a given commit. If the blob is a commit
diff --git a/lib/gitlab/gitaly_client/util.rb b/lib/gitlab/gitaly_client/util.rb
index a8c6d478de8..405567db94a 100644
--- a/lib/gitlab/gitaly_client/util.rb
+++ b/lib/gitlab/gitaly_client/util.rb
@@ -3,11 +3,9 @@ module Gitlab
module Util
class << self
def repository(repository_storage, relative_path, gl_repository)
- git_object_directory = Gitlab::Git::Env['GIT_OBJECT_DIRECTORY_RELATIVE'].presence ||
- Gitlab::Git::Env['GIT_OBJECT_DIRECTORY'].presence
- git_alternate_object_directories =
- Array.wrap(Gitlab::Git::Env['GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE']).presence ||
- Array.wrap(Gitlab::Git::Env['GIT_ALTERNATE_OBJECT_DIRECTORIES']).flat_map { |d| d.split(File::PATH_SEPARATOR) }
+ git_env = Gitlab::Git::HookEnv.all(gl_repository)
+ git_object_directory = git_env['GIT_OBJECT_DIRECTORY_RELATIVE'].presence
+ git_alternate_object_directories = Array.wrap(git_env['GIT_ALTERNATE_OBJECT_DIRECTORIES_RELATIVE'])
Gitaly::Repository.new(
storage_name: repository_storage,