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/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2021-07-14 21:08:31 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2021-07-14 21:08:31 +0300
commit06ac12d53c3f0b7cee2755a1254bf1af05d55044 (patch)
tree95d0be0bd751a22d6135f496c425c44d774fbe54 /app
parentb689f371350fbf1b71f266764ee018befc9b91f7 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/admin/users/components/modals/delete_user_modal.vue (renamed from app/assets/javascripts/pages/admin/users/components/delete_user_modal.vue)0
-rw-r--r--app/assets/javascripts/admin/users/components/modals/user_modal_manager.vue (renamed from app/assets/javascripts/pages/admin/users/components/user_modal_manager.vue)0
-rw-r--r--app/assets/javascripts/admin/users/constants.js6
-rw-r--r--app/assets/javascripts/admin/users/index.js49
-rw-r--r--app/assets/javascripts/issuable_list/components/issuable_list_root.vue2
-rw-r--r--app/assets/javascripts/pages/admin/identities/index.js (renamed from app/assets/javascripts/pages/admin/users/keys/index.js)0
-rw-r--r--app/assets/javascripts/pages/admin/impersonation_tokens/index.js2
-rw-r--r--app/assets/javascripts/pages/admin/users/index.js66
-rw-r--r--app/assets/javascripts/repository/components/table/index.vue2
-rw-r--r--app/assets/javascripts/search/store/actions.js7
-rw-r--r--app/controllers/projects/repositories_controller.rb2
-rw-r--r--app/controllers/projects/service_hook_logs_controller.rb11
-rw-r--r--app/helpers/ci/variables_helper.rb2
-rw-r--r--app/helpers/routing/snippets_helper.rb2
-rw-r--r--app/models/alert_management/alert.rb2
-rw-r--r--app/models/application_setting.rb4
-rw-r--r--app/models/blob_viewer/go_mod.rb6
-rw-r--r--app/models/concerns/ci/maskable.rb2
-rw-r--r--app/models/concerns/integrations/has_web_hook.rb36
-rw-r--r--app/models/integrations/bamboo.rb6
-rw-r--r--app/models/integrations/buildkite.rb16
-rw-r--r--app/models/integrations/datadog.rb14
-rw-r--r--app/models/integrations/drone_ci.rb36
-rw-r--r--app/models/integrations/jenkins.rb13
-rw-r--r--app/models/integrations/packagist.rb14
-rw-r--r--app/models/integrations/teamcity.rb6
-rw-r--r--app/models/operations/feature_flag.rb2
-rw-r--r--app/models/packages/go/module.rb2
-rw-r--r--app/services/auth/container_registry_authentication_service.rb20
-rw-r--r--app/services/packages/conan/search_service.rb2
-rw-r--r--app/services/projects/update_remote_mirror_service.rb2
-rw-r--r--app/workers/project_service_worker.rb2
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