diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2021-07-14 21:08:31 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2021-07-14 21:08:31 +0300 |
commit | 06ac12d53c3f0b7cee2755a1254bf1af05d55044 (patch) | |
tree | 95d0be0bd751a22d6135f496c425c44d774fbe54 /app | |
parent | b689f371350fbf1b71f266764ee018befc9b91f7 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
32 files changed, 188 insertions, 148 deletions
diff --git a/app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue index 413163c8536..413163c8536 100644 --- a/app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue +++ b/app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue diff --git a/app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue b/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue index 1dfea3f1e7b..1dfea3f1e7b 100644 --- a/app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue +++ b/app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue diff --git a/app/assets/javascripts/admin/users/constants.js b/app/assets/javascripts/admin/users/constants.js index d0421413132..33ee7e1cb0d 100644 --- a/app/assets/javascripts/admin/users/constants.js +++ b/app/assets/javascripts/admin/users/constants.js @@ -20,3 +20,9 @@ export const I18N_USER_ACTIONS = { ban: s__('AdminUsers|Ban user'), unban: s__('AdminUsers|Unban user'), }; + +export const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button'; + +export const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts'; + +export const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal'; diff --git a/app/assets/javascripts/admin/users/index.js b/app/assets/javascripts/admin/users/index.js index 54c8edc080b..05f8469e61a 100644 --- a/app/assets/javascripts/admin/users/index.js +++ b/app/assets/javascripts/admin/users/index.js @@ -2,7 +2,14 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; import createDefaultClient from '~/lib/graphql'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; +import csrf from '~/lib/utils/csrf'; import AdminUsersApp from './components/app.vue'; +import ModalManager from './components/modals/user_modal_manager.vue'; +import { + CONFIRM_DELETE_BUTTON_SELECTOR, + MODAL_TEXTS_CONTAINER_SELECTOR, + MODAL_MANAGER_SELECTOR, +} from './constants'; Vue.use(VueApollo); @@ -29,3 +36,45 @@ export const initAdminUsersApp = (el = document.querySelector('#js-admin-users-a }), }); }; + +export const initDeleteUserModals = () => { + const modalsMountElement = document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR); + + if (!modalsMountElement) { + return; + } + + const modalConfiguration = Array.from(modalsMountElement.children).reduce((accumulator, node) => { + const { modal, ...config } = node.dataset; + + return { + ...accumulator, + [modal]: { + title: node.dataset.title, + ...config, + content: node.innerHTML, + }, + }; + }, {}); + + // eslint-disable-next-line no-new + new Vue({ + el: MODAL_MANAGER_SELECTOR, + functional: true, + methods: { + show(...args) { + this.$refs.manager.show(...args); + }, + }, + render(h) { + return h(ModalManager, { + ref: 'manager', + props: { + selector: CONFIRM_DELETE_BUTTON_SELECTOR, + modalConfiguration, + csrfToken: csrf.token, + }, + }); + }, + }); +}; diff --git a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue index a19c76cfe3f..87066a0a0b6 100644 --- a/app/assets/javascripts/issuable_list/components/issuable_list_root.vue +++ b/app/assets/javascripts/issuable_list/components/issuable_list_root.vue @@ -134,7 +134,7 @@ export default { labelFilterParam: { type: String, required: false, - default: null, + default: undefined, }, isManualOrdering: { type: Boolean, diff --git a/app/assets/javascripts/pages/admin/users/keys/index.js b/app/assets/javascripts/pages/admin/identities/index.js index 868c8e33077..868c8e33077 100644 --- a/app/assets/javascripts/pages/admin/users/keys/index.js +++ b/app/assets/javascripts/pages/admin/identities/index.js diff --git a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js index dc1bb88bf4b..3f9e4e9d591 100644 --- a/app/assets/javascripts/pages/admin/impersonation_tokens/index.js +++ b/app/assets/javascripts/pages/admin/impersonation_tokens/index.js @@ -1,3 +1,5 @@ import { initExpiresAtField } from '~/access_tokens'; +import initConfirmModal from '~/confirm_modal'; initExpiresAtField(); +initConfirmModal(); diff --git a/app/assets/javascripts/pages/admin/users/index.js b/app/assets/javascripts/pages/admin/users/index.js index 9a8b0c9990f..99bf842ef2d 100644 --- a/app/assets/javascripts/pages/admin/users/index.js +++ b/app/assets/javascripts/pages/admin/users/index.js @@ -1,64 +1,6 @@ -import Vue from 'vue'; - -import { initAdminUsersApp } from '~/admin/users'; +import { initAdminUsersApp, initDeleteUserModals } from '~/admin/users'; import initConfirmModal from '~/confirm_modal'; -import csrf from '~/lib/utils/csrf'; -import Translate from '~/vue_shared/translate'; -import ModalManager from './components/user_modal_manager.vue'; - -const CONFIRM_DELETE_BUTTON_SELECTOR = '.js-delete-user-modal-button'; -const MODAL_TEXTS_CONTAINER_SELECTOR = '#js-modal-texts'; -const MODAL_MANAGER_SELECTOR = '#js-delete-user-modal'; - -function loadModalsConfigurationFromHtml(modalsElement) { - const modalsConfiguration = {}; - - if (!modalsElement) { - /* eslint-disable-next-line @gitlab/require-i18n-strings */ - throw new Error('Modals content element not found!'); - } - - Array.from(modalsElement.children).forEach((node) => { - const { modal, ...config } = node.dataset; - modalsConfiguration[modal] = { - title: node.dataset.title, - ...config, - content: node.innerHTML, - }; - }); - - return modalsConfiguration; -} - -document.addEventListener('DOMContentLoaded', () => { - Vue.use(Translate); - - initAdminUsersApp(); - - const modalConfiguration = loadModalsConfigurationFromHtml( - document.querySelector(MODAL_TEXTS_CONTAINER_SELECTOR), - ); - - // eslint-disable-next-line no-new - new Vue({ - el: MODAL_MANAGER_SELECTOR, - functional: true, - methods: { - show(...args) { - this.$refs.manager.show(...args); - }, - }, - render(h) { - return h(ModalManager, { - ref: 'manager', - props: { - selector: CONFIRM_DELETE_BUTTON_SELECTOR, - modalConfiguration, - csrfToken: csrf.token, - }, - }); - }, - }); - initConfirmModal(); -}); +initAdminUsersApp(); +initDeleteUserModals(); +initConfirmModal(); diff --git a/app/assets/javascripts/repository/components/table/index.vue b/app/assets/javascripts/repository/components/table/index.vue index ca5711de49c..69eefc807d7 100644 --- a/app/assets/javascripts/repository/components/table/index.vue +++ b/app/assets/javascripts/repository/components/table/index.vue @@ -70,7 +70,7 @@ export default { ); }, showParentRow() { - return !this.isLoading && ['', '/'].indexOf(this.path) === -1; + return ['', '/'].indexOf(this.path) === -1; }, }, methods: { diff --git a/app/assets/javascripts/search/store/actions.js b/app/assets/javascripts/search/store/actions.js index eaf164d5591..b53557c0ec5 100644 --- a/app/assets/javascripts/search/store/actions.js +++ b/app/assets/javascripts/search/store/actions.js @@ -32,7 +32,12 @@ export const fetchProjects = ({ commit, state }, search) => { if (groupId) { // TODO (https://gitlab.com/gitlab-org/gitlab/-/issues/323331): For errors `createFlash` is called twice; in `callback` and in `Api.groupProjects` - Api.groupProjects(groupId, search, { order_by: 'similarity' }, callback); + Api.groupProjects( + groupId, + search, + { order_by: 'similarity', with_shared: false, include_subgroups: true }, + callback, + ); } else { // The .catch() is due to the API method not handling a rejection properly Api.projects(search, { order_by: 'id' }, callback).catch(() => { diff --git a/app/controllers/projects/repositories_controller.rb b/app/controllers/projects/repositories_controller.rb index 8f64a8aa1d3..8beebb52980 100644 --- a/app/controllers/projects/repositories_controller.rb +++ b/app/controllers/projects/repositories_controller.rb @@ -117,7 +117,7 @@ class Projects::RepositoriesController < Projects::ApplicationController # from Redis. def extract_ref_and_filename(id) path = id.strip - data = path.match(/(.*)\/(.*)/) + data = path.match(%r{(.*)/(.*)}) if data [data[1], data[2]] diff --git a/app/controllers/projects/service_hook_logs_controller.rb b/app/controllers/projects/service_hook_logs_controller.rb index 93ba3eedddb..88de0b7ba0d 100644 --- a/app/controllers/projects/service_hook_logs_controller.rb +++ b/app/controllers/projects/service_hook_logs_controller.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class Projects::ServiceHookLogsController < Projects::HookLogsController + extend Gitlab::Utils::Override + before_action :integration, only: [:show, :retry] def retry @@ -10,11 +12,12 @@ class Projects::ServiceHookLogsController < Projects::HookLogsController private - def hook - @hook ||= integration.service_hook - end - def integration @integration ||= @project.find_or_initialize_integration(params[:service_id]) end + + override :hook + def hook + @hook ||= integration.service_hook || not_found + end end diff --git a/app/helpers/ci/variables_helper.rb b/app/helpers/ci/variables_helper.rb index b20390d58e9..84572363a8d 100644 --- a/app/helpers/ci/variables_helper.rb +++ b/app/helpers/ci/variables_helper.rb @@ -48,7 +48,7 @@ module Ci end def ci_variable_maskable_regex - Ci::Maskable::REGEX.inspect.sub('\\A', '^').sub('\\z', '$').sub(/^\//, '').sub(/\/[a-z]*$/, '').gsub('\/', '/') + Ci::Maskable::REGEX.inspect.sub('\\A', '^').sub('\\z', '$').sub(%r{^/}, '').sub(%r{/[a-z]*$}, '').gsub('\/', '/') end end end diff --git a/app/helpers/routing/snippets_helper.rb b/app/helpers/routing/snippets_helper.rb index 2e81c5adc42..19450c1d033 100644 --- a/app/helpers/routing/snippets_helper.rb +++ b/app/helpers/routing/snippets_helper.rb @@ -49,7 +49,7 @@ module Routing def gitlab_raw_snippet_blob_url(snippet, path, ref = nil, **options) params = { snippet_id: snippet, - ref: ref || snippet.repository.root_ref, + ref: ref || snippet.default_branch, path: path } diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb index 0cd89f91b1a..679406e68d7 100644 --- a/app/models/alert_management/alert.rb +++ b/app/models/alert_management/alert.rb @@ -210,7 +210,7 @@ module AlertManagement end def self.link_reference_pattern - @link_reference_pattern ||= super("alert_management", /(?<alert>\d+)\/details(\#)?/) + @link_reference_pattern ||= super("alert_management", %r{(?<alert>\d+)/details(\#)?}) end def self.reference_valid?(reference) diff --git a/app/models/application_setting.rb b/app/models/application_setting.rb index cbde2db803a..a7140cc0718 100644 --- a/app/models/application_setting.rb +++ b/app/models/application_setting.rb @@ -293,7 +293,7 @@ class ApplicationSetting < ApplicationRecord validates :user_default_internal_regex, js_regex: true, allow_nil: true validates :personal_access_token_prefix, - format: { with: /\A[a-zA-Z0-9_+=\/@:.-]+\z/, + format: { with: %r{\A[a-zA-Z0-9_+=/@:.-]+\z}, message: _("can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'") }, length: { maximum: 20, message: _('is too long (maximum is %{count} characters)') }, allow_blank: true @@ -590,7 +590,7 @@ class ApplicationSetting < ApplicationRecord end def sourcegraph_url_is_com? - !!(sourcegraph_url =~ /\Ahttps:\/\/(www\.)?sourcegraph\.com/) + !!(sourcegraph_url =~ %r{\Ahttps://(www\.)?sourcegraph\.com}) end def instance_review_permitted? diff --git a/app/models/blob_viewer/go_mod.rb b/app/models/blob_viewer/go_mod.rb index ae57e2c0526..d4d117f899c 100644 --- a/app/models/blob_viewer/go_mod.rb +++ b/app/models/blob_viewer/go_mod.rb @@ -5,13 +5,13 @@ module BlobViewer include ServerSide include Gitlab::Utils::StrongMemoize - MODULE_REGEX = / + MODULE_REGEX = %r{ \A (?# beginning of file) module\s+ (?# module directive) (?<name>.*?) (?# module name) - \s*(?:\/\/.*)? (?# comment) + \s*(?://.*)? (?# comment) (?:\n|\z) (?# newline or end of file) - /x.freeze + }x.freeze self.file_types = %i(go_mod go_sum) diff --git a/app/models/concerns/ci/maskable.rb b/app/models/concerns/ci/maskable.rb index e1ef4531845..62be0150ee0 100644 --- a/app/models/concerns/ci/maskable.rb +++ b/app/models/concerns/ci/maskable.rb @@ -11,7 +11,7 @@ module Ci # * Minimal length of 8 characters # * Characters must be from the Base64 alphabet (RFC4648) with the addition of '@', ':', '.', and '~' # * Absolutely no fun is allowed - REGEX = /\A[a-zA-Z0-9_+=\/@:.~-]{8,}\z/.freeze + REGEX = %r{\A[a-zA-Z0-9_+=/@:.~-]{8,}\z}.freeze included do validates :masked, inclusion: { in: [true, false] } diff --git a/app/models/concerns/integrations/has_web_hook.rb b/app/models/concerns/integrations/has_web_hook.rb new file mode 100644 index 00000000000..dabe7152b18 --- /dev/null +++ b/app/models/concerns/integrations/has_web_hook.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Integrations + module HasWebHook + extend ActiveSupport::Concern + + included do + after_save :update_web_hook!, if: :activated? + end + + # Return the URL to be used for the webhook. + def hook_url + raise NotImplementedError + end + + # Return whether the webhook should use SSL verification. + def hook_ssl_verification + true + end + + # Create or update the webhook, raising an exception if it cannot be saved. + def update_web_hook! + hook = service_hook || build_service_hook + hook.url = hook_url if hook.url != hook_url # avoid reencryption + hook.enable_ssl_verification = hook_ssl_verification + hook.save! if hook.changed? + hook + end + + # Execute the webhook, creating it if necessary. + def execute_web_hook!(*args) + update_web_hook! + service_hook.execute(*args) + end + end +end diff --git a/app/models/integrations/bamboo.rb b/app/models/integrations/bamboo.rb index fef2774c593..590be52151c 100644 --- a/app/models/integrations/bamboo.rb +++ b/app/models/integrations/bamboo.rb @@ -18,14 +18,8 @@ module Integrations attr_accessor :response - after_save :compose_service_hook, if: :activated? before_update :reset_password - def compose_service_hook - hook = service_hook || build_service_hook - hook.save - end - def reset_password if bamboo_url_changed? && !password_touched? self.password = nil diff --git a/app/models/integrations/buildkite.rb b/app/models/integrations/buildkite.rb index 4f28c961916..94a37f0c4f2 100644 --- a/app/models/integrations/buildkite.rb +++ b/app/models/integrations/buildkite.rb @@ -4,7 +4,9 @@ require "addressable/uri" module Integrations class Buildkite < BaseCi + include HasWebHook include ReactiveService + extend Gitlab::Utils::Override ENDPOINT = "https://buildkite.com" @@ -13,8 +15,6 @@ module Integrations validates :project_url, presence: true, public_url: true, if: :activated? validates :token, presence: true, if: :activated? - after_save :compose_service_hook, if: :activated? - def self.supported_events %w(push merge_request tag_push) end @@ -35,21 +35,15 @@ module Integrations self.properties.delete('enable_ssl_verification') # Remove unused key end - def webhook_url + override :hook_url + def hook_url "#{buildkite_endpoint('webhook')}/deliver/#{webhook_token}" end - def compose_service_hook - hook = service_hook || build_service_hook - hook.url = webhook_url - hook.enable_ssl_verification = true - hook.save - end - def execute(data) return unless supported_events.include?(data[:object_kind]) - service_hook.execute(data) + execute_web_hook!(data) end def commit_status(sha, ref) diff --git a/app/models/integrations/datadog.rb b/app/models/integrations/datadog.rb index d7d472f1d89..27c2fcf266b 100644 --- a/app/models/integrations/datadog.rb +++ b/app/models/integrations/datadog.rb @@ -2,6 +2,9 @@ module Integrations class Datadog < Integration + include HasWebHook + extend Gitlab::Utils::Override + DEFAULT_DOMAIN = 'datadoghq.com' URL_TEMPLATE = 'https://webhooks-http-intake.logs.%{datadog_domain}/api/v2/webhook' URL_TEMPLATE_API_KEYS = 'https://app.%{datadog_domain}/account/settings#api' @@ -21,8 +24,6 @@ module Integrations validates :api_url, presence: true, unless: -> (obj) { obj.datadog_site.present? } end - after_save :compose_service_hook, if: :activated? - def initialize_properties super @@ -98,12 +99,7 @@ module Integrations ] end - def compose_service_hook - hook = service_hook || build_service_hook - hook.url = hook_url - hook.save - end - + override :hook_url def hook_url url = api_url.presence || sprintf(URL_TEMPLATE, datadog_domain: datadog_domain) url = URI.parse(url) @@ -127,7 +123,7 @@ module Integrations object_kind = 'job' if object_kind == 'build' return unless supported_events.include?(object_kind) - service_hook.execute(data, "#{object_kind} hook") + execute_web_hook!(data, "#{object_kind} hook") end def test(data) diff --git a/app/models/integrations/drone_ci.rb b/app/models/integrations/drone_ci.rb index 6d60ebac8b7..c93ae432fe9 100644 --- a/app/models/integrations/drone_ci.rb +++ b/app/models/integrations/drone_ci.rb @@ -2,8 +2,10 @@ module Integrations class DroneCi < BaseCi + include HasWebHook include ReactiveService include ServicePushDataValidations + extend Gitlab::Utils::Override prop_accessor :drone_url, :token boolean_accessor :enable_ssl_verification @@ -11,24 +13,16 @@ module Integrations validates :drone_url, presence: true, public_url: true, if: :activated? validates :token, presence: true, if: :activated? - after_save :compose_service_hook, if: :activated? - - def compose_service_hook - hook = service_hook || build_service_hook - # If using a service template, project may not be available - hook.url = [drone_url, "/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join if project - hook.enable_ssl_verification = !!enable_ssl_verification - hook.save - end - def execute(data) + return unless project + case data[:object_kind] when 'push' - service_hook.execute(data) if push_valid?(data) + execute_web_hook!(data) if push_valid?(data) when 'merge_request' - service_hook.execute(data) if merge_request_valid?(data) + execute_web_hook!(data) if merge_request_valid?(data) when 'tag_push' - service_hook.execute(data) if tag_push_valid?(data) + execute_web_hook!(data) if tag_push_valid?(data) end end @@ -105,5 +99,21 @@ module Integrations { type: 'checkbox', name: 'enable_ssl_verification', title: "Enable SSL verification" } ] end + + override :hook_url + def hook_url + [drone_url, "/hook", "?owner=#{project.namespace.full_path}", "&name=#{project.path}", "&access_token=#{token}"].join + end + + override :hook_ssl_verification + def hook_ssl_verification + !!enable_ssl_verification + end + + override :update_web_hook! + def update_web_hook! + # If using a service template, project may not be available + super if project + end end end diff --git a/app/models/integrations/jenkins.rb b/app/models/integrations/jenkins.rb index 264bbd0b6ed..55fc60990f3 100644 --- a/app/models/integrations/jenkins.rb +++ b/app/models/integrations/jenkins.rb @@ -2,7 +2,9 @@ module Integrations class Jenkins < BaseCi + include HasWebHook include ActionView::Helpers::UrlHelper + extend Gitlab::Utils::Override prop_accessor :jenkins_url, :project_name, :username, :password @@ -16,8 +18,6 @@ module Integrations default_value_for :merge_requests_events, false default_value_for :tag_push_events, false - after_save :compose_service_hook, if: :activated? - def reset_password # don't reset the password if a new one is provided if (jenkins_url_changed? || username.blank?) && !password_touched? @@ -25,16 +25,10 @@ module Integrations end end - def compose_service_hook - hook = service_hook || build_service_hook - hook.url = hook_url - hook.save - end - def execute(data) return unless supported_events.include?(data[:object_kind]) - service_hook.execute(data, "#{data[:object_kind]}_hook") + execute_web_hook!(data, "#{data[:object_kind]}_hook") end def test(data) @@ -48,6 +42,7 @@ module Integrations { success: true, result: result[:message] } end + override :hook_url def hook_url url = URI.parse(jenkins_url) url.path = File.join(url.path || '/', "project/#{project_name}") diff --git a/app/models/integrations/packagist.rb b/app/models/integrations/packagist.rb index b597bd11175..fb0917db02b 100644 --- a/app/models/integrations/packagist.rb +++ b/app/models/integrations/packagist.rb @@ -2,6 +2,9 @@ module Integrations class Packagist < Integration + include HasWebHook + extend Gitlab::Utils::Override + prop_accessor :username, :token, :server validates :username, presence: true, if: :activated? @@ -10,8 +13,6 @@ module Integrations default_value_for :push_events, true default_value_for :tag_push_events, true - after_save :compose_service_hook, if: :activated? - def title 'Packagist' end @@ -39,7 +40,7 @@ module Integrations def execute(data) return unless supported_events.include?(data[:object_kind]) - service_hook.execute(data) + execute_web_hook!(data) end def test(data) @@ -53,12 +54,7 @@ module Integrations { success: true, result: result[:message] } end - def compose_service_hook - hook = service_hook || build_service_hook - hook.url = hook_url - hook.save - end - + override :hook_url def hook_url base_url = server.presence || 'https://packagist.org' "#{base_url}/api/update-package?username=#{username}&apiToken=#{token}" diff --git a/app/models/integrations/teamcity.rb b/app/models/integrations/teamcity.rb index 403271aa6a9..135c304b57e 100644 --- a/app/models/integrations/teamcity.rb +++ b/app/models/integrations/teamcity.rb @@ -18,7 +18,6 @@ module Integrations attr_accessor :response - after_save :compose_service_hook, if: :activated? before_update :reset_password class << self @@ -31,11 +30,6 @@ module Integrations end end - def compose_service_hook - hook = service_hook || build_service_hook - hook.save - end - def reset_password if teamcity_url_changed? && !password_touched? self.password = nil diff --git a/app/models/operations/feature_flag.rb b/app/models/operations/feature_flag.rb index 8b052f80395..450a5970ad8 100644 --- a/app/models/operations/feature_flag.rb +++ b/app/models/operations/feature_flag.rb @@ -80,7 +80,7 @@ module Operations end def link_reference_pattern - @link_reference_pattern ||= super("feature_flags", /(?<feature_flag>\d+)\/edit/) + @link_reference_pattern ||= super("feature_flags", %r{(?<feature_flag>\d+)/edit}) end def reference_postfix diff --git a/app/models/packages/go/module.rb b/app/models/packages/go/module.rb index 00d51c21881..a029437c82d 100644 --- a/app/models/packages/go/module.rb +++ b/app/models/packages/go/module.rb @@ -33,7 +33,7 @@ module Packages end def path_valid?(major) - m = /\/v(\d+)$/i.match(@name) + m = %r{/v(\d+)$}i.match(@name) case major when 0, 1 diff --git a/app/services/auth/container_registry_authentication_service.rb b/app/services/auth/container_registry_authentication_service.rb index 5fde346c4ab..d42dcb2fd00 100644 --- a/app/services/auth/container_registry_authentication_service.rb +++ b/app/services/auth/container_registry_authentication_service.rb @@ -115,7 +115,25 @@ module Auth # ensure_container_repository!(path, authorized_actions) - { type: type, name: path.to_s, actions: authorized_actions } + { + type: type, + name: path.to_s, + actions: authorized_actions, + migration_eligible: migration_eligible(requested_project, authorized_actions) + }.compact + end + + def migration_eligible(project, actions) + return unless actions.include?('push') + return unless Feature.enabled?(:container_registry_migration_phase1) + + # The migration process will start by allowing only specific test and gitlab-org projects using the + # `container_registry_migration_phase1_allow` FF. We'll then move on to a percentage rollout using this same FF. + # To remove the risk of impacting enterprise customers that rely heavily on the registry during the percentage + # rollout, we'll add their top-level group/namespace to the `container_registry_migration_phase1_deny` FF. Later, + # we'll remove them manually from this deny list, and their new repositories will become eligible. + Feature.disabled?(:container_registry_migration_phase1_deny, project.root_ancestor) && + Feature.enabled?(:container_registry_migration_phase1_allow, project) end ## diff --git a/app/services/packages/conan/search_service.rb b/app/services/packages/conan/search_service.rb index 143fd8a627b..31ee9bea084 100644 --- a/app/services/packages/conan/search_service.rb +++ b/app/services/packages/conan/search_service.rb @@ -41,7 +41,7 @@ module Packages end def search_for_single_package(query) - name, version, username, _ = query.split(/[@\/]/) + name, version, username, _ = query.split(%r{[@/]}) full_path = Packages::Conan::Metadatum.full_path_from(package_username: username) project = Project.find_by_full_path(full_path) return unless Ability.allowed?(current_user, :read_package, project) diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb index eac84337967..6c29ba81910 100644 --- a/app/services/projects/update_remote_mirror_service.rb +++ b/app/services/projects/update_remote_mirror_service.rb @@ -65,7 +65,7 @@ module Projects # TODO: Support LFS sync over SSH # https://gitlab.com/gitlab-org/gitlab/-/issues/249587 - return unless remote_mirror.url =~ /\Ahttps?:\/\//i + return unless remote_mirror.url =~ %r{\Ahttps?://}i return unless remote_mirror.password_auth? Lfs::PushService.new( diff --git a/app/workers/project_service_worker.rb b/app/workers/project_service_worker.rb index 967be3b3e81..da38d2fc0cd 100644 --- a/app/workers/project_service_worker.rb +++ b/app/workers/project_service_worker.rb @@ -15,6 +15,6 @@ class ProjectServiceWorker # rubocop:disable Scalability/IdempotentWorker integration.execute(data) rescue StandardError => error integration_class = integration&.class&.name || "Not Found" - logger.error class: self.class.name, service_class: integration_class, message: error.message + Gitlab::ErrorTracking.log_exception(error, integration_class: integration_class) end end |