diff options
Diffstat (limited to 'app')
47 files changed, 137 insertions, 127 deletions
diff --git a/app/assets/javascripts/ci/runner/components/runner_list_header.vue b/app/assets/javascripts/ci/runner/components/runner_list_header.vue index e4367db035e..6ed271d15ab 100644 --- a/app/assets/javascripts/ci/runner/components/runner_list_header.vue +++ b/app/assets/javascripts/ci/runner/components/runner_list_header.vue @@ -7,7 +7,7 @@ export default { <header class="gl-my-5 gl-display-flex gl-align-items-flex-start gl-flex-wrap gl-justify-content-space-between" > - <h1 v-if="$scopedSlots.title" class="gl-my-0 gl-font-size-h1 header-title"> + <h1 v-if="$scopedSlots.title" class="gl-mt-0 gl-mb-3 gl-font-size-h1 header-title"> <slot name="title"></slot> </h1> <div v-if="$scopedSlots.actions" class="gl-display-flex gl-gap-3"> diff --git a/app/assets/javascripts/ide/components/activity_bar.vue b/app/assets/javascripts/ide/components/activity_bar.vue index 44a94f5fefe..ef808c8218a 100644 --- a/app/assets/javascripts/ide/components/activity_bar.vue +++ b/app/assets/javascripts/ide/components/activity_bar.vue @@ -43,7 +43,6 @@ export default { :aria-label="s__('IDE|Edit')" data-container="body" data-placement="right" - data-qa-selector="edit_mode_tab" data-testid="edit-mode-button" type="button" class="ide-sidebar-link js-ide-edit-mode" @@ -80,7 +79,6 @@ export default { :aria-label="s__('IDE|Commit')" data-container="body" data-placement="right" - data-qa-selector="commit_mode_tab" data-testid="commit-mode-button" type="button" class="ide-sidebar-link js-ide-commit-mode" diff --git a/app/assets/javascripts/ide/components/commit_sidebar/actions.vue b/app/assets/javascripts/ide/components/commit_sidebar/actions.vue index bc8496e359c..8765808cf0c 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/actions.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/actions.vue @@ -78,7 +78,6 @@ export default { :value="$options.commitToCurrentBranch" :disabled="!canPushToBranch" :title="$options.currentBranchPermissionsTooltip" - data-qa-selector="commit_to_current_branch_radio_container" > <span class="ide-option-label"> <gl-sprintf :message="s__('IDE|Commit to %{branchName} branch')"> diff --git a/app/assets/javascripts/ide/components/commit_sidebar/form.vue b/app/assets/javascripts/ide/components/commit_sidebar/form.vue index 281a3054721..708b5d84e5b 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/form.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/form.vue @@ -159,7 +159,6 @@ export default { category="primary" variant="confirm" block - data-qa-selector="begin_commit_button" data-testid="begin-commit-button" @click="beginCommit" > @@ -187,7 +186,6 @@ export default { :disabled="commitButtonDisabled" :loading="submitCommitLoading" data-testid="commit-button" - data-qa-selector="commit_button" category="primary" variant="confirm" type="submit" diff --git a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue index 69d84bcc6aa..5ee28ae58bb 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/list_item.vue @@ -86,11 +86,7 @@ export default { role="button" @click="openFileInEditor" > - <span - class="multi-file-commit-list-file-path d-flex align-items-center" - data-qa-selector="file_to_commit_content" - :data-qa-file-name="file.name" - > + <span class="multi-file-commit-list-file-path d-flex align-items-center"> <file-icon :file-name="file.name" class="gl-mr-3" /> <template v-if="file.prevName && file.prevName !== file.name"> {{ file.prevName }} → diff --git a/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue b/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue index d05aa960f01..372ff9812ac 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/message_field.vue @@ -112,7 +112,6 @@ export default { :placeholder="placeholder" :value="text" class="note-textarea ide-commit-message-textarea" - data-qa-selector="ide_commit_message_field" dir="auto" name="commit-message" @scroll="handleScroll" diff --git a/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue b/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue index 38b71e3da73..0c1faad1573 100644 --- a/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue +++ b/app/assets/javascripts/ide/components/commit_sidebar/radio_group.vue @@ -76,7 +76,6 @@ export default { :value="value" :disabled="disabled" name="commit-action" - data-qa-selector="commit_type_radio" @change="updateCommitAction(value)" > <span v-if="label" class="ide-option-label"> diff --git a/app/assets/javascripts/ide/components/error_message.vue b/app/assets/javascripts/ide/components/error_message.vue index ce3d8f53fd2..0eb781e0ba2 100644 --- a/app/assets/javascripts/ide/components/error_message.vue +++ b/app/assets/javascripts/ide/components/error_message.vue @@ -53,7 +53,6 @@ export default { <template> <gl-alert - data-qa-selector="flash_alert" variant="danger" :dismissible="canDismiss" :primary-button-text="message.actionText" diff --git a/app/assets/javascripts/ide/components/file_templates/bar.vue b/app/assets/javascripts/ide/components/file_templates/bar.vue index 287ebc99662..e24e1468b6c 100644 --- a/app/assets/javascripts/ide/components/file_templates/bar.vue +++ b/app/assets/javascripts/ide/components/file_templates/bar.vue @@ -84,7 +84,6 @@ export default { <div class="gl-display-flex gl-align-items-center ide-file-templates gl-relative gl-z-index-1" data-testid="file-templates-bar" - data-qa-selector="file_templates_container" > <strong class="gl-mr-3"> {{ $options.i18n.barLabel }} </strong> <gl-dropdown @@ -102,12 +101,11 @@ export default { <gl-dropdown v-if="showTemplatesDropdown" class="gl-mr-6" - data-qa-selector="file_template_dropdown" :text="$options.i18n.templateListDropdownLabel" @show="fetchTemplateTypes" > <template #header> - <gl-search-box-by-type v-model.trim="search" data-qa-selector="dropdown_filter_input" /> + <gl-search-box-by-type v-model.trim="search" /> </template> <div> <gl-loading-icon v-if="isLoading" /> diff --git a/app/assets/javascripts/ide/components/ide.vue b/app/assets/javascripts/ide/components/ide.vue index 6cb26643b66..a850d37c4c0 100644 --- a/app/assets/javascripts/ide/components/ide.vue +++ b/app/assets/javascripts/ide/components/ide.vue @@ -186,7 +186,6 @@ export default { category="primary" :title="__('New file')" :aria-label="__('New file')" - data-qa-selector="first_file_button" @click="createNewFile()" > {{ __('New file') }} diff --git a/app/assets/javascripts/ide/components/ide_project_header.vue b/app/assets/javascripts/ide/components/ide_project_header.vue index 3296dc2060c..6e1a4cd8e99 100644 --- a/app/assets/javascripts/ide/components/ide_project_header.vue +++ b/app/assets/javascripts/ide/components/ide_project_header.vue @@ -25,11 +25,7 @@ export default { /> <span class="ide-sidebar-project-title"> <span class="sidebar-context-title"> {{ project.name }} </span> - <span - class="sidebar-context-title text-secondary" - data-qa-selector="project_path_content" - :data-qa-project-path="project.path_with_namespace" - > + <span class="sidebar-context-title text-secondary"> {{ project.path_with_namespace }} </span> </span> diff --git a/app/assets/javascripts/ide/components/ide_sidebar_nav.vue b/app/assets/javascripts/ide/components/ide_sidebar_nav.vue index d8daf3b7ad6..172c622e195 100644 --- a/app/assets/javascripts/ide/components/ide_sidebar_nav.vue +++ b/app/assets/javascripts/ide/components/ide_sidebar_nav.vue @@ -71,7 +71,6 @@ export default { :title="tab.title" :aria-label="tab.title" :class="buttonClasses(tab)" - :data-qa-selector="`${tab.title.toLowerCase()}_tab_button`" class="ide-sidebar-link" type="button" @click="clickTab($event, tab)" diff --git a/app/assets/javascripts/ide/components/ide_status_bar.vue b/app/assets/javascripts/ide/components/ide_status_bar.vue index 984dc9edaf1..e56d8ef109a 100644 --- a/app/assets/javascripts/ide/components/ide_status_bar.vue +++ b/app/assets/javascripts/ide/components/ide_status_bar.vue @@ -106,7 +106,6 @@ export default { :href="getCommitPath(lastCommit.short_id)" class="commit-sha" data-testid="commit-sha-content" - data-qa-selector="commit_sha_content" >{{ lastCommit.short_id }}</a > by diff --git a/app/assets/javascripts/ide/components/ide_tree.vue b/app/assets/javascripts/ide/components/ide_tree.vue index 427b3743961..5999d349ca8 100644 --- a/app/assets/javascripts/ide/components/ide_tree.vue +++ b/app/assets/javascripts/ide/components/ide_tree.vue @@ -61,7 +61,6 @@ export default { :show-label="false" class="gl-display-flex gl-border-0 gl-p-0 gl-mr-5" icon="doc-new" - data-qa-selector="new_file_button" @click="createNewFile()" /> <upload @@ -75,7 +74,6 @@ export default { :show-label="false" class="gl-display-flex gl-border-0 gl-p-0" icon="folder-new" - data-qa-selector="new_directory_button" @click="createNewFolder()" /> </div> diff --git a/app/assets/javascripts/ide/components/ide_tree_list.vue b/app/assets/javascripts/ide/components/ide_tree_list.vue index f2a97e62190..7c3441b8cd0 100644 --- a/app/assets/javascripts/ide/components/ide_tree_list.vue +++ b/app/assets/javascripts/ide/components/ide_tree_list.vue @@ -53,7 +53,7 @@ export default { </script> <template> - <div class="ide-file-list" data-qa-selector="file_list_container"> + <div class="ide-file-list"> <template v-if="showLoading"> <div v-for="n in 3" :key="n" class="multi-file-loading-container"> <gl-skeleton-loader /> diff --git a/app/assets/javascripts/ide/components/new_dropdown/index.vue b/app/assets/javascripts/ide/components/new_dropdown/index.vue index 7cd415169cc..5e71470f383 100644 --- a/app/assets/javascripts/ide/components/new_dropdown/index.vue +++ b/app/assets/javascripts/ide/components/new_dropdown/index.vue @@ -66,7 +66,6 @@ export default { :aria-label="__('Create new file or directory')" type="button" class="rounded border-0 d-flex ide-entry-dropdown-toggle" - data-qa-selector="dropdown_button" @click.stop="openDropdown()" > <gl-icon name="ellipsis_v" /> @@ -100,7 +99,6 @@ export default { class="d-flex" icon="pencil" icon-classes="mr-2" - data-qa-selector="rename_move_button" @click="createNewItem($options.modalTypes.rename)" /> </li> @@ -110,7 +108,6 @@ export default { class="d-flex" icon="remove" icon-classes="mr-2" - data-qa-selector="delete_button" @click="deleteEntry(path)" /> </li> diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue index ba1258f8b50..1e4eca23cb5 100644 --- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue +++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue @@ -157,7 +157,6 @@ export default { <gl-modal ref="modal" modal-id="ide-new-entry" - data-qa-selector="new_file_modal" data-testid="ide-new-entry" :title="modalTitle" size="lg" @@ -179,11 +178,7 @@ export default { :placeholder="placeholder" /> </form> - <ul - v-if="isCreatingNewFile" - class="file-templates gl-mt-3 list-inline" - data-qa-selector="template_list_content" - > + <ul v-if="isCreatingNewFile" class="file-templates gl-mt-3 list-inline"> <li v-for="(template, index) in templateTypes" :key="index" class="list-inline-item"> <gl-button variant="dashed" diff --git a/app/assets/javascripts/ide/components/new_dropdown/upload.vue b/app/assets/javascripts/ide/components/new_dropdown/upload.vue index 9664c5bc597..69cf5c9b252 100644 --- a/app/assets/javascripts/ide/components/new_dropdown/upload.vue +++ b/app/assets/javascripts/ide/components/new_dropdown/upload.vue @@ -82,7 +82,6 @@ export default { type="file" class="hidden" multiple - data-qa-selector="file_upload_field" @change="openFile" /> </li> diff --git a/app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue b/app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue index ce55d88437d..95d38da508e 100644 --- a/app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue +++ b/app/assets/javascripts/ide/components/panes/collapsible_sidebar.vue @@ -74,11 +74,7 @@ export default { </script> <template> - <div - :class="`ide-${side}-sidebar`" - :data-qa-selector="`ide_${side}_sidebar`" - class="multi-file-commit-panel ide-sidebar" - > + <div :class="`ide-${side}-sidebar`" class="multi-file-commit-panel ide-sidebar"> <div v-show="isOpen" :class="`ide-${side}-sidebar-${currentView}`" diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue index 3b59fe86764..8f4f777d396 100644 --- a/app/assets/javascripts/ide/components/repo_editor.vue +++ b/app/assets/javascripts/ide/components/repo_editor.vue @@ -543,7 +543,6 @@ export default { 'is-added': file.tempFile, }" class="multi-file-editor-holder" - data-qa-selector="editor_container" data-testid="editor-container" :data-editor-loading="isEditorLoading" @focusout="triggerFilesChange" diff --git a/app/assets/javascripts/ide/components/shared/commit_message_field.vue b/app/assets/javascripts/ide/components/shared/commit_message_field.vue index 428cf7f55ac..e7725054329 100644 --- a/app/assets/javascripts/ide/components/shared/commit_message_field.vue +++ b/app/assets/javascripts/ide/components/shared/commit_message_field.vue @@ -121,7 +121,6 @@ export default { :placeholder="placeholder" :value="text" class="gl-absolute gl-w-full gl-h-full gl-z-index-2 gl-font-monospace p-0 gl-outline-0 gl-bg-transparent gl-border-0" - data-qa-selector="ide_commit_message_field" dir="auto" name="commit-message" @scroll="handleScroll" diff --git a/app/assets/javascripts/ide/components/terminal/empty_state.vue b/app/assets/javascripts/ide/components/terminal/empty_state.vue index fa93f6d42a5..e7dcf2ca6b6 100644 --- a/app/assets/javascripts/ide/components/terminal/empty_state.vue +++ b/app/assets/javascripts/ide/components/terminal/empty_state.vue @@ -53,13 +53,7 @@ export default { <template v-else> <p>{{ __('Run tests against your code live using the Web Terminal') }}</p> <p> - <gl-button - :disabled="!isValid" - category="primary" - variant="confirm" - data-qa-selector="start_web_terminal_button" - @click="onStart" - > + <gl-button :disabled="!isValid" category="primary" variant="confirm" @click="onStart"> {{ __('Start Web Terminal') }} </gl-button> </p> diff --git a/app/assets/javascripts/ide/components/terminal/terminal.vue b/app/assets/javascripts/ide/components/terminal/terminal.vue index b2e90a64758..b34febe5f1d 100644 --- a/app/assets/javascripts/ide/components/terminal/terminal.vue +++ b/app/assets/javascripts/ide/components/terminal/terminal.vue @@ -95,7 +95,7 @@ export default { <template> <div class="d-flex flex-column flex-fill min-height-0 pr-3"> <div class="top-bar d-flex border-left-0 align-items-center"> - <div v-if="loadingText" data-qa-selector="loading_container"> + <div v-if="loadingText"> <gl-loading-icon size="sm" :inline="true" /> <span>{{ loadingText }}</span> </div> @@ -113,7 +113,6 @@ export default { ref="terminal" class="ide-terminal-trace flex-fill min-height-0 w-100" :data-project-path="terminalPath" - data-qa-selector="terminal_screen" ></div> </div> </div> diff --git a/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue b/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue index ed5ba3c2653..c9c3856423e 100644 --- a/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue +++ b/app/assets/javascripts/pages/projects/shared/permissions/components/ci_catalog_settings.vue @@ -129,7 +129,7 @@ export default { <label class="gl-mb-1 gl-mr-2"> {{ $options.i18n.ciCatalogLabel }} </label> - <gl-badge size="sm" variant="info"> {{ $options.i18n.badgeText }} </gl-badge> + <gl-badge size="sm" variant="neutral"> {{ $options.i18n.badgeText }} </gl-badge> </div> <gl-sprintf :message="$options.i18n.ciCatalogHelpText"> <template #link="{ content }"> diff --git a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue index 2a47e96b2e2..5a807d10f24 100644 --- a/app/assets/javascripts/vue_shared/components/changed_file_icon.vue +++ b/app/assets/javascripts/vue_shared/components/changed_file_icon.vue @@ -82,8 +82,6 @@ export default { :title="tooltipTitle" :class="{ 'ml-auto': isCentered }" class="file-changed-icon d-inline-block" - data-qa-selector="changed_file_icon_content" - :data-qa-title="tooltipTitle" > <gl-icon v-if="showIcon" :name="changedIcon" :size="size" :class="changedIconClass" /> </span> diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue index 1370f7b2a8c..7b9ecc18ce1 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue @@ -54,7 +54,7 @@ export default { </script> <template> - <div class="preview-container" data-qa-selector="preview_container"> + <div class="preview-container"> <image-viewer v-if="type === 'image'" :path="path" :file-size="fileSize" /> <markdown-viewer v-if="type === 'markdown'" diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue index f28a2801bc0..332424c70ac 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/download_viewer.vue @@ -41,14 +41,7 @@ export default { {{ fileName }} <template v-if="fileSize > 0"> ({{ fileSizeReadable }}) </template> </p> - <a - :href="path" - class="btn btn-default" - rel="nofollow" - :download="fileName" - target="_blank" - data-qa-selector="download_button" - > + <a :href="path" class="btn btn-default" rel="nofollow" :download="fileName" target="_blank"> <gl-icon :size="16" name="download" class="float-left gl-mr-3" /> {{ __('Download') }} </a> diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue index 04ab0fd00aa..9742118cd5f 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/image_viewer.vue @@ -88,7 +88,7 @@ export default { </script> <template> - <div data-testid="image-viewer" data-qa-selector="image_viewer_container"> + <div data-testid="image-viewer"> <div :class="innerCssClasses" class="position-relative"> <img ref="contentImg" :src="safePath" @load="onImgLoad" /> <slot diff --git a/app/assets/javascripts/vue_shared/components/file_icon.vue b/app/assets/javascripts/vue_shared/components/file_icon.vue index 6a10557c6bc..4738d0f5a38 100644 --- a/app/assets/javascripts/vue_shared/components/file_icon.vue +++ b/app/assets/javascripts/vue_shared/components/file_icon.vue @@ -90,12 +90,6 @@ export default { <svg v-else-if="!folder" :key="spriteHref" :class="[iconSizeClass, cssClasses]"> <use :href="spriteHref" /> </svg> - <gl-icon - v-else - :name="folderIconName" - :size="size" - class="folder-icon" - data-qa-selector="folder_icon_content" - /> + <gl-icon v-else :name="folderIconName" :size="size" class="folder-icon" /> </span> </template> diff --git a/app/assets/javascripts/vue_shared/components/file_row.vue b/app/assets/javascripts/vue_shared/components/file_row.vue index cecd1be82e9..6ac75230d88 100644 --- a/app/assets/javascripts/vue_shared/components/file_row.vue +++ b/app/assets/javascripts/vue_shared/components/file_row.vue @@ -132,11 +132,7 @@ export default { @click="clickFile" @mouseleave="$emit('mouseleave', $event)" > - <div - class="file-row-name-container" - data-qa-selector="file_row_container" - :data-qa-file-name="file.name" - > + <div class="file-row-name-container"> <span ref="textOutput" class="file-row-name" diff --git a/app/assets/javascripts/vue_shared/components/web_ide/confirm_fork_modal.vue b/app/assets/javascripts/vue_shared/components/web_ide/confirm_fork_modal.vue index b4afb27c497..96b2bd37080 100644 --- a/app/assets/javascripts/vue_shared/components/web_ide/confirm_fork_modal.vue +++ b/app/assets/javascripts/vue_shared/components/web_ide/confirm_fork_modal.vue @@ -82,7 +82,6 @@ export default { attributes: { href: this.forkPath, variant: 'confirm', - 'data-qa-selector': 'fork_project_button', }, }, }; @@ -94,7 +93,6 @@ export default { <template> <gl-modal :visible="visible" - data-qa-selector="confirm_fork_modal" :modal-id="modalId" :title="$options.i18n.title" :action-primary="btnActions.primary" diff --git a/app/controllers/admin/application_settings_controller.rb b/app/controllers/admin/application_settings_controller.rb index 8cf0ab60fd3..b5edecbd6a5 100644 --- a/app/controllers/admin/application_settings_controller.rb +++ b/app/controllers/admin/application_settings_controller.rb @@ -164,10 +164,6 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController params.delete(:domain_denylist_raw) if params[:domain_denylist] params.delete(:domain_allowlist_raw) if params[:domain_allowlist] - if params[:application_setting].key?(:user_email_lookup_limit) - params[:application_setting][:search_rate_limit] ||= params[:application_setting][:user_email_lookup_limit] - end - params[:application_setting].permit(visible_application_setting_attributes) end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 0bb93a68470..284495a1d97 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -19,7 +19,12 @@ module Ci belongs_to :runner belongs_to :trigger_request belongs_to :erased_by, class_name: 'User' - belongs_to :pipeline, class_name: 'Ci::Pipeline', foreign_key: :commit_id, inverse_of: :builds + belongs_to :pipeline, + ->(build) { in_partition(build) }, + class_name: 'Ci::Pipeline', + foreign_key: :commit_id, + partition_foreign_key: :partition_id, + inverse_of: :builds RUNNER_FEATURES = { upload_multiple_artifacts: -> (build) { build.publishes_artifacts_reports? }, diff --git a/app/models/ci/build_metadata.rb b/app/models/ci/build_metadata.rb index 555565ff621..4194be7c0af 100644 --- a/app/models/ci/build_metadata.rb +++ b/app/models/ci/build_metadata.rb @@ -14,9 +14,14 @@ module Ci self.table_name = 'p_ci_builds_metadata' self.primary_key = 'id' + query_constraints :id, :partition_id partitionable scope: :build, partitioned: true - belongs_to :build, class_name: 'CommitStatus' + belongs_to :build, # rubocop: disable Rails/InverseOf -- this relation is not present on CommitStatus + ->(metadata) { in_partition(metadata) }, + partition_foreign_key: :partition_id, + class_name: 'CommitStatus' + belongs_to :project before_create :set_build_project @@ -42,6 +47,10 @@ module Ci job_timeout_source: 4 } + def self.use_partition_id_filter? + Ci::Pipeline.use_partition_id_filter? + end + def update_timeout_state timeout = timeout_with_highest_precedence diff --git a/app/models/ci/catalog/resource.rb b/app/models/ci/catalog/resource.rb index 3ead852e834..8bfef225e05 100644 --- a/app/models/ci/catalog/resource.rb +++ b/app/models/ci/catalog/resource.rb @@ -50,6 +50,11 @@ module Ci save! end + # Triggered in Ci::Catalog::Resources::Version and Release model callbacks. + def update_latest_released_at! + update!(latest_released_at: versions.latest&.released_at) + end + private # These columns are denormalized from the `projects` table. We first sync these diff --git a/app/models/ci/catalog/resources/version.rb b/app/models/ci/catalog/resources/version.rb index bd0ebc77a6d..ab4d5c52526 100644 --- a/app/models/ci/catalog/resources/version.rb +++ b/app/models/ci/catalog/resources/version.rb @@ -28,6 +28,9 @@ module Ci delegate :name, :description, :tag, :sha, :released_at, :author_id, to: :release + after_destroy :update_catalog_resource + after_save :update_catalog_resource + class << self # In the future, we should support semantic versioning. # See https://gitlab.com/gitlab-org/gitlab/-/issues/427286 @@ -110,6 +113,12 @@ module Ci end end end + + private + + def update_catalog_resource + catalog_resource.update_latest_released_at! + end end end end diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 54aa3d78cf3..faa79f8f49c 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -80,31 +80,31 @@ module Ci # Ci:Job models. With that epic, we aim to replace `statuses` with `jobs`. # # DEPRECATED: - has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :processables, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline - has_many :latest_statuses_ordered_by_stage, -> { latest.order(:stage_idx, :stage) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :latest_statuses, -> { latest }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :statuses_order_id_desc, -> { order_id_desc }, class_name: 'CommitStatus', foreign_key: :commit_id, - inverse_of: :pipeline - has_many :bridges, class_name: 'Ci::Bridge', foreign_key: :commit_id, inverse_of: :pipeline - has_many :builds, foreign_key: :commit_id, inverse_of: :pipeline - has_many :generic_commit_statuses, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'GenericCommitStatus' + has_many :statuses, ->(pipeline) { in_partition(pipeline) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :processables, ->(pipeline) { in_partition(pipeline) }, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :latest_statuses_ordered_by_stage, -> (pipeline) { latest.in_partition(pipeline).order(:stage_idx, :stage) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :latest_statuses, ->(pipeline) { latest.in_partition(pipeline) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :statuses_order_id_desc, ->(pipeline) { in_partition(pipeline).order_id_desc }, class_name: 'CommitStatus', foreign_key: :commit_id, + inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :bridges, ->(pipeline) { in_partition(pipeline) }, class_name: 'Ci::Bridge', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :builds, ->(pipeline) { in_partition(pipeline) }, foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :generic_commit_statuses, ->(pipeline) { in_partition(pipeline) }, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'GenericCommitStatus', partition_foreign_key: :partition_id # # NEW: - has_many :all_jobs, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :current_jobs, -> { latest }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :all_processable_jobs, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline - has_many :current_processable_jobs, -> { latest }, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline + has_many :all_jobs, ->(pipeline) { in_partition(pipeline) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :current_jobs, ->(pipeline) { latest.in_partition(pipeline) }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :all_processable_jobs, ->(pipeline) { in_partition(pipeline) }, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id + has_many :current_processable_jobs, ->(pipeline) { latest.in_partition(pipeline) }, class_name: 'Ci::Processable', foreign_key: :commit_id, inverse_of: :pipeline, partition_foreign_key: :partition_id has_many :job_artifacts, through: :builds has_many :build_trace_chunks, class_name: 'Ci::BuildTraceChunk', through: :builds, source: :trace_chunks has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id, inverse_of: :pipeline # rubocop:disable Cop/ActiveRecordDependent has_many :variables, class_name: 'Ci::PipelineVariable' - has_many :latest_builds, -> { latest.with_project_and_metadata }, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'Ci::Build' + has_many :latest_builds, ->(pipeline) { in_partition(pipeline).latest.with_project_and_metadata }, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'Ci::Build' has_many :downloadable_artifacts, -> do not_expired.or(where_exists(Ci::Pipeline.artifacts_locked.where("#{Ci::Pipeline.quoted_table_name}.id = #{Ci::Build.quoted_table_name}.commit_id"))).downloadable.with_job end, through: :latest_builds, source: :job_artifacts - has_many :latest_successful_jobs, -> { latest.success.with_project_and_metadata }, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'Ci::Processable' + has_many :latest_successful_jobs, ->(pipeline) { in_partition(pipeline).latest.success.with_project_and_metadata }, foreign_key: :commit_id, inverse_of: :pipeline, class_name: 'Ci::Processable' has_many :messages, class_name: 'Ci::PipelineMessage', inverse_of: :pipeline @@ -113,14 +113,14 @@ module Ci has_many :merge_requests_as_head_pipeline, foreign_key: :head_pipeline_id, class_name: 'MergeRequest', inverse_of: :head_pipeline - has_many :pending_builds, -> { pending }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline - has_many :failed_builds, -> { latest.failed }, foreign_key: :commit_id, class_name: 'Ci::Build', + has_many :pending_builds, ->(pipeline) { in_partition(pipeline).pending }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline + has_many :failed_builds, ->(pipeline) { in_partition(pipeline).latest.failed }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline - has_many :retryable_builds, -> { latest.failed_or_canceled.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline - has_many :cancelable_statuses, -> { cancelable }, foreign_key: :commit_id, class_name: 'CommitStatus', + has_many :retryable_builds, ->(pipeline) { in_partition(pipeline).latest.failed_or_canceled.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline + has_many :cancelable_statuses, ->(pipeline) { in_partition(pipeline).cancelable }, foreign_key: :commit_id, class_name: 'CommitStatus', inverse_of: :pipeline - has_many :manual_actions, -> { latest.manual_actions.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Processable', inverse_of: :pipeline - has_many :scheduled_actions, -> { latest.scheduled_actions.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline + has_many :manual_actions, ->(pipeline) { in_partition(pipeline).latest.manual_actions.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Processable', inverse_of: :pipeline + has_many :scheduled_actions, ->(pipeline) { in_partition(pipeline).latest.scheduled_actions.includes(:project) }, foreign_key: :commit_id, class_name: 'Ci::Build', inverse_of: :pipeline has_many :auto_canceled_pipelines, class_name: 'Ci::Pipeline', foreign_key: :auto_canceled_by_id, inverse_of: :auto_canceled_by @@ -605,6 +605,12 @@ module Ci ::Gitlab::Ci::PipelineObjectHierarchy.new(relation, options: options) end + def self.use_partition_id_filter? + ::Gitlab::SafeRequestStore.fetch(:ci_builds_partition_id_query_filter) do + ::Feature.enabled?(:ci_builds_partition_id_query_filter) + end + end + def uses_needs? processables.where(scheduling_type: :dag).any? end diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index 3d2df9a45ef..e413ed8a668 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -21,19 +21,45 @@ module Ci belongs_to :project belongs_to :pipeline - has_many :statuses, class_name: 'CommitStatus', foreign_key: :stage_id, inverse_of: :ci_stage - has_many :latest_statuses, -> { ordered.latest }, + has_many :statuses, + ->(stage) { in_partition(stage) }, class_name: 'CommitStatus', foreign_key: :stage_id, + partition_foreign_key: :partition_id, inverse_of: :ci_stage - has_many :retried_statuses, -> { ordered.retried }, + has_many :latest_statuses, + ->(stage) { in_partition(stage).ordered.latest }, class_name: 'CommitStatus', foreign_key: :stage_id, + partition_foreign_key: :partition_id, + inverse_of: :ci_stage + has_many :retried_statuses, + ->(stage) { in_partition(stage).ordered.retried }, + class_name: 'CommitStatus', + foreign_key: :stage_id, + partition_foreign_key: :partition_id, + inverse_of: :ci_stage + has_many :processables, + ->(stage) { in_partition(stage) }, + class_name: 'Ci::Processable', + foreign_key: :stage_id, + partition_foreign_key: :partition_id, + inverse_of: :ci_stage + has_many :builds, + ->(stage) { in_partition(stage) }, + foreign_key: :stage_id, + partition_foreign_key: :partition_id, + inverse_of: :ci_stage + has_many :bridges, + ->(stage) { in_partition(stage) }, + foreign_key: :stage_id, + partition_foreign_key: :partition_id, + inverse_of: :ci_stage + has_many :generic_commit_statuses, + ->(stage) { in_partition(stage) }, + foreign_key: :stage_id, + partition_foreign_key: :partition_id, inverse_of: :ci_stage - has_many :processables, class_name: 'Ci::Processable', foreign_key: :stage_id, inverse_of: :ci_stage - has_many :builds, foreign_key: :stage_id, inverse_of: :ci_stage - has_many :bridges, foreign_key: :stage_id, inverse_of: :ci_stage - has_many :generic_commit_statuses, foreign_key: :stage_id, inverse_of: :ci_stage scope :ordered, -> { order(position: :asc) } scope :in_pipelines, ->(pipelines) { where(pipeline: pipelines) } @@ -107,6 +133,10 @@ module Ci end end + def self.use_partition_id_filter? + Ci::Pipeline.use_partition_id_filter? + end + def set_status(new_status) retry_optimistic_lock(self, name: 'ci_stage_set_status') do case new_status diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 9f77bd8ebe2..a8e2615b327 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -25,11 +25,12 @@ class CommitStatus < Ci::ApplicationRecord self.sequence_name = :ci_builds_id_seq self.primary_key = :id + query_constraints :id, :partition_id partitionable scope: :pipeline, partitioned: true belongs_to :user belongs_to :project - belongs_to :pipeline, class_name: 'Ci::Pipeline', foreign_key: :commit_id, inverse_of: :statuses + belongs_to :pipeline, ->(build) { in_partition(build) }, class_name: 'Ci::Pipeline', foreign_key: :commit_id, inverse_of: :statuses, partition_foreign_key: :partition_id belongs_to :auto_canceled_by, class_name: 'Ci::Pipeline', inverse_of: :auto_canceled_jobs belongs_to :ci_stage, class_name: 'Ci::Stage', foreign_key: :stage_id @@ -233,6 +234,10 @@ class CommitStatus < Ci::ApplicationRecord false end + def self.use_partition_id_filter? + Ci::Pipeline.use_partition_id_filter? + end + def locking_enabled? will_save_change_to_status? end diff --git a/app/models/concerns/ci/metadatable.rb b/app/models/concerns/ci/metadatable.rb index b785e39523d..5dcae7d594d 100644 --- a/app/models/concerns/ci/metadatable.rb +++ b/app/models/concerns/ci/metadatable.rb @@ -10,8 +10,10 @@ module Ci included do has_one :metadata, + ->(build) { where(partition_id: build.partition_id) }, class_name: 'Ci::BuildMetadata', foreign_key: :build_id, + partition_foreign_key: :partition_id, inverse_of: :build, autosave: true diff --git a/app/models/concerns/ci/partitionable.rb b/app/models/concerns/ci/partitionable.rb index aaf07bfee3a..447603c1635 100644 --- a/app/models/concerns/ci/partitionable.rb +++ b/app/models/concerns/ci/partitionable.rb @@ -61,6 +61,10 @@ module Ci before_validation :set_partition_id, on: :create validates :partition_id, presence: true + scope :in_partition, ->(id) do + where(partition_id: (id.respond_to?(:partition_id) ? id.partition_id : id)) + end + def set_partition_id return if partition_id_changed? && partition_id.present? return unless partition_scope_value diff --git a/app/models/release.rb b/app/models/release.rb index 6830f6e8480..f8a7973e451 100644 --- a/app/models/release.rb +++ b/app/models/release.rb @@ -25,6 +25,9 @@ class Release < ApplicationRecord accepts_nested_attributes_for :links, allow_destroy: true before_create :set_released_at + # TODO: Remove this callback after catalog_resource.released_at is denormalized. See https://gitlab.com/gitlab-org/gitlab/-/issues/430117. + after_update :update_catalog_resource, if: -> { project.catalog_resource && saved_change_to_released_at? } + after_destroy :update_catalog_resource, if: -> { project.catalog_resource } validates :project, :tag, presence: true validates :author_id, presence: true, on: :create @@ -168,6 +171,10 @@ class Release < ApplicationRecord order_created_desc end end + + def update_catalog_resource + project.catalog_resource.update_latest_released_at! + end end Release.prepend_mod_with('Release') diff --git a/app/services/packages/debian/extract_metadata_service.rb b/app/services/packages/debian/extract_metadata_service.rb index cc9defd2e73..91a4a0d67c8 100644 --- a/app/services/packages/debian/extract_metadata_service.rb +++ b/app/services/packages/debian/extract_metadata_service.rb @@ -26,9 +26,7 @@ module Packages attr_reader :package_file def valid_package_file? - package_file && - package_file.package&.debian? && - package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate + package_file && package_file.package&.debian? && !package_file.file.empty_size? end def file_type_basic diff --git a/app/services/packages/helm/extract_file_metadata_service.rb b/app/services/packages/helm/extract_file_metadata_service.rb index 77efa65f1d1..5cd1acc57dd 100644 --- a/app/services/packages/helm/extract_file_metadata_service.rb +++ b/app/services/packages/helm/extract_file_metadata_service.rb @@ -24,9 +24,7 @@ module Packages private def valid_package_file? - @package_file && - @package_file.package&.helm? && - @package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate + @package_file && @package_file.package&.helm? && !@package_file.file.empty_size? end def metadata diff --git a/app/services/packages/nuget/process_package_file_service.rb b/app/services/packages/nuget/process_package_file_service.rb index 99b59bd3322..acec926dc48 100644 --- a/app/services/packages/nuget/process_package_file_service.rb +++ b/app/services/packages/nuget/process_package_file_service.rb @@ -22,9 +22,7 @@ module Packages attr_reader :package_file def valid_package_file? - package_file && - package_file.package&.nuget? && - package_file.file.size > 0 # rubocop:disable Style/ZeroLengthPredicate + package_file && package_file.package&.nuget? && !package_file.file.empty_size? end def with_zip_file(&block) diff --git a/app/services/quick_actions/interpret_service.rb b/app/services/quick_actions/interpret_service.rb index b5f6bff756b..250a4046cce 100644 --- a/app/services/quick_actions/interpret_service.rb +++ b/app/services/quick_actions/interpret_service.rb @@ -42,7 +42,7 @@ module QuickActions @updates = {} @execution_message = {} - content, commands = extractor.extract_commands(content, only: only) + content, commands = extractor.extract_commands(content, only: only, target: quick_action_target) extract_updates(commands) [content, @updates, execution_messages_for(commands), command_names(commands)] @@ -56,7 +56,7 @@ module QuickActions @quick_action_target = quick_action_target - content, commands = extractor(keep_actions).extract_commands(content) + content, commands = extractor(keep_actions).extract_commands(content, target: quick_action_target) commands = explain_commands(commands) [content, commands] end diff --git a/app/uploaders/gitlab_uploader.rb b/app/uploaders/gitlab_uploader.rb index c1ca535b336..6e8906645d8 100644 --- a/app/uploaders/gitlab_uploader.rb +++ b/app/uploaders/gitlab_uploader.rb @@ -76,6 +76,10 @@ class GitlabUploader < CarrierWave::Uploader::Base file.present? end + def empty_size? + size == 0 + end + def cache_dir File.join(root, base_dir, 'tmp/cache') end |