From bd746eebdc82ea3731b38cd903a999569ff3b8be Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 27 Oct 2022 18:11:02 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .gitlab/CODEOWNERS | 2 +- .../Pipeline Configuration.md | 4 +- app/assets/javascripts/blob_edit/edit_blob.js | 53 +- .../source_editor_markdown_livepreview_ext.js | 58 +- .../components/invite_members_modal.vue | 36 +- .../components/invite_modal_base.vue | 164 ++-- .../components/user_limit_notification.vue | 105 ++- app/assets/javascripts/invite_members/constants.js | 16 +- .../projects/compare/components/app.vue | 4 +- danger/pipeline/Dangerfile | 2 +- doc/ci/runners/saas/linux_saas_runner.md | 2 +- doc/development/chatops_on_gitlabcom.md | 2 +- doc/development/cicd/index.md | 2 +- doc/development/cicd/templates.md | 2 +- .../documentation/site_architecture/global_nav.md | 2 +- doc/development/documentation/styleguide/index.md | 25 +- .../documentation/styleguide/word_list.md | 16 +- doc/development/documentation/topic_types/task.md | 9 + doc/development/ee_features.md | 2 +- .../fe_guide/merge_request_widget_extensions.md | 2 +- doc/development/fe_guide/vuex.md | 2 +- doc/development/graphql_guide/pagination.md | 2 +- doc/development/i18n/merging_translations.md | 2 +- doc/development/i18n/proofreader.md | 1 + doc/development/integrations/jira_connect.md | 2 +- .../integrations/secure_partner_integration.md | 2 +- doc/development/performance.md | 2 +- doc/development/pipelines.md | 882 +-------------------- doc/development/pipelines/index.md | 530 +++++++++++++ doc/development/pipelines/internals.md | 216 +++++ doc/development/pipelines/performance.md | 151 ++++ doc/development/testing_guide/best_practices.md | 2 +- doc/development/testing_guide/flaky_tests.md | 2 +- doc/development/testing_guide/review_apps.md | 2 +- .../autodevops/multiple_clusters_auto_devops.md | 2 +- doc/user/clusters/agent/ci_cd_workflow.md | 38 +- doc/user/clusters/agent/index.md | 5 +- lib/api/search.rb | 6 +- lib/gitlab/database/migration_helpers.rb | 320 +------- .../database/migrations/constraints_helpers.rb | 337 ++++++++ lib/gitlab/metrics/global_search_slis.rb | 10 +- locale/gitlab.pot | 45 +- qa/qa/page/component/issuable/sidebar.rb | 74 ++ qa/qa/resource/merge_request.rb | 13 +- .../gitaly/automatic_failover_and_recovery_spec.rb | 2 +- .../gitaly/backend_node_recovery_spec.rb | 2 +- .../gitaly/changing_repository_storage_spec.rb | 2 +- .../12_systems/gitaly/distributed_reads_spec.rb | 2 +- .../api/12_systems/gitaly/gitaly_mtls_spec.rb | 2 +- .../gitaly/praefect_connectivity_spec.rb | 2 +- .../12_systems/gitaly/praefect_dataloss_spec.rb | 2 +- .../gitaly/praefect_replication_queue_spec.rb | 2 +- .../12_systems/gitaly/praefect_repo_sync_spec.rb | 2 +- .../1_manage/migration/gitlab_migration_mr_spec.rb | 63 +- scripts/generate-failed-pipeline-slack-message.rb | 6 +- spec/features/admin/admin_dev_ops_reports_spec.rb | 4 +- spec/frontend/blob_edit/edit_blob_spec.js | 48 ++ .../source_editor_markdown_livepreview_ext_spec.js | 9 + .../components/invite_members_modal_spec.js | 76 +- .../components/invite_modal_base_spec.js | 57 +- .../components/user_limit_notification_spec.js | 60 +- .../invite_members/mock_data/member_modal.js | 2 +- spec/lib/gitlab/database/migration_helpers_spec.rb | 662 ---------------- .../migrations/constraints_helpers_spec.rb | 679 ++++++++++++++++ spec/lib/gitlab/metrics/global_search_slis_spec.rb | 8 +- spec/requests/api/search_spec.rb | 64 +- 66 files changed, 2569 insertions(+), 2343 deletions(-) create mode 100644 doc/development/pipelines/index.md create mode 100644 doc/development/pipelines/internals.md create mode 100644 doc/development/pipelines/performance.md create mode 100644 lib/gitlab/database/migrations/constraints_helpers.rb create mode 100644 spec/lib/gitlab/database/migrations/constraints_helpers_spec.rb diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS index b6463bca8cf..8cb2574791b 100644 --- a/.gitlab/CODEOWNERS +++ b/.gitlab/CODEOWNERS @@ -2,7 +2,7 @@ # project here: https://gitlab.com/gitlab-org/gitlab/-/project_members # As described in https://docs.gitlab.com/ee/user/project/code_owners.html -* @gitlab-org/maintainers/rails-backend @gitlab-org/maintainers/frontend @gitlab-org/maintainers/database @gl-quality/qe-maintainers @gitlab-org/delivery @gitlab-org/maintainers/cicd-templates @kwiebers @nolith @jacobvosmaer-gitlab @gitlab-org/tw-leadership +* @gitlab-org/maintainers/rails-backend @gitlab-org/maintainers/frontend @gitlab-org/maintainers/database @gl-quality/qe-maintainers @gitlab-org/delivery @gitlab-org/maintainers/cicd-templates @nolith @jacobvosmaer-gitlab @gitlab-org/tw-leadership CODEOWNERS @gitlab-org/development-leaders @gitlab-org/tw-leadership docs/CODEOWNERS @gitlab-org/development-leaders @gitlab-org/tw-leadership diff --git a/.gitlab/merge_request_templates/Pipeline Configuration.md b/.gitlab/merge_request_templates/Pipeline Configuration.md index 336988d8bdf..255cb787d64 100644 --- a/.gitlab/merge_request_templates/Pipeline Configuration.md +++ b/.gitlab/merge_request_templates/Pipeline Configuration.md @@ -1,4 +1,4 @@ - + ## What does this MR do? @@ -15,7 +15,7 @@ Consider the effect of the changes in this merge request on the following: -- [ ] Different [pipeline types](https://docs.gitlab.com/ee/development/pipelines.html#pipelines-for-merge-requests) +- [ ] Different [pipeline types](https://docs.gitlab.com/ee/development/pipelines/index.html#pipelines-types-for-merge-requests) - Non-canonical projects: - [ ] `gitlab-foss` - [ ] `security` diff --git a/app/assets/javascripts/blob_edit/edit_blob.js b/app/assets/javascripts/blob_edit/edit_blob.js index 78e3f934183..97d8b206307 100644 --- a/app/assets/javascripts/blob_edit/edit_blob.js +++ b/app/assets/javascripts/blob_edit/edit_blob.js @@ -16,8 +16,10 @@ export default class EditBlob { constructor(options) { this.options = options; this.configureMonacoEditor(); + this.isMarkdown = this.options.isMarkdown; + this.markdownLivePreviewOpened = false; - if (this.options.isMarkdown) { + if (this.isMarkdown) { this.fetchMarkdownExtension(); } @@ -104,6 +106,13 @@ export default class EditBlob { this.$editModeLinks.on('click', (e) => this.editModeLinkClickHandler(e)); } + toggleMarkdownPreview(toOpen) { + if (toOpen !== this.markdownLivePreviewOpened) { + this.editor.markdownPreview?.eventEmitter.fire(); + this.markdownLivePreviewOpened = !this.markdownLivePreviewOpened; + } + } + editModeLinkClickHandler(e) { e.preventDefault(); @@ -115,25 +124,29 @@ export default class EditBlob { currentLink.parent().addClass('active hover'); - this.$editModePanes.hide(); - - currentPane.show(); - - if (paneId === '#preview') { - this.$toggleButton.hide(); - axios - .post(currentLink.data('previewUrl'), { - content: this.editor.getValue(), - }) - .then(({ data }) => { - currentPane.empty().append(data); - currentPane.renderGFM(); - }) - .catch(() => - createAlert({ - message: BLOB_PREVIEW_ERROR, - }), - ); + if (this.isMarkdown) { + this.toggleMarkdownPreview(paneId === '#preview'); + } else { + this.$editModePanes.hide(); + + currentPane.show(); + + if (paneId === '#preview') { + this.$toggleButton.hide(); + axios + .post(currentLink.data('previewUrl'), { + content: this.editor.getValue(), + }) + .then(({ data }) => { + currentPane.empty().append(data); + currentPane.renderGFM(); + }) + .catch(() => + createAlert({ + message: BLOB_PREVIEW_ERROR, + }), + ); + } } this.$toggleButton.show(); diff --git a/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js b/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js index 999e91eed19..dd4a7a689d7 100644 --- a/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js +++ b/app/assets/javascripts/editor/extensions/source_editor_markdown_livepreview_ext.js @@ -1,4 +1,4 @@ -import { KeyMod, KeyCode } from 'monaco-editor'; +import { KeyMod, KeyCode, Emitter } from 'monaco-editor'; import { debounce } from 'lodash'; import { BLOB_PREVIEW_ERROR } from '~/blob_edit/constants'; import { createAlert } from '~/flash'; @@ -56,6 +56,7 @@ export class EditorMarkdownPreviewExtension { layoutChangeListener: undefined, path: setupOptions.previewMarkdownPath, actionShowPreviewCondition: instance.createContextKey('toggleLivePreview', true), + eventEmitter: new Emitter(), }; this.toolbarButtons = []; @@ -71,6 +72,8 @@ export class EditorMarkdownPreviewExtension { EditorMarkdownPreviewExtension.resizePreviewLayout(instance, newWidth); } }); + + this.preview.eventEmitter.event(this.togglePreview.bind(this, instance)); } onBeforeUnuse(instance) { @@ -187,6 +190,31 @@ export class EditorMarkdownPreviewExtension { }); } + togglePreview(instance) { + if (!this.preview?.el) { + this.preview.el = setupDomElement({ injectToEl: instance.getDomNode().parentElement }); + } + this.togglePreviewLayout(instance); + this.togglePreviewPanel(instance); + + this.preview.actionShowPreviewCondition.set(!this.preview.actionShowPreviewCondition.get()); + + if (!this.preview?.shown) { + this.preview.modelChangeListener = instance.onDidChangeModelContent( + debounce(this.fetchPreview.bind(this, instance), EXTENSION_MARKDOWN_PREVIEW_UPDATE_DELAY), + ); + } else { + this.preview.modelChangeListener.dispose(); + } + + this.preview.shown = !this.preview?.shown; + if (instance.toolbar) { + instance.toolbar.updateItem(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID, { + selected: this.preview.shown, + }); + } + } + provides() { return { markdownPreview: this.preview, @@ -195,33 +223,7 @@ export class EditorMarkdownPreviewExtension { setupPreviewAction: (instance) => this.setupPreviewAction(instance), - togglePreview: (instance) => { - if (!this.preview?.el) { - this.preview.el = setupDomElement({ injectToEl: instance.getDomNode().parentElement }); - } - this.togglePreviewLayout(instance); - this.togglePreviewPanel(instance); - - this.preview.actionShowPreviewCondition.set(!this.preview.actionShowPreviewCondition.get()); - - if (!this.preview?.shown) { - this.preview.modelChangeListener = instance.onDidChangeModelContent( - debounce( - this.fetchPreview.bind(this, instance), - EXTENSION_MARKDOWN_PREVIEW_UPDATE_DELAY, - ), - ); - } else { - this.preview.modelChangeListener.dispose(); - } - - this.preview.shown = !this.preview?.shown; - if (instance.toolbar) { - instance.toolbar.updateItem(EXTENSION_MARKDOWN_PREVIEW_ACTION_ID, { - selected: this.preview.shown, - }); - } - }, + togglePreview: (instance) => this.togglePreview(instance), }; } } diff --git a/app/assets/javascripts/invite_members/components/invite_members_modal.vue b/app/assets/javascripts/invite_members/components/invite_members_modal.vue index a334f5e4bf7..f61e822bf7e 100644 --- a/app/assets/javascripts/invite_members/components/invite_members_modal.vue +++ b/app/assets/javascripts/invite_members/components/invite_members_modal.vue @@ -18,7 +18,8 @@ import { BV_SHOW_MODAL, BV_HIDE_MODAL } from '~/lib/utils/constants'; import { getParameterValues } from '~/lib/utils/url_utility'; import { n__, sprintf } from '~/locale'; import { - CLOSE_TO_LIMIT_COUNT, + CLOSE_TO_LIMIT_VARIANT, + REACHED_LIMIT_VARIANT, USERS_FILTER_ALL, INVITE_MEMBERS_FOR_TASK, MEMBER_MODAL_LABELS, @@ -174,27 +175,11 @@ export default { isOnLearnGitlab() { return this.source === LEARN_GITLAB; }, - closeToLimit() { - if (this.usersLimitDataset.freeUsersLimit && this.usersLimitDataset.membersCount) { - return ( - this.usersLimitDataset.membersCount >= - this.usersLimitDataset.freeUsersLimit - CLOSE_TO_LIMIT_COUNT - ); - } - - return false; - }, - reachedLimit() { - if (this.usersLimitDataset.freeUsersLimit && this.usersLimitDataset.membersCount) { - return this.usersLimitDataset.membersCount >= this.usersLimitDataset.freeUsersLimit; - } - - return false; + showUserLimitNotification() { + return this.usersLimitDataset.reachedLimit || this.usersLimitDataset.closeToDashboardLimit; }, - formGroupDescription() { - return this.reachedLimit - ? this.$options.labels.placeHolderDisabled - : this.$options.labels.placeHolder; + limitVariant() { + return this.usersLimitDataset.reachedLimit ? REACHED_LIMIT_VARIANT : CLOSE_TO_LIMIT_VARIANT; }, errorList() { return Object.entries(this.invalidMembers).map(([member, error]) => { @@ -385,13 +370,11 @@ export default { :help-link="helpLink" :label-intro-text="labelIntroText" :label-search-field="$options.labels.searchField" - :form-group-description="formGroupDescription" + :form-group-description="$options.labels.placeHolder" :invalid-feedback-message="invalidFeedbackMessage" :is-loading="isLoading" :new-users-to-invite="newUsersToInvite" :root-group-id="rootId" - :close-to-limit="closeToLimit" - :reached-limit="reachedLimit" :users-limit-dataset="usersLimitDataset" @reset="resetFields" @submit="sendInvite" @@ -448,9 +431,8 @@ export default { diff --git a/app/assets/javascripts/invite_members/components/invite_modal_base.vue b/app/assets/javascripts/invite_members/components/invite_modal_base.vue index f917ebc35c2..e3511a49fc5 100644 --- a/app/assets/javascripts/invite_members/components/invite_modal_base.vue +++ b/app/assets/javascripts/invite_members/components/invite_modal_base.vue @@ -8,7 +8,6 @@ import { GlLink, GlSprintf, GlFormInput, - GlIcon, } from '@gitlab/ui'; import Tracking from '~/tracking'; import { sprintf } from '~/locale'; @@ -20,11 +19,8 @@ import { INVITE_BUTTON_TEXT, INVITE_BUTTON_TEXT_DISABLED, CANCEL_BUTTON_TEXT, - CANCEL_BUTTON_TEXT_DISABLED, HEADER_CLOSE_LABEL, ON_SHOW_TRACK_LABEL, - ON_CLOSE_TRACK_LABEL, - ON_SUBMIT_TRACK_LABEL, } from '../constants'; const DEFAULT_SLOT = 'default'; @@ -48,7 +44,6 @@ export default { GlDropdownItem, GlSprintf, GlFormInput, - GlIcon, ContentTransition, }, mixins: [Tracking.mixin()], @@ -131,16 +126,6 @@ export default { required: false, default: false, }, - closeToLimit: { - type: Boolean, - required: false, - default: false, - }, - reachedLimit: { - type: Boolean, - required: false, - default: false, - }, usersLimitDataset: { type: Object, required: false, @@ -175,20 +160,17 @@ export default { }, actionPrimary() { return { - text: this.reachedLimit ? INVITE_BUTTON_TEXT_DISABLED : this.submitButtonText, + text: this.submitButtonText, attributes: { variant: 'confirm', - disabled: this.reachedLimit ? false : this.submitDisabled, - loading: this.reachedLimit ? false : this.isLoading, + disabled: this.submitDisabled, + loading: this.isLoading, 'data-qa-selector': 'invite_button', - ...(this.reachedLimit && { href: this.usersLimitDataset.membersPath }), }, }; }, actionCancel() { - if (this.reachedLimit && this.usersLimitDataset.userNamespace) return undefined; - - if (this.closeToLimit && this.usersLimitDataset.userNamespace) { + if (this.usersLimitDataset.closeToDashboardLimit && this.usersLimitDataset.userNamespace) { return { text: INVITE_BUTTON_TEXT_DISABLED, attributes: { @@ -200,13 +182,9 @@ export default { } return { - text: this.reachedLimit ? CANCEL_BUTTON_TEXT_DISABLED : this.cancelButtonText, - ...(this.reachedLimit && { attributes: { href: this.usersLimitDataset.purchasePath } }), + text: this.cancelButtonText, }; }, - selectLabelClass() { - return `col-form-label ${this.reachedLimit ? 'gl-text-gray-500' : ''}`; - }, }, watch: { selectedAccessLevel: { @@ -226,23 +204,19 @@ export default { this.$emit('reset'); }, onShowModal() { - if (this.reachedLimit) { + if (this.usersLimitDataset.reachedLimit) { this.track('render', { category: 'default', label: ON_SHOW_TRACK_LABEL }); } }, onCloseModal(e) { - if (this.preventCancelDefault || this.reachedLimit) { + if (this.preventCancelDefault) { e.preventDefault(); } else { this.onReset(); this.$refs.modal.hide(); } - if (this.reachedLimit) { - this.track('click_button', { category: 'default', label: ON_CLOSE_TRACK_LABEL }); - } else { - this.$emit('cancel'); - } + this.$emit('cancel'); }, changeSelectedItem(item) { this.selectedAccessLevel = item; @@ -251,14 +225,10 @@ export default { // We never want to hide when submitting e.preventDefault(); - if (this.reachedLimit) { - this.track('click_button', { category: 'default', label: ON_SUBMIT_TRACK_LABEL }); - } else { - this.$emit('submit', { - accessLevel: this.selectedAccessLevel, - expiresAt: this.selectedDate, - }); - } + this.$emit('submit', { + accessLevel: this.selectedAccessLevel, + expiresAt: this.selectedDate, + }); }, }, HEADER_CLOSE_LABEL, @@ -311,71 +281,63 @@ export default { - - - - - + + - + +
+ + + +
+