Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-01-03 18:08:33 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-01-03 18:08:33 +0300
commit511e761b41b81484c85e3d125f45873ce38e9201 (patch)
tree6bb98a6356de6e1d736951d2eef6ec83e6aa3dd2 /lib
parent4247e67be1faa9d52691757dad954a7fa63e8bfe (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib')
-rw-r--r--lib/api/api.rb8
-rw-r--r--lib/api/commit_statuses.rb12
-rw-r--r--lib/api/helpers/internal_helpers.rb4
-rw-r--r--lib/api/internal/base.rb12
-rw-r--r--lib/api/projects.rb2
-rw-r--r--lib/gitlab/application_context.rb50
-rw-r--r--lib/gitlab/ci/config/entry/artifacts.rb5
-rw-r--r--lib/gitlab/middleware/correlation_id.rb31
-rw-r--r--lib/gitlab/sidekiq_middleware.rb4
-rw-r--r--lib/gitlab/sidekiq_middleware/correlation_injector.rb14
-rw-r--r--lib/gitlab/sidekiq_middleware/correlation_logger.rb15
-rw-r--r--lib/gitlab/utils/lazy_attributes.rb45
12 files changed, 132 insertions, 70 deletions
diff --git a/lib/api/api.rb b/lib/api/api.rb
index 56eccb036b6..eae10738f32 100644
--- a/lib/api/api.rb
+++ b/lib/api/api.rb
@@ -43,6 +43,14 @@ module API
header['X-Content-Type-Options'] = 'nosniff'
end
+ before do
+ Gitlab::ApplicationContext.push(
+ user: -> { current_user },
+ project: -> { @project },
+ namespace: -> { @group }
+ )
+ end
+
# The locale is set to the current user's locale when `current_user` is loaded
after { Gitlab::I18n.use_default_locale }
diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb
index d108c811f4b..6e26ee309f0 100644
--- a/lib/api/commit_statuses.rb
+++ b/lib/api/commit_statuses.rb
@@ -71,27 +71,27 @@ module API
ref = params[:ref]
ref ||= pipeline&.ref
- ref ||= @project.repository.branch_names_contains(commit.sha).first
+ ref ||= user_project.repository.branch_names_contains(commit.sha).first
not_found! 'References for commit' unless ref
name = params[:name] || params[:context] || 'default'
unless pipeline
- pipeline = @project.ci_pipelines.create!(
+ pipeline = user_project.ci_pipelines.create!(
source: :external,
sha: commit.sha,
ref: ref,
user: current_user,
- protected: @project.protected_for?(ref))
+ protected: user_project.protected_for?(ref))
end
status = GenericCommitStatus.running_or_pending.find_or_initialize_by(
- project: @project,
+ project: user_project,
pipeline: pipeline,
name: name,
ref: ref,
user: current_user,
- protected: @project.protected_for?(ref)
+ protected: user_project.protected_for?(ref)
)
optional_attributes =
@@ -117,7 +117,7 @@ module API
render_api_error!('invalid state', 400)
end
- MergeRequest.where(source_project: @project, source_branch: ref)
+ MergeRequest.where(source_project: user_project, source_branch: ref)
.update_all(head_pipeline_id: pipeline.id) if pipeline.latest?
present status, with: Entities::CommitStatus
diff --git a/lib/api/helpers/internal_helpers.rb b/lib/api/helpers/internal_helpers.rb
index 607e0784415..b719e5c0886 100644
--- a/lib/api/helpers/internal_helpers.rb
+++ b/lib/api/helpers/internal_helpers.rb
@@ -107,8 +107,10 @@ module API
if params[:gl_repository]
@project, @repo_type = Gitlab::GlRepository.parse(params[:gl_repository])
@redirected_path = nil
- else
+ elsif params[:project]
@project, @repo_type, @redirected_path = Gitlab::RepoPath.parse(params[:project])
+ else
+ @project, @repo_type, @redirected_path = nil, nil, nil
end
end
# rubocop:enable Gitlab/ModuleWithInstanceVariables
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index 11f2a2ea1c0..d64de2bb465 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -6,6 +6,13 @@ module API
class Base < Grape::API
before { authenticate_by_gitlab_shell_token! }
+ before do
+ Gitlab::ApplicationContext.push(
+ user: -> { actor&.user },
+ project: -> { project }
+ )
+ end
+
helpers ::API::Helpers::InternalHelpers
UNKNOWN_CHECK_RESULT_ERROR = 'Unknown check result'.freeze
@@ -205,7 +212,12 @@ module API
status 200
response = Gitlab::InternalPostReceive::Response.new
+
+ # Try to load the project and users so we have the application context
+ # available for logging before we schedule any jobs.
user = actor.user
+ project
+
push_options = Gitlab::PushOptions.new(params[:push_options])
response.reference_counter_decreased = Gitlab::ReferenceCounter.new(params[:gl_repository]).decrease
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index d1f99ea49ce..68f199cc160 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -355,7 +355,7 @@ module API
post ':id/unarchive' do
authorize!(:archive_project, user_project)
- ::Projects::UpdateService.new(@project, current_user, archived: false).execute
+ ::Projects::UpdateService.new(user_project, current_user, archived: false).execute
present user_project, with: Entities::Project, current_user: current_user
end
diff --git a/lib/gitlab/application_context.rb b/lib/gitlab/application_context.rb
new file mode 100644
index 00000000000..b9190b519a0
--- /dev/null
+++ b/lib/gitlab/application_context.rb
@@ -0,0 +1,50 @@
+# frozen_string_literal: true
+
+module Gitlab
+ # A GitLab-rails specific accessor for `Labkit::Logging::ApplicationContext`
+ class ApplicationContext
+ include Gitlab::Utils::LazyAttributes
+
+ def self.with_context(args, &block)
+ application_context = new(**args)
+ Labkit::Context.with_context(application_context.to_lazy_hash, &block)
+ end
+
+ def self.push(args)
+ application_context = new(**args)
+ Labkit::Context.push(application_context.to_lazy_hash)
+ end
+
+ def initialize(user: nil, project: nil, namespace: nil)
+ @user, @project, @namespace = user, project, namespace
+ end
+
+ def to_lazy_hash
+ { user: -> { username },
+ project: -> { project_path },
+ root_namespace: -> { root_namespace_path } }
+ end
+
+ private
+
+ lazy_attr_reader :user, type: User
+ lazy_attr_reader :project, type: Project
+ lazy_attr_reader :namespace, type: Namespace
+
+ def project_path
+ project&.full_path
+ end
+
+ def username
+ user&.username
+ end
+
+ def root_namespace_path
+ if namespace
+ namespace.full_path_components.first
+ else
+ project&.full_path_components&.first
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/config/entry/artifacts.rb b/lib/gitlab/ci/config/entry/artifacts.rb
index 9d8d7675234..aebc1675bec 100644
--- a/lib/gitlab/ci/config/entry/artifacts.rb
+++ b/lib/gitlab/ci/config/entry/artifacts.rb
@@ -54,6 +54,11 @@ module Gitlab
def expose_as_present?
return false unless Feature.enabled?(:ci_expose_arbitrary_artifacts_in_mr, default_enabled: true)
+ # This duplicates the `validates :config, type: Hash` above,
+ # but Validatable currently doesn't halt the validation
+ # chain if it encounters a validation error.
+ return false unless @config.is_a?(Hash)
+
!@config[:expose_as].nil?
end
end
diff --git a/lib/gitlab/middleware/correlation_id.rb b/lib/gitlab/middleware/correlation_id.rb
deleted file mode 100644
index fffd5da827f..00000000000
--- a/lib/gitlab/middleware/correlation_id.rb
+++ /dev/null
@@ -1,31 +0,0 @@
-# frozen_string_literal: true
-
-# A dumb middleware that steals correlation id
-# and sets it as a global context for the request
-module Gitlab
- module Middleware
- class CorrelationId
- include ActionView::Helpers::TagHelper
-
- def initialize(app)
- @app = app
- end
-
- def call(env)
- ::Labkit::Correlation::CorrelationId.use_id(correlation_id(env)) do
- @app.call(env)
- end
- end
-
- private
-
- def correlation_id(env)
- request(env).request_id
- end
-
- def request(env)
- ActionDispatch::Request.new(env)
- end
- end
- end
-end
diff --git a/lib/gitlab/sidekiq_middleware.rb b/lib/gitlab/sidekiq_middleware.rb
index c6726dcfa67..4893cbc1f45 100644
--- a/lib/gitlab/sidekiq_middleware.rb
+++ b/lib/gitlab/sidekiq_middleware.rb
@@ -15,7 +15,7 @@ module Gitlab
chain.add Gitlab::SidekiqMiddleware::MemoryKiller if memory_killer
chain.add Gitlab::SidekiqMiddleware::RequestStoreMiddleware if request_store
chain.add Gitlab::SidekiqMiddleware::BatchLoader
- chain.add Gitlab::SidekiqMiddleware::CorrelationLogger
+ chain.add Labkit::Middleware::Sidekiq::Server
chain.add Gitlab::SidekiqMiddleware::InstrumentationLogger
chain.add Gitlab::SidekiqStatus::ServerMiddleware
end
@@ -27,7 +27,7 @@ module Gitlab
def self.client_configurator
lambda do |chain|
chain.add Gitlab::SidekiqStatus::ClientMiddleware
- chain.add Gitlab::SidekiqMiddleware::CorrelationInjector
+ chain.add Labkit::Middleware::Sidekiq::Client
end
end
end
diff --git a/lib/gitlab/sidekiq_middleware/correlation_injector.rb b/lib/gitlab/sidekiq_middleware/correlation_injector.rb
deleted file mode 100644
index 1539fd706ab..00000000000
--- a/lib/gitlab/sidekiq_middleware/correlation_injector.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module SidekiqMiddleware
- class CorrelationInjector
- def call(worker_class, job, queue, redis_pool)
- job[Labkit::Correlation::CorrelationId::LOG_KEY] ||=
- Labkit::Correlation::CorrelationId.current_or_new_id
-
- yield
- end
- end
- end
-end
diff --git a/lib/gitlab/sidekiq_middleware/correlation_logger.rb b/lib/gitlab/sidekiq_middleware/correlation_logger.rb
deleted file mode 100644
index cffc4483573..00000000000
--- a/lib/gitlab/sidekiq_middleware/correlation_logger.rb
+++ /dev/null
@@ -1,15 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
- module SidekiqMiddleware
- class CorrelationLogger
- def call(worker, job, queue)
- correlation_id = job[Labkit::Correlation::CorrelationId::LOG_KEY]
-
- Labkit::Correlation::CorrelationId.use_id(correlation_id) do
- yield
- end
- end
- end
- end
-end
diff --git a/lib/gitlab/utils/lazy_attributes.rb b/lib/gitlab/utils/lazy_attributes.rb
new file mode 100644
index 00000000000..79f3a7dcb53
--- /dev/null
+++ b/lib/gitlab/utils/lazy_attributes.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Utils
+ module LazyAttributes
+ extend ActiveSupport::Concern
+ include Gitlab::Utils::StrongMemoize
+
+ class_methods do
+ def lazy_attr_reader(*one_or_more_names, type: nil)
+ names = Array.wrap(one_or_more_names)
+ names.each { |name| define_lazy_reader(name, type: type) }
+ end
+
+ def lazy_attr_accessor(*one_or_more_names, type: nil)
+ names = Array.wrap(one_or_more_names)
+ names.each do |name|
+ define_lazy_reader(name, type: type)
+ define_lazy_writer(name)
+ end
+ end
+
+ private
+
+ def define_lazy_reader(name, type:)
+ define_method(name) do
+ strong_memoize("#{name}_lazy_loaded") do
+ value = instance_variable_get("@#{name}")
+ value = value.call if value.respond_to?(:call)
+ value = nil if type && !value.is_a?(type)
+ value
+ end
+ end
+ end
+
+ def define_lazy_writer(name)
+ define_method("#{name}=") do |value|
+ clear_memoization("#{name}_lazy_loaded")
+ instance_variable_set("@#{name}", value)
+ end
+ end
+ end
+ end
+ end
+end