diff --git a/.rubocop_todo/lint/ambiguous_regexp_literal.yml b/.rubocop_todo/lint/ambiguous_regexp_literal.yml index 4af24464e8e..83000e7955f 100644 --- a/.rubocop_todo/lint/ambiguous_regexp_literal.yml +++ b/.rubocop_todo/lint/ambiguous_regexp_literal.yml @@ -82,7 +82,6 @@ Lint/AmbiguousRegexpLiteral: - 'spec/services/loose_foreign_keys/cleaner_service_spec.rb' - 'spec/services/snippets/repository_validation_service_spec.rb' - 'spec/services/system_notes/merge_requests_service_spec.rb' - - 'spec/support/shared_examples/features/content_editor_shared_examples.rb' - 'spec/support/shared_examples/lib/gitlab/sql/set_operator_shared_examples.rb' - 'spec/support_specs/database/multiple_databases_helpers_spec.rb' - 'spec/tasks/gitlab/gitaly_rake_spec.rb' diff --git a/Gemfile b/Gemfile index c3e2841a640..2c7152e2aaf 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,7 @@ gem 'sprockets', '~> 3.7.0' # rubocop:todo Gemfile/MissingFeatureCategory gem 'view_component', '~> 3.8.0' # rubocop:todo Gemfile/MissingFeatureCategory # Supported DBs -gem 'pg', '~> 1.5.4' # rubocop:todo Gemfile/MissingFeatureCategory +gem 'pg', '~> 1.5.5' # rubocop:todo Gemfile/MissingFeatureCategory gem 'neighbor', '~> 0.2.3' # rubocop:todo Gemfile/MissingFeatureCategory @@ -277,7 +277,7 @@ gem 're2', '2.7.0' # rubocop:todo Gemfile/MissingFeatureCategory # Misc -gem 'semver_dialects', '~> 1.6.1', feature_category: :static_application_security_testing +gem 'semver_dialects', '~> 1.6.2', feature_category: :static_application_security_testing gem 'version_sorter', '~> 2.3' # rubocop:todo Gemfile/MissingFeatureCategory gem 'csv_builder', path: 'gems/csv_builder' # rubocop:todo Gemfile/MissingFeatureCategory diff --git a/Gemfile.checksum b/Gemfile.checksum index f653e89f93f..8f89b395cee 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -460,7 +460,10 @@ {"name":"parslet","version":"1.8.2","platform":"ruby","checksum":"08d1ab3721cd3f175bfbee8788b2ddff71f92038f2d69bd65454c22bb9fbd98a"}, {"name":"pastel","version":"0.8.0","platform":"ruby","checksum":"481da9fb7d2f6e6b1a08faf11fa10363172dc40fd47848f096ae21209f805a75"}, {"name":"peek","version":"1.1.0","platform":"ruby","checksum":"d6501ead8cde46d8d8ed0d59eb6f0ba713d0a41c11a2c4a81447b2dce37b3ecc"}, -{"name":"pg","version":"1.5.4","platform":"ruby","checksum":"04f7b247151c639a0b955d8e5a9a41541343f4640aa3c2bdf749a872c339d25d"}, +{"name":"pg","version":"1.5.5","platform":"ruby","checksum":"7e4baa3395619424fe0e82d0b0489e54d3015c6ee5896dd007b3bce6d7d49b68"}, +{"name":"pg","version":"1.5.5","platform":"x64-mingw-ucrt","checksum":"1adad3a4b4631e3676891639bab5aed68ac7c6a379d8314b768f74e6bdf0375e"}, +{"name":"pg","version":"1.5.5","platform":"x64-mingw32","checksum":"98b1480a04e3f8aca9c7fc06dec5662117cec540e5c5058cb3a0812e8261adcc"}, +{"name":"pg","version":"1.5.5","platform":"x86-mingw32","checksum":"4fd1e309c5d227ecb1704fc2b3f1168b13748a8d8b0eb7c09d834b28069b9433"}, {"name":"pg_query","version":"5.1.0","platform":"ruby","checksum":"b7f7f47c864f08ccbed46a8244906fb6ee77ee344fd27250717963928c93145d"}, {"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"}, {"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"}, @@ -593,7 +596,7 @@ {"name":"sd_notify","version":"0.1.1","platform":"ruby","checksum":"cbc7ac6caa7cedd26b30a72b5eeb6f36050dc0752df263452ea24fb5a4ad3131"}, {"name":"seed-fu","version":"2.3.7","platform":"ruby","checksum":"f19673443e9af799b730e3d4eca6a89b39e5a36825015dffd00d02ea3365cf74"}, {"name":"selenium-webdriver","version":"4.18.1","platform":"ruby","checksum":"abe8daa474c9fa8b94b6462a0cdbe093140218f876e58e3911bb064a60d45eab"}, -{"name":"semver_dialects","version":"1.6.1","platform":"ruby","checksum":"6e5f592d8958480ea9dab80cbbbef0eea1032d373968a15b07786eae3f5e558e"}, +{"name":"semver_dialects","version":"1.6.2","platform":"ruby","checksum":"ac05ed56aa386292e7e0e8f648f57fdfbc0db78dbadfec0b1dc9b5ec1a8d7234"}, {"name":"sentry-rails","version":"5.10.0","platform":"ruby","checksum":"99aa2fac136c26942eb1897c65de65dac88ad43ac5eb183ff20711287a137ebd"}, {"name":"sentry-raven","version":"3.1.2","platform":"ruby","checksum":"103d3b122958810d34898ce2e705bcf549ddb9d855a70ce9a3970ee2484f364a"}, {"name":"sentry-ruby","version":"5.10.0","platform":"ruby","checksum":"115c24c0aee1309210f3a2988fb118e2bec1f11609feeda90e694388b1183619"}, diff --git a/Gemfile.lock b/Gemfile.lock index 89645f325e0..c5dad52f3bb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1270,7 +1270,7 @@ GEM tty-color (~> 0.5) peek (1.1.0) railties (>= 4.0.0) - pg (1.5.4) + pg (1.5.5) pg_query (5.1.0) google-protobuf (>= 3.22.3) plist (3.7.0) @@ -1560,7 +1560,7 @@ GEM rexml (~> 3.2, >= 3.2.5) rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) - semver_dialects (1.6.1) + semver_dialects (1.6.2) deb_version (~> 1.0.1) pastel (~> 0.8.0) thor (~> 1.3) @@ -2047,7 +2047,7 @@ DEPENDENCIES parser (~> 3.3, >= 3.3.0.2) parslet (~> 1.8) peek (~> 1.1) - pg (~> 1.5.4) + pg (~> 1.5.5) pg_query (~> 5.1.0) png_quantizator (~> 0.2.1) premailer-rails (~> 1.10.3) @@ -2100,7 +2100,7 @@ DEPENDENCIES sd_notify (~> 0.1.0) seed-fu (~> 2.3.7) selenium-webdriver (~> 4.18, >= 4.18.1) - semver_dialects (~> 1.6.1) + semver_dialects (~> 1.6.2) sentry-rails (~> 5.10.0) sentry-raven (~> 3.1) sentry-ruby (~> 5.10.0) diff --git a/app/assets/javascripts/editor/schema/ci.json b/app/assets/javascripts/editor/schema/ci.json index 2754a7da14e..8ff39da5813 100644 --- a/app/assets/javascripts/editor/schema/ci.json +++ b/app/assets/javascripts/editor/schema/ci.json @@ -1540,6 +1540,24 @@ } } ] + }, + "exit_codes": { + "markdownDescription": "Either a single or array of exit codes to trigger job retry on. [Learn More](https://docs.gitlab.com/ee/ci/yaml/#retryexit_codes).", + "oneOf": [ + { + "description": "Retry when the job exit code is included in the array's values.", + "type": "array", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "integer" + } + }, + { + "description": "Retry when the job exit code is equal to.", + "type": "integer" + } + ] } } } diff --git a/app/assets/javascripts/organizations/mock_data.js b/app/assets/javascripts/organizations/mock_data.js index b3e408c50aa..0b0554e9e8c 100644 --- a/app/assets/javascripts/organizations/mock_data.js +++ b/app/assets/javascripts/organizations/mock_data.js @@ -66,6 +66,9 @@ export const organizationProjects = [ userPermissions: { removeProject: true, }, + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Project/7', @@ -92,6 +95,9 @@ export const organizationProjects = [ userPermissions: { removeProject: true, }, + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Project/6', @@ -118,6 +124,9 @@ export const organizationProjects = [ userPermissions: { removeProject: true, }, + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Project/5', @@ -144,6 +153,9 @@ export const organizationProjects = [ userPermissions: { removeProject: true, }, + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Project/1', @@ -170,6 +182,9 @@ export const organizationProjects = [ userPermissions: { removeProject: false, }, + maxAccessLevel: { + integerValue: 30, + }, }, ]; @@ -186,6 +201,9 @@ export const organizationGroups = [ projectsCount: 3, groupMembersCount: 2, visibility: 'public', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/33', @@ -199,6 +217,9 @@ export const organizationGroups = [ projectsCount: 3, groupMembersCount: 1, visibility: 'private', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/24', @@ -212,6 +233,9 @@ export const organizationGroups = [ projectsCount: 1, groupMembersCount: 2, visibility: 'internal', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/27', @@ -225,6 +249,9 @@ export const organizationGroups = [ projectsCount: 2, groupMembersCount: 3, visibility: 'public', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/31', @@ -237,6 +264,9 @@ export const organizationGroups = [ projectsCount: 3, groupMembersCount: 10, visibility: 'private', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/22', @@ -250,6 +280,9 @@ export const organizationGroups = [ projectsCount: 3, groupMembersCount: 40, visibility: 'internal', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/35', @@ -263,6 +296,9 @@ export const organizationGroups = [ projectsCount: 30, groupMembersCount: 100, visibility: 'public', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/73', @@ -275,6 +311,9 @@ export const organizationGroups = [ projectsCount: 1, groupMembersCount: 1, visibility: 'private', + maxAccessLevel: { + integerValue: 30, + }, }, { id: 'gid://gitlab/Group/74', @@ -289,6 +328,9 @@ export const organizationGroups = [ projectsCount: 4, groupMembersCount: 4, visibility: 'internal', + maxAccessLevel: { + integerValue: 30, + }, }, ]; diff --git a/app/assets/javascripts/organizations/shared/graphql/queries/groups.query.graphql b/app/assets/javascripts/organizations/shared/graphql/queries/groups.query.graphql index 2451e17ee8f..84744d8ee2d 100644 --- a/app/assets/javascripts/organizations/shared/graphql/queries/groups.query.graphql +++ b/app/assets/javascripts/organizations/shared/graphql/queries/groups.query.graphql @@ -31,6 +31,9 @@ query getOrganizationGroups( projectsCount groupMembersCount visibility + maxAccessLevel { + integerValue + } } pageInfo { ...PageInfo diff --git a/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql b/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql index 69ebd81e2eb..0b7cd2680d2 100644 --- a/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql +++ b/app/assets/javascripts/organizations/shared/graphql/queries/projects.query.graphql @@ -34,6 +34,9 @@ query getOrganizationProjects( userPermissions { removeProject } + maxAccessLevel { + integerValue + } } pageInfo { ...PageInfo diff --git a/app/assets/javascripts/organizations/shared/utils.js b/app/assets/javascripts/organizations/shared/utils.js index 496cbeb62e4..f8ea903ce4f 100644 --- a/app/assets/javascripts/organizations/shared/utils.js +++ b/app/assets/javascripts/organizations/shared/utils.js @@ -22,6 +22,7 @@ export const formatProjects = (projects) => forkingAccessLevel, webUrl, userPermissions, + maxAccessLevel: accessLevel, ...project }) => ({ ...project, @@ -32,6 +33,7 @@ export const formatProjects = (projects) => forkingAccessLevel: forkingAccessLevel.stringValue, webUrl, isForked: false, + accessLevel, editPath: `${webUrl}/edit`, availableActions: availableProjectActions(userPermissions), actionLoadingStates: { @@ -41,11 +43,12 @@ export const formatProjects = (projects) => ); export const formatGroups = (groups) => - groups.map(({ id, webUrl, parent, ...group }) => ({ + groups.map(({ id, webUrl, parent, maxAccessLevel: accessLevel, ...group }) => ({ ...group, id: getIdFromGraphQLId(id), webUrl, parent: parent?.id || null, + accessLevel, editPath: `${webUrl}/-/edit`, availableActions: [ACTION_EDIT, ACTION_DELETE], })); diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue index 95e648bda3c..08072908c4d 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue @@ -5,6 +5,7 @@ import { mapActions, mapState } from 'vuex'; import { createAlert, VARIANT_INFO } from '~/alert'; import { historyReplaceState } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; +import { helpPagePath } from '~/helpers/help_page_helper'; import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages_and_registries/shared/constants'; import { getQueryParams, extractFilterAndSorting } from '~/packages_and_registries/shared/utils'; @@ -34,11 +35,9 @@ export default { computed: { ...mapState({ emptyListIllustration: (state) => state.config.emptyListIllustration, - emptyListHelpUrl: (state) => state.config.emptyListHelpUrl, filter: (state) => state.filter, isGroupPage: (state) => state.config.isGroupPage, selectedType: (state) => state.selectedType, - packageHelpUrl: (state) => state.config.packageHelpUrl, packagesCount: (state) => state.pagination?.total, }), emptySearch() { @@ -92,12 +91,13 @@ export default { i18n: { widenFilters: s__('PackageRegistry|To widen your search, change or remove the filters above.'), }, + terraformRegistryHelpUrl: helpPagePath('user/packages/terraform_module_registry/index'), }; diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/state.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/state.js index 60f02eddc9f..503e2883cbb 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/state.js +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/state.js @@ -9,7 +9,6 @@ export default () => ({ * resourceId: String, * pageType: String, * emptyListIllustration: String, - * emptyListHelpUrl: String, * comingSoon: { projectPath: String, suggestedContributions : String } | null; * } */ diff --git a/app/assets/javascripts/profile/edit/components/profile_edit_app.vue b/app/assets/javascripts/profile/edit/components/profile_edit_app.vue index eedb5d7764e..9b78c4a2bfb 100644 --- a/app/assets/javascripts/profile/edit/components/profile_edit_app.vue +++ b/app/assets/javascripts/profile/edit/components/profile_edit_app.vue @@ -1,23 +1,26 @@ @@ -156,6 +168,13 @@ export default { /> + + + + + + + diff --git a/app/assets/javascripts/profile/edit/constants.js b/app/assets/javascripts/profile/edit/constants.js index e07615273f7..3f701ff3516 100644 --- a/app/assets/javascripts/profile/edit/constants.js +++ b/app/assets/javascripts/profile/edit/constants.js @@ -28,6 +28,11 @@ export const statusI18n = { ), }; +export const timezoneI18n = { + setTimezoneTitle: s__('Profiles|Time settings'), + setTimezoneDescription: s__('Profiles|Set your local time zone.'), +}; + export const i18n = { updateProfileSettings: s__('Profiles|Update profile settings'), cancel: __('Cancel'), diff --git a/app/assets/javascripts/profile/edit/index.js b/app/assets/javascripts/profile/edit/index.js index 27b410c3a12..754ab402732 100644 --- a/app/assets/javascripts/profile/edit/index.js +++ b/app/assets/javascripts/profile/edit/index.js @@ -15,6 +15,8 @@ export const initProfileEdit = () => { currentAvailability, defaultEmoji, currentClearStatusAfter, + timezones, + userTimezone, ...provides } = mountEl.dataset; @@ -31,6 +33,8 @@ export const initProfileEdit = () => { hasAvatar: parseBoolean(provides.hasAvatar), gravatarEnabled: parseBoolean(provides.gravatarEnabled), gravatarLink: JSON.parse(provides.gravatarLink), + timezones: JSON.parse(timezones), + userTimezone, }, render(createElement) { return createElement(ProfileEditApp, { diff --git a/app/assets/javascripts/set_status_modal/set_status_form.vue b/app/assets/javascripts/set_status_modal/set_status_form.vue index 8786dccecc4..34017a912bb 100644 --- a/app/assets/javascripts/set_status_modal/set_status_form.vue +++ b/app/assets/javascripts/set_status_modal/set_status_form.vue @@ -184,7 +184,7 @@ export default {