diff options
157 files changed, 1143 insertions, 343 deletions
@@ -474,7 +474,7 @@ end gem 'spamcheck', '~> 0.1.0' # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 14.2.0.pre.rc2' +gem 'gitaly', '~> 14.3.0.pre.rc1' # KAS GRPC protocol definitions gem 'kas-grpc', '~> 0.0.2' diff --git a/Gemfile.lock b/Gemfile.lock index 7f9375a4424..f9adeeca757 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -453,7 +453,7 @@ GEM rails (>= 3.2.0) git (1.7.0) rchardet (~> 1.8) - gitaly (14.2.0.pre.rc2) + gitaly (14.3.0.pre.rc1) grpc (~> 1.0) github-markup (1.7.0) gitlab (4.16.1) @@ -1471,7 +1471,7 @@ DEPENDENCIES gettext (~> 3.3) gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails_js (~> 1.3) - gitaly (~> 14.2.0.pre.rc2) + gitaly (~> 14.3.0.pre.rc1) github-markup (~> 1.7.0) gitlab-chronic (~> 0.10.5) gitlab-dangerfiles (~> 2.3.0) diff --git a/app/assets/javascripts/content_editor/extensions/division.js b/app/assets/javascripts/content_editor/extensions/division.js new file mode 100644 index 00000000000..c70d1700941 --- /dev/null +++ b/app/assets/javascripts/content_editor/extensions/division.js @@ -0,0 +1,17 @@ +import { Node } from '@tiptap/core'; +import { PARSE_HTML_PRIORITY_LOWEST } from '../constants'; + +export default Node.create({ + name: 'division', + content: 'block*', + group: 'block', + defining: true, + + parseHTML() { + return [{ tag: 'div', priority: PARSE_HTML_PRIORITY_LOWEST }]; + }, + + renderHTML({ HTMLAttributes }) { + return ['div', HTMLAttributes, 0]; + }, +}); diff --git a/app/assets/javascripts/content_editor/extensions/figure.js b/app/assets/javascripts/content_editor/extensions/figure.js new file mode 100644 index 00000000000..b2076894412 --- /dev/null +++ b/app/assets/javascripts/content_editor/extensions/figure.js @@ -0,0 +1,16 @@ +import { Node } from '@tiptap/core'; + +export default Node.create({ + name: 'figure', + content: 'block+', + group: 'block', + defining: true, + + parseHTML() { + return [{ tag: 'figure' }]; + }, + + renderHTML({ HTMLAttributes }) { + return ['figure', HTMLAttributes, 0]; + }, +}); diff --git a/app/assets/javascripts/content_editor/extensions/figure_caption.js b/app/assets/javascripts/content_editor/extensions/figure_caption.js new file mode 100644 index 00000000000..ffd1b474f03 --- /dev/null +++ b/app/assets/javascripts/content_editor/extensions/figure_caption.js @@ -0,0 +1,16 @@ +import { Node } from '@tiptap/core'; + +export default Node.create({ + name: 'figureCaption', + content: 'inline*', + group: 'block', + defining: true, + + parseHTML() { + return [{ tag: 'figcaption' }]; + }, + + renderHTML({ HTMLAttributes }) { + return ['figcaption', HTMLAttributes, 0]; + }, +}); diff --git a/app/assets/javascripts/content_editor/services/create_content_editor.js b/app/assets/javascripts/content_editor/services/create_content_editor.js index f6aa1a1150d..368730ed926 100644 --- a/app/assets/javascripts/content_editor/services/create_content_editor.js +++ b/app/assets/javascripts/content_editor/services/create_content_editor.js @@ -8,9 +8,12 @@ import Bold from '../extensions/bold'; import BulletList from '../extensions/bullet_list'; import Code from '../extensions/code'; import CodeBlockHighlight from '../extensions/code_block_highlight'; +import Division from '../extensions/division'; import Document from '../extensions/document'; import Dropcursor from '../extensions/dropcursor'; import Emoji from '../extensions/emoji'; +import Figure from '../extensions/figure'; +import FigureCaption from '../extensions/figure_caption'; import Gapcursor from '../extensions/gapcursor'; import HardBreak from '../extensions/hard_break'; import Heading from '../extensions/heading'; @@ -71,8 +74,11 @@ export const createContentEditor = ({ Code, CodeBlockHighlight, Document, + Division, Dropcursor, Emoji, + Figure, + FigureCaption, Gapcursor, HardBreak, Heading, diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js index c49580ee91f..c21482751b1 100644 --- a/app/assets/javascripts/content_editor/services/markdown_serializer.js +++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js @@ -9,7 +9,10 @@ import Bold from '../extensions/bold'; import BulletList from '../extensions/bullet_list'; import Code from '../extensions/code'; import CodeBlockHighlight from '../extensions/code_block_highlight'; +import Division from '../extensions/division'; import Emoji from '../extensions/emoji'; +import Figure from '../extensions/figure'; +import FigureCaption from '../extensions/figure_caption'; import HardBreak from '../extensions/hard_break'; import Heading from '../extensions/heading'; import HorizontalRule from '../extensions/horizontal_rule'; @@ -43,6 +46,7 @@ import { renderOrderedList, renderImage, renderPlayable, + renderHTMLNode, } from './serialization_helpers'; const defaultSerializerConfig = { @@ -116,11 +120,14 @@ const defaultSerializerConfig = { state.write('```'); state.closeBlock(node); }, + [Division.name]: renderHTMLNode('div'), [Emoji.name]: (state, node) => { const { name } = node.attrs; state.write(`:${name}:`); }, + [Figure.name]: renderHTMLNode('figure'), + [FigureCaption.name]: renderHTMLNode('figcaption'), [HardBreak.name]: renderHardBreak, [Heading.name]: defaultMarkdownSerializer.nodes.heading, [HorizontalRule.name]: defaultMarkdownSerializer.nodes.horizontal_rule, diff --git a/app/assets/javascripts/content_editor/services/serialization_helpers.js b/app/assets/javascripts/content_editor/services/serialization_helpers.js index a45f76e8d47..47e465fa108 100644 --- a/app/assets/javascripts/content_editor/services/serialization_helpers.js +++ b/app/assets/javascripts/content_editor/services/serialization_helpers.js @@ -24,12 +24,20 @@ export function isPlainURL(link, parent, index, side) { return !link.isInSet(next.marks); } -function shouldRenderCellInline(cell) { +function containsOnlyText(node) { + if (node.childCount === 1) { + const child = node.child(0); + return child.isText && child.marks.length === 0; + } + + return false; +} + +function containsParagraphWithOnlyText(cell) { if (cell.childCount === 1) { - const parent = cell.child(0); - if (parent.type.name === 'paragraph' && parent.childCount === 1) { - const child = parent.child(0); - return child.isText && child.marks.length === 0; + const child = cell.child(0); + if (child.type.name === 'paragraph') { + return containsOnlyText(child); } } @@ -208,7 +216,7 @@ function renderTableRowAsHTML(state, node) { renderTagOpen(state, tag, cell.attrs); - if (!shouldRenderCellInline(cell)) { + if (!containsParagraphWithOnlyText(cell)) { state.closeBlock(node); state.flushClose(); } @@ -222,6 +230,38 @@ function renderTableRowAsHTML(state, node) { renderTagClose(state, 'tr'); } +export function renderContent(state, node, forceRenderInline) { + if (node.type.inlineContent) { + if (containsOnlyText(node)) { + state.renderInline(node); + } else { + state.closeBlock(node); + state.flushClose(); + state.renderInline(node); + state.closeBlock(node); + state.flushClose(); + } + } else { + const renderInline = forceRenderInline || containsParagraphWithOnlyText(node); + if (!renderInline) { + state.closeBlock(node); + state.flushClose(); + state.renderContent(node); + state.ensureNewLine(); + } else { + state.renderInline(forceRenderInline ? node : node.child(0)); + } + } +} + +export function renderHTMLNode(tagName, forceRenderInline = false) { + return (state, node) => { + renderTagOpen(state, tagName, node.attrs); + renderContent(state, node, forceRenderInline); + renderTagClose(state, tagName, false); + }; +} + export function renderOrderedList(state, node) { const { parens } = node.attrs; const start = node.attrs.start || 1; @@ -241,7 +281,7 @@ export function renderTableCell(state, node) { return; } - if (!isInBlockTable(node) || shouldRenderCellInline(node)) { + if (!isInBlockTable(node) || containsParagraphWithOnlyText(node)) { state.renderInline(node.child(0)); } else { state.renderContent(node); diff --git a/app/assets/javascripts/design_management/utils/error_messages.js b/app/assets/javascripts/design_management/utils/error_messages.js index e7b2c814bb3..afee7e81791 100644 --- a/app/assets/javascripts/design_management/utils/error_messages.js +++ b/app/assets/javascripts/design_management/utils/error_messages.js @@ -1,3 +1,4 @@ +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { __, s__, n__, sprintf } from '~/locale'; export const ADD_DISCUSSION_COMMENT_ERROR = s__( diff --git a/app/assets/javascripts/experimentation/utils.js b/app/assets/javascripts/experimentation/utils.js index e572280a62c..9079c238169 100644 --- a/app/assets/javascripts/experimentation/utils.js +++ b/app/assets/javascripts/experimentation/utils.js @@ -1,18 +1,27 @@ // This file only applies to use of experiments through https://gitlab.com/gitlab-org/gitlab-experiment -import { get } from 'lodash'; +import { get, pick } from 'lodash'; import { DEFAULT_VARIANT, CANDIDATE_VARIANT, TRACKING_CONTEXT_SCHEMA } from './constants'; +function getExperimentsData() { + return get(window, ['gon', 'experiment'], {}); +} + +function convertExperimentDataToExperimentContext(experimentData) { + return { schema: TRACKING_CONTEXT_SCHEMA, data: experimentData }; +} + export function getExperimentData(experimentName) { - return get(window, ['gon', 'experiment', experimentName]); + return getExperimentsData()[experimentName]; } export function getExperimentContexts(...experimentNames) { - return experimentNames - .map((name) => { - const data = getExperimentData(name); - return data && { schema: TRACKING_CONTEXT_SCHEMA, data }; - }) - .filter((context) => context); + return Object.values(pick(getExperimentsData(), experimentNames)).map( + convertExperimentDataToExperimentContext, + ); +} + +export function getAllExperimentContexts() { + return Object.values(getExperimentsData()).map(convertExperimentDataToExperimentContext); } export function isExperimentVariant(experimentName, variantName) { diff --git a/app/assets/javascripts/notes/stores/actions.js b/app/assets/javascripts/notes/stores/actions.js index 6a4a3263e4a..656591e0c32 100644 --- a/app/assets/javascripts/notes/stores/actions.js +++ b/app/assets/javascripts/notes/stores/actions.js @@ -1,3 +1,4 @@ +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import $ from 'jquery'; import Visibility from 'visibilityjs'; import Vue from 'vue'; diff --git a/app/assets/javascripts/packages/details/components/package_history.vue b/app/assets/javascripts/packages/details/components/package_history.vue index 0d7a73c12f1..27d2f208a42 100644 --- a/app/assets/javascripts/packages/details/components/package_history.vue +++ b/app/assets/javascripts/packages/details/components/package_history.vue @@ -1,4 +1,5 @@ <script> +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { GlLink, GlSprintf } from '@gitlab/ui'; import { first } from 'lodash'; import { truncateSha } from '~/lib/utils/text_utility'; diff --git a/app/assets/javascripts/packages/shared/constants.js b/app/assets/javascripts/packages/shared/constants.js index b4cdca34d92..f15c31b85c1 100644 --- a/app/assets/javascripts/packages/shared/constants.js +++ b/app/assets/javascripts/packages/shared/constants.js @@ -1,3 +1,4 @@ +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { __, s__ } from '~/locale'; export const PackageType = { diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue index af4a984add4..408bd2e3dfe 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/details/package_history.vue @@ -1,4 +1,5 @@ <script> +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { GlLink, GlSprintf } from '@gitlab/ui'; import { first } from 'lodash'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; diff --git a/app/assets/javascripts/packages_and_registries/package_registry/constants.js b/app/assets/javascripts/packages_and_registries/package_registry/constants.js index aad888b4433..f023b4481a0 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/constants.js +++ b/app/assets/javascripts/packages_and_registries/package_registry/constants.js @@ -1,3 +1,4 @@ +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { __, s__ } from '~/locale'; export const PACKAGE_TYPE_CONAN = 'CONAN'; diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js index 5417e2d969b..b7240bc6d6d 100644 --- a/app/assets/javascripts/tracking/index.js +++ b/app/assets/javascripts/tracking/index.js @@ -1,3 +1,4 @@ +import { getAllExperimentContexts } from '~/experimentation/utils'; import { DEFAULT_SNOWPLOW_OPTIONS } from './constants'; import getStandardContext from './get_standard_context'; import Tracking from './tracking'; @@ -41,7 +42,8 @@ export function initDefaultTrackers() { window.snowplow('enableActivityTracking', 30, 30); // must be after enableActivityTracking const standardContext = getStandardContext(); - window.snowplow('trackPageView', null, [standardContext]); + const experimentContexts = getAllExperimentContexts(); + window.snowplow('trackPageView', null, [standardContext, ...experimentContexts]); if (window.snowplowOptions.formTracking) { Tracking.enableFormTracking(opts.formTrackingConfig); diff --git a/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue b/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue index d331f1690f5..2a996c36cc8 100644 --- a/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue +++ b/app/assets/javascripts/vue_merge_request_widget/components/states/commits_header.vue @@ -1,5 +1,5 @@ <script> -/* eslint-disable vue/no-v-html */ +/* eslint-disable vue/no-v-html, @gitlab/require-string-literal-i18n-helpers */ import { GlButton } from '@gitlab/ui'; import { escape } from 'lodash'; import { __, n__, sprintf, s__ } from '~/locale'; diff --git a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js index 898147681d5..4a7149ed9ae 100644 --- a/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js +++ b/app/assets/javascripts/vue_shared/components/filtered_search_bar/constants.js @@ -1,3 +1,4 @@ +/* eslint-disable @gitlab/require-string-literal-i18n-helpers */ import { __ } from '~/locale'; export const DEBOUNCE_DELAY = 200; diff --git a/app/controllers/import/bulk_imports_controller.rb b/app/controllers/import/bulk_imports_controller.rb index e99b8cfa0c7..da936215ad4 100644 --- a/app/controllers/import/bulk_imports_controller.rb +++ b/app/controllers/import/bulk_imports_controller.rb @@ -112,7 +112,7 @@ class Import::BulkImportsController < ApplicationController end def ensure_group_import_enabled - render_404 unless Feature.enabled?(:bulk_import) + render_404 unless Feature.enabled?(:bulk_import, default_enabled: :yaml) end def access_token_key diff --git a/app/controllers/profiles/two_factor_auths_controller.rb b/app/controllers/profiles/two_factor_auths_controller.rb index effd3514c1b..7b8d71a5575 100644 --- a/app/controllers/profiles/two_factor_auths_controller.rb +++ b/app/controllers/profiles/two_factor_auths_controller.rb @@ -57,7 +57,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController @codes = user.generate_otp_backup_codes! end - helpers.dismiss_account_recovery_regular_check + helpers.dismiss_two_factor_auth_recovery_settings_check render 'create' else @@ -108,7 +108,7 @@ class Profiles::TwoFactorAuthsController < Profiles::ApplicationController Users::UpdateService.new(current_user, user: current_user).execute! do |user| @codes = user.generate_otp_backup_codes! - helpers.dismiss_account_recovery_regular_check + helpers.dismiss_two_factor_auth_recovery_settings_check end end diff --git a/app/finders/error_tracking/errors_finder.rb b/app/finders/error_tracking/errors_finder.rb index fb2d4b14dfa..d83a0c487e6 100644 --- a/app/finders/error_tracking/errors_finder.rb +++ b/app/finders/error_tracking/errors_finder.rb @@ -13,9 +13,10 @@ module ErrorTracking collection = project.error_tracking_errors collection = by_status(collection) + collection = sort(collection) - # Limit collection until pagination implemented - collection.limit(20) + # Limit collection until pagination implemented. + limit(collection) end private @@ -33,5 +34,14 @@ module ErrorTracking def authorized? Ability.allowed?(current_user, :read_sentry_issue, project) end + + def sort(collection) + params[:sort] ? collection.sort_by_attribute(params[:sort]) : collection.order_id_desc + end + + def limit(collection) + # Restrict the maximum limit at 100 records. + collection.limit([(params[:limit] || 20).to_i, 100].min) + end end end diff --git a/app/graphql/types/base_field.rb b/app/graphql/types/base_field.rb index 75fdb41ceb6..9c27f0f8138 100644 --- a/app/graphql/types/base_field.rb +++ b/app/graphql/types/base_field.rb @@ -9,6 +9,7 @@ module Types DEFAULT_COMPLEXITY = 1 attr_reader :deprecation, :doc_reference + attr_writer :max_page_size # Can be removed with :performance_roadmap feature flag: https://gitlab.com/gitlab-org/gitlab/-/issues/337198 def initialize(**kwargs, &block) @calls_gitaly = !!kwargs.delete(:calls_gitaly) diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb index f5a74a3f57d..76b3edbf168 100644 --- a/app/helpers/user_callouts_helper.rb +++ b/app/helpers/user_callouts_helper.rb @@ -27,7 +27,7 @@ module UserCalloutsHelper def render_dashboard_ultimate_trial(user) end - def render_account_recovery_regular_check + def render_two_factor_auth_recovery_settings_check end def show_suggest_popover? @@ -53,7 +53,7 @@ module UserCalloutsHelper !user_dismissed?(REGISTRATION_ENABLED_CALLOUT) end - def dismiss_account_recovery_regular_check + def dismiss_two_factor_auth_recovery_settings_check end private diff --git a/app/models/concerns/integrations/has_data_fields.rb b/app/models/concerns/integrations/has_data_fields.rb index e9aaaac8226..1709b56080e 100644 --- a/app/models/concerns/integrations/has_data_fields.rb +++ b/app/models/concerns/integrations/has_data_fields.rb @@ -46,6 +46,7 @@ module Integrations has_one :issue_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::IssueTrackerData' has_one :jira_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::JiraTrackerData' has_one :open_project_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :service_id, class_name: 'Integrations::OpenProjectTrackerData' + has_one :zentao_tracker_data, autosave: true, inverse_of: :integration, foreign_key: :integration_id, class_name: 'Integrations::ZentaoTrackerData' def data_fields raise NotImplementedError diff --git a/app/models/error_tracking/error.rb b/app/models/error_tracking/error.rb index 49c247657b6..39ecc487806 100644 --- a/app/models/error_tracking/error.rb +++ b/app/models/error_tracking/error.rb @@ -1,6 +1,8 @@ # frozen_string_literal: true class ErrorTracking::Error < ApplicationRecord + include Sortable + belongs_to :project has_many :events, class_name: 'ErrorTracking::ErrorEvent' @@ -34,6 +36,19 @@ class ErrorTracking::Error < ApplicationRecord end end + def self.sort_by_attribute(method) + case method.to_s + when 'last_seen' + order(last_seen_at: :desc) + when 'first_seen' + order(first_seen_at: :desc) + when 'frequency' + order(events_count: :desc) + else + order_id_desc + end + end + def title if description.present? "#{name} #{description}" diff --git a/app/models/integrations/zentao.rb b/app/models/integrations/zentao.rb new file mode 100644 index 00000000000..68c02f54c61 --- /dev/null +++ b/app/models/integrations/zentao.rb @@ -0,0 +1,78 @@ +# frozen_string_literal: true + +module Integrations + class Zentao < Integration + data_field :url, :api_url, :api_token, :zentao_product_xid + + validates :url, public_url: true, presence: true, if: :activated? + validates :api_url, public_url: true, allow_blank: true + validates :api_token, presence: true, if: :activated? + validates :zentao_product_xid, presence: true, if: :activated? + + def data_fields + zentao_tracker_data || self.build_zentao_tracker_data + end + + def title + self.class.name.demodulize + end + + def description + s_("ZentaoIntegration|Use Zentao as this project's issue tracker.") + end + + def self.to_param + name.demodulize.downcase + end + + def test(*_args) + client.ping + end + + def self.supported_events + %w() + end + + def self.supported_event_actions + %w() + end + + def fields + [ + { + type: 'text', + name: 'url', + title: s_('ZentaoIntegration|Zentao Web URL'), + placeholder: 'https://www.zentao.net', + help: s_('ZentaoIntegration|Base URL of the Zentao instance.'), + required: true + }, + { + type: 'text', + name: 'api_url', + title: s_('ZentaoIntegration|Zentao API URL (optional)'), + help: s_('ZentaoIntegration|If different from Web URL.') + }, + { + type: 'password', + name: 'api_token', + title: s_('ZentaoIntegration|Zentao API token'), + non_empty_password_title: s_('ZentaoIntegration|Enter API token'), + required: true + }, + { + type: 'text', + name: 'zentao_product_xid', + title: s_('ZentaoIntegration|Zentao Product ID'), + required: true + } + ] + end + + private + + def client + @client ||= ::Gitlab::Zentao::Client.new(self) + end + end +end diff --git a/app/models/integrations/zentao_tracker_data.rb b/app/models/integrations/zentao_tracker_data.rb new file mode 100644 index 00000000000..468e4e5d7d7 --- /dev/null +++ b/app/models/integrations/zentao_tracker_data.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Integrations + class ZentaoTrackerData < ApplicationRecord + belongs_to :integration, inverse_of: :zentao_tracker_data, foreign_key: :integration_id + delegate :activated?, to: :integration + validates :integration, presence: true + + scope :encryption_options, -> do + { + key: Settings.attr_encrypted_db_key_base_32, + encode: true, + mode: :per_attribute_iv, + algorithm: 'aes-256-gcm' + } + end + + attr_encrypted :url, encryption_options + attr_encrypted :api_url, encryption_options + attr_encrypted :zentao_product_xid, encryption_options + attr_encrypted :api_token, encryption_options + end +end diff --git a/app/models/project.rb b/app/models/project.rb index 6615f9dabb2..6d4d25695df 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -209,6 +209,7 @@ class Project < ApplicationRecord has_one :unify_circuit_integration, class_name: 'Integrations::UnifyCircuit' has_one :webex_teams_integration, class_name: 'Integrations::WebexTeams' has_one :youtrack_integration, class_name: 'Integrations::Youtrack' + has_one :zentao_integration, class_name: 'Integrations::Zentao' has_one :root_of_fork_network, foreign_key: 'root_project_id', @@ -1455,7 +1456,7 @@ class Project < ApplicationRecord end def disabled_integrations - [] + [:zentao] end def find_or_initialize_integration(name) diff --git a/app/models/user.rb b/app/models/user.rb index 3920e61c953..2e5047b6292 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1550,7 +1550,11 @@ class User < ApplicationRecord end def manageable_groups(include_groups_with_developer_maintainer_access: false) - owned_and_maintainer_group_hierarchy = Gitlab::ObjectHierarchy.new(owned_or_maintainers_groups).base_and_descendants + owned_and_maintainer_group_hierarchy = if Feature.enabled?(:linear_user_manageable_groups, self, default_enabled: :yaml) + owned_or_maintainers_groups.self_and_descendants + else + Gitlab::ObjectHierarchy.new(owned_or_maintainers_groups).base_and_descendants + end if include_groups_with_developer_maintainer_access union_sql = ::Gitlab::SQL::Union.new( diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb index 1172b2ee5e8..32f84bb95e8 100644 --- a/app/models/user_callout.rb +++ b/app/models/user_callout.rb @@ -15,7 +15,7 @@ class UserCallout < ApplicationRecord suggest_popover_dismissed: 9, tabs_position_highlight: 10, threat_monitoring_info: 11, # EE-only - account_recovery_regular_check: 12, # EE-only + two_factor_auth_recovery_settings_check: 12, # EE-only web_ide_alert_dismissed: 16, # no longer in use active_user_count_threshold: 18, # EE-only buy_pipeline_minutes_notification_dot: 19, # EE-only diff --git a/app/services/error_tracking/list_issues_service.rb b/app/services/error_tracking/list_issues_service.rb index 5ddba748fd4..86c7791e759 100644 --- a/app/services/error_tracking/list_issues_service.rb +++ b/app/services/error_tracking/list_issues_service.rb @@ -74,7 +74,9 @@ module ErrorTracking # We are going to support more options in the future. # For now we implement the bare minimum for rendering the list in UI. filter_opts = { - status: opts[:issue_status] + status: opts[:issue_status], + sort: opts[:sort], + limit: opts[:limit] } errors = ErrorTracking::ErrorsFinder.new(current_user, project, filter_opts).execute diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index 302c047a65f..5bc0d7551ee 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -12,6 +12,7 @@ module Projects @import_data = @params.delete(:import_data) @relations_block = @params.delete(:relations_block) @default_branch = @params.delete(:default_branch) + @readme_template = @params.delete(:readme_template) build_topics end @@ -149,12 +150,16 @@ module Projects branch_name: @default_branch.presence || @project.default_branch_or_main, commit_message: 'Initial commit', file_path: 'README.md', - file_content: experiment(:new_project_readme_content, namespace: @project.namespace).run_with(@project) + file_content: readme_content } Files::CreateService.new(@project, current_user, commit_attrs).execute end + def readme_content + @readme_template.presence || experiment(:new_project_readme_content, namespace: @project.namespace).run_with(@project) + end + def skip_wiki? !@project.feature_available?(:wiki, current_user) || @skip_wiki end diff --git a/app/views/groups/new.html.haml b/app/views/groups/new.html.haml index 11927142ea6..0f11ca5fb8f 100644 --- a/app/views/groups/new.html.haml +++ b/app/views/groups/new.html.haml @@ -15,7 +15,7 @@ #import-group-pane.tab-pane - if import_sources_enabled? - - if Feature.enabled?(:bulk_import) + - if Feature.enabled?(:bulk_import, default_enabled: :yaml) = render 'import_group_from_another_instance_panel' .gl-mt-7.gl-border-b-solid.gl-border-gray-100.gl-border-1 = render 'import_group_from_file_panel' diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index ba2d6aa79eb..ec2904245d3 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -14,7 +14,7 @@ = render "layouts/nav/classification_level_banner" = yield :flash_message = render "shared/service_ping_consent" - = render_account_recovery_regular_check + = render_two_factor_auth_recovery_settings_check = render_if_exists "layouts/header/ee_subscribable_banner" = render_if_exists "shared/namespace_storage_limit_alert" = render_if_exists "shared/new_user_signups_cap_reached_alert" diff --git a/app/views/shared/_check_recovery_settings.html.haml b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml index 2ba0cca9ef6..d4764d1a5d9 100644 --- a/app/views/shared/_check_recovery_settings.html.haml +++ b/app/views/shared/_two_factor_auth_recovery_settings_check.html.haml @@ -1,7 +1,7 @@ = render 'shared/global_alert', variant: :warning, alert_class: 'js-recovery-settings-callout', - alert_data: { feature_id: 'account_recovery_regular_check', dismiss_endpoint: user_callouts_path, defer_links: 'true' }, + alert_data: { feature_id: UserCalloutsHelper::TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK, dismiss_endpoint: user_callouts_path, defer_links: 'true' }, close_button_data: { testid: 'close-account-recovery-regular-check-callout' } do .gl-alert-body = s_('Profiles|Ensure you have two-factor authentication recovery codes stored in a safe place.') diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 8fc6b4e40f4..5218abb67c9 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -83,8 +83,7 @@ :resource_boundary: :unknown :weight: 2 :idempotent: - :tags: - - :exclude_from_gitlab_com + :tags: [] - :name: chaos:chaos_db_spin :worker_name: Chaos::DbSpinWorker :feature_category: :not_owned @@ -93,8 +92,7 @@ :resource_boundary: :unknown :weight: 2 :idempotent: - :tags: - - :exclude_from_gitlab_com + :tags: [] - :name: chaos:chaos_kill :worker_name: Chaos::KillWorker :feature_category: :not_owned @@ -103,8 +101,7 @@ :resource_boundary: :unknown :weight: 2 :idempotent: - :tags: - - :exclude_from_gitlab_com + :tags: [] - :name: chaos:chaos_leak_mem :worker_name: Chaos::LeakMemWorker :feature_category: :not_owned @@ -113,8 +110,7 @@ :resource_boundary: :unknown :weight: 2 :idempotent: - :tags: - - :exclude_from_gitlab_com + :tags: [] - :name: chaos:chaos_sleep :worker_name: Chaos::SleepWorker :feature_category: :not_owned @@ -123,8 +119,7 @@ :resource_boundary: :unknown :weight: 2 :idempotent: - :tags: - - :exclude_from_gitlab_com + :tags: [] - :name: container_repository:cleanup_container_repository :worker_name: CleanupContainerRepositoryWorker :feature_category: :container_registry @@ -142,8 +137,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: container_repository:delete_container_repository :worker_name: DeleteContainerRepositoryWorker :feature_category: :container_registry @@ -170,8 +164,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:authorized_project_update_periodic_recalculate :worker_name: AuthorizedProjectUpdate::PeriodicRecalculateWorker :feature_category: :source_code_management @@ -207,8 +200,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:ci_platform_metrics_update_cron :worker_name: CiPlatformMetricsUpdateCronWorker :feature_category: :continuous_integration @@ -226,8 +218,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:container_expiration_policy :worker_name: ContainerExpirationPolicyWorker :feature_category: :container_registry @@ -245,8 +236,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:database_drop_detached_partitions :worker_name: Database::DropDetachedPartitionsWorker :feature_category: :database @@ -345,8 +335,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:metrics_dashboard_schedule_annotations_prune :worker_name: Metrics::Dashboard::ScheduleAnnotationsPruneWorker :feature_category: :metrics @@ -364,8 +353,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:namespaces_prune_aggregation_schedules :worker_name: Namespaces::PruneAggregationSchedulesWorker :feature_category: :source_code_management @@ -383,8 +371,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:pages_domain_removal_cron :worker_name: PagesDomainRemovalCronWorker :feature_category: :pages @@ -429,8 +416,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:personal_access_tokens_expiring :worker_name: PersonalAccessTokens::ExpiringWorker :feature_category: :authentication_and_authorization @@ -466,8 +452,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:remove_expired_group_links :worker_name: RemoveExpiredGroupLinksWorker :feature_category: :authentication_and_authorization @@ -494,8 +479,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:remove_unreferenced_lfs_objects :worker_name: RemoveUnreferencedLfsObjectsWorker :feature_category: :git_lfs @@ -540,8 +524,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:schedule_migrate_external_diffs :worker_name: ScheduleMigrateExternalDiffsWorker :feature_category: :code_review @@ -559,8 +542,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:ssh_keys_expiring_soon_notification :worker_name: SshKeys::ExpiringSoonNotificationWorker :feature_category: :compliance_management @@ -569,8 +551,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:stuck_ci_jobs :worker_name: StuckCiJobsWorker :feature_category: :continuous_integration @@ -624,8 +605,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:users_create_statistics :worker_name: Users::CreateStatisticsWorker :feature_category: :users @@ -643,8 +623,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: cronjob:x509_issuer_crl_check :worker_name: X509IssuerCrlCheckWorker :feature_category: :source_code_management @@ -671,8 +650,7 @@ :resource_boundary: :unknown :weight: 3 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: deployment:deployments_hooks :worker_name: Deployments::HooksWorker :feature_category: :continuous_delivery @@ -897,8 +875,7 @@ :resource_boundary: :cpu :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: github_importer:github_import_import_pull_request_review :worker_name: Gitlab::GithubImport::ImportPullRequestReviewWorker :feature_category: :importers @@ -907,8 +884,7 @@ :resource_boundary: :cpu :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: github_importer:github_import_refresh_import_jid :worker_name: Gitlab::GithubImport::RefreshImportJidWorker :feature_category: :importers @@ -980,8 +956,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: github_importer:github_import_stage_import_pull_requests_reviews :worker_name: Gitlab::GithubImport::Stage::ImportPullRequestsReviewsWorker :feature_category: :importers @@ -990,8 +965,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: github_importer:github_import_stage_import_repository :worker_name: Gitlab::GithubImport::Stage::ImportRepositoryWorker :feature_category: :importers @@ -1010,7 +984,6 @@ :weight: 1 :idempotent: :tags: - - :exclude_from_gitlab_com - :needs_own_queue - :name: hashed_storage:hashed_storage_project_migrate :worker_name: HashedStorage::ProjectMigrateWorker @@ -1021,7 +994,6 @@ :weight: 1 :idempotent: :tags: - - :exclude_from_gitlab_com - :needs_own_queue - :name: hashed_storage:hashed_storage_project_rollback :worker_name: HashedStorage::ProjectRollbackWorker @@ -1032,7 +1004,6 @@ :weight: 1 :idempotent: :tags: - - :exclude_from_gitlab_com - :needs_own_queue - :name: hashed_storage:hashed_storage_rollbacker :worker_name: HashedStorage::RollbackerWorker @@ -1043,7 +1014,6 @@ :weight: 1 :idempotent: :tags: - - :exclude_from_gitlab_com - :needs_own_queue - :name: incident_management:clusters_applications_check_prometheus_health :worker_name: Clusters::Applications::CheckPrometheusHealthWorker @@ -1062,8 +1032,7 @@ :resource_boundary: :cpu :weight: 2 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: incident_management:incident_management_pager_duty_process_incident :worker_name: IncidentManagement::PagerDuty::ProcessIncidentWorker :feature_category: :incident_management @@ -1117,8 +1086,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: jira_connect:jira_connect_sync_deployments :worker_name: JiraConnect::SyncDeploymentsWorker :feature_category: :integrations @@ -1127,8 +1095,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: jira_connect:jira_connect_sync_feature_flags :worker_name: JiraConnect::SyncFeatureFlagsWorker :feature_category: :integrations @@ -1137,8 +1104,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: jira_connect:jira_connect_sync_merge_request :worker_name: JiraConnect::SyncMergeRequestWorker :feature_category: :integrations @@ -1156,8 +1122,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: jira_importer:jira_import_advance_stage :worker_name: Gitlab::JiraImport::AdvanceStageWorker :feature_category: :importers @@ -1319,8 +1284,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: package_repositories:packages_go_sync_packages :worker_name: Packages::Go::SyncPackagesWorker :feature_category: :package_registry @@ -1329,8 +1293,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: package_repositories:packages_helm_extraction :worker_name: Packages::Helm::ExtractionWorker :feature_category: :package_registry @@ -1348,8 +1311,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: package_repositories:packages_nuget_extraction :worker_name: Packages::Nuget::ExtractionWorker :feature_category: :package_registry @@ -1367,8 +1329,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pipeline_background:archive_trace :worker_name: ArchiveTraceWorker :feature_category: :continuous_integration @@ -1422,8 +1383,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pipeline_background:ci_pipeline_success_unlock_artifacts :worker_name: Ci::PipelineSuccessUnlockArtifactsWorker :feature_category: :continuous_integration @@ -1450,8 +1410,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pipeline_cache:expire_job_cache :worker_name: ExpireJobCacheWorker :feature_category: :continuous_integration @@ -1523,8 +1482,7 @@ :resource_boundary: :unknown :weight: 3 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pipeline_default:ci_merge_requests_add_todo_when_build_fails :worker_name: Ci::MergeRequests::AddTodoWhenBuildFailsWorker :feature_category: :continuous_integration @@ -1533,8 +1491,7 @@ :resource_boundary: :unknown :weight: 3 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pipeline_default:ci_pipeline_bridge_status :worker_name: Ci::PipelineBridgeStatusWorker :feature_category: :continuous_integration @@ -1732,8 +1689,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: todos_destroyer:todos_destroyer_entity_leave :worker_name: TodosDestroyer::EntityLeaveWorker :feature_category: :issue_tracking @@ -1805,8 +1761,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: approve_blocked_pending_approval_users :worker_name: ApproveBlockedPendingApprovalUsersWorker :feature_category: :users @@ -1815,8 +1770,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: authorized_keys :worker_name: AuthorizedKeysWorker :feature_category: :source_code_management @@ -1852,8 +1806,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: bulk_imports_entity :worker_name: BulkImports::EntityWorker :feature_category: :importers @@ -1862,8 +1815,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: bulk_imports_export_request :worker_name: BulkImports::ExportRequestWorker :feature_category: :importers @@ -1881,8 +1833,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: bulk_imports_relation_export :worker_name: BulkImports::RelationExportWorker :feature_category: :importers @@ -1891,8 +1842,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: chat_notification :worker_name: ChatNotificationWorker :feature_category: :chatops @@ -1910,8 +1860,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: create_commit_signature :worker_name: CreateCommitSignatureWorker :feature_category: :source_code_management @@ -1983,8 +1932,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: design_management_new_version :worker_name: DesignManagement::NewVersionWorker :feature_category: :design_management @@ -2002,8 +1950,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: detect_repository_languages :worker_name: DetectRepositoryLanguagesWorker :feature_category: :source_code_management @@ -2021,8 +1968,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: disallow_two_factor_for_subgroups :worker_name: DisallowTwoFactorForSubgroupsWorker :feature_category: :subgroups @@ -2031,8 +1977,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: email_receiver :worker_name: EmailReceiverWorker :feature_category: :issue_tracking @@ -2060,8 +2005,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: error_tracking_issue_link :worker_name: ErrorTrackingIssueLinkWorker :feature_category: :error_tracking @@ -2079,8 +2023,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: expire_build_instance_artifacts :worker_name: ExpireBuildInstanceArtifactsWorker :feature_category: :continuous_integration @@ -2125,8 +2068,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: github_import_advance_stage :worker_name: Gitlab::GithubImport::AdvanceStageWorker :feature_category: :importers @@ -2144,8 +2086,7 @@ :resource_boundary: :cpu :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: gitlab_shell :worker_name: GitlabShellWorker :feature_category: :source_code_management @@ -2163,9 +2104,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :requires_disk_io - - :exclude_from_kubernetes + :tags: [] - :name: group_export :worker_name: GroupExportWorker :feature_category: :importers @@ -2255,8 +2194,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: mailers :worker_name: ActionMailer::MailDeliveryJob :feature_category: :issue_tracking @@ -2283,8 +2221,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: merge_request_mergeability_check :worker_name: MergeRequestMergeabilityCheckWorker :feature_category: :code_review @@ -2338,8 +2275,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: migrate_external_diffs :worker_name: MigrateExternalDiffsWorker :feature_category: :code_review @@ -2366,8 +2302,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: namespaces_onboarding_pipeline_created :worker_name: Namespaces::OnboardingPipelineCreatedWorker :feature_category: :subgroups @@ -2376,8 +2311,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: namespaces_onboarding_progress :worker_name: Namespaces::OnboardingProgressWorker :feature_category: :product_analytics @@ -2386,8 +2320,7 @@ :resource_boundary: :cpu :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: namespaces_onboarding_user_added :worker_name: Namespaces::OnboardingUserAddedWorker :feature_category: :users @@ -2396,8 +2329,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: new_issue :worker_name: NewIssueWorker :feature_category: :issue_tracking @@ -2433,8 +2365,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pages :worker_name: PagesWorker :feature_category: :pages @@ -2443,9 +2374,7 @@ :resource_boundary: :cpu :weight: 1 :idempotent: - :tags: - - :requires_disk_io - - :exclude_from_kubernetes + :tags: [] - :name: pages_domain_ssl_renewal :worker_name: PagesDomainSslRenewalWorker :feature_category: :pages @@ -2454,9 +2383,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :requires_disk_io - - :exclude_from_kubernetes + :tags: [] - :name: pages_domain_verification :worker_name: PagesDomainVerificationWorker :feature_category: :pages @@ -2465,9 +2392,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :requires_disk_io - - :exclude_from_kubernetes + :tags: [] - :name: pages_remove :worker_name: PagesRemoveWorker :feature_category: :pages @@ -2476,8 +2401,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pages_transfer :worker_name: PagesTransferWorker :feature_category: :pages @@ -2486,8 +2410,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: pages_update_configuration :worker_name: PagesUpdateConfigurationWorker :feature_category: :pages @@ -2496,8 +2419,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: phabricator_import_import_tasks :worker_name: Gitlab::PhabricatorImport::ImportTasksWorker :feature_category: :importers @@ -2551,9 +2473,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :requires_disk_io - - :exclude_from_kubernetes + :tags: [] - :name: project_export :worker_name: ProjectExportWorker :feature_category: :importers @@ -2580,8 +2500,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: projects_post_creation :worker_name: Projects::PostCreationWorker :feature_category: :source_code_management @@ -2590,8 +2509,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: projects_schedule_bulk_repository_shard_moves :worker_name: Projects::ScheduleBulkRepositoryShardMovesWorker :feature_category: :gitaly @@ -2636,8 +2554,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: propagate_integration_inherit :worker_name: PropagateIntegrationInheritWorker :feature_category: :integrations @@ -2646,8 +2563,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: propagate_integration_inherit_descendant :worker_name: PropagateIntegrationInheritDescendantWorker :feature_category: :integrations @@ -2656,8 +2572,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: propagate_integration_project :worker_name: PropagateIntegrationProjectWorker :feature_category: :integrations @@ -2666,8 +2581,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: propagate_service_template :worker_name: PropagateServiceTemplateWorker :feature_category: :integrations @@ -2703,8 +2617,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: remote_mirror_notification :worker_name: RemoteMirrorNotificationWorker :feature_category: :source_code_management @@ -2876,8 +2789,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: true - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: web_hooks_log_execution :worker_name: WebHooks::LogExecutionWorker :feature_category: :integrations @@ -2895,8 +2807,7 @@ :resource_boundary: :unknown :weight: 1 :idempotent: - :tags: - - :exclude_from_kubernetes + :tags: [] - :name: x509_certificate_revoke :worker_name: X509CertificateRevokeWorker :feature_category: :source_code_management diff --git a/app/workers/analytics/usage_trends/count_job_trigger_worker.rb b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb index 41ef75ac20a..dae576a6521 100644 --- a/app/workers/analytics/usage_trends/count_job_trigger_worker.rb +++ b/app/workers/analytics/usage_trends/count_job_trigger_worker.rb @@ -13,7 +13,6 @@ module Analytics DEFAULT_DELAY = 3.minutes.freeze feature_category :devops_reports - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/analytics/usage_trends/counter_job_worker.rb b/app/workers/analytics/usage_trends/counter_job_worker.rb index bfb8a435939..b3a8f7dd3c2 100644 --- a/app/workers/analytics/usage_trends/counter_job_worker.rb +++ b/app/workers/analytics/usage_trends/counter_job_worker.rb @@ -12,7 +12,6 @@ module Analytics feature_category :devops_reports urgency :low - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/approve_blocked_pending_approval_users_worker.rb b/app/workers/approve_blocked_pending_approval_users_worker.rb index fdf1bd99558..661ec87c1dd 100644 --- a/app/workers/approve_blocked_pending_approval_users_worker.rb +++ b/app/workers/approve_blocked_pending_approval_users_worker.rb @@ -10,7 +10,6 @@ class ApproveBlockedPendingApprovalUsersWorker idempotent! feature_category :users - tags :exclude_from_kubernetes def perform(current_user_id) current_user = User.find(current_user_id) diff --git a/app/workers/bulk_import_worker.rb b/app/workers/bulk_import_worker.rb index d7f0b752a34..61ea0a30be4 100644 --- a/app/workers/bulk_import_worker.rb +++ b/app/workers/bulk_import_worker.rb @@ -6,7 +6,6 @@ class BulkImportWorker # rubocop:disable Scalability/IdempotentWorker data_consistency :always feature_category :importers - tags :exclude_from_kubernetes sidekiq_options retry: false, dead: false diff --git a/app/workers/bulk_imports/entity_worker.rb b/app/workers/bulk_imports/entity_worker.rb index cc52e349130..5c04cdc96a0 100644 --- a/app/workers/bulk_imports/entity_worker.rb +++ b/app/workers/bulk_imports/entity_worker.rb @@ -7,7 +7,6 @@ module BulkImports data_consistency :always feature_category :importers - tags :exclude_from_kubernetes sidekiq_options retry: false, dead: false diff --git a/app/workers/bulk_imports/pipeline_worker.rb b/app/workers/bulk_imports/pipeline_worker.rb index 713c6c69213..760a309a381 100644 --- a/app/workers/bulk_imports/pipeline_worker.rb +++ b/app/workers/bulk_imports/pipeline_worker.rb @@ -9,7 +9,6 @@ module BulkImports NDJSON_PIPELINE_PERFORM_DELAY = 1.minute feature_category :importers - tags :exclude_from_kubernetes sidekiq_options retry: false, dead: false diff --git a/app/workers/bulk_imports/relation_export_worker.rb b/app/workers/bulk_imports/relation_export_worker.rb index 416dad5b3ae..9324b79cc75 100644 --- a/app/workers/bulk_imports/relation_export_worker.rb +++ b/app/workers/bulk_imports/relation_export_worker.rb @@ -10,7 +10,6 @@ module BulkImports idempotent! loggable_arguments 2, 3 feature_category :importers - tags :exclude_from_kubernetes sidekiq_options status_expiration: StuckExportJobsWorker::EXPORT_JOBS_EXPIRATION def perform(user_id, portable_id, portable_class, relation) diff --git a/app/workers/ci/delete_objects_worker.rb b/app/workers/ci/delete_objects_worker.rb index d31d248597b..cbcad3e8838 100644 --- a/app/workers/ci/delete_objects_worker.rb +++ b/app/workers/ci/delete_objects_worker.rb @@ -10,7 +10,6 @@ module Ci include LimitedCapacity::Worker feature_category :continuous_integration - tags :exclude_from_kubernetes idempotent! def perform_work(*args) diff --git a/app/workers/ci/drop_pipeline_worker.rb b/app/workers/ci/drop_pipeline_worker.rb index f3672dba3fe..edb97c3cac5 100644 --- a/app/workers/ci/drop_pipeline_worker.rb +++ b/app/workers/ci/drop_pipeline_worker.rb @@ -9,8 +9,6 @@ module Ci sidekiq_options retry: 3 include PipelineQueue - tags :exclude_from_kubernetes - idempotent! def perform(pipeline_id, failure_reason) diff --git a/app/workers/ci/merge_requests/add_todo_when_build_fails_worker.rb b/app/workers/ci/merge_requests/add_todo_when_build_fails_worker.rb index af042dc1e64..98bb259db0a 100644 --- a/app/workers/ci/merge_requests/add_todo_when_build_fails_worker.rb +++ b/app/workers/ci/merge_requests/add_todo_when_build_fails_worker.rb @@ -10,7 +10,6 @@ module Ci include PipelineQueue urgency :low - tags :exclude_from_kubernetes idempotent! def perform(job_id) diff --git a/app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb b/app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb index 06bc100c66a..bb0a81a0a17 100644 --- a/app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb +++ b/app/workers/ci/pipeline_artifacts/create_quality_report_worker.rb @@ -11,7 +11,6 @@ module Ci queue_namespace :pipeline_background feature_category :code_testing - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb b/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb index e4dc293353b..2af07cf6f93 100644 --- a/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb +++ b/app/workers/ci/pipeline_artifacts/expire_artifacts_worker.rb @@ -15,7 +15,6 @@ module Ci deduplicate :until_executed, including_scheduled: true idempotent! feature_category :continuous_integration - tags :exclude_from_kubernetes def perform service = ::Ci::PipelineArtifacts::DestroyAllExpiredService.new diff --git a/app/workers/ci/schedule_delete_objects_cron_worker.rb b/app/workers/ci/schedule_delete_objects_cron_worker.rb index 06bf83ae0a7..55b23bbab62 100644 --- a/app/workers/ci/schedule_delete_objects_cron_worker.rb +++ b/app/workers/ci/schedule_delete_objects_cron_worker.rb @@ -12,7 +12,6 @@ module Ci # rubocop:enable Scalability/CronWorkerContext feature_category :continuous_integration - tags :exclude_from_kubernetes idempotent! def perform(*args) diff --git a/app/workers/ci/test_failure_history_worker.rb b/app/workers/ci/test_failure_history_worker.rb index b67797edf0b..e79ca50c8ce 100644 --- a/app/workers/ci/test_failure_history_worker.rb +++ b/app/workers/ci/test_failure_history_worker.rb @@ -9,8 +9,6 @@ module Ci sidekiq_options retry: 3 include PipelineBackgroundQueue - tags :exclude_from_kubernetes - idempotent! def perform(pipeline_id) diff --git a/app/workers/concerns/chaos_queue.rb b/app/workers/concerns/chaos_queue.rb index 2ccd55157c6..a9c557f0175 100644 --- a/app/workers/concerns/chaos_queue.rb +++ b/app/workers/concerns/chaos_queue.rb @@ -6,6 +6,5 @@ module ChaosQueue included do queue_namespace :chaos feature_category_not_owned! - tags :exclude_from_gitlab_com end end diff --git a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb index de9bb4d5a93..433ed5e0ea4 100644 --- a/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb +++ b/app/workers/container_expiration_policies/cleanup_container_repository_worker.rb @@ -12,7 +12,6 @@ module ContainerExpirationPolicies queue_namespace :container_repository feature_category :container_registry - tags :exclude_from_kubernetes urgency :low worker_resource_boundary :unknown idempotent! diff --git a/app/workers/database/batched_background_migration_worker.rb b/app/workers/database/batched_background_migration_worker.rb index 0750ff1acaf..fda539b372d 100644 --- a/app/workers/database/batched_background_migration_worker.rb +++ b/app/workers/database/batched_background_migration_worker.rb @@ -9,7 +9,6 @@ module Database include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :database - tags :exclude_from_kubernetes idempotent! LEASE_TIMEOUT_MULTIPLIER = 3 diff --git a/app/workers/deployments/drop_older_deployments_worker.rb b/app/workers/deployments/drop_older_deployments_worker.rb index 979f683cfb3..c464febd119 100644 --- a/app/workers/deployments/drop_older_deployments_worker.rb +++ b/app/workers/deployments/drop_older_deployments_worker.rb @@ -10,7 +10,6 @@ module Deployments queue_namespace :deployment feature_category :continuous_delivery - tags :exclude_from_kubernetes def perform(deployment_id) Deployments::OlderDeploymentsDropService.new(deployment_id).execute diff --git a/app/workers/design_management/copy_design_collection_worker.rb b/app/workers/design_management/copy_design_collection_worker.rb index a498eed173c..8b265979afa 100644 --- a/app/workers/design_management/copy_design_collection_worker.rb +++ b/app/workers/design_management/copy_design_collection_worker.rb @@ -9,7 +9,6 @@ module DesignManagement sidekiq_options retry: 3 feature_category :design_management - tags :exclude_from_kubernetes idempotent! urgency :low diff --git a/app/workers/destroy_pages_deployments_worker.rb b/app/workers/destroy_pages_deployments_worker.rb index 36424f7473e..7fa73648dd2 100644 --- a/app/workers/destroy_pages_deployments_worker.rb +++ b/app/workers/destroy_pages_deployments_worker.rb @@ -10,7 +10,6 @@ class DestroyPagesDeploymentsWorker loggable_arguments 0, 1 sidekiq_options retry: 3 feature_category :pages - tags :exclude_from_kubernetes def perform(project_id, last_deployment_id = nil) project = Project.find_by_id(project_id) diff --git a/app/workers/disallow_two_factor_for_group_worker.rb b/app/workers/disallow_two_factor_for_group_worker.rb index 4f5ef69a730..5b958f9f31f 100644 --- a/app/workers/disallow_two_factor_for_group_worker.rb +++ b/app/workers/disallow_two_factor_for_group_worker.rb @@ -9,7 +9,6 @@ class DisallowTwoFactorForGroupWorker include ExceptionBacktrace feature_category :subgroups - tags :exclude_from_kubernetes idempotent! def perform(group_id) diff --git a/app/workers/disallow_two_factor_for_subgroups_worker.rb b/app/workers/disallow_two_factor_for_subgroups_worker.rb index d3528b0674b..500c13deed2 100644 --- a/app/workers/disallow_two_factor_for_subgroups_worker.rb +++ b/app/workers/disallow_two_factor_for_subgroups_worker.rb @@ -11,7 +11,6 @@ class DisallowTwoFactorForSubgroupsWorker INTERVAL = 2.seconds.to_i feature_category :subgroups - tags :exclude_from_kubernetes idempotent! def perform(group_id) diff --git a/app/workers/environments/canary_ingress/update_worker.rb b/app/workers/environments/canary_ingress/update_worker.rb index 591c88cac96..02f24db1469 100644 --- a/app/workers/environments/canary_ingress/update_worker.rb +++ b/app/workers/environments/canary_ingress/update_worker.rb @@ -11,7 +11,6 @@ module Environments idempotent! worker_has_external_dependencies! feature_category :continuous_delivery - tags :exclude_from_kubernetes def perform(environment_id, params) Environment.find_by_id(environment_id).try do |environment| diff --git a/app/workers/experiments/record_conversion_event_worker.rb b/app/workers/experiments/record_conversion_event_worker.rb index 4c82c114d15..6487f030628 100644 --- a/app/workers/experiments/record_conversion_event_worker.rb +++ b/app/workers/experiments/record_conversion_event_worker.rb @@ -9,7 +9,6 @@ module Experiments sidekiq_options retry: 3 feature_category :users - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/flush_counter_increments_worker.rb b/app/workers/flush_counter_increments_worker.rb index bcb6a4c2bca..c4a3a5283cc 100644 --- a/app/workers/flush_counter_increments_worker.rb +++ b/app/workers/flush_counter_increments_worker.rb @@ -13,7 +13,6 @@ class FlushCounterIncrementsWorker sidekiq_options retry: 3 feature_category_not_owned! - tags :exclude_from_kubernetes urgency :low deduplicate :until_executing, including_scheduled: true diff --git a/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb b/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb index cce179542c7..ab0cb81249b 100644 --- a/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb +++ b/app/workers/gitlab/github_import/import_pull_request_merged_by_worker.rb @@ -5,7 +5,6 @@ module Gitlab class ImportPullRequestMergedByWorker # rubocop:disable Scalability/IdempotentWorker include ObjectImporter - tags :exclude_from_kubernetes worker_resource_boundary :cpu def representation_class diff --git a/app/workers/gitlab/github_import/import_pull_request_review_worker.rb b/app/workers/gitlab/github_import/import_pull_request_review_worker.rb index 8796d6392df..8d5c7b95b10 100644 --- a/app/workers/gitlab/github_import/import_pull_request_review_worker.rb +++ b/app/workers/gitlab/github_import/import_pull_request_review_worker.rb @@ -5,7 +5,6 @@ module Gitlab class ImportPullRequestReviewWorker # rubocop:disable Scalability/IdempotentWorker include ObjectImporter - tags :exclude_from_kubernetes worker_resource_boundary :cpu def representation_class diff --git a/app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb b/app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb index 7d83fe288da..8c2d652a689 100644 --- a/app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb +++ b/app/workers/gitlab/github_import/stage/import_pull_requests_merged_by_worker.rb @@ -12,8 +12,6 @@ module Gitlab include GithubImport::Queue include StageMethods - tags :exclude_from_kubernetes - # client - An instance of Gitlab::GithubImport::Client. # project - An instance of Project. def import(client, project) diff --git a/app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb b/app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb index ea3b89efd22..e10f1170618 100644 --- a/app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb +++ b/app/workers/gitlab/github_import/stage/import_pull_requests_reviews_worker.rb @@ -12,8 +12,6 @@ module Gitlab include GithubImport::Queue include StageMethods - tags :exclude_from_kubernetes - # client - An instance of Gitlab::GithubImport::Client. # project - An instance of Project. def import(client, project) diff --git a/app/workers/gitlab_performance_bar_stats_worker.rb b/app/workers/gitlab_performance_bar_stats_worker.rb index 4e8bcb9af7b..6d637ad1586 100644 --- a/app/workers/gitlab_performance_bar_stats_worker.rb +++ b/app/workers/gitlab_performance_bar_stats_worker.rb @@ -15,7 +15,6 @@ class GitlabPerformanceBarStatsWorker STATS_KEY_EXPIRE = 30.minutes.to_i feature_category :metrics - tags :exclude_from_kubernetes idempotent! def perform(lease_uuid) diff --git a/app/workers/group_destroy_worker.rb b/app/workers/group_destroy_worker.rb index f44c109f12d..92195d3fe16 100644 --- a/app/workers/group_destroy_worker.rb +++ b/app/workers/group_destroy_worker.rb @@ -9,7 +9,6 @@ class GroupDestroyWorker # rubocop:disable Scalability/IdempotentWorker include ExceptionBacktrace feature_category :subgroups - tags :requires_disk_io, :exclude_from_kubernetes def perform(group_id, user_id) begin diff --git a/app/workers/hashed_storage/migrator_worker.rb b/app/workers/hashed_storage/migrator_worker.rb index 80e86fd7814..c220f663969 100644 --- a/app/workers/hashed_storage/migrator_worker.rb +++ b/app/workers/hashed_storage/migrator_worker.rb @@ -13,7 +13,7 @@ module HashedStorage # Gitlab::HashedStorage::Migrator#migration_pending? depends on the # queue size of this worker. - tags :exclude_from_gitlab_com, :needs_own_queue + tags :needs_own_queue # @param [Integer] start initial ID of the batch # @param [Integer] finish last ID of the batch diff --git a/app/workers/hashed_storage/project_migrate_worker.rb b/app/workers/hashed_storage/project_migrate_worker.rb index edddea55356..0547e670203 100644 --- a/app/workers/hashed_storage/project_migrate_worker.rb +++ b/app/workers/hashed_storage/project_migrate_worker.rb @@ -13,7 +13,7 @@ module HashedStorage # Gitlab::HashedStorage::Migrator#migration_pending? depends on the # queue size of this worker. - tags :exclude_from_gitlab_com, :needs_own_queue + tags :needs_own_queue attr_reader :project_id diff --git a/app/workers/hashed_storage/project_rollback_worker.rb b/app/workers/hashed_storage/project_rollback_worker.rb index c5841dbbb28..1a8f5ce926c 100644 --- a/app/workers/hashed_storage/project_rollback_worker.rb +++ b/app/workers/hashed_storage/project_rollback_worker.rb @@ -13,7 +13,7 @@ module HashedStorage # Gitlab::HashedStorage::Migrator#rollback_pending? depends on the # queue size of this worker. - tags :exclude_from_gitlab_com, :needs_own_queue + tags :needs_own_queue attr_reader :project_id diff --git a/app/workers/hashed_storage/rollbacker_worker.rb b/app/workers/hashed_storage/rollbacker_worker.rb index 90e48f0e37a..8302f90fdec 100644 --- a/app/workers/hashed_storage/rollbacker_worker.rb +++ b/app/workers/hashed_storage/rollbacker_worker.rb @@ -13,7 +13,7 @@ module HashedStorage # Gitlab::HashedStorage::Migrator#rollback_pending? depends on the # queue size of this worker. - tags :exclude_from_gitlab_com, :needs_own_queue + tags :needs_own_queue # @param [Integer] start initial ID of the batch # @param [Integer] finish last ID of the batch diff --git a/app/workers/incident_management/add_severity_system_note_worker.rb b/app/workers/incident_management/add_severity_system_note_worker.rb index 31da7b0bcfe..3a4667bea0a 100644 --- a/app/workers/incident_management/add_severity_system_note_worker.rb +++ b/app/workers/incident_management/add_severity_system_note_worker.rb @@ -11,7 +11,6 @@ module IncidentManagement queue_namespace :incident_management feature_category :incident_management - tags :exclude_from_kubernetes def perform(incident_id, user_id) return if incident_id.blank? || user_id.blank? diff --git a/app/workers/issue_rebalancing_worker.rb b/app/workers/issue_rebalancing_worker.rb index 13e02c37bdb..a7676c312f9 100644 --- a/app/workers/issue_rebalancing_worker.rb +++ b/app/workers/issue_rebalancing_worker.rb @@ -10,7 +10,6 @@ class IssueRebalancingWorker idempotent! urgency :low feature_category :issue_tracking - tags :exclude_from_kubernetes deduplicate :until_executed, including_scheduled: true def perform(ignore = nil, project_id = nil, root_namespace_id = nil) diff --git a/app/workers/jira_connect/sync_builds_worker.rb b/app/workers/jira_connect/sync_builds_worker.rb index 379f087bc1b..1a9974af55f 100644 --- a/app/workers/jira_connect/sync_builds_worker.rb +++ b/app/workers/jira_connect/sync_builds_worker.rb @@ -8,7 +8,6 @@ module JiraConnect queue_namespace :jira_connect feature_category :integrations data_consistency :delayed - tags :exclude_from_kubernetes urgency :low worker_has_external_dependencies! diff --git a/app/workers/jira_connect/sync_deployments_worker.rb b/app/workers/jira_connect/sync_deployments_worker.rb index 3138230ced5..f4286752359 100644 --- a/app/workers/jira_connect/sync_deployments_worker.rb +++ b/app/workers/jira_connect/sync_deployments_worker.rb @@ -8,7 +8,6 @@ module JiraConnect queue_namespace :jira_connect feature_category :integrations data_consistency :delayed - tags :exclude_from_kubernetes urgency :low worker_has_external_dependencies! diff --git a/app/workers/jira_connect/sync_feature_flags_worker.rb b/app/workers/jira_connect/sync_feature_flags_worker.rb index 4de27c1b551..507d5c29f38 100644 --- a/app/workers/jira_connect/sync_feature_flags_worker.rb +++ b/app/workers/jira_connect/sync_feature_flags_worker.rb @@ -8,7 +8,6 @@ module JiraConnect queue_namespace :jira_connect feature_category :integrations data_consistency :delayed - tags :exclude_from_kubernetes urgency :low worker_has_external_dependencies! diff --git a/app/workers/jira_connect/sync_project_worker.rb b/app/workers/jira_connect/sync_project_worker.rb index a83444e58e7..b0ebaf30e99 100644 --- a/app/workers/jira_connect/sync_project_worker.rb +++ b/app/workers/jira_connect/sync_project_worker.rb @@ -8,7 +8,6 @@ module JiraConnect queue_namespace :jira_connect feature_category :integrations data_consistency :delayed - tags :exclude_from_kubernetes urgency :low worker_has_external_dependencies! diff --git a/app/workers/member_invitation_reminder_emails_worker.rb b/app/workers/member_invitation_reminder_emails_worker.rb index fa6787b9063..a7614db30f6 100644 --- a/app/workers/member_invitation_reminder_emails_worker.rb +++ b/app/workers/member_invitation_reminder_emails_worker.rb @@ -8,7 +8,6 @@ class MemberInvitationReminderEmailsWorker # rubocop:disable Scalability/Idempot include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :subgroups - tags :exclude_from_kubernetes urgency :low def perform diff --git a/app/workers/merge_request_cleanup_refs_worker.rb b/app/workers/merge_request_cleanup_refs_worker.rb index c57c6fbc28d..27bd5774b8d 100644 --- a/app/workers/merge_request_cleanup_refs_worker.rb +++ b/app/workers/merge_request_cleanup_refs_worker.rb @@ -10,7 +10,6 @@ class MergeRequestCleanupRefsWorker sidekiq_options retry: 3 feature_category :code_review - tags :exclude_from_kubernetes idempotent! # Hard-coded to 4 for now. Will be configurable later on via application settings. diff --git a/app/workers/metrics/dashboard/sync_dashboards_worker.rb b/app/workers/metrics/dashboard/sync_dashboards_worker.rb index 645c03428a2..fe8694582c4 100644 --- a/app/workers/metrics/dashboard/sync_dashboards_worker.rb +++ b/app/workers/metrics/dashboard/sync_dashboards_worker.rb @@ -10,7 +10,6 @@ module Metrics sidekiq_options retry: 3 feature_category :metrics - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/namespaces/in_product_marketing_emails_worker.rb b/app/workers/namespaces/in_product_marketing_emails_worker.rb index 035fa453f59..49e65d59e83 100644 --- a/app/workers/namespaces/in_product_marketing_emails_worker.rb +++ b/app/workers/namespaces/in_product_marketing_emails_worker.rb @@ -9,7 +9,6 @@ module Namespaces include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :subgroups - tags :exclude_from_kubernetes urgency :low def perform diff --git a/app/workers/namespaces/onboarding_issue_created_worker.rb b/app/workers/namespaces/onboarding_issue_created_worker.rb index 3cff741ecbf..81d105ab19c 100644 --- a/app/workers/namespaces/onboarding_issue_created_worker.rb +++ b/app/workers/namespaces/onboarding_issue_created_worker.rb @@ -9,7 +9,6 @@ module Namespaces sidekiq_options retry: 3 feature_category :issue_tracking - tags :exclude_from_kubernetes urgency :low deduplicate :until_executing diff --git a/app/workers/namespaces/onboarding_pipeline_created_worker.rb b/app/workers/namespaces/onboarding_pipeline_created_worker.rb index 2c77fab8114..f9a6b734586 100644 --- a/app/workers/namespaces/onboarding_pipeline_created_worker.rb +++ b/app/workers/namespaces/onboarding_pipeline_created_worker.rb @@ -9,7 +9,6 @@ module Namespaces sidekiq_options retry: 3 feature_category :subgroups - tags :exclude_from_kubernetes urgency :low deduplicate :until_executing diff --git a/app/workers/namespaces/onboarding_progress_worker.rb b/app/workers/namespaces/onboarding_progress_worker.rb index 43d13618091..b77db1aec5e 100644 --- a/app/workers/namespaces/onboarding_progress_worker.rb +++ b/app/workers/namespaces/onboarding_progress_worker.rb @@ -10,7 +10,6 @@ module Namespaces feature_category :product_analytics worker_resource_boundary :cpu - tags :exclude_from_kubernetes urgency :low deduplicate :until_executed diff --git a/app/workers/namespaces/onboarding_user_added_worker.rb b/app/workers/namespaces/onboarding_user_added_worker.rb index 4d4d9c03d3e..6a189e81b95 100644 --- a/app/workers/namespaces/onboarding_user_added_worker.rb +++ b/app/workers/namespaces/onboarding_user_added_worker.rb @@ -9,7 +9,6 @@ module Namespaces sidekiq_options retry: 3 feature_category :users - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/packages/composer/cache_cleanup_worker.rb b/app/workers/packages/composer/cache_cleanup_worker.rb index fee886bc750..19babf63967 100644 --- a/app/workers/packages/composer/cache_cleanup_worker.rb +++ b/app/workers/packages/composer/cache_cleanup_worker.rb @@ -10,7 +10,6 @@ module Packages include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :package_registry - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/packages/composer/cache_update_worker.rb b/app/workers/packages/composer/cache_update_worker.rb index f146a0a83cc..874993a1325 100644 --- a/app/workers/packages/composer/cache_update_worker.rb +++ b/app/workers/packages/composer/cache_update_worker.rb @@ -10,7 +10,6 @@ module Packages sidekiq_options retry: 3 feature_category :package_registry - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/packages/debian/process_changes_worker.rb b/app/workers/packages/debian/process_changes_worker.rb index 0d10e18cc01..0a716c61203 100644 --- a/app/workers/packages/debian/process_changes_worker.rb +++ b/app/workers/packages/debian/process_changes_worker.rb @@ -13,7 +13,6 @@ module Packages queue_namespace :package_repositories feature_category :package_registry - tags :exclude_from_kubernetes def perform(package_file_id, user_id) @package_file_id = package_file_id diff --git a/app/workers/packages/go/sync_packages_worker.rb b/app/workers/packages/go/sync_packages_worker.rb index 182c9bfec5d..dbf48cea1ae 100644 --- a/app/workers/packages/go/sync_packages_worker.rb +++ b/app/workers/packages/go/sync_packages_worker.rb @@ -12,7 +12,6 @@ module Packages queue_namespace :package_repositories feature_category :package_registry - tags :exclude_from_kubernetes deduplicate :until_executing idempotent! diff --git a/app/workers/packages/maven/metadata/sync_worker.rb b/app/workers/packages/maven/metadata/sync_worker.rb index ab18c70e95e..b18b950e1c8 100644 --- a/app/workers/packages/maven/metadata/sync_worker.rb +++ b/app/workers/packages/maven/metadata/sync_worker.rb @@ -13,7 +13,6 @@ module Packages queue_namespace :package_repositories feature_category :package_registry - tags :exclude_from_kubernetes deduplicate :until_executing idempotent! diff --git a/app/workers/packages/rubygems/extraction_worker.rb b/app/workers/packages/rubygems/extraction_worker.rb index 520305981cf..dbaf9bc35a9 100644 --- a/app/workers/packages/rubygems/extraction_worker.rb +++ b/app/workers/packages/rubygems/extraction_worker.rb @@ -11,7 +11,6 @@ module Packages queue_namespace :package_repositories feature_category :package_registry - tags :exclude_from_kubernetes deduplicate :until_executing def perform(package_file_id) diff --git a/app/workers/pages_domain_ssl_renewal_worker.rb b/app/workers/pages_domain_ssl_renewal_worker.rb index d4c68f66699..d6b40318fd4 100644 --- a/app/workers/pages_domain_ssl_renewal_worker.rb +++ b/app/workers/pages_domain_ssl_renewal_worker.rb @@ -8,7 +8,6 @@ class PagesDomainSslRenewalWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 feature_category :pages - tags :requires_disk_io, :exclude_from_kubernetes def perform(domain_id) domain = PagesDomain.find_by_id(domain_id) diff --git a/app/workers/pages_domain_verification_worker.rb b/app/workers/pages_domain_verification_worker.rb index f9504a7c1d2..59de00d40d5 100644 --- a/app/workers/pages_domain_verification_worker.rb +++ b/app/workers/pages_domain_verification_worker.rb @@ -8,7 +8,6 @@ class PagesDomainVerificationWorker # rubocop:disable Scalability/IdempotentWork sidekiq_options retry: 3 feature_category :pages - tags :requires_disk_io, :exclude_from_kubernetes # rubocop: disable CodeReuse/ActiveRecord def perform(domain_id) diff --git a/app/workers/pages_remove_worker.rb b/app/workers/pages_remove_worker.rb index 69a8344b5aa..6d1200b8f51 100644 --- a/app/workers/pages_remove_worker.rb +++ b/app/workers/pages_remove_worker.rb @@ -8,7 +8,6 @@ class PagesRemoveWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 feature_category :pages - tags :exclude_from_kubernetes loggable_arguments 0 def perform(project_id) diff --git a/app/workers/pages_transfer_worker.rb b/app/workers/pages_transfer_worker.rb index c2190a352dd..404c79b9e89 100644 --- a/app/workers/pages_transfer_worker.rb +++ b/app/workers/pages_transfer_worker.rb @@ -10,7 +10,6 @@ class PagesTransferWorker # rubocop:disable Scalability/IdempotentWorker TransferFailedError = Class.new(StandardError) feature_category :pages - tags :exclude_from_kubernetes loggable_arguments 0, 1 def perform(method, args) diff --git a/app/workers/pages_update_configuration_worker.rb b/app/workers/pages_update_configuration_worker.rb index 8a37b70a0b7..3dfd82ed517 100644 --- a/app/workers/pages_update_configuration_worker.rb +++ b/app/workers/pages_update_configuration_worker.rb @@ -9,7 +9,6 @@ class PagesUpdateConfigurationWorker idempotent! feature_category :pages - tags :exclude_from_kubernetes def self.perform_async(*args) return unless ::Settings.pages.local_store.enabled diff --git a/app/workers/pages_worker.rb b/app/workers/pages_worker.rb index d0c21cf74e1..5e951ab2c3a 100644 --- a/app/workers/pages_worker.rb +++ b/app/workers/pages_worker.rb @@ -8,7 +8,6 @@ class PagesWorker # rubocop:disable Scalability/IdempotentWorker sidekiq_options retry: 3 feature_category :pages loggable_arguments 0, 1 - tags :requires_disk_io, :exclude_from_kubernetes worker_resource_boundary :cpu def perform(action, *arg) diff --git a/app/workers/personal_access_tokens/expired_notification_worker.rb b/app/workers/personal_access_tokens/expired_notification_worker.rb index 8deacf457b2..2d0ea3d3aa4 100644 --- a/app/workers/personal_access_tokens/expired_notification_worker.rb +++ b/app/workers/personal_access_tokens/expired_notification_worker.rb @@ -9,7 +9,6 @@ module PersonalAccessTokens include CronjobQueue feature_category :authentication_and_authorization - tags :exclude_from_kubernetes def perform(*args) notification_service = NotificationService.new diff --git a/app/workers/project_destroy_worker.rb b/app/workers/project_destroy_worker.rb index 149f8290b54..45d0ebd2b65 100644 --- a/app/workers/project_destroy_worker.rb +++ b/app/workers/project_destroy_worker.rb @@ -9,7 +9,6 @@ class ProjectDestroyWorker # rubocop:disable Scalability/IdempotentWorker include ExceptionBacktrace feature_category :source_code_management - tags :requires_disk_io, :exclude_from_kubernetes def perform(project_id, user_id, params) project = Project.find(project_id) diff --git a/app/workers/projects/git_garbage_collect_worker.rb b/app/workers/projects/git_garbage_collect_worker.rb index 0d67a8ac30e..cf236f8b660 100644 --- a/app/workers/projects/git_garbage_collect_worker.rb +++ b/app/workers/projects/git_garbage_collect_worker.rb @@ -5,8 +5,6 @@ module Projects extend ::Gitlab::Utils::Override include GitGarbageCollectMethods - tags :exclude_from_kubernetes - private override :find_resource diff --git a/app/workers/projects/post_creation_worker.rb b/app/workers/projects/post_creation_worker.rb index 99438e4e4b2..3a39bd17ce3 100644 --- a/app/workers/projects/post_creation_worker.rb +++ b/app/workers/projects/post_creation_worker.rb @@ -9,7 +9,6 @@ module Projects sidekiq_options retry: 3 feature_category :source_code_management - tags :exclude_from_kubernetes idempotent! def perform(project_id) diff --git a/app/workers/propagate_integration_group_worker.rb b/app/workers/propagate_integration_group_worker.rb index 443ff1f2abe..ed08e90f38d 100644 --- a/app/workers/propagate_integration_group_worker.rb +++ b/app/workers/propagate_integration_group_worker.rb @@ -6,7 +6,6 @@ class PropagateIntegrationGroupWorker data_consistency :always sidekiq_options retry: 3 feature_category :integrations - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/propagate_integration_inherit_descendant_worker.rb b/app/workers/propagate_integration_inherit_descendant_worker.rb index 24573591409..8b3ecc1f057 100644 --- a/app/workers/propagate_integration_inherit_descendant_worker.rb +++ b/app/workers/propagate_integration_inherit_descendant_worker.rb @@ -6,7 +6,6 @@ class PropagateIntegrationInheritDescendantWorker data_consistency :always sidekiq_options retry: 3 feature_category :integrations - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/propagate_integration_inherit_worker.rb b/app/workers/propagate_integration_inherit_worker.rb index 24a8778b928..f0a53f8cb07 100644 --- a/app/workers/propagate_integration_inherit_worker.rb +++ b/app/workers/propagate_integration_inherit_worker.rb @@ -6,7 +6,6 @@ class PropagateIntegrationInheritWorker data_consistency :always sidekiq_options retry: 3 feature_category :integrations - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/propagate_integration_project_worker.rb b/app/workers/propagate_integration_project_worker.rb index dba8a270007..bc55b7ff504 100644 --- a/app/workers/propagate_integration_project_worker.rb +++ b/app/workers/propagate_integration_project_worker.rb @@ -6,7 +6,6 @@ class PropagateIntegrationProjectWorker data_consistency :always sidekiq_options retry: 3 feature_category :integrations - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/releases/create_evidence_worker.rb b/app/workers/releases/create_evidence_worker.rb index 5aed543500f..628b0e0b806 100644 --- a/app/workers/releases/create_evidence_worker.rb +++ b/app/workers/releases/create_evidence_worker.rb @@ -9,7 +9,6 @@ module Releases sidekiq_options retry: 3 feature_category :release_evidence - tags :exclude_from_kubernetes # pipeline_id is optional for backward compatibility with existing jobs # caller should always try to provide the pipeline and pass nil only diff --git a/app/workers/releases/manage_evidence_worker.rb b/app/workers/releases/manage_evidence_worker.rb index f316aa6eefd..94d0342a65a 100644 --- a/app/workers/releases/manage_evidence_worker.rb +++ b/app/workers/releases/manage_evidence_worker.rb @@ -9,7 +9,6 @@ module Releases include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :release_evidence - tags :exclude_from_kubernetes def perform releases = Release.without_evidence.released_within_2hrs diff --git a/app/workers/remove_unaccepted_member_invites_worker.rb b/app/workers/remove_unaccepted_member_invites_worker.rb index 7833ec30c3c..7fe45b26094 100644 --- a/app/workers/remove_unaccepted_member_invites_worker.rb +++ b/app/workers/remove_unaccepted_member_invites_worker.rb @@ -8,7 +8,6 @@ class RemoveUnacceptedMemberInvitesWorker # rubocop:disable Scalability/Idempote include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :authentication_and_authorization - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/schedule_merge_request_cleanup_refs_worker.rb b/app/workers/schedule_merge_request_cleanup_refs_worker.rb index 46a6e0ef01f..58cd8f7ade3 100644 --- a/app/workers/schedule_merge_request_cleanup_refs_worker.rb +++ b/app/workers/schedule_merge_request_cleanup_refs_worker.rb @@ -8,7 +8,6 @@ class ScheduleMergeRequestCleanupRefsWorker include CronjobQueue # rubocop:disable Scalability/CronWorkerContext feature_category :code_review - tags :exclude_from_kubernetes idempotent! def perform diff --git a/app/workers/ssh_keys/expired_notification_worker.rb b/app/workers/ssh_keys/expired_notification_worker.rb index 6afeecdd1b5..d8553b5a9a2 100644 --- a/app/workers/ssh_keys/expired_notification_worker.rb +++ b/app/workers/ssh_keys/expired_notification_worker.rb @@ -9,7 +9,6 @@ module SshKeys include CronjobQueue feature_category :compliance_management - tags :exclude_from_kubernetes idempotent! BATCH_SIZE = 500 diff --git a/app/workers/ssh_keys/expiring_soon_notification_worker.rb b/app/workers/ssh_keys/expiring_soon_notification_worker.rb index ef256621e07..a89520867ed 100644 --- a/app/workers/ssh_keys/expiring_soon_notification_worker.rb +++ b/app/workers/ssh_keys/expiring_soon_notification_worker.rb @@ -9,7 +9,6 @@ module SshKeys include CronjobQueue feature_category :compliance_management - tags :exclude_from_kubernetes idempotent! def perform diff --git a/app/workers/todos_destroyer/destroyed_issuable_worker.rb b/app/workers/todos_destroyer/destroyed_issuable_worker.rb index ff4f5e15472..f93c1389534 100644 --- a/app/workers/todos_destroyer/destroyed_issuable_worker.rb +++ b/app/workers/todos_destroyer/destroyed_issuable_worker.rb @@ -9,8 +9,6 @@ module TodosDestroyer sidekiq_options retry: 3 include TodosDestroyerQueue - tags :exclude_from_kubernetes - idempotent! def perform(target_id, target_type) diff --git a/app/workers/user_status_cleanup/batch_worker.rb b/app/workers/user_status_cleanup/batch_worker.rb index b6ca6548572..f3d73b2e6e9 100644 --- a/app/workers/user_status_cleanup/batch_worker.rb +++ b/app/workers/user_status_cleanup/batch_worker.rb @@ -12,7 +12,6 @@ module UserStatusCleanup # rubocop:enable Scalability/CronWorkerContext feature_category :users - tags :exclude_from_kubernetes idempotent! diff --git a/app/workers/users/deactivate_dormant_users_worker.rb b/app/workers/users/deactivate_dormant_users_worker.rb index bcb13483379..d7ea20e4b62 100644 --- a/app/workers/users/deactivate_dormant_users_worker.rb +++ b/app/workers/users/deactivate_dormant_users_worker.rb @@ -9,7 +9,6 @@ module Users include CronjobQueue feature_category :utilization - tags :exclude_from_kubernetes NUMBER_OF_BATCHES = 50 BATCH_SIZE = 200 diff --git a/app/workers/web_hooks/destroy_worker.rb b/app/workers/web_hooks/destroy_worker.rb index b92fe86bafb..f457cd11e54 100644 --- a/app/workers/web_hooks/destroy_worker.rb +++ b/app/workers/web_hooks/destroy_worker.rb @@ -7,7 +7,6 @@ module WebHooks data_consistency :always sidekiq_options retry: 3 feature_category :integrations - tags :exclude_from_kubernetes urgency :low idempotent! diff --git a/app/workers/wikis/git_garbage_collect_worker.rb b/app/workers/wikis/git_garbage_collect_worker.rb index f34d3be51d2..1b455c50618 100644 --- a/app/workers/wikis/git_garbage_collect_worker.rb +++ b/app/workers/wikis/git_garbage_collect_worker.rb @@ -5,8 +5,6 @@ module Wikis extend ::Gitlab::Utils::Override include GitGarbageCollectMethods - tags :exclude_from_kubernetes - private override :find_resource diff --git a/config/feature_flags/development/bulk_import.yml b/config/feature_flags/development/bulk_import.yml index 10885093adf..5a654b3f6d9 100644 --- a/config/feature_flags/development/bulk_import.yml +++ b/config/feature_flags/development/bulk_import.yml @@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/255310 milestone: '13.5' type: development group: group::import -default_enabled: false +default_enabled: true diff --git a/config/feature_flags/development/ci_include_rules.yml b/config/feature_flags/development/ci_include_rules.yml index a53f818b4f4..d8a3f0b245e 100644 --- a/config/feature_flags/development/ci_include_rules.yml +++ b/config/feature_flags/development/ci_include_rules.yml @@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/337507 milestone: '14.2' type: development group: group::pipeline authoring -default_enabled: false +default_enabled: true diff --git a/config/feature_flags/development/linear_user_manageable_groups.yml b/config/feature_flags/development/linear_user_manageable_groups.yml new file mode 100644 index 00000000000..e5822fc3d7d --- /dev/null +++ b/config/feature_flags/development/linear_user_manageable_groups.yml @@ -0,0 +1,8 @@ +--- +name: linear_user_manageable_groups +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68845 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339434 +milestone: '14.3' +type: development +group: group::access +default_enabled: false diff --git a/config/feature_flags/development/new_blobs_via_list_blobs.yml b/config/feature_flags/development/new_blobs_via_list_blobs.yml new file mode 100644 index 00000000000..331a08d713e --- /dev/null +++ b/config/feature_flags/development/new_blobs_via_list_blobs.yml @@ -0,0 +1,8 @@ +--- +name: new_blobs_via_list_blobs +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68935 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/339637 +milestone: '14.3' +type: development +group: group::gitaly +default_enabled: false diff --git a/db/migrate/20210826124311_add_index_to_error_tracking_error.rb b/db/migrate/20210826124311_add_index_to_error_tracking_error.rb new file mode 100644 index 00000000000..5973331e487 --- /dev/null +++ b/db/migrate/20210826124311_add_index_to_error_tracking_error.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class AddIndexToErrorTrackingError < ActiveRecord::Migration[6.1] + include Gitlab::Database::MigrationHelpers + + DOWNTIME = false + + disable_ddl_transaction! + + def up + add_concurrent_index :error_tracking_errors, [:project_id, :status, :last_seen_at], name: 'index_et_errors_on_project_id_and_status_and_last_seen_at' + add_concurrent_index :error_tracking_errors, [:project_id, :status, :first_seen_at], name: 'index_et_errors_on_project_id_and_status_and_first_seen_at' + add_concurrent_index :error_tracking_errors, [:project_id, :status, :events_count], name: 'index_et_errors_on_project_id_and_status_and_events_count' + add_concurrent_index :error_tracking_errors, [:project_id, :status, :id], name: 'index_et_errors_on_project_id_and_status_and_id' + end + + def down + remove_concurrent_index :error_tracking_errors, [:project_id, :status, :last_seen_at], name: 'index_et_errors_on_project_id_and_status_and_last_seen_at' + remove_concurrent_index :error_tracking_errors, [:project_id, :status, :first_seen_at], name: 'index_et_errors_on_project_id_and_status_and_first_seen_at' + remove_concurrent_index :error_tracking_errors, [:project_id, :status, :events_count], name: 'index_et_errors_on_project_id_and_status_and_events_count' + remove_concurrent_index :error_tracking_errors, [:project_id, :status, :id], name: 'index_et_errors_on_project_id_and_status_and_id' + end +end diff --git a/db/schema_migrations/20210826124311 b/db/schema_migrations/20210826124311 new file mode 100644 index 00000000000..c63d85f13b7 --- /dev/null +++ b/db/schema_migrations/20210826124311 @@ -0,0 +1 @@ +2cad14b3b7cb4f958a26cb6d4e76380338b745cc90c2e31c521614ea277c4ee9
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index ef88af2a04f..957dbb7e644 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -24048,6 +24048,14 @@ CREATE UNIQUE INDEX index_escalation_rules_on_all_attributes ON incident_managem CREATE INDEX index_escalation_rules_on_user ON incident_management_escalation_rules USING btree (user_id); +CREATE INDEX index_et_errors_on_project_id_and_status_and_events_count ON error_tracking_errors USING btree (project_id, status, events_count); + +CREATE INDEX index_et_errors_on_project_id_and_status_and_first_seen_at ON error_tracking_errors USING btree (project_id, status, first_seen_at); + +CREATE INDEX index_et_errors_on_project_id_and_status_and_id ON error_tracking_errors USING btree (project_id, status, id); + +CREATE INDEX index_et_errors_on_project_id_and_status_and_last_seen_at ON error_tracking_errors USING btree (project_id, status, last_seen_at); + CREATE INDEX index_events_on_action ON events USING btree (action); CREATE INDEX index_events_on_author_id_and_created_at ON events USING btree (author_id, created_at); diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index faa2e2fd28c..600334ddb3d 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -16029,7 +16029,6 @@ Name of the feature that the callout is for. | Value | Description | | ----- | ----------- | -| <a id="usercalloutfeaturenameenumaccount_recovery_regular_check"></a>`ACCOUNT_RECOVERY_REGULAR_CHECK` | Callout feature name for account_recovery_regular_check. | | <a id="usercalloutfeaturenameenumactive_user_count_threshold"></a>`ACTIVE_USER_COUNT_THRESHOLD` | Callout feature name for active_user_count_threshold. | | <a id="usercalloutfeaturenameenumbuy_pipeline_minutes_notification_dot"></a>`BUY_PIPELINE_MINUTES_NOTIFICATION_DOT` | Callout feature name for buy_pipeline_minutes_notification_dot. | | <a id="usercalloutfeaturenameenumcanary_deployment"></a>`CANARY_DEPLOYMENT` | Callout feature name for canary_deployment. | @@ -16058,6 +16057,7 @@ Name of the feature that the callout is for. | <a id="usercalloutfeaturenameenumthreat_monitoring_info"></a>`THREAT_MONITORING_INFO` | Callout feature name for threat_monitoring_info. | | <a id="usercalloutfeaturenameenumtrial_status_reminder_d14"></a>`TRIAL_STATUS_REMINDER_D14` | Callout feature name for trial_status_reminder_d14. | | <a id="usercalloutfeaturenameenumtrial_status_reminder_d3"></a>`TRIAL_STATUS_REMINDER_D3` | Callout feature name for trial_status_reminder_d3. | +| <a id="usercalloutfeaturenameenumtwo_factor_auth_recovery_settings_check"></a>`TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK` | Callout feature name for two_factor_auth_recovery_settings_check. | | <a id="usercalloutfeaturenameenumultimate_trial"></a>`ULTIMATE_TRIAL` | Callout feature name for ultimate_trial. | | <a id="usercalloutfeaturenameenumunfinished_tag_cleanup_callout"></a>`UNFINISHED_TAG_CLEANUP_CALLOUT` | Callout feature name for unfinished_tag_cleanup_callout. | | <a id="usercalloutfeaturenameenumweb_ide_alert_dismissed"></a>`WEB_IDE_ALERT_DISMISSED` | Callout feature name for web_ide_alert_dismissed. | diff --git a/doc/ci/yaml/index.md b/doc/ci/yaml/index.md index c307316472c..374553a4e76 100644 --- a/doc/ci/yaml/index.md +++ b/doc/ci/yaml/index.md @@ -450,12 +450,12 @@ that proposes expanding this feature to support more variables. #### `rules` with `include` -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276515) in GitLab 14.2. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/276515) in GitLab 14.2. +> - [Enabled on GitLab.com](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) in GitLab 14.3 and is ready for production use. +> - [Enabled with `ci_include_rules` flag](https://gitlab.com/gitlab-org/gitlab/-/issues/337507) for self-managed GitLab in GitLab 14.3 and is ready for production use. -NOTE: -On self-managed GitLab, by default this feature is not available. To make it available, -ask an administrator to [enable the `ci_include_rules` flag](../../administration/feature_flags.md). -On GitLab.com, this feature is not available. The feature is not ready for production use. +FLAG: +On self-managed GitLab, by default this feature is available. To hide the feature per project or for your entire instance, ask an administrator to [disable the `ci_include_rules` flag](../../administration/feature_flags.md). On GitLab.com, this feature is available. You can use [`rules`](#rules) with `include` to conditionally include other configuration files. You can only use `rules:if` in `include` with [certain variables](#variables-with-include). @@ -1627,7 +1627,7 @@ To disable directed acyclic graphs (DAG), set the limit to `0`. #### Artifact downloads with `needs` -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.6. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab 12.6. When a job uses `needs`, it no longer downloads all artifacts from previous stages by default, because jobs with `needs` can start before earlier stages complete. With @@ -1679,7 +1679,7 @@ with `needs`. #### Cross project artifact downloads with `needs` **(PREMIUM)** -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab v12.7. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/14311) in GitLab 12.7. Use `needs` to download artifacts from up to five jobs in pipelines: @@ -1752,7 +1752,7 @@ pipelines running on the same ref could override the artifacts. #### Artifact downloads to child pipelines -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab v13.7. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/255983) in GitLab 13.7. A [child pipeline](../pipelines/parent_child_pipelines.md) can download artifacts from a job in its parent pipeline or another child pipeline in the same parent-child pipeline hierarchy. @@ -2379,7 +2379,7 @@ cache-job: ##### `cache:key:files` -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab 12.5. Use the `cache:key:files` keyword to generate a new key when one or two specific files change. `cache:key:files` lets you reuse some caches, and rebuild them less often, @@ -2417,7 +2417,7 @@ fallback key is `default`. ##### `cache:key:prefix` -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab v12.5. +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18986) in GitLab 12.5. Use `cache:key:prefix` to combine a prefix with the SHA computed for [`cache:key:files`](#cachekeyfiles). diff --git a/doc/development/cicd/templates.md b/doc/development/cicd/templates.md index 03823a4b712..43cbf856cf1 100644 --- a/doc/development/cicd/templates.md +++ b/doc/development/cicd/templates.md @@ -289,9 +289,9 @@ If the `latest` template does not exist yet, you can copy [the stable template]( ### How to include an older stable template Users may want to use an older [stable template](#stable-version) that is not bundled -in the current GitLab package. For example, the stable templates in GitLab v13.0 and -GitLab v14.0 could be so different that a user wants to continue using the v13.0 template even -after upgrading to GitLab 14.0. +in the current GitLab package. For example, the stable templates in GitLab 13.0 and +GitLab 14.0 could be so different that a user wants to continue using the GitLab 13.0 +template even after upgrading to GitLab 14.0. You can add a note in the template or in documentation explaining how to use `include:remote` to include older template versions. If other templates are included with `include: template`, diff --git a/doc/security/rack_attack.md b/doc/security/rack_attack.md index 6d2725d1ec1..4894af1fa19 100644 --- a/doc/security/rack_attack.md +++ b/doc/security/rack_attack.md @@ -109,7 +109,7 @@ The following settings can be configured: - `enabled`: By default this is set to `false`. Set this to `true` to enable Rack Attack. - `ip_whitelist`: Whitelist any IPs from being blocked. They must be formatted as strings within a Ruby array. - CIDR notation is supported in GitLab v12.1 and up. + CIDR notation is supported in GitLab 12.1 and later. For example, `["127.0.0.1", "127.0.0.2", "127.0.0.3", "192.168.0.1/24"]`. - `maxretry`: The maximum amount of times a request can be made in the specified time. diff --git a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md index e4378ce2d78..45f930b198c 100644 --- a/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md +++ b/doc/topics/autodevops/upgrading_auto_deploy_dependencies.md @@ -159,7 +159,7 @@ steps to upgrade to v2: To use a specific version of Auto Deploy dependencies, specify the previous Auto Deploy stable template that contains the [desired version of `auto-deploy-image` and `auto-deploy-app`](#verify-dependency-versions). -For example, if the template is bundled in GitLab v13.3, change your `.gitlab-ci.yml` to: +For example, if the template is bundled in GitLab 13.3, change your `.gitlab-ci.yml` to: ```yaml include: diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md index 721afa219d0..31c3a8e774e 100644 --- a/doc/user/group/import/index.md +++ b/doc/user/group/import/index.md @@ -77,7 +77,7 @@ Any other items are **not** migrated. ## Enable or disable GitLab Group Migration -GitLab Migration is deployed behind a feature flag that is **disabled by default**. +GitLab Migration is deployed behind a feature flag that is **enabled by default**. [GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) can enable it. To enable it: diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index d447e73be5c..76a6408da09 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -364,8 +364,12 @@ module Gitlab return [] if newrev.blank? || newrev == ::Gitlab::Git::BLANK_SHA strong_memoize("new_blobs_#{newrev}") do - wrapped_gitaly_errors do - gitaly_ref_client.list_new_blobs(newrev, REV_LIST_COMMIT_LIMIT, dynamic_timeout: dynamic_timeout) + if Feature.enabled?(:new_blobs_via_list_blobs) + blobs(['--not', '--all', '--not', newrev], with_paths: true, dynamic_timeout: dynamic_timeout) + else + wrapped_gitaly_errors do + gitaly_ref_client.list_new_blobs(newrev, REV_LIST_COMMIT_LIMIT, dynamic_timeout: dynamic_timeout) + end end end end @@ -374,13 +378,14 @@ module Gitlab # pseudo-revisions `--not` and `--all`. Uses the minimum of # GitalyClient.medium_timeout and dynamic timeout if the dynamic # timeout is set, otherwise it'll always use the medium timeout. - def blobs(revisions, dynamic_timeout: nil) + def blobs(revisions, with_paths: false, dynamic_timeout: nil) revisions = revisions.reject { |rev| rev.blank? || rev == ::Gitlab::Git::BLANK_SHA } return [] if revisions.blank? wrapped_gitaly_errors do - gitaly_blob_client.list_blobs(revisions, limit: REV_LIST_COMMIT_LIMIT, dynamic_timeout: dynamic_timeout) + gitaly_blob_client.list_blobs(revisions, limit: REV_LIST_COMMIT_LIMIT, + with_paths: with_paths, dynamic_timeout: dynamic_timeout) end end diff --git a/lib/gitlab/gitaly_client/blob_service.rb b/lib/gitlab/gitaly_client/blob_service.rb index 362ecbd845d..3b08a833aeb 100644 --- a/lib/gitlab/gitaly_client/blob_service.rb +++ b/lib/gitlab/gitaly_client/blob_service.rb @@ -19,12 +19,13 @@ module Gitlab consume_blob_response(response) end - def list_blobs(revisions, limit: 0, bytes_limit: 0, dynamic_timeout: nil) + def list_blobs(revisions, limit: 0, bytes_limit: 0, with_paths: false, dynamic_timeout: nil) request = Gitaly::ListBlobsRequest.new( repository: @gitaly_repo, revisions: Array.wrap(revisions), limit: limit, - bytes_limit: bytes_limit + bytes_limit: bytes_limit, + with_paths: with_paths ) timeout = diff --git a/lib/gitlab/i18n.rb b/lib/gitlab/i18n.rb index 5f1b9873fee..fd0106456d8 100644 --- a/lib/gitlab/i18n.rb +++ b/lib/gitlab/i18n.rb @@ -7,6 +7,7 @@ module Gitlab AVAILABLE_LANGUAGES = { 'bg' => 'Bulgarian - български', 'cs_CZ' => 'Czech - čeština', + 'da_DK' => 'Danish - dansk', 'de' => 'German - Deutsch', 'en' => 'English', 'eo' => 'Esperanto - esperanto', @@ -18,10 +19,12 @@ module Gitlab 'it' => 'Italian - italiano', 'ja' => 'Japanese - 日本語', 'ko' => 'Korean - 한국어', + 'nb_NO' => 'Norwegian (Bokmål) - norsk (bokmål)', 'nl_NL' => 'Dutch - Nederlands', 'pl_PL' => 'Polish - polski', 'pt_BR' => 'Portuguese (Brazil) - português (Brasil)', - 'ru' => 'Russian - Русский', + 'ro_RO' => 'Romanian - română', + 'ru' => 'Russian - русский', 'tr_TR' => 'Turkish - Türkçe', 'uk' => 'Ukrainian - українська', 'zh_CN' => 'Chinese, Simplified - 简体中文', @@ -40,6 +43,7 @@ module Gitlab TRANSLATION_LEVELS = { 'bg' => 0, 'cs_CZ' => 1, + 'da_DK' => 26, 'de' => 16, 'en' => 100, 'eo' => 0, @@ -51,9 +55,11 @@ module Gitlab 'it' => 2, 'ja' => 39, 'ko' => 12, + 'nb_NO' => 27, 'nl_NL' => 0, 'pl_PL' => 6, 'pt_BR' => 36, + 'ro_RO' => 20, 'ru' => 28, 'tr_TR' => 16, 'uk' => 40, diff --git a/lib/gitlab/integrations/sti_type.rb b/lib/gitlab/integrations/sti_type.rb index 0fa9f435b5c..91797a7b99b 100644 --- a/lib/gitlab/integrations/sti_type.rb +++ b/lib/gitlab/integrations/sti_type.rb @@ -7,7 +7,7 @@ module Gitlab Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker - Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack + Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack Zentao )).freeze def self.namespaced_integrations diff --git a/lib/gitlab/zentao/client.rb b/lib/gitlab/zentao/client.rb new file mode 100644 index 00000000000..bdfa4b3a308 --- /dev/null +++ b/lib/gitlab/zentao/client.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +module Gitlab + module Zentao + class Client + Error = Class.new(StandardError) + ConfigError = Class.new(Error) + + attr_reader :integration + + def initialize(integration) + raise ConfigError, 'Please check your integration configuration.' unless integration + + @integration = integration + end + + def ping + response = fetch_product(zentao_product_xid) + + active = response.fetch('deleted') == '0' rescue false + + if active + { success: true } + else + { success: false, message: 'Not Found' } + end + end + + def fetch_product(product_id) + get("products/#{product_id}") + end + + def fetch_issues(params = {}) + get("products/#{zentao_product_xid}/issues", + params.reverse_merge(page: 1, limit: 20)) + end + + def fetch_issue(issue_id) + get("issues/#{issue_id}") + end + + private + + def get(path, params = {}) + options = { headers: headers, query: params } + response = Gitlab::HTTP.get(url(path), options) + + return {} unless response.success? + + Gitlab::Json.parse(response.body) + rescue JSON::ParserError + {} + end + + def url(path) + host = integration.api_url.presence || integration.url + + URI.join(host, '/api.php/v1/', path) + end + + def headers + { + 'Content-Type': 'application/json', + 'Token': integration.api_token + } + end + + def zentao_product_xid + integration.zentao_product_xid + end + end + end +end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4039f5a2f37..6863e64745f 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -18815,6 +18815,9 @@ msgstr "" msgid "Iterations|Create cadence" msgstr "" +msgid "Iterations|Create your first iteration" +msgstr "" + msgid "Iterations|Delete cadence" msgstr "" @@ -38922,6 +38925,30 @@ msgstr "" msgid "Your username is %{username}." msgstr "" +msgid "ZentaoIntegration|Base URL of the Zentao instance." +msgstr "" + +msgid "ZentaoIntegration|Enter API token" +msgstr "" + +msgid "ZentaoIntegration|If different from Web URL." +msgstr "" + +msgid "ZentaoIntegration|Use Zentao as this project's issue tracker." +msgstr "" + +msgid "ZentaoIntegration|Zentao API URL (optional)" +msgstr "" + +msgid "ZentaoIntegration|Zentao API token" +msgstr "" + +msgid "ZentaoIntegration|Zentao Product ID" +msgstr "" + +msgid "ZentaoIntegration|Zentao Web URL" +msgstr "" + msgid "Zoom meeting added" msgstr "" diff --git a/package.json b/package.json index 622e3a8eed4..ad7f314eca5 100644 --- a/package.json +++ b/package.json @@ -205,7 +205,7 @@ }, "devDependencies": { "@babel/plugin-transform-modules-commonjs": "^7.10.1", - "@gitlab/eslint-plugin": "9.0.3", + "@gitlab/eslint-plugin": "9.2.0", "@gitlab/stylelint-config": "2.3.0", "@testing-library/dom": "^7.16.2", "@vue/test-utils": "1.2.0", diff --git a/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb b/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb index 7655cb24f0a..925d50a6639 100644 --- a/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb +++ b/qa/qa/specs/features/api/1_manage/bulk_import_group_spec.rb @@ -54,7 +54,6 @@ module QA end before do - Runtime::Feature.enable(:bulk_import) unless staging? Runtime::Feature.enable(:top_level_group_creation_enabled) if staging? sandbox.add_member(user, Resource::Members::AccessLevel::MAINTAINER) @@ -91,7 +90,6 @@ module QA after do user.remove_via_api! ensure - Runtime::Feature.disable(:bulk_import) unless staging? Runtime::Feature.disable(:top_level_group_creation_enabled) if staging? end end diff --git a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb index f9b367724a8..c3be58fda74 100644 --- a/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb +++ b/qa/qa/specs/features/browser_ui/1_manage/group/bulk_import_group_spec.rb @@ -38,7 +38,6 @@ module QA end before do - Runtime::Feature.enable(:bulk_import) unless staging? Runtime::Feature.enable(:top_level_group_creation_enabled) if staging? sandbox.add_member(user, Resource::Members::AccessLevel::MAINTAINER) @@ -77,7 +76,6 @@ module QA after do user.remove_via_api! ensure - Runtime::Feature.disable(:bulk_import) unless staging? Runtime::Feature.disable(:top_level_group_creation_enabled) if staging? end end diff --git a/spec/controllers/profiles/two_factor_auths_controller_spec.rb b/spec/controllers/profiles/two_factor_auths_controller_spec.rb index 818bf2a4ae6..9df88e860be 100644 --- a/spec/controllers/profiles/two_factor_auths_controller_spec.rb +++ b/spec/controllers/profiles/two_factor_auths_controller_spec.rb @@ -70,8 +70,8 @@ RSpec.describe Profiles::TwoFactorAuthsController do go end - it 'dismisses the `ACCOUNT_RECOVERY_REGULAR_CHECK` callout' do - expect(controller.helpers).to receive(:dismiss_account_recovery_regular_check) + it 'dismisses the `TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK` callout' do + expect(controller.helpers).to receive(:dismiss_two_factor_auth_recovery_settings_check) go end @@ -124,8 +124,8 @@ RSpec.describe Profiles::TwoFactorAuthsController do expect(user.otp_backup_codes).not_to be_empty end - it 'dismisses the `ACCOUNT_RECOVERY_REGULAR_CHECK` callout' do - expect(controller.helpers).to receive(:dismiss_account_recovery_regular_check) + it 'dismisses the `TWO_FACTOR_AUTH_RECOVERY_SETTINGS_CHECK` callout' do + expect(controller.helpers).to receive(:dismiss_two_factor_auth_recovery_settings_check) post :codes end diff --git a/spec/factories/integration_data.rb b/spec/factories/integration_data.rb index a7406794437..4d0892556f8 100644 --- a/spec/factories/integration_data.rb +++ b/spec/factories/integration_data.rb @@ -7,13 +7,21 @@ FactoryBot.define do integration factory: :jira_integration end + factory :zentao_tracker_data, class: 'Integrations::ZentaoTrackerData' do + integration factory: :zentao_integration + url { 'https://jihudemo.zentao.net' } + api_url { '' } + api_token { 'ZENTAO_TOKEN' } + zentao_product_xid { '3' } + end + factory :issue_tracker_data, class: 'Integrations::IssueTrackerData' do integration end factory :open_project_tracker_data, class: 'Integrations::OpenProjectTrackerData' do integration factory: :open_project_service - url { 'http://openproject.example.com'} + url { 'http://openproject.example.com' } token { 'supersecret' } project_identifier_code { 'PRJ-1' } closed_status_id { '15' } diff --git a/spec/factories/integrations.rb b/spec/factories/integrations.rb index ca8ffb135f9..cb1c94c25c1 100644 --- a/spec/factories/integrations.rb +++ b/spec/factories/integrations.rb @@ -85,6 +85,32 @@ FactoryBot.define do end end + factory :zentao_integration, class: 'Integrations::Zentao' do + project + active { true } + type { 'ZentaoService' } + + transient do + create_data { true } + url { 'https://jihudemo.zentao.net' } + api_url { '' } + api_token { 'ZENTAO_TOKEN' } + zentao_product_xid { '3' } + end + + after(:build) do |integration, evaluator| + if evaluator.create_data + integration.zentao_tracker_data = build(:zentao_tracker_data, + integration: integration, + url: evaluator.url, + api_url: evaluator.api_url, + api_token: evaluator.api_token, + zentao_product_xid: evaluator.zentao_product_xid + ) + end + end + end + factory :confluence_integration, class: 'Integrations::Confluence' do project active { true } diff --git a/spec/finders/error_tracking/errors_finder_spec.rb b/spec/finders/error_tracking/errors_finder_spec.rb index 2df5f1653e0..2695de31751 100644 --- a/spec/finders/error_tracking/errors_finder_spec.rb +++ b/spec/finders/error_tracking/errors_finder_spec.rb @@ -7,6 +7,7 @@ RSpec.describe ErrorTracking::ErrorsFinder do let_it_be(:user) { project.creator } let_it_be(:error) { create(:error_tracking_error, project: project) } let_it_be(:error_resolved) { create(:error_tracking_error, :resolved, project: project) } + let_it_be(:error_yesterday) { create(:error_tracking_error, project: project, first_seen_at: Time.zone.now.yesterday) } before do project.add_maintainer(user) @@ -17,12 +18,24 @@ RSpec.describe ErrorTracking::ErrorsFinder do subject { described_class.new(user, project, params).execute } - it { is_expected.to contain_exactly(error, error_resolved) } + it { is_expected.to contain_exactly(error, error_resolved, error_yesterday) } context 'with status parameter' do let(:params) { { status: 'resolved' } } it { is_expected.to contain_exactly(error_resolved) } end + + context 'with sort parameter' do + let(:params) { { status: 'unresolved', sort: 'first_seen' } } + + it { is_expected.to eq([error, error_yesterday]) } + end + + context 'with limit parameter' do + let(:params) { { limit: '1', sort: 'first_seen' } } + + it { is_expected.to contain_exactly(error) } + end end end diff --git a/spec/frontend/content_editor/services/markdown_serializer_spec.js b/spec/frontend/content_editor/services/markdown_serializer_spec.js index cd4560677f8..0f12e0e4aec 100644 --- a/spec/frontend/content_editor/services/markdown_serializer_spec.js +++ b/spec/frontend/content_editor/services/markdown_serializer_spec.js @@ -3,7 +3,10 @@ import Bold from '~/content_editor/extensions/bold'; import BulletList from '~/content_editor/extensions/bullet_list'; import Code from '~/content_editor/extensions/code'; import CodeBlockHighlight from '~/content_editor/extensions/code_block_highlight'; +import Division from '~/content_editor/extensions/division'; import Emoji from '~/content_editor/extensions/emoji'; +import Figure from '~/content_editor/extensions/figure'; +import FigureCaption from '~/content_editor/extensions/figure_caption'; import HardBreak from '~/content_editor/extensions/hard_break'; import Heading from '~/content_editor/extensions/heading'; import HorizontalRule from '~/content_editor/extensions/horizontal_rule'; @@ -38,7 +41,10 @@ const tiptapEditor = createTestEditor({ BulletList, Code, CodeBlockHighlight, + Division, Emoji, + Figure, + FigureCaption, HardBreak, Heading, HorizontalRule, @@ -68,7 +74,10 @@ const { bulletList, code, codeBlock, + division, emoji, + figure, + figureCaption, heading, hardBreak, horizontalRule, @@ -95,7 +104,10 @@ const { bulletList: { nodeType: BulletList.name }, code: { markType: Code.name }, codeBlock: { nodeType: CodeBlockHighlight.name }, + division: { nodeType: Division.name }, emoji: { markType: Emoji.name }, + figure: { nodeType: Figure.name }, + figureCaption: { nodeType: FigureCaption.name }, hardBreak: { nodeType: HardBreak.name }, heading: { nodeType: Heading.name }, horizontalRule: { nodeType: HorizontalRule.name }, @@ -533,6 +545,61 @@ this is not really json but just trying out whether this case works or not ); }); + it('correctly renders div', () => { + expect( + serialize( + division(paragraph('just a paragraph in a div')), + division(paragraph('just some ', bold('styled'), ' ', italic('content'), ' in a div')), + ), + ).toBe( + '<div>just a paragraph in a div</div>\n<div>\n\njust some **styled** _content_ in a div\n\n</div>', + ); + }); + + it('correctly renders figure', () => { + expect( + serialize( + figure( + paragraph(image({ src: 'elephant.jpg', alt: 'An elephant at sunset' })), + figureCaption('An elephant at sunset'), + ), + ), + ).toBe( + ` +<figure> + +![An elephant at sunset](elephant.jpg) + +<figcaption>An elephant at sunset</figcaption> +</figure> + `.trim(), + ); + }); + + it('correctly renders figure with styled caption', () => { + expect( + serialize( + figure( + paragraph(image({ src: 'elephant.jpg', alt: 'An elephant at sunset' })), + figureCaption(italic('An elephant at sunset')), + ), + ), + ).toBe( + ` +<figure> + +![An elephant at sunset](elephant.jpg) + +<figcaption> + +_An elephant at sunset_ + +</figcaption> +</figure> + `.trim(), + ); + }); + it('correctly serializes a table with inline content', () => { expect( serialize( diff --git a/spec/frontend/experimentation/utils_spec.js b/spec/frontend/experimentation/utils_spec.js index 2ba8c65a252..999bed1ffbd 100644 --- a/spec/frontend/experimentation/utils_spec.js +++ b/spec/frontend/experimentation/utils_spec.js @@ -37,6 +37,50 @@ describe('experiment Utilities', () => { }); }); + describe('getAllExperimentContexts', () => { + const schema = TRACKING_CONTEXT_SCHEMA; + let origGon; + + beforeEach(() => { + origGon = window.gon; + }); + + afterEach(() => { + window.gon = origGon; + }); + + it('collects all of the experiment contexts into a single array', () => { + const experiments = [ + { experiment: 'abc', variant: 'candidate' }, + { experiment: 'def', variant: 'control' }, + { experiment: 'ghi', variant: 'blue' }, + ]; + window.gon = { + experiment: experiments.reduce((collector, { experiment, variant }) => { + return { ...collector, [experiment]: { experiment, variant } }; + }, {}), + }; + + expect(experimentUtils.getAllExperimentContexts()).toEqual( + experiments.map((data) => ({ schema, data })), + ); + }); + + it('returns an empty array if there are no experiments', () => { + window.gon.experiment = {}; + + expect(experimentUtils.getAllExperimentContexts()).toEqual([]); + }); + + it('includes all additional experiment data', () => { + const experiment = 'experimentWithCustomData'; + const data = { experiment, variant: 'control', color: 'blue', style: 'rounded' }; + window.gon.experiment[experiment] = data; + + expect(experimentUtils.getAllExperimentContexts()).toContainEqual({ schema, data }); + }); + }); + describe('isExperimentVariant', () => { describe.each` gon | input | output diff --git a/spec/frontend/fixtures/api_markdown.yml b/spec/frontend/fixtures/api_markdown.yml index 8433efaf00c..1a6eebc0d4f 100644 --- a/spec/frontend/fixtures/api_markdown.yml +++ b/spec/frontend/fixtures/api_markdown.yml @@ -33,6 +33,32 @@ * <ruby>漢<rt>ㄏㄢˋ</rt></ruby> * C<sub>7</sub>H<sub>16</sub> + O<sub>2</sub> → CO<sub>2</sub> + H<sub>2</sub>O * The **Pythagorean theorem** is often expressed as <var>a<sup>2</sup></var> + <var>b<sup>2</sup></var> = <var>c<sup>2</sup></var> +- name: div + markdown: |- + <div>plain text</div> + <div> + + just a plain ol' div, not much to _expect_! + + </div> +- name: figure + markdown: |- + <figure> + + ![Elephant at sunset](elephant-sunset.jpg) + + <figcaption>An elephant at sunset</figcaption> + </figure> + <figure> + + ![A crocodile wearing crocs](croc-crocs.jpg) + + <figcaption> + + A crocodile wearing _crocs_! + + </figcaption> + </figure> - name: link markdown: '[GitLab](https://gitlab.com)' - name: attachment_link diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js index f3233bcd771..b59c3cda055 100644 --- a/spec/frontend/tracking_spec.js +++ b/spec/frontend/tracking_spec.js @@ -1,10 +1,13 @@ import { setHTMLFixture } from 'helpers/fixtures'; import { TRACKING_CONTEXT_SCHEMA } from '~/experimentation/constants'; -import { getExperimentData } from '~/experimentation/utils'; +import { getExperimentData, getAllExperimentContexts } from '~/experimentation/utils'; import Tracking, { initUserTracking, initDefaultTrackers } from '~/tracking'; import getStandardContext from '~/tracking/get_standard_context'; -jest.mock('~/experimentation/utils', () => ({ getExperimentData: jest.fn() })); +jest.mock('~/experimentation/utils', () => ({ + getExperimentData: jest.fn(), + getAllExperimentContexts: jest.fn(), +})); describe('Tracking', () => { let standardContext; @@ -29,6 +32,7 @@ describe('Tracking', () => { beforeEach(() => { getExperimentData.mockReturnValue(undefined); + getAllExperimentContexts.mockReturnValue([]); window.snowplow = window.snowplow || (() => {}); window.snowplowOptions = { @@ -100,6 +104,31 @@ describe('Tracking', () => { initDefaultTrackers(); expect(trackLoadEventsSpy).toHaveBeenCalled(); }); + + describe('when there are experiment contexts', () => { + const experimentContexts = [ + { + schema: TRACKING_CONTEXT_SCHEMA, + data: { experiment: 'experiment1', variant: 'control' }, + }, + { + schema: TRACKING_CONTEXT_SCHEMA, + data: { experiment: 'experiment_two', variant: 'candidate' }, + }, + ]; + + beforeEach(() => { + getAllExperimentContexts.mockReturnValue(experimentContexts); + }); + + it('includes those contexts alongside the standard context', () => { + initDefaultTrackers(); + expect(snowplowSpy).toHaveBeenCalledWith('trackPageView', null, [ + standardContext, + ...experimentContexts, + ]); + }); + }); }); describe('.event', () => { diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 1dcf12b1049..540957f48ea 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -936,6 +936,75 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do end end + describe '#new_blobs' do + let(:repository) { mutable_repository } + let(:repository_rugged) { mutable_repository_rugged } + let(:new_blob) do + repository_rugged.write('This is a new blob', :blob) + end + + let(:new_commit) do + author = { name: 'Test User', email: 'mail@example.com', time: Time.now } + + index = repository_rugged.index + index.add(path: 'nested/new-blob.txt', oid: new_blob, mode: 0100644) + + Rugged::Commit.create(repository_rugged, + author: author, + committer: author, + message: "Message", + parents: [], + tree: index.write_tree(repository_rugged)) + end + + subject { repository.new_blobs(new_commit).to_a } + + context 'with :new_blobs_via_list_blobs enabled' do + before do + stub_feature_flags(new_blobs_via_list_blobs: true) + + expect_next_instance_of(Gitlab::GitalyClient::BlobService) do |service| + expect(service) + .to receive(:list_blobs) + .with(['--not', '--all', '--not', new_commit], + limit: Gitlab::Git::Repository::REV_LIST_COMMIT_LIMIT, + with_paths: true, + dynamic_timeout: nil) + .and_call_original + end + end + + it 'enumerates new blobs' do + expect(subject).to match_array( + [have_attributes(class: Gitlab::Git::Blob, id: new_blob, path: 'nested/new-blob.txt', size: 18)] + ) + end + end + + context 'with :new_blobs_via_list_blobs disabled' do + before do + stub_feature_flags(new_blobs_via_list_blobs: false) + + expect_next_instance_of(Gitlab::GitalyClient::RefService) do |service| + expect(service) + .to receive(:list_new_blobs) + .with(new_commit, + Gitlab::Git::Repository::REV_LIST_COMMIT_LIMIT, + dynamic_timeout: nil) + .and_call_original + end + end + + it 'enumerates new blobs' do + expect(subject).to match_array([Gitaly::NewBlobObject.new( + size: 18, + oid: new_blob, + path: "nested/new-blob.txt" + )]) + end + end + end + describe '#new_commits' do let(:repository) { mutable_repository } let(:new_commit) do diff --git a/spec/lib/gitlab/gitaly_client/blob_service_spec.rb b/spec/lib/gitlab/gitaly_client/blob_service_spec.rb index 50078d8c127..f869c66337e 100644 --- a/spec/lib/gitlab/gitaly_client/blob_service_spec.rb +++ b/spec/lib/gitlab/gitaly_client/blob_service_spec.rb @@ -92,13 +92,14 @@ RSpec.describe Gitlab::GitalyClient::BlobService do describe '#list_blobs' do let(:limit) { 0 } let(:bytes_limit) { 0 } - let(:expected_params) { { revisions: revisions, limit: limit, bytes_limit: bytes_limit } } + let(:with_paths) { false } + let(:expected_params) { { revisions: revisions, limit: limit, bytes_limit: bytes_limit, with_paths: with_paths } } before do ::Gitlab::GitalyClient.clear_stubs! end - subject { client.list_blobs(revisions, limit: limit, bytes_limit: bytes_limit) } + subject { client.list_blobs(revisions, limit: limit, bytes_limit: bytes_limit, with_paths: with_paths) } context 'with a single revision' do let(:revisions) { ['master'] } @@ -147,6 +148,24 @@ RSpec.describe Gitlab::GitalyClient::BlobService do end end + context 'with paths' do + let(:revisions) { ['master'] } + let(:limit) { 10 } + let(:bytes_lmit) { 1024 } + let(:with_paths) { true } + + it 'sends a list_blobs message' do + expect_next_instance_of(Gitaly::BlobService::Stub) do |service| + expect(service) + .to receive(:list_blobs) + .with(gitaly_request_with_params(expected_params), kind_of(Hash)) + .and_return([]) + end + + subject + end + end + context 'with split contents' do let(:revisions) { ['master'] } diff --git a/spec/lib/gitlab/import_export/all_models.yml b/spec/lib/gitlab/import_export/all_models.yml index ee939823129..be04bd2a3f0 100644 --- a/spec/lib/gitlab/import_export/all_models.yml +++ b/spec/lib/gitlab/import_export/all_models.yml @@ -320,6 +320,7 @@ integrations: - project - service_hook - jira_tracker_data +- zentao_tracker_data - issue_tracker_data - open_project_tracker_data hooks: @@ -399,6 +400,7 @@ project: - teamcity_integration - pushover_integration - jira_integration +- zentao_integration - redmine_integration - youtrack_integration - custom_issue_tracker_integration diff --git a/spec/lib/gitlab/zentao/client_spec.rb b/spec/lib/gitlab/zentao/client_spec.rb new file mode 100644 index 00000000000..e3a335c1e89 --- /dev/null +++ b/spec/lib/gitlab/zentao/client_spec.rb @@ -0,0 +1,105 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::Zentao::Client do + subject(:integration) { described_class.new(zentao_integration) } + + let(:zentao_integration) { create(:zentao_integration) } + let(:mock_get_products_url) { integration.send(:url, "products/#{zentao_integration.zentao_product_xid}") } + + describe '#new' do + context 'if integration is nil' do + let(:zentao_integration) { nil } + + it 'raises ConfigError' do + expect { integration }.to raise_error(described_class::ConfigError) + end + end + + context 'integration is provided' do + it 'is initialized successfully' do + expect { integration }.not_to raise_error + end + end + end + + describe '#fetch_product' do + let(:mock_headers) do + { + headers: { + 'Content-Type' => 'application/json', + 'Token' => zentao_integration.api_token + } + } + end + + context 'with valid product' do + let(:mock_response) { { 'id' => zentao_integration.zentao_product_xid } } + + before do + WebMock.stub_request(:get, mock_get_products_url) + .with(mock_headers).to_return(status: 200, body: mock_response.to_json) + end + + it 'fetches the product' do + expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq mock_response + end + end + + context 'with invalid product' do + before do + WebMock.stub_request(:get, mock_get_products_url) + .with(mock_headers).to_return(status: 404, body: {}.to_json) + end + + it 'fetches the empty product' do + expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq({}) + end + end + + context 'with invalid response' do + before do + WebMock.stub_request(:get, mock_get_products_url) + .with(mock_headers).to_return(status: 200, body: '[invalid json}') + end + + it 'fetches the empty product' do + expect(integration.fetch_product(zentao_integration.zentao_product_xid)).to eq({}) + end + end + end + + describe '#ping' do + let(:mock_headers) do + { + headers: { + 'Content-Type' => 'application/json', + 'Token' => zentao_integration.api_token + } + } + end + + context 'with valid resource' do + before do + WebMock.stub_request(:get, mock_get_products_url) + .with(mock_headers).to_return(status: 200, body: { 'deleted' => '0' }.to_json) + end + + it 'responds with success' do + expect(integration.ping[:success]).to eq true + end + end + + context 'with deleted resource' do + before do + WebMock.stub_request(:get, mock_get_products_url) + .with(mock_headers).to_return(status: 200, body: { 'deleted' => '1' }.to_json) + end + + it 'responds with unsuccess' do + expect(integration.ping[:success]).to eq false + end + end + end +end diff --git a/spec/migrations/add_triggers_to_integrations_type_new_spec.rb b/spec/migrations/add_triggers_to_integrations_type_new_spec.rb index 07845715a52..01af5884170 100644 --- a/spec/migrations/add_triggers_to_integrations_type_new_spec.rb +++ b/spec/migrations/add_triggers_to_integrations_type_new_spec.rb @@ -8,6 +8,18 @@ RSpec.describe AddTriggersToIntegrationsTypeNew do let(:migration) { described_class.new } let(:integrations) { table(:integrations) } + # This matches Gitlab::Integrations::StiType at the time the trigger was added + let(:namespaced_integrations) do + %w[ + Asana Assembla Bamboo Bugzilla Buildkite Campfire Confluence CustomIssueTracker Datadog + Discord DroneCi EmailsOnPush Ewm ExternalWiki Flowdock HangoutsChat Irker Jenkins Jira Mattermost + MattermostSlashCommands MicrosoftTeams MockCi MockMonitoring Packagist PipelinesEmail Pivotaltracker + Prometheus Pushover Redmine Slack SlackSlashCommands Teamcity UnifyCircuit WebexTeams Youtrack + + Github GitlabSlackApplication + ] + end + describe '#up' do before do migrate! @@ -15,7 +27,7 @@ RSpec.describe AddTriggersToIntegrationsTypeNew do describe 'INSERT trigger' do it 'sets `type_new` to the transformed `type` class name' do - Gitlab::Integrations::StiType.namespaced_integrations.each do |type| + namespaced_integrations.each do |type| integration = integrations.create!(type: "#{type}Service") expect(integration.reload).to have_attributes( diff --git a/spec/models/error_tracking/error_spec.rb b/spec/models/error_tracking/error_spec.rb index 739ef1c10d4..5543392b624 100644 --- a/spec/models/error_tracking/error_spec.rb +++ b/spec/models/error_tracking/error_spec.rb @@ -34,6 +34,44 @@ RSpec.describe ErrorTracking::Error, type: :model do end end + describe '.sort_by_attribute' do + let!(:error2) { create(:error_tracking_error, first_seen_at: Time.zone.now - 2.weeks, last_seen_at: Time.zone.now - 1.week) } + let!(:error3) { create(:error_tracking_error, first_seen_at: Time.zone.now - 3.weeks, last_seen_at: Time.zone.now.yesterday) } + let!(:errors) { [error, error2, error3] } + + subject { described_class.where(id: errors).sort_by_attribute(sort) } + + context 'id desc by default' do + let(:sort) { nil } + + it { is_expected.to eq([error3, error2, error]) } + end + + context 'first_seen' do + let(:sort) { 'first_seen' } + + it { is_expected.to eq([error, error2, error3]) } + end + + context 'last_seen' do + let(:sort) { 'last_seen' } + + it { is_expected.to eq([error, error3, error2]) } + end + + context 'frequency' do + let(:sort) { 'frequency' } + + before do + create(:error_tracking_error_event, error: error2) + create(:error_tracking_error_event, error: error2) + create(:error_tracking_error_event, error: error3) + end + + it { is_expected.to eq([error2, error3, error]) } + end + end + describe '#title' do it { expect(error.title).to eq('ActionView::MissingTemplate Missing template posts/edit') } end diff --git a/spec/models/integrations/zentao_spec.rb b/spec/models/integrations/zentao_spec.rb new file mode 100644 index 00000000000..a1503ecc092 --- /dev/null +++ b/spec/models/integrations/zentao_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Integrations::Zentao do + let(:url) { 'https://jihudemo.zentao.net' } + let(:api_url) { 'https://jihudemo.zentao.net' } + let(:api_token) { 'ZENTAO_TOKEN' } + let(:zentao_product_xid) { '3' } + let(:zentao_integration) { create(:zentao_integration) } + + describe '#create' do + let(:project) { create(:project, :repository) } + let(:params) do + { + project: project, + url: url, + api_url: api_url, + api_token: api_token, + zentao_product_xid: zentao_product_xid + } + end + + it 'stores data in data_fields correctly' do + tracker_data = described_class.create!(params).zentao_tracker_data + + expect(tracker_data.url).to eq(url) + expect(tracker_data.api_url).to eq(api_url) + expect(tracker_data.api_token).to eq(api_token) + expect(tracker_data.zentao_product_xid).to eq(zentao_product_xid) + end + end + + describe '#fields' do + it 'returns custom fields' do + expect(zentao_integration.fields.pluck(:name)).to eq(%w[url api_url api_token zentao_product_xid]) + end + end + + describe '#test' do + let(:test_response) { { success: true } } + + before do + allow_next_instance_of(Gitlab::Zentao::Client) do |client| + allow(client).to receive(:ping).and_return(test_response) + end + end + + it 'gets response from Gitlab::Zentao::Client#ping' do + expect(zentao_integration.test).to eq(test_response) + end + end +end diff --git a/spec/models/integrations/zentao_tracker_data_spec.rb b/spec/models/integrations/zentao_tracker_data_spec.rb new file mode 100644 index 00000000000..b078c57830b --- /dev/null +++ b/spec/models/integrations/zentao_tracker_data_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Integrations::ZentaoTrackerData do + describe 'factory available' do + let(:zentao_tracker_data) { create(:zentao_tracker_data) } + + it { expect(zentao_tracker_data.valid?).to eq true } + end + + describe 'associations' do + it { is_expected.to belong_to(:integration) } + end + + describe 'encrypted attributes' do + subject { described_class.encrypted_attributes.keys } + + it { is_expected.to contain_exactly(:url, :api_url, :zentao_product_xid, :api_token) } + end +end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 9a6fd67d6c5..659be6f993d 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -1755,14 +1755,26 @@ RSpec.describe User do end describe '#manageable_groups' do - it 'includes all the namespaces the user can manage' do - expect(user.manageable_groups).to contain_exactly(group, subgroup) + shared_examples 'manageable groups examples' do + it 'includes all the namespaces the user can manage' do + expect(user.manageable_groups).to contain_exactly(group, subgroup) + end + + it 'does not include duplicates if a membership was added for the subgroup' do + subgroup.add_owner(user) + + expect(user.manageable_groups).to contain_exactly(group, subgroup) + end end - it 'does not include duplicates if a membership was added for the subgroup' do - subgroup.add_owner(user) + it_behaves_like 'manageable groups examples' + + context 'when feature flag :linear_user_manageable_groups is disabled' do + before do + stub_feature_flags(linear_user_manageable_groups: false) + end - expect(user.manageable_groups).to contain_exactly(group, subgroup) + it_behaves_like 'manageable groups examples' end end diff --git a/spec/services/projects/create_service_spec.rb b/spec/services/projects/create_service_spec.rb index cd8a56e59c4..9455995c47c 100644 --- a/spec/services/projects/create_service_spec.rb +++ b/spec/services/projects/create_service_spec.rb @@ -601,6 +601,18 @@ RSpec.describe Projects::CreateService, '#execute' do MARKDOWN end end + + context 'and readme_template is specified' do + before do + opts[:readme_template] = "# GitLab\nThis is customized template." + end + + it_behaves_like 'creates README.md' + + it 'creates README.md with specified template' do + expect(project.repository.readme.data).to include('This is customized template.') + end + end end end diff --git a/yarn.lock b/yarn.lock index f3e972a092e..441493f490f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -933,10 +933,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e" integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg== -"@gitlab/eslint-plugin@9.0.3": - version "9.0.3" - resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-9.0.3.tgz#f6e69c3df90d8a5652faa1fa62e7826904b73225" - integrity sha512-Hq0Oa0V0P2OpE9ZTr4a2phW8yDp+F6kaWG7UGjGPwdcuOtiCmdAxowwhxmOvyx0A8kiFcc9pNVWoKofkShKW4A== +"@gitlab/eslint-plugin@9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-9.2.0.tgz#a281883ebe3cd06a88503c590525a191eb78a885" + integrity sha512-iVANLTwn5S4efVUWKX5crLTUChrh3HvAnUrVvLEXTgBw/Aup4t4L5tYLs5YOh5ofw08SUEaaxvAq5ooSqSPqCA== dependencies: babel-eslint "^10.0.3" eslint-config-airbnb-base "^14.2.1" |