From 218585fc850159e0cf7fa4b609f0837cb5f29599 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 16 Jan 2024 12:08:54 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../release-environments/main.gitlab-ci.yml | 20 ++ .../components/import_actions_cell.vue | 128 +++++++++--- .../import_groups/components/import_table.vue | 40 +++- .../import_entities/import_groups/utils.js | 4 + ...ere_user_can_import_projects.query.graphql | 1 + .../javascripts/pages/projects/index.js | 3 + .../commit_box/info/components/refs_list.vue | 2 +- app/assets/javascripts/read_more.js | 20 ++ .../bootstrap_migration_components.scss | 4 + .../stylesheets/framework/read_more.scss | 42 +++- app/models/ci/catalog/resource.rb | 2 + app/views/projects/_sidebar.html.haml | 9 +- .../{gitlab_http.rb => 7_gitlab_http.rb} | 0 ...verification_level_to_catalog_resources.rb | 9 + ...15112056_add_index_on_pipeline_metadata.rb | 17 ++ db/schema_migrations/20231221181908 | 1 + db/schema_migrations/20240115112056 | 1 + db/structure.sql | 5 +- doc/api/graphql/reference/index.md | 10 + doc/development/ai_features/index.md | 2 +- doc/integration/oauth_provider.md | 2 +- doc/user/ai_features.md | 1 + doc/user/analytics/index.md | 4 +- doc/user/custom_roles.md | 4 +- doc/user/custom_roles/abilities.md | 8 +- doc/user/group/import/index.md | 10 +- doc/user/project/insights/index.md | 2 +- doc/user/ssh.md | 11 +- lib/gitlab/redis/wrapper.rb | 38 +++- locale/gitlab.pot | 24 +++ .../repository/protected_tags_spec.rb | 6 +- ...redis_config_with_extra_config_command.yml | 4 + .../components/import_actions_cell_spec.js | 193 ++++++++++-------- .../components/import_table_spec.js | 45 ++++ .../import_groups/graphql/fixtures.js | 7 +- .../import_groups/utils_spec.js | 21 +- spec/frontend/import_entities/mock_data.js | 1 + spec/frontend/read_more_spec.js | 47 ++++- spec/models/ci/catalog/resource_spec.rb | 5 + .../helpers/user_with_namespace_shim.yml | 4 - .../redis/redis_shared_examples.rb | 36 ++++ .../docs/templates/custom_abilities.md.erb | 8 +- 42 files changed, 639 insertions(+), 162 deletions(-) rename config/initializers/{gitlab_http.rb => 7_gitlab_http.rb} (100%) create mode 100644 db/migrate/20231221181908_add_verification_level_to_catalog_resources.rb create mode 100644 db/post_migrate/20240115112056_add_index_on_pipeline_metadata.rb create mode 100644 db/schema_migrations/20231221181908 create mode 100644 db/schema_migrations/20240115112056 create mode 100644 spec/fixtures/config/redis_config_with_extra_config_command.yml diff --git a/.gitlab/ci/release-environments/main.gitlab-ci.yml b/.gitlab/ci/release-environments/main.gitlab-ci.yml index 9cda6d588fb..7de578a7dbc 100644 --- a/.gitlab/ci/release-environments/main.gitlab-ci.yml +++ b/.gitlab/ci/release-environments/main.gitlab-ci.yml @@ -1,6 +1,14 @@ --- include: - local: .gitlab/ci/cng/main.gitlab-ci.yml + - project: 'gitlab-org/quality/pipeline-common' + ref: master + file: ci/base.gitlab-ci.yml + +stages: + - prepare + - deploy + - qa release-environments-build-cng-env: extends: .build-cng-env @@ -42,3 +50,15 @@ release-environments-deploy: project: gitlab-com/gl-infra/release-environments branch: main strategy: depend + +release-environments-qa: + stage: qa + extends: + - .qa-base + timeout: 3h + variables: + QA_SCENARIO: "Test::Instance::Smoke" + RELEASE: "${CI_REGISTRY}/${CI_PROJECT_PATH}/gitlab-ee-qa:${CI_COMMIT_SHA}" + GITLAB_QA_OPTS: --address "https://gitlab.${ENVIRONMENT}.release.gke.gitlab.net" + GITLAB_INITIAL_ROOT_PASSWORD: "${RELEASE_ENVIRONMENTS_ROOT_PASSWORD}" + SIGNUP_DISABLED: "true" diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue b/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue index 678efc536f2..6929b0460b7 100644 --- a/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue +++ b/app/assets/javascripts/import_entities/import_groups/components/import_actions_cell.vue @@ -5,8 +5,13 @@ import { GlIcon, GlButtonGroup, GlButton, - GlTooltipDirective as GlTooltip, + GlLink, + GlTooltip, + GlTooltipDirective, + GlSprintf, } from '@gitlab/ui'; +import { helpPagePath } from '~/helpers/help_page_helper'; +import { __ } from '~/locale'; export default { components: { @@ -15,11 +20,22 @@ export default { GlDisclosureDropdownItem, GlButtonGroup, GlButton, + GlLink, + GlTooltip, + GlSprintf, }, directives: { - GlTooltip, + GlTooltip: GlTooltipDirective, }, + projectCreationHelp: helpPagePath('user/group/import/index', { + anchor: 'ensure-projects-can-be-imported', + }), props: { + id: { + type: Number, + required: false, + default: null, + }, isFinished: { type: Boolean, required: true, @@ -32,7 +48,28 @@ export default { type: Boolean, required: true, }, + isProjectCreationAllowed: { + type: Boolean, + required: false, + default: false, + }, }, + + computed: { + showImportActions() { + return this.isAvailableForImport || this.isFinished; + }, + showImportWithoutProjectsWarning() { + return this.showImportActions && !this.isProjectCreationAllowed; + }, + importWithProjectsText() { + return this.isFinished ? __('Re-import with projects') : __('Import with projects'); + }, + importWithoutProjectsText() { + return this.isFinished ? __('Re-import without projects') : __('Import without projects'); + }, + }, + methods: { importGroup(extraArgs = {}) { this.$emit('import-group', extraArgs); @@ -42,41 +79,82 @@ export default { diff --git a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue index 25d47f3ced3..038209f1831 100644 --- a/app/assets/javascripts/import_entities/import_groups/components/import_table.vue +++ b/app/assets/javascripts/import_entities/import_groups/components/import_table.vue @@ -33,7 +33,13 @@ import updateImportStatusMutation from '../graphql/mutations/update_import_statu import bulkImportSourceGroupsQuery from '../graphql/queries/bulk_import_source_groups.query.graphql'; import { NEW_NAME_FIELD, ROOT_NAMESPACE, i18n } from '../constants'; import { StatusPoller } from '../services/status_poller'; -import { isFinished, isAvailableForImport, isNameValid, isSameTarget } from '../utils'; +import { + isFinished, + isAvailableForImport, + isNameValid, + isProjectCreationAllowed, + isSameTarget, +} from '../utils'; import ImportActionsCell from './import_actions_cell.vue'; import ImportHistoryLink from './import_history_link.vue'; import ImportSourceCell from './import_source_cell.vue'; @@ -175,6 +181,7 @@ export default { isAvailableForImport: isGroupAvailableForImport, isAllowedForReimport: false, isFinished: isFinished(group), + isProjectCreationAllowed: isProjectCreationAllowed(importTarget?.targetNamespace), }; return { @@ -197,6 +204,16 @@ export default { return this.selectedGroupsIds.length === this.availableGroupsForImport.length; }, + showImportProjectsWarning() { + return ( + this.hasSelectedGroups && + this.groupsTableData.some( + (group) => + this.selectedGroupsIds.includes(group.id) && !group.flags.isProjectCreationAllowed, + ) + ); + }, + availableGroupsForImport() { return this.groupsTableData.filter((g) => g.flags.isAvailableForImport && !g.flags.isInvalid); }, @@ -362,7 +379,16 @@ export default { const newImportTarget = { ...group.importTarget, ...changes, + ...(changes.targetNamespace + ? { + targetNamespace: { + ...(this.availableNamespaces.find((g) => g.id === changes.targetNamespace.id) || + changes.targetNamespace), + }, + } + : {}), }; + this.$set(this.importTargets, group.id, newImportTarget); this.validateImportTarget(newImportTarget); }, @@ -734,6 +760,16 @@ export default { {{ s__('BulkImport|Import without projects') }} + + + + diff --git a/app/assets/javascripts/import_entities/import_groups/utils.js b/app/assets/javascripts/import_entities/import_groups/utils.js index f896203ba60..55e9c39a4a8 100644 --- a/app/assets/javascripts/import_entities/import_groups/utils.js +++ b/app/assets/javascripts/import_entities/import_groups/utils.js @@ -17,6 +17,10 @@ export function isAvailableForImport(group) { return !group.progress || isFinished(group); } +export function isProjectCreationAllowed(group) { + return Boolean(group.projectCreationLevel) && group.projectCreationLevel !== 'noone'; +} + export function isSameTarget(importTarget) { return (target) => target !== importTarget && diff --git a/app/assets/javascripts/import_entities/import_projects/graphql/queries/search_namespaces_where_user_can_import_projects.query.graphql b/app/assets/javascripts/import_entities/import_projects/graphql/queries/search_namespaces_where_user_can_import_projects.query.graphql index 8c41f7116b3..f6be7f42273 100644 --- a/app/assets/javascripts/import_entities/import_projects/graphql/queries/search_namespaces_where_user_can_import_projects.query.graphql +++ b/app/assets/javascripts/import_entities/import_projects/graphql/queries/search_namespaces_where_user_can_import_projects.query.graphql @@ -6,6 +6,7 @@ query searchNamespacesWhereUserCanImportProjects($search: String) { id fullPath name + projectCreationLevel visibility webUrl } diff --git a/app/assets/javascripts/pages/projects/index.js b/app/assets/javascripts/pages/projects/index.js index dc00036864f..95d52f2270d 100644 --- a/app/assets/javascripts/pages/projects/index.js +++ b/app/assets/javascripts/pages/projects/index.js @@ -1,6 +1,9 @@ import { addShortcutsExtension } from '~/behaviors/shortcuts'; import ShortcutsNavigation from '~/behaviors/shortcuts/shortcuts_navigation'; +import initReadMore from '~/read_more'; import Project from './project'; new Project(); // eslint-disable-line no-new addShortcutsExtension(ShortcutsNavigation); + +initReadMore(); diff --git a/app/assets/javascripts/projects/commit_box/info/components/refs_list.vue b/app/assets/javascripts/projects/commit_box/info/components/refs_list.vue index 7a926c3f4e6..b76d569cf75 100644 --- a/app/assets/javascripts/projects/commit_box/info/components/refs_list.vue +++ b/app/assets/javascripts/projects/commit_box/info/components/refs_list.vue @@ -78,7 +78,7 @@ export default {