diff --git a/app/assets/javascripts/filtered_search/filtered_search_manager.js b/app/assets/javascripts/filtered_search/filtered_search_manager.js index d0996c9200b3d5ab38a8b74a994a4da9104f01fa..707205a650266a448ced54152f8cc94e16c45474 100644 --- a/app/assets/javascripts/filtered_search/filtered_search_manager.js +++ b/app/assets/javascripts/filtered_search/filtered_search_manager.js @@ -801,7 +801,7 @@ export default class FilteredSearchManager { paths.push(`search=${sanitized}`); } - let parameterizedUrl = `?scope=all&utf8=%E2%9C%93&${paths.join('&')}`; + let parameterizedUrl = `?scope=all&${paths.join('&')}`; if (this.anchor) { parameterizedUrl += `#${this.anchor}`; diff --git a/app/assets/javascripts/incidents/components/incidents_list.vue b/app/assets/javascripts/incidents/components/incidents_list.vue index af99341b11fdf558fc8e099539daa4554fe03df7..4d34daa43ba5872cc32fd23508f5d75fb65c5ebf 100644 --- a/app/assets/javascripts/incidents/components/incidents_list.vue +++ b/app/assets/javascripts/incidents/components/incidents_list.vue @@ -10,6 +10,7 @@ import { GlIcon, GlEmptyState, } from '@gitlab/ui'; +import { isValidSlaDueAt } from 'ee_else_ce/vue_shared/components/incidents/utils'; import { visitUrl, mergeUrlParams, joinPaths } from '~/lib/utils/url_utility'; import { s__ } from '~/locale'; import { INCIDENT_SEVERITY } from '~/sidebar/components/severity/constants'; @@ -287,6 +288,7 @@ export default { errorAlertDismissed() { this.isErrorAlertDismissed = true; }, + isValidSlaDueAt, }, }; </script> @@ -367,7 +369,13 @@ export default { </template> <template v-if="slaFeatureAvailable" #cell(incidentSla)="{ item }"> - <service-level-agreement-cell :sla-due-at="item.slaDueAt" data-testid="incident-sla" /> + <service-level-agreement-cell + v-if="isValidSlaDueAt(item.slaDueAt)" + :issue-iid="item.iid" + :project-path="projectPath" + :sla-due-at="item.slaDueAt" + data-testid="incident-sla" + /> </template> <template #cell(assignees)="{ item }"> diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js new file mode 100644 index 0000000000000000000000000000000000000000..b6c49a10ee843a4fce2d7ef13c658090d23ee77e --- /dev/null +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details_app_bundle.js @@ -0,0 +1,29 @@ +import Vue from 'vue'; +import { parseBoolean } from '~/lib/utils/common_utils'; +import PackagesApp from '~/packages/details/components/app.vue'; +import createStore from '~/packages/details/store'; +import Translate from '~/vue_shared/translate'; + +Vue.use(Translate); + +export default () => { + const el = document.querySelector('#js-vue-packages-detail'); + const { package: packageJson, canDelete: canDeleteStr, ...rest } = el.dataset; + const packageEntity = JSON.parse(packageJson); + const canDelete = parseBoolean(canDeleteStr); + + const store = createStore({ + packageEntity, + packageFiles: packageEntity.package_files, + canDelete, + ...rest, + }); + + return new Vue({ + el, + store, + render(createElement) { + return createElement(PackagesApp); + }, + }); +}; diff --git a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue index 4589c99f4f7907d9fbe14e488501144308e60ec3..292a70cd69ad8ab9a5a81a4ba454401ea7668457 100644 --- a/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue +++ b/app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue @@ -113,7 +113,6 @@ export default { }), visibility: initFormField({ value: this.projectVisibility, - skipValidation: true, }), }, }; @@ -326,7 +325,11 @@ export default { /> </gl-form-group> - <gl-form-group> + <gl-form-group + v-validation:[form.showValidation] + :invalid-feedback="s__('ForkProject|Please select a visibility level')" + :state="form.fields.visibility.state" + > <label> {{ s__('ForkProject|Visibility level') }} <gl-link :href="visibilityHelpPath" target="_blank"> diff --git a/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js b/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js new file mode 100644 index 0000000000000000000000000000000000000000..44d9e2ffb6e1ff0d29b1973e7d3333c616e22907 --- /dev/null +++ b/app/assets/javascripts/pages/projects/packages/infrastructure_registry/show/index.js @@ -0,0 +1,3 @@ +import initDetails from '~/packages_and_registries/infrastructure_registry/details_app_bundle'; + +initDetails(); diff --git a/app/assets/javascripts/projects/commit/components/form_modal.vue b/app/assets/javascripts/projects/commit/components/form_modal.vue index 6eefa5f55e4262ed906fc9aeca5e2b835de8422a..ec7d37644a89f42bd7e854083c81c7174104b249 100644 --- a/app/assets/javascripts/projects/commit/components/form_modal.vue +++ b/app/assets/javascripts/projects/commit/components/form_modal.vue @@ -3,7 +3,6 @@ import { GlModal, GlForm, GlFormCheckbox, GlSprintf, GlFormGroup } from '@gitlab import { mapActions, mapState } from 'vuex'; import { BV_SHOW_MODAL } from '~/lib/utils/constants'; import csrf from '~/lib/utils/csrf'; -import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import eventHub from '../event_hub'; import BranchesDropdown from './branches_dropdown.vue'; import ProjectsDropdown from './projects_dropdown.vue'; @@ -18,7 +17,6 @@ export default { GlSprintf, GlFormGroup, }, - mixins: [glFeatureFlagsMixin()], inject: { prependedText: { default: '', @@ -116,7 +114,7 @@ export default { <input type="hidden" name="authenticity_token" :value="$options.csrf.token" /> <gl-form-group - v-if="glFeatures.pickIntoProject && isCherryPick" + v-if="isCherryPick" :label="i18n.projectLabel" label-for="start_project" data-testid="dropdown-group" diff --git a/app/assets/javascripts/tracking/index.js b/app/assets/javascripts/tracking/index.js index 0c920ac927b1a75ab7f95ecbde4e6d37eec8847c..e0ba7dba97f16f514249ddca8b261613ed8b6519 100644 --- a/app/assets/javascripts/tracking/index.js +++ b/app/assets/javascripts/tracking/index.js @@ -48,7 +48,7 @@ const createEventPayload = (el, { suffix = '' } = {}) => { const action = (trackAction || trackEvent) + (suffix || ''); let value = trackValue || el.value || undefined; - if (el.type === 'checkbox' && !el.checked) value = false; + if (el.type === 'checkbox' && !el.checked) value = 0; let extra = trackExtra; diff --git a/app/assets/javascripts/vue_shared/components/incidents/utils.js b/app/assets/javascripts/vue_shared/components/incidents/utils.js new file mode 100644 index 0000000000000000000000000000000000000000..bcb578a6ba64cc729414e27aad5d86f14f0a5ac9 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/incidents/utils.js @@ -0,0 +1,3 @@ +import { noop } from 'lodash'; + +export const isValidSlaDueAt = noop; diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb index 7bfcda67aa2703178fd2e994d34cf8c0006c5a51..0fb77e2aaf4b4628b94b0b24fae4a6cc933fa0d5 100644 --- a/app/controllers/concerns/creates_commit.rb +++ b/app/controllers/concerns/creates_commit.rb @@ -18,7 +18,7 @@ def create_commit(service, success_path:, failure_path:, failure_view: nil, succ @start_branch ||= @ref || @branch_name - start_project = Feature.enabled?(:pick_into_project, @project, default_enabled: :yaml) ? @project_to_commit_into : @project + start_project = @project_to_commit_into commit_params = @commit_params.merge( start_project: start_project, diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 863715429ffaecc8b23281cd2201c1a3ff68eae2..3d2398f7ee308bb8b9b43cc7870f3407baf1bbb2 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -19,9 +19,6 @@ class Projects::CommitController < Projects::ApplicationController before_action :define_commit_box_vars, only: [:show, :pipelines] before_action :define_note_vars, only: [:show, :diff_for_path, :diff_files] before_action :authorize_edit_tree!, only: [:revert, :cherry_pick] - before_action do - push_frontend_feature_flag(:pick_into_project, @project, default_enabled: :yaml) - end BRANCH_SEARCH_LIMIT = 1000 COMMIT_DIFFS_PER_PAGE = 20 @@ -220,7 +217,6 @@ def assign_change_commit_vars def find_cherry_pick_target_project return @project if params[:target_project_id].blank? - return @project unless Feature.enabled?(:pick_into_project, @project, default_enabled: :yaml) MergeRequestTargetProjectFinder .new(current_user: current_user, source_project: @project, project_feature: :repository) diff --git a/app/controllers/projects/packages/infrastructure_registry_controller.rb b/app/controllers/projects/packages/infrastructure_registry_controller.rb index 22ae1d6501351fbdc57289360f4fdf7ae32c44cc..f6db314b475c3113146b75c34d163c7efe5dbf20 100644 --- a/app/controllers/projects/packages/infrastructure_registry_controller.rb +++ b/app/controllers/projects/packages/infrastructure_registry_controller.rb @@ -3,7 +3,19 @@ module Projects module Packages class InfrastructureRegistryController < Projects::ApplicationController + before_action :verify_feature_enabled! feature_category :infrastructure_as_code + + def show + @package = project.packages.find(params[:id]) + @package_files = @package.package_files.recent + end + + private + + def verify_feature_enabled! + render_404 unless Feature.enabled?(:infrastructure_registry_page) + end end end end diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 7893ce76da1eba1a264bf50b5d2eb4b0175570a2..a7696ba4ea7cd097abcc62334511f5b8ba0b9c14 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -137,8 +137,6 @@ def conditionally_paginate_diff_files(diffs, paginate:, per:) end def cherry_pick_projects_data(project) - return [] unless Feature.enabled?(:pick_into_project, project, default_enabled: :yaml) - [project, project.forked_from_project].compact.map do |project| { id: project.id.to_s, diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 0682f3013d42462a698797fb4a24e8b4acf560e7..e27ea7c07e574bb75bb32a193b2c0b527f16b384 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -116,7 +116,7 @@ def destroy_project_related_records(project) log_destroy_event trash_relation_repositories! trash_project_repositories! - destroy_web_hooks! if Feature.enabled?(:destroy_webhooks_before_the_project, project, default_enabled: :yaml) + destroy_web_hooks! # Rails attempts to load all related records into memory before # destroying: https://github.com/rails/rails/issues/22510 diff --git a/app/views/projects/packages/infrastructure_registry/show.html.haml b/app/views/projects/packages/infrastructure_registry/show.html.haml new file mode 100644 index 0000000000000000000000000000000000000000..a36dd685f45cc74e78fce805c880f17b8f9315fe --- /dev/null +++ b/app/views/projects/packages/infrastructure_registry/show.html.haml @@ -0,0 +1,13 @@ +- add_to_breadcrumbs _("Infrastructure Registry"), project_packages_path(@project) +- add_to_breadcrumbs @package.name, project_packages_path(@project) +- breadcrumb_title @package.version +- page_title _("Infrastructure Registry") +- @content_class = "limit-container-width" unless fluid_layout + +.row + .col-12 + #js-vue-packages-detail{ data: { package: package_from_presenter(@package), + can_delete: can?(current_user, :destroy_package, @project).to_s, + svg_path: image_path('illustrations/no-packages.svg'), + project_name: @project.name, + project_list_url: project_infrastructure_registry_index_path(@project)} } diff --git a/config/feature_flags/development/destroy_webhooks_before_the_project.yml b/config/feature_flags/development/destroy_webhooks_before_the_project.yml deleted file mode 100644 index 7493822d641a72d6d5d11e777cad7e557d49f2a2..0000000000000000000000000000000000000000 --- a/config/feature_flags/development/destroy_webhooks_before_the_project.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: destroy_webhooks_before_the_project -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59754 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/328393 -milestone: '13.12' -type: development -group: group::source code -default_enabled: true diff --git a/config/feature_flags/development/pick_into_project.yml b/config/feature_flags/development/pick_into_project.yml deleted file mode 100644 index fc28527d5a3760bf4976ce7d6690485290e75f76..0000000000000000000000000000000000000000 --- a/config/feature_flags/development/pick_into_project.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: pick_into_project -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/55970 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/324154 -milestone: '13.10' -type: development -group: group::source code -default_enabled: true diff --git a/config/initializers/action_view.rb b/config/initializers/action_view.rb new file mode 100644 index 0000000000000000000000000000000000000000..7617173348331b5836e97dca11e2684a502fa365 --- /dev/null +++ b/config/initializers/action_view.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +# This file was introduced during upgrading Rails from 5.2 to 6.0. +# This file can be removed when `config.load_defaults 6.0` is introduced. + +# Don't force requests from old versions of IE to be UTF-8 encoded. +Rails.application.config.action_view.default_enforce_utf8 = false diff --git a/config/routes.rb b/config/routes.rb index 2f0dcc3b856e85d17b2b1d71d20e242577bcbea4..bc85fe440a145b00f750bc6b3e49dcecf2799c8f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -279,9 +279,13 @@ # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/210024 scope as: 'deprecated' do - draw :snippets + # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719 + get '/snippets/:id/raw', + to: 'snippets#raw', + format: false, + constraints: { id: /\d+/ } - Gitlab::Routing.redirect_legacy_paths(self, :profile) + Gitlab::Routing.redirect_legacy_paths(self, :profile, :snippets) end Gitlab.ee do diff --git a/config/routes/project.rb b/config/routes/project.rb index 4213febc1fc4d11d9cd159f48bad6269e1cb5e89..9a77e7a98ac0feb2e3ed9aa7742e71cde6fd3aa7 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -50,7 +50,7 @@ end end - resources :infrastructure_registry, only: [:index], module: :packages + resources :infrastructure_registry, only: [:index, :show], module: :packages resources :jobs, only: [:index, :show], constraints: { id: /\d+/ } do collection do @@ -567,13 +567,13 @@ # Issue https://gitlab.com/gitlab-org/gitlab/issues/118849 draw :repository - # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/29572 - resources :snippets, concerns: :awardable, constraints: { id: /\d+/ } do # rubocop: disable Cop/PutProjectRoutesUnderScope - member do - get :raw # rubocop:todo Cop/PutProjectRoutesUnderScope - post :mark_as_spam # rubocop:todo Cop/PutProjectRoutesUnderScope - end - end + # Issue https://gitlab.com/gitlab-org/gitlab/-/issues/223719 + # rubocop: disable Cop/PutProjectRoutesUnderScope + get '/snippets/:id/raw', + to: 'snippets#raw', + format: false, + constraints: { id: /\d+/ } + # rubocop: enable Cop/PutProjectRoutesUnderScope end # All new routes should go under /-/ scope. @@ -589,7 +589,7 @@ :tracing, :serverless, :clusters, :audit_events, :wikis, :merge_requests, :vulnerability_feedback, :security, :dependencies, :issues, - :pipelines, :pipeline_schedules) + :pipelines, :pipeline_schedules, :snippets) end # rubocop: disable Cop/PutProjectRoutesUnderScope diff --git a/doc/api/group_wikis.md b/doc/api/group_wikis.md index f0c38d4d4b9ab352199a57a4d73fad8f5fa8beab..7d5f8ec641d654b75984bf3a63bac0354d834e89 100644 --- a/doc/api/group_wikis.md +++ b/doc/api/group_wikis.md @@ -64,7 +64,7 @@ GET /groups/:id/wikis/:slug | Attribute | Type | Required | Description | | --------- | ------- | -------- | --------------------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) | -| `slug` | string | yes | The slug (a unique string) of the wiki page | +| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` | ```shell curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/wikis/home" @@ -127,7 +127,7 @@ PUT /groups/:id/wikis/:slug | `content` | string | yes if `title` is not provided | The content of the wiki page | | `title` | string | yes if `content` is not provided | The title of the wiki page | | `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` | -| `slug` | string | yes | The slug (a unique identifier) of the wiki page | +| `slug` | string | yes | URL encoded slug (a unique string) of the wiki page. Ex. dir%2Fpage_name | ```shell curl --request PUT --data "format=rdoc&content=documentation&title=Docs" \ @@ -157,7 +157,7 @@ DELETE /groups/:id/wikis/:slug | Attribute | Type | Required | Description | | --------- | ------- | -------- | --------------------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the group](README.md#namespaced-path-encoding) | -| `slug` | string | yes | The slug (a unique identifier) of the wiki page | +| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` | ```shell curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/groups/1/wikis/foo" diff --git a/doc/api/templates/dockerfiles.md b/doc/api/templates/dockerfiles.md index 6eedf8d2bc06ddf667ce41863ae6a9a47322529a..2d7e926561f6b8b853bcc46af367c5a4e3613de0 100644 --- a/doc/api/templates/dockerfiles.md +++ b/doc/api/templates/dockerfiles.md @@ -74,10 +74,6 @@ Example response: "key": "OpenJDK", "name": "OpenJDK" }, - { - "key": "OpenJDK-alpine", - "name": "OpenJDK-alpine" - }, { "key": "PHP", "name": "PHP" diff --git a/doc/api/wikis.md b/doc/api/wikis.md index 569708cdfcc10201ddb94c4f228563c24022dae8..791eba460937f4d290d9fa2992f1bb99439a0ed3 100644 --- a/doc/api/wikis.md +++ b/doc/api/wikis.md @@ -64,7 +64,7 @@ GET /projects/:id/wikis/:slug | Attribute | Type | Required | Description | | --------- | ------- | -------- | --------------------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) | -| `slug` | string | yes | The slug (a unique string) of the wiki page | +| `slug` | string | yes | URLencoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` | ```shell curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/home" @@ -125,7 +125,7 @@ PUT /projects/:id/wikis/:slug | `content` | string | yes if `title` is not provided | The content of the wiki page | | `title` | string | yes if `content` is not provided | The title of the wiki page | | `format` | string | no | The format of the wiki page. Available formats are: `markdown` (default), `rdoc`, `asciidoc` and `org` | -| `slug` | string | yes | The slug (a unique string) of the wiki page | +| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` | ```shell curl --request PUT --data "format=rdoc&content=documentation&title=Docs" --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/foo" @@ -153,7 +153,7 @@ DELETE /projects/:id/wikis/:slug | Attribute | Type | Required | Description | | --------- | ------- | -------- | --------------------- | | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) | -| `slug` | string | yes | The slug (a unique string) of the wiki page | +| `slug` | string | yes | URL-encoded slug (a unique string) of the wiki page, such as `dir%2Fpage_name` | ```shell curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/wikis/foo" diff --git a/doc/user/project/merge_requests/cherry_pick_changes.md b/doc/user/project/merge_requests/cherry_pick_changes.md index b71c7386301b82d3edc3ac49b5718950dacd8e5b..710638128f3557a8822fcbf4f9fc09da51f0a5f3 100644 --- a/doc/user/project/merge_requests/cherry_pick_changes.md +++ b/doc/user/project/merge_requests/cherry_pick_changes.md @@ -63,10 +63,7 @@ git cherry-pick -m 2 7a39eb0 ### Cherry-pick into a project > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/21268) in GitLab 13.11. -> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default. -> - It's disabled on GitLab.com. -> - It's not recommended for production use. -> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-cherry-picking-into-a-project). **(FREE SELF)** +> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/324154) in GitLab 14.0 WARNING: This feature might not be available to you. Check the **version history** note above for details. @@ -81,25 +78,6 @@ merge request is from a fork: 1. (Optional) Select **Start a new merge request** if you're ready to create a merge request. 1. Click **Cherry-pick**. -### Enable or disable cherry-picking into a project **(FREE SELF)** - -Cherry-picking into a project is under development and not ready for production use. It is -deployed behind a feature flag that is **disabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) -can enable it. - -To enable it: - -```ruby -Feature.enable(:pick_into_project) -``` - -To disable it: - -```ruby -Feature.disable(:pick_into_project) -``` - ## Related links - The [Commits API](../../../api/commits.md) enables you to add custom messages diff --git a/locale/gitlab.pot b/locale/gitlab.pot index a5eaf76c47b1ddff0a140a009f3859313cc6a25b..e8e9b56b456595d566f2af925a7a361f98176a5a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -14341,6 +14341,9 @@ msgstr "" msgid "ForkProject|Please select a namespace" msgstr "" +msgid "ForkProject|Please select a visibility level" +msgstr "" + msgid "ForkProject|Private" msgstr "" @@ -15745,13 +15748,16 @@ msgstr "" msgid "GroupActivityMetrics|Issues opened" msgstr "" +msgid "GroupActivityMetrics|Last 90 days" +msgstr "" + msgid "GroupActivityMetrics|Members added" msgstr "" msgid "GroupActivityMetrics|Merge Requests opened" msgstr "" -msgid "GroupActivityMetrics|Recent activity (last 90 days)" +msgid "GroupActivityMetrics|Recent activity" msgstr "" msgid "GroupImport|Failed to import group." @@ -17357,6 +17363,9 @@ msgstr "" msgid "IncidentManagement|%{minutes} minutes remaining" msgstr "" +msgid "IncidentManagement|Achieved SLA" +msgstr "" + msgid "IncidentManagement|All" msgstr "" @@ -17396,6 +17405,9 @@ msgstr "" msgid "IncidentManagement|Medium - S3" msgstr "" +msgid "IncidentManagement|Missed SLA" +msgstr "" + msgid "IncidentManagement|No incidents to display." msgstr "" diff --git a/spec/controllers/projects/commit_controller_spec.rb b/spec/controllers/projects/commit_controller_spec.rb index a231b54419e7bc8adcaa318138ea73393c71822f..c650d145bef0c984cb815cffd7208c542bde4bf1 100644 --- a/spec/controllers/projects/commit_controller_spec.rb +++ b/spec/controllers/projects/commit_controller_spec.rb @@ -380,18 +380,6 @@ def merge_request_url(source_project, branch) expect(response).to have_gitlab_http_status(:not_found) end end - - context 'disable pick_into_project feature flag' do - before do - stub_feature_flags(pick_into_project: false) - end - - it 'does not cherry pick a commit from fork to upstream' do - send_request - - expect(project.commit('feature').message).not_to include(forked_project.commit.id) - end - end end end diff --git a/spec/features/projects/infrastructure_registry_spec.rb b/spec/features/projects/infrastructure_registry_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..9cab4ebeb3ad4496f4d7117d4659da1de9776b41 --- /dev/null +++ b/spec/features/projects/infrastructure_registry_spec.rb @@ -0,0 +1,61 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'Infrastructure Registry' do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project) } + + before do + sign_in(user) + project.add_maintainer(user) + end + + context 'when feature is not available' do + before do + stub_feature_flags(infrastructure_registry_page: false) + end + + it 'gives 404' do + visit_project_infrastructure_registry + + expect(status_code).to eq(404) + end + end + + context 'when feature is available', :js do + before do + visit_project_infrastructure_registry + end + + context 'when there are packages' do + let_it_be(:terraform_module) { create(:terraform_module_package, project: project, created_at: 1.day.ago, version: '1.0.0') } + let_it_be(:terraform_module2) { create(:terraform_module_package, project: project, created_at: 2.days.ago, version: '2.0.0') } + let_it_be(:packages) { [terraform_module, terraform_module2] } + + it_behaves_like 'packages list' + + context 'deleting a package' do + let_it_be(:project) { create(:project) } + let_it_be(:terraform_module) { create(:terraform_module_package, project: project) } + + it 'allows you to delete a module', :aggregate_failures do + # this is still using the package copy in the UI too + click_button('Remove package') + click_button('Delete package') + + expect(page).to have_content 'Package deleted successfully' + expect(page).not_to have_content(terraform_module.name) + end + end + end + + it 'displays the empty message' do + expect(page).to have_content('You have no Terraform modules in your project') + end + end + + def visit_project_infrastructure_registry + visit project_infrastructure_registry_index_path(project) + end +end diff --git a/spec/frontend/filtered_search/filtered_search_manager_spec.js b/spec/frontend/filtered_search/filtered_search_manager_spec.js index 465e1ee1ef1ae8ced9708ecb0fd292608fb3ef3a..c03c8f6c529a5b7233d6d54013ec0efcd707ea59 100644 --- a/spec/frontend/filtered_search/filtered_search_manager_spec.js +++ b/spec/frontend/filtered_search/filtered_search_manager_spec.js @@ -185,7 +185,7 @@ describe('Filtered Search Manager', () => { }); describe('search', () => { - const defaultParams = '?scope=all&utf8=%E2%9C%93'; + const defaultParams = '?scope=all'; const defaultState = '&state=opened'; it('should search with a single word', (done) => { diff --git a/spec/frontend/incidents/components/incidents_list_spec.js b/spec/frontend/incidents/components/incidents_list_spec.js index c7286d70b9460e7f0506d8052d476f9cff312fa5..8d4ccab2a409df45cae6a37302cce7c8eb0ef28f 100644 --- a/spec/frontend/incidents/components/incidents_list_spec.js +++ b/spec/frontend/incidents/components/incidents_list_spec.js @@ -43,12 +43,10 @@ describe('Incidents List', () => { const findLoader = () => wrapper.find(GlLoadingIcon); const findTimeAgo = () => wrapper.findAll(TimeAgoTooltip); const findAssignees = () => wrapper.findAll('[data-testid="incident-assignees"]'); - const findIncidentSlaHeader = () => wrapper.find('[data-testid="incident-management-sla"]'); const findCreateIncidentBtn = () => wrapper.find('[data-testid="createIncidentBtn"]'); const findClosedIcon = () => wrapper.findAll("[data-testid='incident-closed']"); const findEmptyState = () => wrapper.find(GlEmptyState); const findSeverity = () => wrapper.findAll(SeverityToken); - const findIncidentSla = () => wrapper.findAll("[data-testid='incident-sla']"); function mountComponent({ data = {}, loading = false, provide = {} } = {}) { wrapper = mount(IncidentsList, { @@ -188,35 +186,6 @@ describe('Incidents List', () => { joinPaths(`/project/issues/incident`, mockIncidents[0].iid), ); }); - - describe('Incident SLA field', () => { - it('displays the column when the feature is available', () => { - mountComponent({ - data: { incidents: { list: mockIncidents } }, - provide: { slaFeatureAvailable: true }, - }); - - expect(findIncidentSlaHeader().text()).toContain('Time to SLA'); - }); - - it('does not display the column when the feature is not available', () => { - mountComponent({ - data: { incidents: { list: mockIncidents } }, - provide: { slaFeatureAvailable: false }, - }); - - expect(findIncidentSlaHeader().exists()).toBe(false); - }); - - it('renders an SLA for each incident', () => { - mountComponent({ - data: { incidents: { list: mockIncidents } }, - provide: { slaFeatureAvailable: true }, - }); - - expect(findIncidentSla().length).toBe(mockIncidents.length); - }); - }); }); describe('Create Incident', () => { diff --git a/spec/frontend/issues_list/components/issuables_list_app_spec.js b/spec/frontend/issues_list/components/issuables_list_app_spec.js index fe3d2114463b390b8eb9ffbd48da0f3abd5f2163..a7f3dd81517c117f51f1551ba5e6a414faf0921d 100644 --- a/spec/frontend/issues_list/components/issuables_list_app_spec.js +++ b/spec/frontend/issues_list/components/issuables_list_app_spec.js @@ -302,7 +302,6 @@ describe('Issuables list component', () => { my_reaction_emoji: 'airplane', scope: 'all', state: 'opened', - utf8: '✓', weight: '0', milestone: 'v3.0', labels: 'Aquapod,Astro', @@ -312,7 +311,7 @@ describe('Issuables list component', () => { describe('when page is not present in params', () => { const query = - '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&utf8=%E2%9C%93&weight=0¬[label_name][]=Afterpod¬[milestone_title][]=13'; + '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&weight=0¬[label_name][]=Afterpod¬[milestone_title][]=13'; beforeEach(() => { setUrl(query); @@ -356,7 +355,7 @@ describe('Issuables list component', () => { describe('when page is present in the param', () => { const query = - '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&utf8=%E2%9C%93&weight=0&page=3'; + '?assignee_username=root&author_username=root&confidential=yes&label_name%5B%5D=Aquapod&label_name%5B%5D=Astro&milestone_title=v3.0&my_reaction_emoji=airplane&scope=all&sort=priority&state=opened&weight=0&page=3'; beforeEach(() => { setUrl(query); diff --git a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js index 3a0e899ada3c2f1d2e74720d2e12d58c814aed83..79a0ab006dae61d33ee322e71b6179d2e49bb7bb 100644 --- a/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js +++ b/spec/frontend/pages/projects/forks/new/components/fork_form_spec.js @@ -261,7 +261,7 @@ describe('ForkForm component', () => { }); describe('onSubmit', () => { - beforeEach(() => { + const setupComponent = (fields = {}) => { jest.spyOn(urlUtility, 'redirectTo').mockImplementation(); mockGetRequest(); @@ -271,9 +271,14 @@ describe('ForkForm component', () => { namespaces: MOCK_NAMESPACES_RESPONSE, form: { state: true, + ...fields, }, }, ); + }; + + beforeEach(() => { + setupComponent(); }); const selectedMockNamespaceIndex = 1; @@ -305,6 +310,23 @@ describe('ForkForm component', () => { expect(urlUtility.redirectTo).not.toHaveBeenCalled(); }); + + it('does not make POST request if no visbility is checked', async () => { + jest.spyOn(axios, 'post'); + + setupComponent({ + fields: { + visibility: { + value: null, + }, + }, + }); + + await submitForm(); + + expect(wrapper.find('[name="visibility"]:checked').exists()).toBe(false); + expect(axios.post).not.toHaveBeenCalled(); + }); }); describe('with valid form', () => { diff --git a/spec/frontend/projects/commit/components/form_modal_spec.js b/spec/frontend/projects/commit/components/form_modal_spec.js index 9688cb47799611d281b4e951bd6c24f3b6325e98..0c8089430d08000fdc58094a33fec22a13ceca3e 100644 --- a/spec/frontend/projects/commit/components/form_modal_spec.js +++ b/spec/frontend/projects/commit/components/form_modal_spec.js @@ -159,12 +159,7 @@ describe('CommitFormModal', () => { }); it('Changes the target_project_id input value', async () => { - createComponent( - shallowMount, - {}, - { glFeatures: { pickIntoProject: true } }, - { isCherryPick: true }, - ); + createComponent(shallowMount, {}, {}, { isCherryPick: true }); findProjectsDropdown().vm.$emit('selectProject', '_changed_project_value_'); await wrapper.vm.$nextTick(); diff --git a/spec/frontend/tracking_spec.js b/spec/frontend/tracking_spec.js index 9d60f9232ebb9990b4ad5080727f16efbf9be43a..ac1bb57d7da7e2127dc2f6bf923260b08a2bb649 100644 --- a/spec/frontend/tracking_spec.js +++ b/spec/frontend/tracking_spec.js @@ -232,7 +232,7 @@ describe('Tracking', () => { Tracking.bindDocument('_category_'); // only happens once setHTMLFixture(` <input data-track-${term}="click_input1" data-track-label="_label_" value="_value_"/> - <input data-track-${term}="click_input2" data-track-value="_value_override_" value="_value_"/> + <input data-track-${term}="click_input2" data-track-value="_value_override_" value=0/> <input type="checkbox" data-track-${term}="toggle_checkbox" value="_value_" checked/> <input class="dropdown" data-track-${term}="toggle_dropdown"/> <div data-track-${term}="nested_event"><span class="nested"></span></div> @@ -272,7 +272,7 @@ describe('Tracking', () => { checkbox.click(); // unchecking expect(eventSpy).toHaveBeenCalledWith('_category_', 'toggle_checkbox', { - value: false, + value: 0, }); checkbox.click(); // checking diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb index 01493b0bad907f25336e77d09c6373ea7979b8ce..4e94636ba45cd072a58a70af3430d6316030baae 100644 --- a/spec/helpers/commits_helper_spec.rb +++ b/spec/helpers/commits_helper_spec.rb @@ -205,16 +205,6 @@ { id: forked_project.id.to_s, name: forked_project.full_path, refsUrl: refs_project_path(forked_project) } ]) end - - context 'pick_into_project is disabled' do - before do - stub_feature_flags(pick_into_project: false) - end - - it 'does not calculate target projects' do - expect(helper.cherry_pick_projects_data(project)).to eq([]) - end - end end describe "#commit_options_dropdown_data" do diff --git a/spec/lib/gitlab/path_regex_spec.rb b/spec/lib/gitlab/path_regex_spec.rb index 957a680189ec81dd7280d7b564f282fd5e1858e8..54c866b4a6d28a4b1c572e6658d7dcd6ce43f03a 100644 --- a/spec/lib/gitlab/path_regex_spec.rb +++ b/spec/lib/gitlab/path_regex_spec.rb @@ -113,7 +113,7 @@ def failure_message(constant_name, migration_helper, missing_words: [], addition let(:deprecated_routes) do # profile was deprecated in https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51646 - %w(profile) + %w(profile s) end let(:ee_top_level_words) do diff --git a/spec/routing/project_routing_spec.rb b/spec/routing/project_routing_spec.rb index 43d7c31d87f6937d25d7b576469429d28937ab47..fe04a1d7c4a63af6a37101eac0baa4d2f486a3d5 100644 --- a/spec/routing/project_routing_spec.rb +++ b/spec/routing/project_routing_spec.rb @@ -320,9 +320,11 @@ expect(get('/gitlab/gitlabhq/-/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') end - it 'to #show from unscope routing' do - expect(get('/gitlab/gitlabhq/snippets/1')).to route_to('projects/snippets#show', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') + it 'to #raw from unscope routing' do + expect(get('/gitlab/gitlabhq/snippets/1/raw')).to route_to('projects/snippets#raw', namespace_id: 'gitlab', project_id: 'gitlabhq', id: '1') end + + it_behaves_like 'redirecting a legacy path', '/gitlab/gitlabhq/snippets/1', '/gitlab/gitlabhq/-/snippets/1' end # test_project_hook POST /:project_id/-/hooks/:id/test(.:format) hooks#test diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb index 69c0ae7a945e85b5b0b8402352c8cffa65b237e9..4d95d5631e422725912f74ce7e60d2e987936da3 100644 --- a/spec/routing/routing_spec.rb +++ b/spec/routing/routing_spec.rb @@ -96,9 +96,11 @@ expect(get("/-/snippets/1")).to route_to('snippets#show', id: '1') end - it 'to #show from unscoped routing' do - expect(get("/snippets/1")).to route_to('snippets#show', id: '1') + it 'to #raw from unscoped routing' do + expect(get("/snippets/1/raw")).to route_to('snippets#raw', id: '1') end + + it_behaves_like 'redirecting a legacy path', '/snippets/1', '/-/snippets/1' end # help GET /help(.:format) help#index diff --git a/spec/services/projects/destroy_service_spec.rb b/spec/services/projects/destroy_service_spec.rb index ff582279d717a8c37f53a60bec33d37b94785529..c6b2b1e2b21730e596813da3c4da89270b9e0af6 100644 --- a/spec/services/projects/destroy_service_spec.rb +++ b/spec/services/projects/destroy_service_spec.rb @@ -447,23 +447,6 @@ it_behaves_like 'handles errors thrown during async destroy', "Failed to remove webhooks" end - - context 'when "destroy_webhooks_before_the_project" flag is disabled' do - before do - stub_feature_flags(destroy_webhooks_before_the_project: false) - end - - it 'does not call WebHooks::DestroyService' do - expect(WebHooks::DestroyService).not_to receive(:new) - - expect do - destroy_project(project, user) - end.to change(WebHook, :count).by(-2) - .and change(WebHookLog, :count).by(-1) - - expect(another_project_web_hook.reload).to be - end - end end context 'error while destroying', :sidekiq_inline do diff --git a/vendor/Dockerfile/OpenJDK-alpine.Dockerfile b/vendor/Dockerfile/OpenJDK-alpine.Dockerfile deleted file mode 100644 index ee853d9cfd26f798b4b2901a2c0095930b3b91dc..0000000000000000000000000000000000000000 --- a/vendor/Dockerfile/OpenJDK-alpine.Dockerfile +++ /dev/null @@ -1,8 +0,0 @@ -FROM openjdk:8-alpine - -COPY . /usr/src/myapp -WORKDIR /usr/src/myapp - -RUN javac Main.java - -CMD ["java", "Main"]