diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-23 21:09:46 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-04-23 21:09:46 +0300 |
commit | fdd0b0fd4592c74257980d07878db75705d22192 (patch) | |
tree | fcf923555aed86fea3842f1074ec45d2864db20c /lib | |
parent | 9a9415ab127d5e660c09113238a6fb0a895218e9 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib')
-rw-r--r-- | lib/api/entities/project_import_status.rb | 2 | ||||
-rw-r--r-- | lib/api/entities/snippet.rb | 5 | ||||
-rw-r--r-- | lib/api/helpers/snippets_helpers.rb | 6 | ||||
-rw-r--r-- | lib/api/internal/base.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/danger/helper.rb | 14 | ||||
-rw-r--r-- | lib/gitlab/import_export/project/base_task.rb | 7 | ||||
-rw-r--r-- | lib/gitlab/import_export/project/import_task.rb | 18 | ||||
-rw-r--r-- | lib/gitlab/import_export/snippets_repo_restorer.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/import_export/snippets_repo_saver.rb | 2 | ||||
-rw-r--r-- | lib/gitlab/jira_import/metadata_collector.rb | 12 | ||||
-rw-r--r-- | lib/gitlab/tree_summary.rb | 16 | ||||
-rw-r--r-- | lib/gitlab/utils/measuring.rb | 57 |
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) |