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-04-23 21:09:46 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-04-23 21:09:46 +0300
commitfdd0b0fd4592c74257980d07878db75705d22192 (patch)
treefcf923555aed86fea3842f1074ec45d2864db20c /lib
parent9a9415ab127d5e660c09113238a6fb0a895218e9 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib')
-rw-r--r--lib/api/entities/project_import_status.rb2
-rw-r--r--lib/api/entities/snippet.rb5
-rw-r--r--lib/api/helpers/snippets_helpers.rb6
-rw-r--r--lib/api/internal/base.rb4
-rw-r--r--lib/gitlab/danger/helper.rb14
-rw-r--r--lib/gitlab/import_export/project/base_task.rb7
-rw-r--r--lib/gitlab/import_export/project/import_task.rb18
-rw-r--r--lib/gitlab/import_export/snippets_repo_restorer.rb1
-rw-r--r--lib/gitlab/import_export/snippets_repo_saver.rb2
-rw-r--r--lib/gitlab/jira_import/metadata_collector.rb12
-rw-r--r--lib/gitlab/tree_summary.rb16
-rw-r--r--lib/gitlab/utils/measuring.rb57
12 files changed, 101 insertions, 43 deletions
diff --git a/lib/api/entities/project_import_status.rb b/lib/api/entities/project_import_status.rb
index 5ef5600259f..f92593da3fa 100644
--- a/lib/api/entities/project_import_status.rb
+++ b/lib/api/entities/project_import_status.rb
@@ -9,7 +9,7 @@ module API
end
expose :failed_relations, using: Entities::ProjectImportFailedRelation do |project, _options|
- project.import_state.relation_hard_failures(limit: 100)
+ project.import_state&.relation_hard_failures(limit: 100) || []
end
# TODO: Use `expose_nil` once we upgrade the grape-entity gem
diff --git a/lib/api/entities/snippet.rb b/lib/api/entities/snippet.rb
index 2b254888cab..19c89603cbc 100644
--- a/lib/api/entities/snippet.rb
+++ b/lib/api/entities/snippet.rb
@@ -13,10 +13,9 @@ module API
expose :raw_url do |snippet|
Gitlab::UrlBuilder.build(snippet, raw: true)
end
- expose :ssh_url_to_repo, :http_url_to_repo, if: ->(snippet) { snippet.versioned_enabled_for?(options[:current_user]) }
+ expose :ssh_url_to_repo, :http_url_to_repo, if: ->(snippet) { snippet.repository_exists? }
expose :file_name do |snippet|
- (::Feature.enabled?(:version_snippets, options[:current_user]) && snippet.file_name_on_repo) ||
- snippet.file_name
+ snippet.file_name_on_repo || snippet.file_name
end
end
end
diff --git a/lib/api/helpers/snippets_helpers.rb b/lib/api/helpers/snippets_helpers.rb
index 6ca3086d934..20aeca6a9d3 100644
--- a/lib/api/helpers/snippets_helpers.rb
+++ b/lib/api/helpers/snippets_helpers.rb
@@ -4,12 +4,12 @@ module API
module Helpers
module SnippetsHelpers
def content_for(snippet)
- if ::Feature.enabled?(:version_snippets, current_user) && !snippet.empty_repo?
+ if snippet.empty_repo?
+ snippet.content
+ else
blob = snippet.blobs.first
blob.load_all_data!
blob.data
- else
- snippet.content
end
end
end
diff --git a/lib/api/internal/base.rb b/lib/api/internal/base.rb
index 1eac3142852..564a00701c4 100644
--- a/lib/api/internal/base.rb
+++ b/lib/api/internal/base.rb
@@ -112,10 +112,6 @@ module API
# check_ip - optional, only in EE version, may limit access to
# group resources based on its IP restrictions
post "/allowed" do
- if repo_type.snippet? && params[:protocol] != 'web' && Feature.disabled?(:version_snippets, actor.user)
- break response_with_status(code: 401, success: false, message: 'Snippet git access is disabled.')
- end
-
# It was moved to a separate method so that EE can alter its behaviour more
# easily.
check_allowed(params)
diff --git a/lib/gitlab/danger/helper.rb b/lib/gitlab/danger/helper.rb
index aa2737262be..ee453000a43 100644
--- a/lib/gitlab/danger/helper.rb
+++ b/lib/gitlab/danger/helper.rb
@@ -191,6 +191,20 @@ module Gitlab
gitlab_helper.mr_json['web_url'].include?('/gitlab-org/security/')
end
+ def mr_has_labels?(*labels)
+ return false unless gitlab_helper
+
+ labels = labels.flatten.uniq
+ (labels & gitlab_helper.mr_labels) == labels
+ end
+
+ def prepare_labels_for_mr(labels)
+ return '' unless labels.any?
+
+ labels_list = labels.map { |label| %Q{~"#{label}"} }.join(' ')
+ "/label #{labels_list}"
+ end
+
private
def has_database_scoped_labels?(current_mr_labels)
diff --git a/lib/gitlab/import_export/project/base_task.rb b/lib/gitlab/import_export/project/base_task.rb
index 6a7b24421c9..5b0ca37f9fe 100644
--- a/lib/gitlab/import_export/project/base_task.rb
+++ b/lib/gitlab/import_export/project/base_task.rb
@@ -30,6 +30,13 @@ module Gitlab
true
end
+ def measurement_options
+ {
+ measurement_enabled: measurement_enabled?,
+ measurement_logger: logger
+ }
+ end
+
def error(message)
logger.error(message)
diff --git a/lib/gitlab/import_export/project/import_task.rb b/lib/gitlab/import_export/project/import_task.rb
index ae654ddbeaf..101cc5f5ab0 100644
--- a/lib/gitlab/import_export/project/import_task.rb
+++ b/lib/gitlab/import_export/project/import_task.rb
@@ -32,7 +32,7 @@ module Gitlab
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/24475#note_283090635
# For development setups, this code-path will be excluded from n+1 detection.
::Gitlab::GitalyClient.allow_n_plus_1_calls do
- measurement_enabled? ? measurement.with_measuring { yield } : yield
+ yield
end
end
@@ -56,14 +56,10 @@ module Gitlab
disable_upload_object_storage do
service = Projects::GitlabProjectsImportService.new(
current_user,
- {
- namespace_id: namespace.id,
- path: project_path,
- file: File.open(file_path)
- }
+ import_params
)
- service.execute
+ service.execute(measurement_options)
end
end
@@ -99,6 +95,14 @@ module Gitlab
" as #{current_user.name}"
end
+ def import_params
+ {
+ namespace_id: namespace.id,
+ path: project_path,
+ file: File.open(file_path)
+ }
+ end
+
def show_import_failures_count
return unless project.import_failures.exists?
diff --git a/lib/gitlab/import_export/snippets_repo_restorer.rb b/lib/gitlab/import_export/snippets_repo_restorer.rb
index 8fe83225812..9ff3e74a6b1 100644
--- a/lib/gitlab/import_export/snippets_repo_restorer.rb
+++ b/lib/gitlab/import_export/snippets_repo_restorer.rb
@@ -10,7 +10,6 @@ module Gitlab
end
def restore
- return true unless Feature.enabled?(:version_snippets, @user)
return true unless Dir.exist?(snippets_repo_bundle_path)
@project.snippets.find_each.all? do |snippet|
diff --git a/lib/gitlab/import_export/snippets_repo_saver.rb b/lib/gitlab/import_export/snippets_repo_saver.rb
index 85e094c0d15..d3b0fe1c18c 100644
--- a/lib/gitlab/import_export/snippets_repo_saver.rb
+++ b/lib/gitlab/import_export/snippets_repo_saver.rb
@@ -12,8 +12,6 @@ module Gitlab
end
def save
- return true unless Feature.enabled?(:version_snippets, @current_user)
-
create_snippets_repo_directory
@project.snippets.find_each.all? do |snippet|
diff --git a/lib/gitlab/jira_import/metadata_collector.rb b/lib/gitlab/jira_import/metadata_collector.rb
index 49faef4cf49..5e873ab3ef4 100644
--- a/lib/gitlab/jira_import/metadata_collector.rb
+++ b/lib/gitlab/jira_import/metadata_collector.rb
@@ -34,22 +34,26 @@ module Gitlab
end
def add_labels
- return if fields['labels'].blank?
+ return if fields['labels'].blank? || !fields['labels'].is_a?(Array)
metadata << "- Labels: #{fields['labels'].join(', ')}"
end
def add_parent
parent_issue_key = fields.dig('parent', 'key')
+
return if parent_issue_key.blank?
- metadata << "- Parent issue: [#{parent_issue_key}] #{fields['parent']['fields']['summary']}"
+ parent_summary_key = fields.dig('parent', 'fields', 'summary')
+
+ metadata << "- Parent issue: [#{parent_issue_key}] #{parent_summary_key}".strip
end
def add_versions
- return if fields['fixVersions'].blank?
+ return if fields['fixVersions'].blank? || !fields['fixVersions'].is_a?(Array)
- metadata << "- Fix versions: #{fields['fixVersions'].map { |version| version['name'] }.join(', ')}"
+ versions = fields['fixVersions'].map { |version| version['name'] }.compact.join(', ')
+ metadata << "- Fix versions: #{versions}"
end
def fields
diff --git a/lib/gitlab/tree_summary.rb b/lib/gitlab/tree_summary.rb
index 5df53b5adde..724341c9cee 100644
--- a/lib/gitlab/tree_summary.rb
+++ b/lib/gitlab/tree_summary.rb
@@ -6,6 +6,9 @@ module Gitlab
include ::Gitlab::Utils::StrongMemoize
+ CACHE_EXPIRE_IN = 1.hour
+ MAX_OFFSET = 2**31
+
attr_reader :commit, :project, :path, :offset, :limit
attr_reader :resolved_commits
@@ -16,7 +19,7 @@ module Gitlab
@project = project
@path = params.fetch(:path, nil).presence
- @offset = params.fetch(:offset, 0).to_i
+ @offset = [params.fetch(:offset, 0).to_i, MAX_OFFSET].min
@limit = (params.fetch(:limit, 25) || 25).to_i
# Ensure that if multiple tree entries share the same last commit, they share
@@ -43,6 +46,17 @@ module Gitlab
[summary, commits]
end
+ def fetch_logs
+ cache_key = ['projects', project.id, 'logs', commit.id, path, offset]
+ Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRE_IN) do
+ logs, _ = summarize
+
+ new_offset = next_offset if more?
+
+ [logs.as_json, new_offset]
+ end
+ end
+
# Does the tree contain more entries after the given offset + limit?
def more?
all_contents[next_offset].present?
diff --git a/lib/gitlab/utils/measuring.rb b/lib/gitlab/utils/measuring.rb
index 0680cefd249..381eaa96170 100644
--- a/lib/gitlab/utils/measuring.rb
+++ b/lib/gitlab/utils/measuring.rb
@@ -5,13 +5,25 @@ require 'prometheus/pid_provider'
module Gitlab
module Utils
class Measuring
- def initialize(logger: Logger.new($stdout))
- @logger = logger
+ class << self
+ def execute_with(measurement_enabled, logger, base_log_data)
+ measurement_enabled ? measuring(logger, base_log_data).with_measuring { yield } : yield
+ end
+
+ private
+
+ def measuring(logger, base_log_data)
+ Gitlab::Utils::Measuring.new(logger: logger, base_log_data: base_log_data)
+ end
+ end
+
+ def initialize(logger: nil, base_log_data: {})
+ @logger = logger || Logger.new($stdout)
+ @base_log_data = base_log_data
end
def with_measuring
- logger.info "Measuring enabled..."
- with_gc_stats do
+ result = with_gc_stats do
with_count_queries do
with_measure_time do
yield
@@ -19,45 +31,56 @@ module Gitlab
end
end
- logger.info "Memory usage: #{Gitlab::Metrics::System.memory_usage.to_f / 1024 / 1024} MiB"
- logger.info "Label: #{::Prometheus::PidProvider.worker_id}"
+ log_info(
+ gc_stats: gc_stats,
+ time_to_finish: time_to_finish,
+ number_of_sql_calls: sql_calls_count,
+ memory_usage: "#{Gitlab::Metrics::System.memory_usage.to_f / 1024 / 1024} MiB",
+ label: ::Prometheus::PidProvider.worker_id
+ )
+
+ result
end
private
- attr_reader :logger
+ attr_reader :gc_stats, :time_to_finish, :sql_calls_count, :logger, :base_log_data
def with_count_queries(&block)
- count = 0
+ @sql_calls_count = 0
counter_f = ->(_name, _started, _finished, _unique_id, payload) {
- count += 1 unless payload[:name].in? %w[CACHE SCHEMA]
+ @sql_calls_count += 1 unless payload[:name].in? %w[CACHE SCHEMA]
}
ActiveSupport::Notifications.subscribed(counter_f, "sql.active_record", &block)
+ end
- logger.info "Number of sql calls: #{count}"
+ def log_info(details)
+ details = base_log_data.merge(details)
+ details = details.to_yaml if ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
+ logger.info(details)
end
def with_gc_stats
GC.start # perform a full mark-and-sweep
stats_before = GC.stat
- yield
+ result = yield
stats_after = GC.stat
- stats_diff = stats_after.map do |key, after_value|
+ @gc_stats = stats_after.map do |key, after_value|
before_value = stats_before[key]
[key, before: before_value, after: after_value, diff: after_value - before_value]
end.to_h
- logger.info "GC stats:"
- logger.info JSON.pretty_generate(stats_diff)
+ result
end
def with_measure_time
- timing = Benchmark.realtime do
- yield
+ result = nil
+ @time_to_finish = Benchmark.realtime do
+ result = yield
end
- logger.info "Time to finish: #{duration_in_numbers(timing)}"
+ result
end
def duration_in_numbers(duration_in_seconds)