From 1e62780b8cf2b268f1e282759d393a39cbd3113d Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 20 Sep 2024 12:10:46 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- CHANGELOG.md | 8 + GITALY_SERVER_VERSION | 2 +- GITLAB_KAS_VERSION | 2 +- Gemfile.checksum | 2 +- Gemfile.lock | 2 +- Gemfile.next.checksum | 2 +- Gemfile.next.lock | 2 +- .../filtered_search/visual_token_value.js | 2 +- .../oauth_domain_mismatch_error.vue | 29 +++- .../members/components/table/drawer/utils.js | 2 +- .../components/merge_requests_list_app.vue | 45 ++++++ .../javascripts/merge_requests/list/index.js | 2 + .../queries/merge_request.fragment.graphql | 4 + .../list/components/issuable_item.vue | 17 ++- .../page_bundles/merge_request.scss | 20 --- app/helpers/merge_requests_helper.rb | 3 +- app/models/ci/catalog/resources/version.rb | 3 +- app/policies/project_policy.rb | 1 + app/policies/release_policy.rb | 1 + .../ci/catalog/resources/release_service.rb | 29 +++- .../versions/build_components_service.rb | 8 +- .../resources/versions/create_service.rb | 11 +- app/views/admin/applications/index.html.haml | 2 +- .../background_migrations/index.html.haml | 2 +- app/views/admin/dashboard/index.html.haml | 10 +- .../admin/dev_ops_report/_score.html.haml | 2 +- app/views/admin/groups/_form.html.haml | 2 +- app/views/admin/groups/show.html.haml | 4 +- app/views/admin/health_check/show.html.haml | 2 +- app/views/admin/projects/show.html.haml | 4 +- app/views/admin/topics/_form.html.haml | 2 +- .../clusters/agents/dashboard/index.html.haml | 2 +- .../clusters/_advanced_settings.html.haml | 2 +- .../clusters/_deprecation_alert.html.haml | 2 +- .../_multiple_clusters_message.html.haml | 2 +- .../clusters/clusters/_namespace.html.haml | 2 +- .../clusters/_provider_details_form.html.haml | 4 +- .../_cloud_provider_selector.html.haml | 6 +- app/views/clusters/clusters/show.html.haml | 8 +- .../clusters/clusters/user/_form.html.haml | 8 +- app/views/dashboard/todos/index.html.haml | 2 +- app/views/explore/groups/index.html.haml | 2 +- .../groups/_group_admin_settings.html.haml | 4 +- app/views/groups/_home_panel.html.haml | 2 +- ...roup_from_another_instance_panel.html.haml | 8 +- .../_import_group_from_file_panel.html.haml | 4 +- .../groups/_invite_members_modal.html.haml | 2 +- app/views/groups/_new_group_fields.html.haml | 2 +- app/views/groups/edit.html.haml | 4 +- app/views/groups/milestones/_form.html.haml | 2 +- app/views/groups/milestones/index.html.haml | 4 +- .../registry/repositories/index.html.haml | 10 +- app/views/groups/settings/_advanced.html.haml | 2 +- app/views/groups/settings/_export.html.haml | 2 +- app/views/groups/settings/_lfs.html.haml | 2 +- .../groups/settings/_remove_button.html.haml | 2 +- app/views/groups/settings/_transfer.html.haml | 4 +- .../ci_cd/_auto_devops_form.html.haml | 2 +- .../groups/settings/ci_cd/_form.html.haml | 2 +- .../groups/settings/ci_cd/show.html.haml | 4 +- .../import/bulk_imports/history.html.haml | 2 +- app/views/import/github/new.html.haml | 2 +- app/views/import/manifest/_form.html.haml | 2 +- .../source_users/_accept_invite.html.haml | 2 +- .../source_users/_invalid_invite.html.haml | 2 +- .../source_users/_reject_invite.html.haml | 2 +- app/views/import/source_users/show.html.haml | 2 +- app/views/profiles/accounts/show.html.haml | 4 +- .../notifications/_group_settings.html.haml | 2 +- .../notifications/_project_settings.html.haml | 2 +- .../profiles/notifications/show.html.haml | 2 +- app/views/profiles/preferences/show.html.haml | 14 +- .../_empty_git_instructions.html.haml | 2 +- app/views/projects/_export.html.haml | 2 +- .../projects/_import_project_pane.html.haml | 2 +- .../projects/_invite_members_modal.html.haml | 2 +- .../_lfs_misconfiguration_banner.html.haml | 2 +- .../projects/_new_project_fields.html.haml | 6 +- .../projects/_service_desk_settings.html.haml | 2 +- app/views/projects/_transfer.html.haml | 4 +- .../blob/viewers/_gitlab_ci_yml.html.haml | 2 +- .../viewers/_gitlab_ci_yml_loading.html.haml | 2 +- .../blob/viewers/_route_map.html.haml | 2 +- .../blob/viewers/_route_map_loading.html.haml | 2 +- .../_branch_names_fields.html.haml | 2 +- .../_default_branch_fields.html.haml | 4 +- app/views/projects/ci/lints/show.html.haml | 2 +- .../commit/_signature_badge.html.haml | 6 +- app/views/projects/edit.html.haml | 10 +- app/views/projects/empty.html.haml | 4 +- .../projects/environments/index.html.haml | 2 +- .../projects/feature_flags/index.html.haml | 6 +- .../projects/feature_flags/new.html.haml | 4 +- .../feature_flags_user_lists/edit.html.haml | 2 +- .../feature_flags_user_lists/index.html.haml | 2 +- .../feature_flags_user_lists/new.html.haml | 2 +- app/views/projects/forks/new.html.haml | 2 +- .../_alert_moved_from_service_desk.html.haml | 2 +- .../issues/_design_management.html.haml | 2 +- .../projects/issues/_new_branch.html.haml | 2 +- .../projects/issues/_related_issues.html.haml | 2 +- .../projects/issues/service_desk.html.haml | 2 +- .../projects/maintenance/_cleanup.html.haml | 2 +- .../maintenance/_remove_blobs.html.haml | 2 +- .../projects/maintenance/_show.html.haml | 2 +- .../projects/merge_requests/_page.html.haml | 2 +- .../projects/merge_requests/_widget.html.haml | 8 +- .../projects/merge_requests/index.html.haml | 4 +- app/views/projects/milestones/_form.html.haml | 2 +- .../projects/mirrors/_branch_filter.html.haml | 2 +- .../projects/mirrors/_mirror_repos.html.haml | 2 +- .../mirrors/_mirror_repos_push.html.haml | 2 +- app/views/projects/new.html.haml | 2 +- app/views/projects/pages/_access.html.haml | 2 +- app/views/projects/pages/_header.html.haml | 2 +- .../projects/pages/_pages_settings.html.haml | 4 +- .../pages/_ssl_limitations_warning.html.haml | 2 +- app/views/projects/pages/_use.html.haml | 2 +- .../pages_domains/_certificate.html.haml | 2 +- .../projects/pages_domains/_dns.html.haml | 2 +- .../pages_domains/_helper_text.html.haml | 2 +- .../shared/_create_protected_tag.html.haml | 2 +- .../protected_tags/shared/_index.html.haml | 4 +- .../projects/runners/_group_runners.html.haml | 2 +- .../runners/_project_runners.html.haml | 2 +- .../projects/settings/_archive.html.haml | 4 +- .../settings/_branch_rules_callout.html.haml | 2 +- .../settings/ci_cd/_autodevops_form.html.haml | 12 +- .../projects/settings/ci_cd/_form.html.haml | 20 +-- .../projects/settings/ci_cd/show.html.haml | 12 +- .../settings/integrations/index.html.haml | 2 +- ...ge_request_merge_commit_template.html.haml | 2 +- ...ge_request_merge_method_settings.html.haml | 4 +- ...quest_merge_suggestions_settings.html.haml | 2 +- ...e_request_squash_commit_template.html.haml | 2 +- ..._request_squash_options_settings.html.haml | 2 +- .../operations/_alert_management.html.haml | 2 +- .../operations/_error_tracking.html.haml | 2 +- ...od_in_terraform_state_name_alert.html.haml | 2 +- app/views/projects/triggers/_index.html.haml | 2 +- .../projects/usage_quotas/index.html.haml | 2 +- .../shared/_index.html.haml | 6 +- .../shared/_auto_devops_callout.html.haml | 2 +- ...devops_implicitly_enabled_banner.html.haml | 2 +- app/views/shared/_custom_attributes.html.haml | 2 +- ...fault_branch_protection_defaults.html.haml | 2 +- app/views/shared/_outdated_browser.html.haml | 2 +- ...ation_features_discovery_message.html.haml | 2 +- .../shared/_service_ping_consent.html.haml | 2 +- .../shared/_silent_mode_banner.html.haml | 2 +- .../shared/_token_expiration_banner.html.haml | 2 +- app/views/shared/_visibility_level.html.haml | 2 +- app/views/shared/deploy_keys/_form.html.haml | 2 +- app/views/shared/deploy_keys/_index.html.haml | 2 +- .../deploy_keys/_project_group_form.html.haml | 2 +- .../shared/deploy_tokens/_form.html.haml | 2 +- .../shared/deploy_tokens/_table.html.haml | 2 +- .../shared/empty_states/_issues.html.haml | 2 +- .../shared/empty_states/_milestones.html.haml | 2 +- .../empty_states/_milestones_tab.html.haml | 2 +- .../shared/empty_states/_snippets.html.haml | 2 +- app/views/shared/file_hooks/_index.html.haml | 2 +- .../form_elements/_description.html.haml | 4 +- app/views/shared/hook_logs/_index.html.haml | 2 +- ..._notifications_deprecation_alert.html.haml | 4 +- .../gitlab_slack_application/_help.html.haml | 2 +- .../_slack_integration_form.html.haml | 2 +- .../_detailed_help.html.haml | 4 +- .../mattermost_slash_commands/_help.html.haml | 2 +- .../shared/integrations/slack/_help.haml | 2 +- .../slack_slash_commands/_help.html.haml | 2 +- .../issuable/_user_dropdown_item.html.haml | 2 +- .../issuable/form/_contribution.html.haml | 2 +- .../form/_default_templates.html.haml | 2 +- .../issuable/form/_merge_params.html.haml | 4 +- .../issuable/form/_type_selector.html.haml | 2 +- app/views/shared/notes/_hints.html.haml | 2 +- .../shared/packages/_no_packages.html.haml | 2 +- ..._inactive_project_deletion_alert.html.haml | 2 +- .../promotions/_promote_servicedesk.html.haml | 2 +- .../runners/_runner_description.html.haml | 2 +- .../_shared_runners_description.html.haml | 2 +- app/views/shared/snippets/_form.html.haml | 2 +- app/views/shared/web_hooks/_form.html.haml | 6 +- .../shared/web_hooks/_hook_errors.html.haml | 2 +- .../_web_hook_disabled_alert.html.haml | 2 +- .../user_settings/gpg_keys/index.html.haml | 2 +- .../profiles/_email_settings.html.haml | 2 +- .../profiles/_private_profile.html.haml | 2 +- .../user_settings/ssh_keys/index.html.haml | 2 +- app/views/users/_deletion_guidance.html.haml | 2 +- config/sidekiq_queues.yml | 4 + .../vulnerability_management_policy_rules.yml | 12 ++ ...e_vulnerability_management_policy_rules.rb | 36 +++++ db/schema_migrations/20240826074352 | 1 + db/structure.sql | 35 +++++ doc/development/ai_features/index.md | 6 +- lib/api/api.rb | 1 + lib/api/ci/catalog.rb | 45 ++++++ .../entities/ci/catalog/resources/version.rb | 21 +++ lib/api/entities/ml/mlflow/model_version.rb | 6 +- .../entities/ml/mlflow/registered_model.rb | 1 + lib/system_check/gitlab_shell_check.rb | 2 +- locale/gitlab.pot | 78 +++++++++- .../admin_sees_background_migrations_spec.rb | 2 +- spec/features/dashboard/snippets_spec.rb | 2 +- spec/features/issues/service_desk_spec.rb | 6 +- .../settings/branch_rules_callout_spec.rb | 2 +- .../components/table/drawer/utils_spec.js | 4 +- .../merge_requests_list_app_spec.js | 57 ++++++++ .../frontend/merge_requests/list/mock_data.js | 4 + spec/helpers/merge_requests_helper_spec.rb | 3 +- spec/policies/project_policy_spec.rb | 20 +++ spec/policies/release_policy_spec.rb | 2 + spec/requests/api/ci/catalog_spec.rb | 138 ++++++++++++++++++ .../api/ml/mlflow/model_versions_spec.rb | 9 +- .../api/ml/mlflow/registered_models_spec.rb | 2 +- .../catalog/resources/release_service_spec.rb | 41 ++++-- .../versions/build_components_service_spec.rb | 25 +++- .../resources/versions/create_service_spec.rb | 58 ++++---- .../profiles/show.html.haml_spec.rb | 4 +- workhorse/go.mod | 10 +- workhorse/go.sum | 20 +-- 223 files changed, 974 insertions(+), 386 deletions(-) create mode 100644 db/docs/vulnerability_management_policy_rules.yml create mode 100644 db/migrate/20240826074352_create_vulnerability_management_policy_rules.rb create mode 100644 db/schema_migrations/20240826074352 create mode 100644 lib/api/ci/catalog.rb create mode 100644 lib/api/entities/ci/catalog/resources/version.rb create mode 100644 spec/requests/api/ci/catalog_spec.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 13b1c5d85af..c3875be4a83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8772,6 +8772,10 @@ No changes. - [Move export buttons next to each other](gitlab-org/gitlab@106bea7a6246cd153cf66d133936a09d46369ae3) ([merge request](gitlab-org/gitlab!137461)) +## 16.6.10 (2024-09-20) + +No changes. + ## 16.6.9 (2024-07-23) ### Added (1 change) @@ -9421,6 +9425,10 @@ No changes. - [Remove pubsub migration helper for actioncable](gitlab-org/gitlab@763ca1305db6f1c9cf6700b8497494a81926d742) ([merge request](gitlab-org/gitlab!133066)) - [Use partitioned table for CommitStatus](gitlab-org/gitlab@063826e042778995fae13928a2fb5de2c8855b45) ([merge request](gitlab-org/gitlab!134489)) +## 16.5.10 (2024-09-20) + +No changes. + ## 16.5.9 (2024-07-23) ### Added (1 change) diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index c5510a0643d..63bd9419d61 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -9bfa8f596beb1e4bc81fa1e0f17e75eb1fc655c5 +51d4445997817e7a637db4e5acbce16f991ccf8a diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION index 40e0480978a..41c96cd4e4b 100644 --- a/GITLAB_KAS_VERSION +++ b/GITLAB_KAS_VERSION @@ -1 +1 @@ -73ca3ba951fb8125308d5dcf467a67e2d6047ceb +ec645429780cc7695efd55bf28f14e4d317bbb6c diff --git a/Gemfile.checksum b/Gemfile.checksum index 7544097c5a5..9a832b189e9 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -617,7 +617,7 @@ {"name":"rubocop-rspec","version":"2.27.1","platform":"ruby","checksum":"2f27ce04700be75db65afe83d7993a36e0fafd07ec062222f4b3cc10137a7a9e"}, {"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"}, {"name":"ruby-lsp","version":"0.17.15","platform":"ruby","checksum":"c7c6f1dc793713bfefe2ed818ac3a5e4aae4a44c03978f7cc526b8c5002b7e57"}, -{"name":"ruby-lsp-rails","version":"0.3.14","platform":"ruby","checksum":"71891e91acc3f00b86a4040b9cfa581777be4460090ffe64c06fef6ed28f3a92"}, +{"name":"ruby-lsp-rails","version":"0.3.15","platform":"ruby","checksum":"415cbaa4c4c98b78aec4753b1d4ac332a1874a7727ff4c69cb28ebeb60f34e64"}, {"name":"ruby-lsp-rspec","version":"0.1.12","platform":"ruby","checksum":"34fe775e27dc4c2f31df901f3d44ee885ed0806b05ba9be0ea564682dd4811e5"}, {"name":"ruby-magic","version":"0.6.0","platform":"ruby","checksum":"7b2138877b7d23aff812c95564eba6473b74b815ef85beb0eb792e729a2b6101"}, {"name":"ruby-openai","version":"3.7.0","platform":"ruby","checksum":"fb735d4c055e282ade264cab9864944c05a8a10e0cddd45a0551e8a9851b1850"}, diff --git a/Gemfile.lock b/Gemfile.lock index af90d4acb5a..77b8f4cfafe 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1652,7 +1652,7 @@ GEM prism (>= 0.29.0, < 0.31) rbs (>= 3, < 4) sorbet-runtime (>= 0.5.10782) - ruby-lsp-rails (0.3.14) + ruby-lsp-rails (0.3.15) ruby-lsp (>= 0.17.12, < 0.18.0) ruby-lsp-rspec (0.1.12) ruby-lsp (~> 0.17.0) diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index 92230c026df..8bc64605f24 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -630,7 +630,7 @@ {"name":"rubocop-rspec","version":"2.27.1","platform":"ruby","checksum":"2f27ce04700be75db65afe83d7993a36e0fafd07ec062222f4b3cc10137a7a9e"}, {"name":"ruby-fogbugz","version":"0.3.0","platform":"ruby","checksum":"5e04cde474648f498a71cf1e1a7ab42c66b953862fbe224f793ec0a7a1d5f657"}, {"name":"ruby-lsp","version":"0.17.15","platform":"ruby","checksum":"c7c6f1dc793713bfefe2ed818ac3a5e4aae4a44c03978f7cc526b8c5002b7e57"}, -{"name":"ruby-lsp-rails","version":"0.3.14","platform":"ruby","checksum":"71891e91acc3f00b86a4040b9cfa581777be4460090ffe64c06fef6ed28f3a92"}, +{"name":"ruby-lsp-rails","version":"0.3.15","platform":"ruby","checksum":"415cbaa4c4c98b78aec4753b1d4ac332a1874a7727ff4c69cb28ebeb60f34e64"}, {"name":"ruby-lsp-rspec","version":"0.1.12","platform":"ruby","checksum":"34fe775e27dc4c2f31df901f3d44ee885ed0806b05ba9be0ea564682dd4811e5"}, {"name":"ruby-magic","version":"0.6.0","platform":"ruby","checksum":"7b2138877b7d23aff812c95564eba6473b74b815ef85beb0eb792e729a2b6101"}, {"name":"ruby-openai","version":"3.7.0","platform":"ruby","checksum":"fb735d4c055e282ade264cab9864944c05a8a10e0cddd45a0551e8a9851b1850"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index a1fa3a4a32f..2fc0d79838b 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -1678,7 +1678,7 @@ GEM prism (>= 0.29.0, < 0.31) rbs (>= 3, < 4) sorbet-runtime (>= 0.5.10782) - ruby-lsp-rails (0.3.14) + ruby-lsp-rails (0.3.15) ruby-lsp (>= 0.17.12, < 0.18.0) ruby-lsp-rspec (0.1.12) ruby-lsp (~> 0.17.0) diff --git a/app/assets/javascripts/filtered_search/visual_token_value.js b/app/assets/javascripts/filtered_search/visual_token_value.js index 7a27d2dae5e..25f88d23f37 100644 --- a/app/assets/javascripts/filtered_search/visual_token_value.js +++ b/app/assets/javascripts/filtered_search/visual_token_value.js @@ -50,7 +50,7 @@ export default class VisualTokenValue { tokenValueContainer.dataset.originalValue = tokenValue; // eslint-disable-next-line no-unsanitized/property tokenValueElement.innerHTML = ` - + ${escape(user.name)} `; /* eslint-enable no-param-reassign */ diff --git a/app/assets/javascripts/ide/components/oauth_domain_mismatch_error.vue b/app/assets/javascripts/ide/components/oauth_domain_mismatch_error.vue index cd04adca2f2..4c272c481b0 100644 --- a/app/assets/javascripts/ide/components/oauth_domain_mismatch_error.vue +++ b/app/assets/javascripts/ide/components/oauth_domain_mismatch_error.vue @@ -1,13 +1,15 @@ @@ -287,13 +296,13 @@ export default { :class="{ closed: issuable.closedAt, 'gl-bg-blue-50': isActive, - 'gl-cursor-pointer': preventRedirect, - 'hover:gl-bg-subtle': preventRedirect && !isActive, + 'gl-cursor-pointer': preventRedirect && !showCheckbox, + 'hover:gl-bg-subtle': preventRedirect && !isActive && !showCheckbox, }" :data-labels="labelIdsString" :data-qa-issue-id="issuableId" data-testid="issuable-item-wrapper" - @click="handleIssuableItemClick" + @click="handleRowClick" > e + # In Rails 7.1, we'll have a better way to handle this error; https://github.com/rails/rails/pull/49100 + # Ci::Catalog::Resources::Component: `enum resource_type: { template: 1 }, validate: true` + error(e.message) end def error(message) diff --git a/app/services/ci/catalog/resources/versions/create_service.rb b/app/services/ci/catalog/resources/versions/create_service.rb index 45ec08cd4d5..9eff3e84b99 100644 --- a/app/services/ci/catalog/resources/versions/create_service.rb +++ b/app/services/ci/catalog/resources/versions/create_service.rb @@ -5,11 +5,11 @@ module Ci module Resources module Versions class CreateService - def initialize(release, user, components_data) + def initialize(release, user, metadata) @release = release @user = user @project = release.project - @components_data = components_data + @metadata = metadata @errors = [] end @@ -19,7 +19,7 @@ module Ci publish(version) if errors.empty? - ServiceResponse.success + ServiceResponse.success(payload: { version: version }) else ServiceResponse.error(message: errors.flatten.first(10).join(', ')) end @@ -27,7 +27,7 @@ module Ci private - attr_reader :project, :errors, :release, :user, :components_data + attr_reader :project, :errors, :release, :user, :metadata def build_catalog_resource_version return error('Project is not a catalog resource') unless project.catalog_resource @@ -48,7 +48,8 @@ module Ci def build_components(version) return if errors.present? - response = BuildComponentsService.new(release, version, components_data).execute + # metadata is passed as `nil` from the `Releases::CreateService`. + response = BuildComponentsService.new(release, version, metadata.try(:[], :components)).execute if response.success? version.components = response.payload diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml index 1302a50adf0..5fcb3dfb526 100644 --- a/app/views/admin/applications/index.html.haml +++ b/app/views/admin/applications/index.html.haml @@ -21,7 +21,7 @@ count: @applications.size, options: { class: 'gl-mt-5', data: { testid: 'oauth-applications' } }) do |c| - c.with_description do - - docs_link_path = help_page_path('integration/oauth_provider') + - docs_link_path = help_page_path('integration/oauth_provider.md') - docs_link_start = ''.html_safe % { url: docs_link_path } = s_('AdminArea|Manage applications for your instance that can use GitLab as an %{docs_link_start}OAuth provider%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: ''.html_safe } - c.with_actions do diff --git a/app/views/admin/background_migrations/index.html.haml b/app/views/admin/background_migrations/index.html.haml index a287a7d08a9..e0df7de13b4 100644 --- a/app/views/admin/background_migrations/index.html.haml +++ b/app/views/admin/background_migrations/index.html.haml @@ -1,6 +1,6 @@ - page_title s_('BackgroundMigrations|Background migrations') - @breadcrumb_link = admin_background_migrations_path(database: params[:database]) -- learnmore_link = help_page_path('update/background_migrations') +- learnmore_link = help_page_path('update/background_migrations.md') - learnmore_link_start = ''.html_safe % { url: learnmore_link } - page_description = html_escape(s_('BackgroundMigrations|Background migrations are used to perform data migrations when a migration exceeds the time limits set by GitLab. %{linkStart}Learn more%{linkEnd}')) % { linkStart: learnmore_link_start, linkEnd: ''.html_safe } diff --git a/app/views/admin/dashboard/index.html.haml b/app/views/admin/dashboard/index.html.haml index 35b34db9ca7..930ee2aedc4 100644 --- a/app/views/admin/dashboard/index.html.haml +++ b/app/views/admin/dashboard/index.html.haml @@ -1,6 +1,6 @@ - breadcrumb_title _("Dashboard") - page_title _("Dashboard") -- billable_users_url = help_page_path('subscriptions/self_managed/index', anchor: 'billable-users') +- billable_users_url = help_page_path('subscriptions/self_managed/index.md', anchor: 'billable-users') - billable_users_link_start = ''.html_safe % { url: billable_users_url } = render_if_exists 'shared/manual_quarterly_reconciliation_banner' @@ -87,7 +87,7 @@ = feature_entry(_('LDAP'), enabled: Gitlab.config.ldap.enabled, - doc_href: help_page_path('administration/auth/ldap/index')) + doc_href: help_page_path('administration/auth/ldap/index.md')) = feature_entry(_('Gravatar'), href: general_admin_application_settings_path(anchor: 'js-account-settings'), @@ -96,18 +96,18 @@ = feature_entry(_('OmniAuth'), href: general_admin_application_settings_path(anchor: 'js-signin-settings'), enabled: Gitlab::Auth.omniauth_enabled?, - doc_href: help_page_path('integration/omniauth')) + doc_href: help_page_path('integration/omniauth.md')) = feature_entry(_('Reply by email'), enabled: Gitlab::Email::IncomingEmail.enabled?, - doc_href: help_page_path('administration/reply_by_email')) + doc_href: help_page_path('administration/reply_by_email.md')) = render_if_exists 'admin/dashboard/elastic_and_geo' = feature_entry(_('Container Registry'), href: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), enabled: Gitlab.config.registry.enabled, - doc_href: help_page_path('user/packages/container_registry/index')) + doc_href: help_page_path('user/packages/container_registry/index.md')) = feature_entry(_('GitLab Pages'), enabled: Gitlab.config.pages.enabled, diff --git a/app/views/admin/dev_ops_report/_score.html.haml b/app/views/admin/dev_ops_report/_score.html.haml index 86065acc527..534bfa92cad 100644 --- a/app/views/admin/dev_ops_report/_score.html.haml +++ b/app/views/admin/dev_ops_report/_score.html.haml @@ -1,6 +1,6 @@ - service_ping_enabled = Gitlab::CurrentSettings.usage_ping_enabled - if !service_ping_enabled - #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/empty-state/empty-devops-md.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index') } } + #js-devops-service-ping-disabled{ data: { is_admin: current_user&.admin.to_s, empty_state_svg_path: image_path('illustrations/empty-state/empty-devops-md.svg'), enable_service_ping_path: metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), docs_link: help_page_path('development/internal_analytics/service_ping/index.md') } } - else #js-devops-score{ data: { devops_score_metrics: devops_score_metrics(@metric).to_json, no_data_image_path: image_path('illustrations/empty-state/empty-devops-md.svg'), devops_score_intro_image_path: image_path('illustrations/chart-bar-sm.svg') } } diff --git a/app/views/admin/groups/_form.html.haml b/app/views/admin/groups/_form.html.haml index f2432bf1333..5af731a4cab 100644 --- a/app/views/admin/groups/_form.html.haml +++ b/app/views/admin/groups/_form.html.haml @@ -4,7 +4,7 @@ - c.with_title { _('Naming, visibility') } - c.with_description do = _('Update your group name, description, avatar, and visibility.') - = link_to _('Learn more about groups.'), help_page_path('user/group/index') + = link_to _('Learn more about groups.'), help_page_path('user/group/index.md') - c.with_body do = render 'shared/groups/group_name_and_path_fields', f: f = render 'shared/group_form_description', f: f diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index 4cfde7124fc..7b8839720d0 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -50,7 +50,7 @@ .gl-col-span-2 %strong = group_lfs_status(@group) - = link_to sprite_icon('question-o', css_class: 'gl-text-blue-600'), help_page_path('topics/git/lfs/index') + = link_to sprite_icon('question-o', css_class: 'gl-text-blue-600'), help_page_path('topics/git/lfs/index.md') = render_if_exists 'namespaces/shared_runner_status', namespace: @group = render_if_exists 'namespaces/additional_minutes_status', namespace: @group @@ -98,7 +98,7 @@ icon: 'user', count: @group.users_count) do |c| - c.with_description do - - direct_members_link = link_to('', help_page_path('user/project/members/index', anchor: 'membership-types')) + - direct_members_link = link_to('', help_page_path('user/project/members/index.md', anchor: 'membership-types')) - direct_members_message = s_('The number of direct members in the current group. Members in subgroups are not included. %{link_start}What is a direct member%{link_end}?') - if @group.root? = safe_format(direct_members_message, tag_pair(direct_members_link, :link_start, :link_end)) diff --git a/app/views/admin/health_check/show.html.haml b/app/views/admin/health_check/show.html.haml index 0a72141c268..01af6bc9b94 100644 --- a/app/views/admin/health_check/show.html.haml +++ b/app/views/admin/health_check/show.html.haml @@ -13,7 +13,7 @@ = _("Reset token") -- help_url = help_page_path('administration/monitoring/health_check') +- help_url = help_page_path('administration/monitoring/health_check.md') - help_start = ''.html_safe % { url: help_url } %p.gl-mb-1= html_escape(s_('HealthCheck|Health information can be retrieved from the following endpoints. More information is available in the %{linkStart}health check documentation%{linkEnd}.')) % { linkStart: help_start, linkEnd: ''.html_safe } %ul.gl-mb-6 diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index 76e6cf56889..d4e65aa566d 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -106,7 +106,7 @@ = _('Git LFS status:') %strong = project_lfs_status(@project) - = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index') + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index.md') - else %li{ class: '!gl-px-5' } %span.light @@ -160,7 +160,7 @@ - else = _("This repository was last checked %{last_check_timestamp}. The check passed.") % { last_check_timestamp: @project.last_repository_check_at.to_fs(:medium) } - = link_to sprite_icon('question-o'), help_page_path('administration/repository_checks') + = link_to sprite_icon('question-o'), help_page_path('administration/repository_checks.md') .form-group = f.submit _('Trigger repository check'), pajamas_button: true diff --git a/app/views/admin/topics/_form.html.haml b/app/views/admin/topics/_form.html.haml index dd6583e55a6..b209c5969c0 100644 --- a/app/views/admin/topics/_form.html.haml +++ b/app/views/admin/topics/_form.html.haml @@ -19,7 +19,7 @@ .form-group = f.label :description, _("Description") .js-markdown-editor{ data: { render_markdown_path: preview_markdown_admin_topics_path, - markdown_docs_path: help_page_path('user/markdown'), + markdown_docs_path: help_page_path('user/markdown.md'), testid: 'topic-form-description', form_field_placeholder: _('Write a description…'), supports_quick_actions: 'false', diff --git a/app/views/clusters/agents/dashboard/index.html.haml b/app/views/clusters/agents/dashboard/index.html.haml index 00382166469..4a2f066c67a 100644 --- a/app/views/clusters/agents/dashboard/index.html.haml +++ b/app/views/clusters/agents/dashboard/index.html.haml @@ -6,7 +6,7 @@ primary_button_text: s_("KubernetesDashboard|View projects"), primary_button_link: dashboard_projects_path, secondary_button_text: s_("KubernetesDashboard|Learn more"), - secondary_button_link: help_page_path('ci/environments/kubernetes_dashboard')) do |c| + secondary_button_link: help_page_path('ci/environments/kubernetes_dashboard.md')) do |c| - c.with_description do = s_("KubernetesDashboard|You can select an agent from a project's environment page.") diff --git a/app/views/clusters/clusters/_advanced_settings.html.haml b/app/views/clusters/clusters/_advanced_settings.html.haml index 36cf4cd0abd..bb41b577127 100644 --- a/app/views/clusters/clusters/_advanced_settings.html.haml +++ b/app/views/clusters/clusters/_advanced_settings.html.haml @@ -30,7 +30,7 @@ selected: @cluster.management_project_id } } %p.text-muted.-gl-mt-5 = html_escape(s_('ClusterIntegration|A cluster management project can be used to run deployment jobs with Kubernetes %{code_open}cluster-admin%{code_close} privileges.')) % { code_open: ''.html_safe, code_close: ''.html_safe } - = link_to _('More information'), help_page_path('user/clusters/management_project'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/clusters/management_project.md'), target: '_blank', rel: 'noopener noreferrer' = field.submit _('Save changes'), pajamas_button: true .sub-section.form-group diff --git a/app/views/clusters/clusters/_deprecation_alert.html.haml b/app/views/clusters/clusters/_deprecation_alert.html.haml index cfc3418b1b5..4f35ba78cc6 100644 --- a/app/views/clusters/clusters/_deprecation_alert.html.haml +++ b/app/views/clusters/clusters/_deprecation_alert.html.haml @@ -2,6 +2,6 @@ - c.with_body do - link_start = ''.html_safe - issue_link_start = link_start % { url: 'https://gitlab.com/gitlab-org/configure/general/-/issues/199' } - - docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index') } + - docs_link_start = link_start % { url: help_page_path('user/clusters/agent/index.md') } - link_end = ''.html_safe = s_('ClusterIntegration|This process is %{issue_link_start}deprecated%{issue_link_end}. Use the %{docs_link_start}the GitLab agent for Kubernetes%{docs_link_end} instead.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end, issue_link_start: issue_link_start, issue_link_end: link_end } diff --git a/app/views/clusters/clusters/_multiple_clusters_message.html.haml b/app/views/clusters/clusters/_multiple_clusters_message.html.haml index 013f3c317df..028b0a9d6f6 100644 --- a/app/views/clusters/clusters/_multiple_clusters_message.html.haml +++ b/app/views/clusters/clusters/_multiple_clusters_message.html.haml @@ -1,4 +1,4 @@ -- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops') +- autodevops_help_url = help_page_path('topics/autodevops/multiple_clusters_auto_devops.md') - help_link_start = ''.html_safe - help_link_end = ''.html_safe diff --git a/app/views/clusters/clusters/_namespace.html.haml b/app/views/clusters/clusters/_namespace.html.haml index 9c20a409b18..34576b6e5af 100644 --- a/app/views/clusters/clusters/_namespace.html.haml +++ b/app/views/clusters/clusters/_namespace.html.haml @@ -1,6 +1,6 @@ - managed_namespace_help_text = s_('ClusterIntegration|Set a prefix for your namespaces. If not set, defaults to your project path. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - non_managed_namespace_help_text = s_('ClusterIntegration|The namespace associated with your project. This will be used for deploy boards, and Web terminals.') -- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' +- managed_namespace_help_link = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' .js-namespace-prefixed .form-group diff --git a/app/views/clusters/clusters/_provider_details_form.html.haml b/app/views/clusters/clusters/_provider_details_form.html.haml index 17a2c17c481..5343e2637d3 100644 --- a/app/views/clusters/clusters/_provider_details_form.html.haml +++ b/app/views/clusters/clusters/_provider_details_form.html.haml @@ -51,7 +51,7 @@ = field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.') - = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' .form-group .form-check @@ -59,7 +59,7 @@ = field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('More information'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' - if cluster.allow_user_defined_namespace? = render('clusters/clusters/namespace', platform_field: platform_field, field: field) diff --git a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml index 464e5b82bde..9c2ebfa5864 100644 --- a/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml +++ b/app/views/clusters/clusters/cloud_providers/_cloud_provider_selector.html.haml @@ -2,9 +2,9 @@ - eks_label = s_('ClusterIntegration|Amazon EKS') - civo_label = s_('ClusterIntegration|Civo Kubernetes') - create_cluster_label = s_('ClusterIntegration|Where do you want to create a cluster?') -- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster') -- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster') -- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster') +- eks_help_path = help_page_path('user/infrastructure/clusters/connect/new_eks_cluster.md') +- gke_help_path = help_page_path('user/infrastructure/clusters/connect/new_gke_cluster.md') +- civo_help_path = help_page_path('user/infrastructure/clusters/connect/new_civo_cluster.md') .gl-py-5.md:gl-pl-5.md:gl-pr-5 %h4.gl-mb-5 diff --git a/app/views/clusters/clusters/show.html.haml b/app/views/clusters/clusters/show.html.haml index b8bc2d64c19..3fc0e8faf51 100644 --- a/app/views/clusters/clusters/show.html.haml +++ b/app/views/clusters/clusters/show.html.haml @@ -12,10 +12,10 @@ cluster_status: @cluster.status_name, cluster_status_reason: @cluster.status_reason, provider_type: @cluster.provider_type, - help_path: help_page_path('user/infrastructure/clusters/index'), - environments_help_path: help_page_path('ci/environments/index', anchor: 'create-a-static-environment'), - clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster'), - deploy_boards_help_path: help_page_path('user/project/deploy_boards', anchor: 'enabling-deploy-boards'), + help_path: help_page_path('user/infrastructure/clusters/index.md'), + environments_help_path: help_page_path('ci/environments/index.md', anchor: 'create-a-static-environment'), + clusters_help_path: help_page_path('user/project/clusters/deploy_to_cluster.md'), + deploy_boards_help_path: help_page_path('user/project/deploy_boards.md', anchor: 'enabling-deploy-boards'), cluster_id: @cluster.id } } .js-cluster-application-notice diff --git a/app/views/clusters/clusters/user/_form.html.haml b/app/views/clusters/clusters/user/_form.html.haml index 6a5acf4f507..71fef5ec322 100644 --- a/app/views/clusters/clusters/user/_form.html.haml +++ b/app/views/clusters/clusters/user/_form.html.haml @@ -1,5 +1,5 @@ -- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_existing_cluster'), target: '_blank', rel: 'noopener noreferrer' -- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/cluster_access'), target: '_blank', rel: 'noopener noreferrer' +- more_info_link = link_to _('Learn more.'), help_page_path('user/project/clusters/add_existing_cluster.md'), target: '_blank', rel: 'noopener noreferrer' +- rbac_help_link = link_to _('Learn more.'), help_page_path('user/project/clusters/cluster_access.md'), target: '_blank', rel: 'noopener noreferrer' - api_url_help_text = s_('ClusterIntegration|The URL used to access the Kubernetes API.') - ca_cert_help_text = s_('ClusterIntegration|The Kubernetes certificate used to authenticate to the cluster.') @@ -58,7 +58,7 @@ = field.label :managed, s_('ClusterIntegration|GitLab-managed cluster'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Allow GitLab to manage namespaces and service accounts for this cluster.') - = link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/clusters/gitlab_managed_clusters.md'), target: '_blank', rel: 'noopener noreferrer' .form-group .form-check @@ -66,7 +66,7 @@ = field.label :namespace_per_environment, s_('ClusterIntegration|Namespace per environment'), class: 'form-check-label label-bold' .form-text.text-muted = s_('ClusterIntegration|Deploy each environment to its own namespace. Otherwise, environments within a project share a project-wide namespace. Note that anyone who can trigger a deployment of a namespace can read its secrets. If modified, existing environments will use their current namespaces until the cluster cache is cleared.') - = link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/clusters/deploy_to_cluster.md', anchor: 'custom-namespace'), target: '_blank', rel: 'noopener noreferrer' = field.fields_for :platform_kubernetes, @user_cluster.platform_kubernetes do |platform_kubernetes_field| - if @user_cluster.allow_user_defined_namespace? diff --git a/app/views/dashboard/todos/index.html.haml b/app/views/dashboard/todos/index.html.haml index 4bc7e7c5f29..445285d0ff5 100644 --- a/app/views/dashboard/todos/index.html.haml +++ b/app/views/dashboard/todos/index.html.haml @@ -107,7 +107,7 @@ %p = (s_("Todos|Not sure where to go next? Take a look at your %{strongStart}%{assignedIssuesLinkStart}assigned issues%{assignedIssuesLinkEnd}%{strongEnd} or %{strongStart}%{mergeRequestLinkStart}merge requests%{mergeRequestLinkEnd}%{mergeRequestLinkEnd}%{strongEnd}.") % { strongStart: '', strongEnd: '', assignedIssuesLinkStart: "", assignedIssuesLinkEnd: '', mergeRequestLinkStart: "", mergeRequestLinkEnd: '' }).html_safe %p - = link_to s_("Todos| What actions create to-do items?"), help_page_path('user/todos', anchor: 'actions-that-create-to-do-items'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_("Todos| What actions create to-do items?"), help_page_path('user/todos.md', anchor: 'actions-that-create-to-do-items'), target: '_blank', rel: 'noopener noreferrer' - elsif todos_has_filtered_results? %p diff --git a/app/views/explore/groups/index.html.haml b/app/views/explore/groups/index.html.haml index e6514765948..b18ac4163ea 100644 --- a/app/views/explore/groups/index.html.haml +++ b/app/views/explore/groups/index.html.haml @@ -9,7 +9,7 @@ %h1.page-title.gl-text-size-h-display= page_title %p = _("Below you will find all the groups that are public or internal. Contribute by requesting to join a group.") - #{link_to _('Learn more'), help_page_path('user/group/index', { anchor: 'view-groups' })}. + #{link_to _('Learn more'), help_page_path('user/group/index.md', { anchor: 'view-groups' })}. .page-title-controls.gl-mt-4 - if current_user&.can_create_group? = render Pajamas::ButtonComponent.new(href: new_group_path, variant: :confirm) do diff --git a/app/views/groups/_group_admin_settings.html.haml b/app/views/groups/_group_admin_settings.html.haml index 05dfc5af746..cf4942d4758 100644 --- a/app/views/groups/_group_admin_settings.html.haml +++ b/app/views/groups/_group_admin_settings.html.haml @@ -4,7 +4,7 @@ = f.gitlab_ui_checkbox_component :lfs_enabled, checkbox_options: { checked: @group.lfs_enabled? } do |c| - c.with_label do = _('Projects in this group can use Git LFS') - = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index'), class: 'gl-ml-2' + = link_to sprite_icon('question-o'), help_page_path('topics/git/lfs/index.md'), class: 'gl-ml-2' - c.with_help_text do = _('This setting can be overridden in each project.') .form-group.gl-form-group{ role: 'group' } @@ -20,7 +20,7 @@ %legend.col-form-label.col-form-label = _('Two-factor authentication') - label = _("All users in this group must set up two-factor authentication") - - help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2' + - help_link = link_to sprite_icon('question-o'), help_page_path('security/two_factor_authentication.md', anchor: 'enforce-2fa-for-all-users-in-a-group'), class: 'gl-ml-2' = f.gitlab_ui_checkbox_component :require_two_factor_authentication, '%{label}%{help_link}'.html_safe % { label: label, help_link: help_link } .form-group.gl-form-group{ role: 'group' } diff --git a/app/views/groups/_home_panel.html.haml b/app/views/groups/_home_panel.html.haml index 9cd0a3411b6..12499da0d52 100644 --- a/app/views/groups/_home_panel.html.haml +++ b/app/views/groups/_home_panel.html.haml @@ -17,7 +17,7 @@ - if current_user.admin? = render Pajamas::ButtonComponent.new(href: [:admin, @group], icon: 'admin', button_options: { title: _('View group in admin area'), data: { toggle: 'tooltip', placement: 'bottom', container: 'body' } }) - if @notification_setting - .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: @group.id, container_class: 'gl-align-top' } } + .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(@notification_setting).to_json, notification_level: @notification_setting.level, help_page_path: help_page_path('user/profile/notifications.md'), group_id: @group.id, container_class: 'gl-align-top' } } - if can_create_subgroups .sm:gl-w-auto.gl-w-full = render Pajamas::ButtonComponent.new(href: new_group_path(parent_id: @group.id, anchor: 'create-group-pane'), button_options: { data: { testid: 'new-subgroup-button' }, class: 'sm:gl-w-auto gl-w-full'}) do diff --git a/app/views/groups/_import_group_from_another_instance_panel.html.haml b/app/views/groups/_import_group_from_another_instance_panel.html.haml index 471df47d281..b72cf4b0daa 100644 --- a/app/views/groups/_import_group_from_another_instance_panel.html.haml +++ b/app/views/groups/_import_group_from_another_instance_panel.html.haml @@ -25,11 +25,11 @@ = render Pajamas::AlertComponent.new(dismissible: false, variant: :warning) do |c| - c.with_body do - - docs_link = link_to('', help_page_path('user/group/import/migrated_items', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer') + - docs_link = link_to('', help_page_path('user/group/import/migrated_items.md', anchor: 'migrated-group-items'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('GroupsNew|Not all group items are migrated. %{docs_link_start}What items are migrated%{docs_link_end}?'), tag_pair(docs_link, :docs_link_start, :docs_link_end)) %p.gl-mt-5.gl-mb-3 - - url_link = link_to('', help_page_path('user/group/import/direct_transfer_migrations', anchor: 'connect-the-source-gitlab-instance'), target: '_blank', rel: 'noopener noreferrer') + - url_link = link_to('', help_page_path('user/group/import/direct_transfer_migrations.md', anchor: 'connect-the-source-gitlab-instance'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('GroupsNew|Provide credentials for the %{url_link_start}source instance%{url_link_end} to import from. You can provide this instance as a source to move groups within this instance.'), tag_pair(url_link, :url_link_start, :url_link_end)) .form-group.gl-form-group.gl-flex.gl-flex-col = f.label :bulk_import_gitlab_url, s_('GroupsNew|GitLab source instance base URL'), for: 'import_gitlab_url' @@ -43,8 +43,8 @@ .form-group.gl-form-group.gl-flex.gl-flex-col = f.label :bulk_import_gitlab_access_token, s_('GroupsNew|Personal access token'), for: 'import_gitlab_token', class: 'col-form-label' .gl-font-normal - - pat_link = link_to('', help_page_path('user/profile/personal_access_tokens'), target: '_blank') - - short_living_link = link_to('', help_page_path('security/tokens/index', anchor: 'security-considerations'), target: '_blank') + - pat_link = link_to('', help_page_path('user/profile/personal_access_tokens.md'), target: '_blank') + - short_living_link = link_to('', help_page_path('security/tokens/index.md', anchor: 'security-considerations'), target: '_blank') = safe_format(s_('GroupsNew|Create a token with %{code_start}api%{code_end} and %{code_start}read_repository%{code_end} scopes in the %{pat_link_start}user settings%{pat_link_end} of the source GitLab instance. For %{short_living_link_start}security reasons%{short_living_link_end}, set a short expiration date for the token. Keep in mind that large migrations take more time.'), tag_pair(''.html_safe, :code_start , :code_end), tag_pair(pat_link, :pat_link_start, :pat_link_end), tag_pair(short_living_link, :short_living_link_start, :short_living_link_end)) = f.password_field :bulk_import_gitlab_access_token, placeholder: s_('GroupsNew|e.g. h8d3f016698e...'), class: 'gl-form-input gl-mt-3 col-xs-12 col-sm-8', required: true, diff --git a/app/views/groups/_import_group_from_file_panel.html.haml b/app/views/groups/_import_group_from_file_panel.html.haml index 26b9ad50255..14c84f15299 100644 --- a/app/views/groups/_import_group_from_file_panel.html.haml +++ b/app/views/groups/_import_group_from_file_panel.html.haml @@ -10,14 +10,14 @@ alert_options: { class: 'gl-mb-5' }, dismissible: false) do |c| - c.with_body do - - docs_link_start = ''.html_safe % { url: help_page_path('user/group/import/index') } + - docs_link_start = ''.html_safe % { url: help_page_path('user/group/import/index.md') } - link_end = ''.html_safe = s_('GroupsNew|This feature is deprecated and replaced by group migration by direct transfer. %{docs_link_start}Learn more%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end } = render 'shared/groups/group_name_and_path_fields', f: f .form-group = f.label :file, s_('GroupsNew|Upload file') .gl-font-normal - - import_export_link_start = ''.html_safe % { url: help_page_path('user/project/settings/import_export', anchor: 'migrate-groups-by-uploading-an-export-file-deprecated') } + - import_export_link_start = ''.html_safe % { url: help_page_path('user/project/settings/import_export.md', anchor: 'migrate-groups-by-uploading-an-export-file-deprecated') } = s_('GroupsNew|To import a group, navigate to the group settings for the GitLab source instance, %{link_start}generate an export file%{link_end}, and upload it here.').html_safe % { link_start: import_export_link_start, link_end: ''.html_safe } .gl-mt-3 = render 'shared/file_picker_button', f: f, field: :file, help_text: nil diff --git a/app/views/groups/_invite_members_modal.html.haml b/app/views/groups/_invite_members_modal.html.haml index 26e42f8999a..c33abf7b21f 100644 --- a/app/views/groups/_invite_members_modal.html.haml +++ b/app/views/groups/_invite_members_modal.html.haml @@ -3,4 +3,4 @@ .js-invite-members-modal{ data: { is_project: 'false', access_levels: access_level_roles_user_can_assign(group, group.access_level_roles).to_json, reload_page_on_submit: current_path?('group_members#index').to_s, - help_link: help_page_url('user/permissions') }.merge(common_invite_modal_dataset(group)).merge(users_filter_data(group)) } + help_link: help_page_url('user/permissions.md') }.merge(common_invite_modal_dataset(group)).merge(users_filter_data(group)) } diff --git a/app/views/groups/_new_group_fields.html.haml b/app/views/groups/_new_group_fields.html.haml index 49cc6e66ab8..13dc08e673f 100644 --- a/app/views/groups/_new_group_fields.html.haml +++ b/app/views/groups/_new_group_fields.html.haml @@ -9,7 +9,7 @@ = _('Visibility level') %p = _('Who will be able to see this group?') - = link_to _('View the documentation'), help_page_path("user/public_access"), target: '_blank', rel: 'noopener noreferrer' + = link_to _('View the documentation'), help_page_path("user/public_access.md"), target: '_blank', rel: 'noopener noreferrer' = render 'shared/visibility_level', f: f, visibility_level: default_group_visibility, can_change_visibility_level: true, form_model: @group, with_label: false - unless parent diff --git a/app/views/groups/edit.html.haml b/app/views/groups/edit.html.haml index 9e726048e43..8ec6a42ccc2 100644 --- a/app/views/groups/edit.html.haml +++ b/app/views/groups/edit.html.haml @@ -14,7 +14,7 @@ expanded: true) do |c| - c.with_description do = _('Update your group name, description, avatar, and visibility.') - = link_to _('Learn more about groups.'), help_page_path('user/group/index') + = link_to _('Learn more about groups.'), help_page_path('user/group/index.md') - c.with_body do = render 'groups/settings/general' @@ -39,7 +39,7 @@ expanded: expanded) do |c| - c.with_description do = s_('GroupSettings|Customize this group\'s badges.') - = link_to s_('GroupSettings|What are badges?'), help_page_path('user/project/badges') + = link_to s_('GroupSettings|What are badges?'), help_page_path('user/project/badges.md') - c.with_body do = render 'shared/badges/badge_settings' diff --git a/app/views/groups/milestones/_form.html.haml b/app/views/groups/milestones/_form.html.haml index 4f6d66299f4..8929bdc6a88 100644 --- a/app/views/groups/milestones/_form.html.haml +++ b/app/views/groups/milestones/_form.html.haml @@ -12,7 +12,7 @@ = f.label :description, _("Description") - @gfm_form = true .js-markdown-editor{ data: { render_markdown_path: group_preview_markdown_path, - markdown_docs_path: help_page_path('user/markdown'), + markdown_docs_path: help_page_path('user/markdown.md'), testid: 'milestone-description-field', form_field_placeholder: _('Write milestone description...'), supports_quick_actions: 'false', diff --git a/app/views/groups/milestones/index.html.haml b/app/views/groups/milestones/index.html.haml index e347f161749..b0c3b435f75 100644 --- a/app/views/groups/milestones/index.html.haml +++ b/app/views/groups/milestones/index.html.haml @@ -12,7 +12,7 @@ = render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }, class: "gl-ml-3" }) do = _('New milestone') - if @milestones.blank? - = render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index') do + = render 'shared/empty_states/milestones_tab', learn_more_path: help_page_path('user/project/milestones/index.md') do - if can?(current_user, :admin_milestone, @group) = render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }}) do = _('New milestone') @@ -27,7 +27,7 @@ = render 'milestone', milestone: milestone = paginate @milestones, theme: "gitlab" - else - = render 'shared/empty_states/milestones', learn_more_path: help_page_path('user/project/milestones/index') do + = render 'shared/empty_states/milestones', learn_more_path: help_page_path('user/project/milestones/index.md') do - if can?(current_user, :admin_milestone, @group) = render Pajamas::ButtonComponent.new(href: new_group_milestone_path(@group), variant: :confirm, button_options: { data: { testid: "new-group-milestone-link" }}) do = _('New milestone') diff --git a/app/views/groups/registry/repositories/index.html.haml b/app/views/groups/registry/repositories/index.html.haml index 3c9bbfce11f..4e8f4190b97 100644 --- a/app/views/groups/registry/repositories/index.html.haml +++ b/app/views/groups/registry/repositories/index.html.haml @@ -3,14 +3,14 @@ %section #js-container-registry{ data: { endpoint: group_container_registries_path(@group), - "help_page_path" => help_page_path('user/packages/container_registry/index'), - "two_factor_auth_help_link" => help_page_path('user/profile/account/two_factor_authentication'), - "personal_access_tokens_help_link" => help_page_path('user/profile/personal_access_tokens'), + "help_page_path" => help_page_path('user/packages/container_registry/index.md'), + "two_factor_auth_help_link" => help_page_path('user/profile/account/two_factor_authentication.md'), + "personal_access_tokens_help_link" => help_page_path('user/profile/personal_access_tokens.md'), "no_containers_image" => image_path('illustrations/docker-empty-state.svg'), "containers_error_image" => image_path('illustrations/docker-error-state.svg'), "registry_host_url_with_port" => escape_once(registry_config.host_port), - "garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'container-registry-garbage-collection'), - "run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry', anchor: 'run-the-cleanup-policy-now'), + "garbage_collection_help_page_path" => help_page_path('administration/packages/container_registry.md', anchor: 'container-registry-garbage-collection'), + "run_cleanup_policies_help_page_path" => help_page_path('administration/packages/container_registry.md', anchor: 'run-the-cleanup-policy-now'), "is_admin": current_user&.admin.to_s, is_group_page: "true", "group_path": @group.full_path, diff --git a/app/views/groups/settings/_advanced.html.haml b/app/views/groups/settings/_advanced.html.haml index 104df2656de..d4b47f2e9b2 100644 --- a/app/views/groups/settings/_advanced.html.haml +++ b/app/views/groups/settings/_advanced.html.haml @@ -9,7 +9,7 @@ %h4.gl-text-base.gl-leading-24.gl-m-0= s_('GroupSettings|Change group URL') %p.gl-text-subtle.gl-text-sm.gl-m-0 = s_("GroupSettings|Changing a group's URL can have unintended side effects.") - #{link_to _('Learn more'), help_page_path('user/group/manage', anchor: 'change-a-groups-path'), target: '_blank', rel: 'noopener noreferrer'}. + #{link_to _('Learn more'), help_page_path('user/group/manage.md', anchor: 'change-a-groups-path'), target: '_blank', rel: 'noopener noreferrer'}. - c.with_body do = gitlab_ui_form_for @group, html: { multipart: true, class: 'gl-show-field-errors' }, authenticity_token: true do |f| diff --git a/app/views/groups/settings/_export.html.haml b/app/views/groups/settings/_export.html.haml index 94177b5c3b0..eba24181344 100644 --- a/app/views/groups/settings/_export.html.haml +++ b/app/views/groups/settings/_export.html.haml @@ -10,7 +10,7 @@ - c.with_body do = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_options: { class: 'gl-mb-4' }) do |c| - c.with_body do - - docs_link_start = ''.html_safe % { url: help_page_path('user/group/import/index') } + - docs_link_start = ''.html_safe % { url: help_page_path('user/group/import/index.md') } - docs_link_end = ''.html_safe = s_('GroupsNew|This feature is deprecated and replaced by group migration by direct transfer. %{docs_link_start}Learn more%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: docs_link_end } %p diff --git a/app/views/groups/settings/_lfs.html.haml b/app/views/groups/settings/_lfs.html.haml index 81d64d983a0..60f144e01fb 100644 --- a/app/views/groups/settings/_lfs.html.haml +++ b/app/views/groups/settings/_lfs.html.haml @@ -1,4 +1,4 @@ -- docs_link_url = help_page_path('topics/git/lfs/index') +- docs_link_url = help_page_path('topics/git/lfs/index.md') - docs_link_start = ''.html_safe % { url: docs_link_url } %h5= _('Large File Storage') diff --git a/app/views/groups/settings/_remove_button.html.haml b/app/views/groups/settings/_remove_button.html.haml index ade223163d1..14340537bd3 100644 --- a/app/views/groups/settings/_remove_button.html.haml +++ b/app/views/groups/settings/_remove_button.html.haml @@ -3,6 +3,6 @@ - if group.linked_to_subscription? = render Pajamas::AlertComponent.new(variant: :tip, dismissible: false, alert_options: { class: 'gl-mb-5', data: { testid: 'group-has-linked-subscription-alert' }}) do |c| - c.with_body do - = html_escape(_("This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "".html_safe, linkEnd: ''.html_safe } + = html_escape(_("This group can't be removed because it is linked to a subscription. To remove this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "".html_safe, linkEnd: ''.html_safe } .js-confirm-danger{ data: group_confirm_modal_data(group: group, remove_form_id: remove_form_id) } diff --git a/app/views/groups/settings/_transfer.html.haml b/app/views/groups/settings/_transfer.html.haml index b69bdb975b4..661f84c0a6b 100644 --- a/app/views/groups/settings/_transfer.html.haml +++ b/app/views/groups/settings/_transfer.html.haml @@ -11,7 +11,7 @@ - c.with_body do = form_for group, url: transfer_group_path(group), method: :put, html: { id: form_id, class: 'js-group-transfer-form' } do |f| %ul - - learn_more_link = help_page_url('user/project/repository/index', anchor: 'repository-path-changes') + - learn_more_link = help_page_url('user/project/repository/index.md', anchor: 'repository-path-changes') - learn_more_link_start = ''.html_safe % { url: learn_more_link } - warning_text = s_("GroupSettings|Be careful. Changing a group's parent can have unintended side effects. %{learn_more_link_start}Learn more.%{learn_more_link_end}") % { learn_more_link_start: learn_more_link_start, learn_more_link_end: ''.html_safe } %li= warning_text.html_safe @@ -21,5 +21,5 @@ - if group.paid? = render Pajamas::AlertComponent.new(variant: :tip, dismissible: false, alert_options: { class: 'gl-mb-5' }) do |c| - c.with_body do - = html_escape(_("This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "".html_safe, linkEnd: ''.html_safe } + = html_escape(_("This group can't be transferred because it is linked to a subscription. To transfer this group, %{linkStart}link the subscription%{linkEnd} with a different group.")) % { linkStart: "".html_safe, linkEnd: ''.html_safe } .js-transfer-group-form{ data: initial_data } diff --git a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml index 705a9704fc2..b0a5d0bd4fa 100644 --- a/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml +++ b/app/views/groups/settings/ci_cd/_auto_devops_form.html.haml @@ -4,7 +4,7 @@ .form-group = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-3' }) do |c| - c.with_body do - - learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer' + - learn_more_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer' - help_text = s_('GroupSettings|The Auto DevOps pipeline runs if no alternative CI configuration file is found.') - badge = gl_badge_tag badge_for_auto_devops_scope(group), variant: :info - label = s_('GroupSettings|Default to Auto DevOps pipeline for all projects within this group') diff --git a/app/views/groups/settings/ci_cd/_form.html.haml b/app/views/groups/settings/ci_cd/_form.html.haml index 9b23a8c5e0e..a77af729638 100644 --- a/app/views/groups/settings/ci_cd/_form.html.haml +++ b/app/views/groups/settings/ci_cd/_form.html.haml @@ -7,5 +7,5 @@ = f.number_field :max_artifacts_size, class: 'form-control' %p.form-text.text-muted = _("The maximum file size in megabytes for individual job artifacts.") - = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration.md', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/groups/settings/ci_cd/show.html.haml b/app/views/groups/settings/ci_cd/show.html.haml index f1e261cd695..a066eee31f6 100644 --- a/app/views/groups/settings/ci_cd/show.html.haml +++ b/app/views/groups/settings/ci_cd/show.html.haml @@ -42,8 +42,8 @@ id: 'auto-devops-settings', expanded: expanded) do |c| - c.with_description do - - auto_devops_url = help_page_path('topics/autodevops/index') - - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke') + - auto_devops_url = help_page_path('topics/autodevops/index.md') + - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke.md') - auto_devops_start = ''.html_safe % { url: auto_devops_url } - quickstart_start = ''.html_safe % { url: quickstart_url } = html_escape(s_('AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}')) % { auto_devops_start: auto_devops_start, auto_devops_end: ''.html_safe, quickstart_start: quickstart_start, quickstart_end: ''.html_safe } diff --git a/app/views/import/bulk_imports/history.html.haml b/app/views/import/bulk_imports/history.html.haml index 13a88867d5a..013bd816029 100644 --- a/app/views/import/bulk_imports/history.html.haml +++ b/app/views/import/bulk_imports/history.html.haml @@ -13,7 +13,7 @@ - c.with_body do = pending_reassignment_presenter.body - c.with_actions do - = render Pajamas::ButtonComponent.new(variant: :default, href: help_page_path('user/project/import/index', anchor: 'placeholder-users'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do + = render Pajamas::ButtonComponent.new(variant: :default, href: help_page_path('user/project/import/index.md', anchor: 'placeholder-users'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do = _('Learn more') #import-history-mount-element{ data: { id: @bulk_import&.id, details_path: failures_import_bulk_import_path(':id', ':entity_id'), realtime_changes_path: realtime_changes_import_bulk_imports_path(format: :json) } } diff --git a/app/views/import/github/new.html.haml b/app/views/import/github/new.html.haml index 21ec14eba49..cab4f52efea 100644 --- a/app/views/import/github/new.html.haml +++ b/app/views/import/github/new.html.haml @@ -42,7 +42,7 @@ - else %li= safe_format(s_('GithubImporter|%{code_start}repo%{code_end}: Used to display a list of your public and private repositories that are available to import from.'), code_pair) %li= safe_format(s_('GithubImporter|%{code_start}read:org%{code_end} (optional): Used to import collaborators from GitHub repositories, or if your project has Git LFS files.'), code_pair) - - docs_link = link_to('', help_page_path('user/project/import/github', anchor: 'use-a-github-personal-access-token'), target: '_blank', rel: 'noopener noreferrer') + - docs_link = link_to('', help_page_path('user/project/import/github.md', anchor: 'use-a-github-personal-access-token'), target: '_blank', rel: 'noopener noreferrer') - docs_link_tag_pair = tag_pair(docs_link, :link_start, :link_end) = safe_format(s_('GithubImport|%{link_start}Learn more%{link_end}.'), docs_link_tag_pair) diff --git a/app/views/import/manifest/_form.html.haml b/app/views/import/manifest/_form.html.haml index a35e9ea3fcf..c21ed15334a 100644 --- a/app/views/import/manifest/_form.html.haml +++ b/app/views/import/manifest/_form.html.haml @@ -19,7 +19,7 @@ = file_field_tag :manifest, class: 'form-control-file w-auto', required: true .form-text.text-muted = _('Import multiple repositories by uploading a manifest file.') - = link_to sprite_icon('question-o'), help_page_path('user/project/import/manifest') + = link_to sprite_icon('question-o'), help_page_path('user/project/import/manifest.md') .gl-mb-3 = render Pajamas::ButtonComponent.new(type: :submit, variant: :confirm) do diff --git a/app/views/import/source_users/_accept_invite.html.haml b/app/views/import/source_users/_accept_invite.html.haml index cbeed62f481..8f30ffb39f9 100644 --- a/app/views/import/source_users/_accept_invite.html.haml +++ b/app/views/import/source_users/_accept_invite.html.haml @@ -8,6 +8,6 @@ destination_group: link_to(source_user.namespace.name, group_path(source_user.namespace))) - c.with_actions do = render Pajamas::ButtonComponent.new(variant: :default, - href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'), + href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do = _('Learn more') diff --git a/app/views/import/source_users/_invalid_invite.html.haml b/app/views/import/source_users/_invalid_invite.html.haml index 1e6760fa0bd..11af2a04bfa 100644 --- a/app/views/import/source_users/_invalid_invite.html.haml +++ b/app/views/import/source_users/_invalid_invite.html.haml @@ -3,6 +3,6 @@ = s_('UserMapping|You might have already accepted or rejected the reassignment, or it might have been canceled by the group owner.') - c.with_actions do = render Pajamas::ButtonComponent.new(variant: :default, - href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'), + href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do = _('Learn more') diff --git a/app/views/import/source_users/_reject_invite.html.haml b/app/views/import/source_users/_reject_invite.html.haml index 34eef387032..e47d10b7948 100644 --- a/app/views/import/source_users/_reject_invite.html.haml +++ b/app/views/import/source_users/_reject_invite.html.haml @@ -8,6 +8,6 @@ destination_group: source_user.namespace.name) - c.with_actions do = render Pajamas::ButtonComponent.new(variant: :default, - href: help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment'), + href: help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment'), button_options: { class: 'deferred-link gl-alert-action', rel: 'noreferrer noopener' }, target: '_blank') do = _('Learn more') diff --git a/app/views/import/source_users/show.html.haml b/app/views/import/source_users/show.html.haml index 430466d1493..56e165e3554 100644 --- a/app/views/import/source_users/show.html.haml +++ b/app/views/import/source_users/show.html.haml @@ -27,7 +27,7 @@ source_hostname: source_hostname, destination_group: destination_group) = succeed '.' do - = link_to s_('UserMapping|Learn more about reassignments'), help_page_path('user/project/import/index', anchor: 'accept-contribution-reassignment') + = link_to s_('UserMapping|Learn more about reassignments'), help_page_path('user/project/import/index.md', anchor: 'accept-contribution-reassignment') %h5 = s_('UserMapping|Import details:') %p.gl-mb-5 diff --git a/app/views/profiles/accounts/show.html.haml b/app/views/profiles/accounts/show.html.haml index b04781ecad6..f6093604bac 100644 --- a/app/views/profiles/accounts/show.html.haml +++ b/app/views/profiles/accounts/show.html.haml @@ -13,7 +13,7 @@ alert_options: { class: 'gl-my-5' }, close_button_options: { class: 'js-close-2fa-enabled-success-alert' }) do |c| - c.with_body do - = html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: ''.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication_troubleshooting', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: ''.html_safe } + = html_escape(_('You have set up 2FA for your account! If you lose access to your 2FA device, you can use your recovery codes to access your account. Alternatively, if you upload an SSH key, you can %{anchorOpen}use that key to generate additional recovery codes%{anchorClose}.')) % { anchorOpen: ''.html_safe % { href: help_page_path('user/profile/account/two_factor_authentication_troubleshooting.md', anchor: 'generate-new-recovery-codes-using-ssh') }, anchorClose: ''.html_safe } .settings-section.js-search-settings-section .settings-sticky-header @@ -53,7 +53,7 @@ %p.gl-text-secondary = s_('Profiles|Changing your username can have unintended side effects.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/index.md', anchor: 'change-your-username'), target: '_blank', rel: 'noopener noreferrer' - data = { initial_username: current_user.username, root_url: root_url, action_url: update_username_profile_path(format: :json) } #update-username{ data: data } diff --git a/app/views/profiles/notifications/_group_settings.html.haml b/app/views/profiles/notifications/_group_settings.html.haml index 0afc3ae473b..c7e382ddef7 100644 --- a/app/views/profiles/notifications/_group_settings.html.haml +++ b/app/views/profiles/notifications/_group_settings.html.haml @@ -11,6 +11,6 @@ .gl-flex.gl-gap-3.gl-flex-wrap - if setting - .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications'), group_id: group.id, show_label: "true" } } + .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications.md'), group_id: group.id, show_label: "true" } } = form_for setting, url: profile_group_notifications_path(group), method: :put, html: { class: 'update-notifications gl-flex' } do |f| .js-notification-email-listbox-input{ data: { name: 'notification_setting[notification_email]', emails: @user.public_verified_emails.to_json, empty_value_text: _('Global notification email') , value: setting.notification_email, placement: 'bottom-end' } } diff --git a/app/views/profiles/notifications/_project_settings.html.haml b/app/views/profiles/notifications/_project_settings.html.haml index 109f68f15e2..c067037dda4 100644 --- a/app/views/profiles/notifications/_project_settings.html.haml +++ b/app/views/profiles/notifications/_project_settings.html.haml @@ -11,4 +11,4 @@ .gl-flex.gl-gap-3.gl-flex-wrap - if setting - .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications'), project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } } + .js-vue-notification-dropdown{ data: { disabled: emails_disabled.to_s, dropdown_items: notification_dropdown_items(setting).to_json, notification_level: setting.level, help_page_path: help_page_path('user/profile/notifications.md'), project_id: project.id, container_class: 'gl-mr-3', show_label: "true" } } diff --git a/app/views/profiles/notifications/show.html.haml b/app/views/profiles/notifications/show.html.haml index c1fd04a33a3..89765e46aaa 100644 --- a/app/views/profiles/notifications/show.html.haml +++ b/app/views/profiles/notifications/show.html.haml @@ -25,7 +25,7 @@ .form-group.global-notification-setting.gl-mb-3 - if @global_notification_setting - .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications'), show_label: 'true' } } + .js-vue-notification-dropdown{ data: { dropdown_items: notification_dropdown_items(@global_notification_setting).to_json, notification_level: @global_notification_setting.level, help_page_path: help_page_path('user/profile/notifications.md'), show_label: 'true' } } = gitlab_ui_form_for @user, url: profile_notifications_path, method: :put do |f| .form-group diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index 970af9e321a..f5daacd4244 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -49,7 +49,7 @@ %p.gl-text-secondary = s_('Preferences|Customize the appearance of the syntax.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'change-the-syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'change-the-syntax-highlighting-theme'), target: '_blank', rel: 'noopener noreferrer' .syntax-theme.row - Gitlab::ColorSchemes.each do |scheme| %label.col-6.col-sm-4.col-md-3.col-lg-auto.gl-mb-5 @@ -76,11 +76,11 @@ %p.gl-text-secondary = s_('Preferences|Customize the behavior of the system layout and default views.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'behavior'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.label :layout, class: 'label-bold' do = s_('Preferences|Keyboard shortcuts') - - shortcuts_help_link = link_to('', help_page_path('user/shortcuts'), target: '_blank', rel: 'noopener noreferrer') + - shortcuts_help_link = link_to('', help_page_path('user/shortcuts.md'), target: '_blank', rel: 'noopener noreferrer') = f.gitlab_ui_checkbox_component :keyboard_shortcuts_enabled, s_('Preferences|Enable keyboard shortcuts'), help_text: safe_format(s_('Preferences|%{link_start}List of keyboard shortcuts%{link_end}'), tag_pair(shortcuts_help_link, :link_start, :link_end)) @@ -141,11 +141,11 @@ %p.gl-text-secondary = _('Customize language and region related settings.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'localization'), target: '_blank', rel: 'noopener noreferrer' .js-listbox-input{ data: { label: _('Language'), description: s_('Preferences|This feature is experimental and translations are not yet complete.'), name: 'user[preferred_language]', items: language_choices.to_json, value: current_user.preferred_language, block: true.to_s, toggle_class: 'gl-form-input-xl' } } %p.-gl-mt-5 - = link_to help_page_url('development/i18n/translation'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do + = link_to help_page_url('development/i18n/translation.md'), class: 'text-nowrap', target: '_blank', rel: 'noopener noreferrer' do = _("Help translate GitLab into your language") %span{ aria: { label: _('Open new window') } } = sprite_icon('external-link') @@ -162,7 +162,7 @@ %p.gl-text-secondary = s_('Preferences|Configure how dates and times display for you.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/preferences', anchor: 'show-exact-times-instead-of-relative-times'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/preferences.md', anchor: 'show-exact-times-instead-of-relative-times'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :time_display_relative, s_('Preferences|Use relative times'), @@ -181,7 +181,7 @@ %p.gl-text-secondary = s_('Preferences|Turns on or off the ability to follow or be followed by other users.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/profile/index', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/profile/index.md', anchor: 'follow-users'), target: '_blank', rel: 'noopener noreferrer' .form-group = f.gitlab_ui_checkbox_component :enabled_following, s_('Preferences|Enable follow users') diff --git a/app/views/projects/_empty_git_instructions.html.haml b/app/views/projects/_empty_git_instructions.html.haml index 33d2d9cb866..a63d30c5b98 100644 --- a/app/views/projects/_empty_git_instructions.html.haml +++ b/app/views/projects/_empty_git_instructions.html.haml @@ -3,7 +3,7 @@ - git_push_target = '' - if protocol == 'ssh' - - ssh_doc = link_to('', help_page_path('user/ssh'), target: '_blank', rel: 'noopener noreferrer') + - ssh_doc = link_to('', help_page_path('user/ssh.md'), target: '_blank', rel: 'noopener noreferrer') %p.gl-mt-2= safe_format(_('%{link}How to use SSH keys%{link_end}?'), tag_pair(ssh_doc, :link, :link_end)) - git_push_target = content_tag(:span, ssh_clone_url_to_repo(@project), class: 'js-clone') - if protocol == 'https' diff --git a/app/views/projects/_export.html.haml b/app/views/projects/_export.html.haml index 5ff55bb02e1..08a8ef55e65 100644 --- a/app/views/projects/_export.html.haml +++ b/app/views/projects/_export.html.haml @@ -9,7 +9,7 @@ - c.with_body do %p - - link = link_to('', help_page_path('user/project/settings/import_export'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/settings/import_export.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_('Export this project with all its related data in order to move it to a new GitLab instance. When the exported file is ready, you can download it from this page or from the download link in the email notification you will receive. You can then import it when creating a new project. %{link_start}Learn more.%{link_end}'), tag_pair(link, :link_start, :link_end)) .gl-mb-0 %p.gl-font-bold= _('The following items will be exported:') diff --git a/app/views/projects/_import_project_pane.html.haml b/app/views/projects/_import_project_pane.html.haml index 426c1e5ac34..bfbce172b05 100644 --- a/app/views/projects/_import_project_pane.html.haml +++ b/app/views/projects/_import_project_pane.html.haml @@ -11,7 +11,7 @@ alert_options: { class: 'gl-my-3' }, dismissible: false) do |c| - c.with_body do - - docs_link_url = help_page_path('user/group/import/index') + '#migrate-groups-by-direct-transfer-recommended' + - docs_link_url = help_page_path('user/group/import/index.md') + '#migrate-groups-by-direct-transfer-recommended' - docs_link = ''.html_safe % { url: docs_link_url } = html_escape(_("Importing GitLab projects? Migrating GitLab projects when migrating groups by direct transfer is in Beta. %{link_start}Learn more.%{link_end}")) % { link_start: docs_link, link_end: ''.html_safe } .import-buttons diff --git a/app/views/projects/_invite_members_modal.html.haml b/app/views/projects/_invite_members_modal.html.haml index a1b0bdd6c56..26800a1ebe2 100644 --- a/app/views/projects/_invite_members_modal.html.haml +++ b/app/views/projects/_invite_members_modal.html.haml @@ -3,4 +3,4 @@ .js-invite-members-modal{ data: { is_project: 'true', access_levels: ProjectMember.permissible_access_level_roles(current_user, project).to_json, reload_page_on_submit: current_path?('project_members#index').to_s, - help_link: help_page_url('user/permissions') }.merge(common_invite_modal_dataset(project)).merge(users_filter_data(project.group)) } + help_link: help_page_url('user/permissions.md') }.merge(common_invite_modal_dataset(project)).merge(users_filter_data(project.group)) } diff --git a/app/views/projects/_lfs_misconfiguration_banner.html.haml b/app/views/projects/_lfs_misconfiguration_banner.html.haml index 29ea5a6d8a3..00d056460d9 100644 --- a/app/views/projects/_lfs_misconfiguration_banner.html.haml +++ b/app/views/projects/_lfs_misconfiguration_banner.html.haml @@ -2,4 +2,4 @@ = render Pajamas::AlertComponent.new(variant: :warning, dismissible: false, alert_options: { class: 'gl-hidden sm:gl-block' }) do |c| - c.with_body do = _('Possible LFS configuration issue. This project contains LFS objects but there is no .gitattributes file. You can ignore this message if you recently added a `.gitattributes` file.') - = link_to('Learn more.', help_page_path('topics/git/lfs/index'), target: '_blank', rel: 'noopener noreferrer') + = link_to('Learn more.', help_page_path('topics/git/lfs/index.md'), target: '_blank', rel: 'noopener noreferrer') diff --git a/app/views/projects/_new_project_fields.html.haml b/app/views/projects/_new_project_fields.html.haml index 958f3567e33..ce91d30053a 100644 --- a/app/views/projects/_new_project_fields.html.haml +++ b/app/views/projects/_new_project_fields.html.haml @@ -44,7 +44,7 @@ = render Pajamas::AlertComponent.new(dismissible: false, variant: :success) do |c| - c.with_body do - - help_link_start = ''.html_safe % { url: help_page_path('user/profile/index', anchor: 'add-details-to-your-profile-with-a-readme') } + - help_link_start = ''.html_safe % { url: help_page_path('user/profile/index.md', anchor: 'add-details-to-your-profile-with-a-readme') } = html_escape(_('%{project_path} is a project that you can use to add a README to your GitLab profile. Create a public project and initialize the repository with a README to get started. %{help_link_start}Learn more%{help_link_end}.')) % { project_path: "#{current_user.username} / #{current_user.username}".html_safe, help_link_start: help_link_start, help_link_end: ''.html_safe } - if include_description @@ -67,7 +67,7 @@ .form-group.gl-form-group = f.label :visibility_level, class: 'label-bold' do = s_('ProjectsNew|Visibility Level') - = link_to sprite_icon('question-o'), help_page_path('user/public_access'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('user/public_access.md'), aria: { label: 'Documentation for Visibility Level' }, target: '_blank', rel: 'noopener noreferrer' = render 'shared/visibility_level', f: f, visibility_level: visibility_level.to_i, can_change_visibility_level: true, form_model: @project, with_label: false, data: { testid: 'visibility-radios'} - if !hide_init_with_readme @@ -90,7 +90,7 @@ = s_('ProjectsNew|Enable Static Application Security Testing (SAST)') - c.with_help_text do = s_('ProjectsNew|Analyze your source code for known security vulnerabilities.') - = link_to _('Learn more.'), help_page_path('user/application_security/sast/index'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' } + = link_to _('Learn more.'), help_page_path('user/application_security/sast/index.md'), target: '_blank', rel: 'noopener noreferrer', data: { track_action: 'followed' } - if display_sha256_repository #js-experimental-setting-accordion.form-group.gl-mb-6 diff --git a/app/views/projects/_service_desk_settings.html.haml b/app/views/projects/_service_desk_settings.html.haml index 7934ab83dfe..d39f0027f56 100644 --- a/app/views/projects/_service_desk_settings.html.haml +++ b/app/views/projects/_service_desk_settings.html.haml @@ -4,7 +4,7 @@ testid: 'service-desk-content', expanded: expanded_by_default?) do |c| - c.with_description do - - link_start = "".html_safe + - link_start = "".html_safe = _('Enable and disable Service Desk. Some additional configuration might be required. %{link_start}Learn more%{link_end}.').html_safe % { link_start: link_start, link_end: ''.html_safe } - c.with_body do - if ::Gitlab::ServiceDesk.supported? diff --git a/app/views/projects/_transfer.html.haml b/app/views/projects/_transfer.html.haml index 122ec14e8f7..fd098ada60d 100644 --- a/app/views/projects/_transfer.html.haml +++ b/app/views/projects/_transfer.html.haml @@ -8,14 +8,14 @@ .gl-flex.gl-grow %h4.gl-text-base.gl-leading-24.gl-m-0= _('Transfer project') %p.gl-text-subtle.gl-text-sm.gl-m-0 - - link = link_to('', help_page_path('user/project/settings/migrate_projects', anchor: 'transfer-a-project-to-another-namespace'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/settings/migrate_projects.md', anchor: 'transfer-a-project-to-another-namespace'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_("Transfer your project into another namespace. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end)) - c.with_body do = form_for @project, url: transfer_project_path(@project), method: :put, html: { class: 'js-project-transfer-form', id: form_id } do |f| .form-group.gl-mb-0 %p - - link = link_to('', help_page_path('user/project/working_with_projects', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/working_with_projects.md', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_("A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end)) %p= _('When you transfer your project to a group, you can easily manage multiple projects, view usage quotas for storage, compute minutes, and users, and start a trial or upgrade to a paid tier.') %p diff --git a/app/views/projects/blob/viewers/_gitlab_ci_yml.html.haml b/app/views/projects/blob/viewers/_gitlab_ci_yml.html.haml index afde59aa37d..963c40424c5 100644 --- a/app/views/projects/blob/viewers/_gitlab_ci_yml.html.haml +++ b/app/views/projects/blob/viewers/_gitlab_ci_yml.html.haml @@ -6,4 +6,4 @@ = s_('Pipelines|This GitLab CI configuration is invalid:') = viewer.validation_message(project: @project, sha: @commit.sha, user: @current_user) -= link_to _('Learn more'), help_page_path('ci/yaml/index') += link_to _('Learn more'), help_page_path('ci/yaml/index.md') diff --git a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml index d1c9736e76d..c1463e8728a 100644 --- a/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml +++ b/app/views/projects/blob/viewers/_gitlab_ci_yml_loading.html.haml @@ -1,4 +1,4 @@ = gl_loading_icon(inline: true, css_class: "!gl-mr-2") = s_('Pipelines|Validating GitLab CI configuration…') -= link_to _('Learn more'), help_page_path('ci/yaml/index') += link_to _('Learn more'), help_page_path('ci/yaml/index.md') diff --git a/app/views/projects/blob/viewers/_route_map.html.haml b/app/views/projects/blob/viewers/_route_map.html.haml index 22e62e4e185..1f831db2f09 100644 --- a/app/views/projects/blob/viewers/_route_map.html.haml +++ b/app/views/projects/blob/viewers/_route_map.html.haml @@ -6,4 +6,4 @@ This Route Map is invalid: = viewer.validation_message -= link_to _('Learn more'), help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages') += link_to _('Learn more'), help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages') diff --git a/app/views/projects/blob/viewers/_route_map_loading.html.haml b/app/views/projects/blob/viewers/_route_map_loading.html.haml index b681462c5c7..2d767b4e217 100644 --- a/app/views/projects/blob/viewers/_route_map_loading.html.haml +++ b/app/views/projects/blob/viewers/_route_map_loading.html.haml @@ -1,4 +1,4 @@ = gl_loading_icon(inline: true, css_class: "gl-mr-1") Validating Route Map… -= link_to _('Learn more'), help_page_path('ci/environments/index', anchor: 'go-from-source-files-to-public-pages') += link_to _('Learn more'), help_page_path('ci/environments/index.md', anchor: 'go-from-source-files-to-public-pages') diff --git a/app/views/projects/branch_defaults/_branch_names_fields.html.haml b/app/views/projects/branch_defaults/_branch_names_fields.html.haml index 982280120fa..3e77cb51a85 100644 --- a/app/views/projects/branch_defaults/_branch_names_fields.html.haml +++ b/app/views/projects/branch_defaults/_branch_names_fields.html.haml @@ -10,6 +10,6 @@ %p.form-text.text-muted = s_('ProjectSettings|Leave empty to use default template.') = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Issue::MAX_BRANCH_TEMPLATE }) - - branch_name_help_link = help_page_path('user/project/repository/branches/index', anchor: 'name-your-branch') + - branch_name_help_link = help_page_path('user/project/repository/branches/index.md', anchor: 'name-your-branch') = link_to _('What variables can I use?'), branch_name_help_link, target: "_blank" = render_if_exists 'projects/branch_defaults/branch_names_help' diff --git a/app/views/projects/branch_defaults/_default_branch_fields.html.haml b/app/views/projects/branch_defaults/_default_branch_fields.html.haml index f3a7e93a5f7..8c1d2f2432f 100644 --- a/app/views/projects/branch_defaults/_default_branch_fields.html.haml +++ b/app/views/projects/branch_defaults/_default_branch_fields.html.haml @@ -3,7 +3,7 @@ - if change_default_disabled - tag_pair_security_policies_page = tag_pair(link_to('', namespace_project_security_policies_path, target: '_blank', rel: 'noopener noreferrer'), :security_policies_link_start, :security_policies_link_end) - - tag_pair_security_policies_docs = tag_pair(link_to('', help_page_path('user/application_security/policies/scan-result-policies'), target: '_blank', rel: 'noopener noreferrer'), :learn_more_link_start, :learn_more_link_end) + - tag_pair_security_policies_docs = tag_pair(link_to('', help_page_path('user/application_security/policies/scan-result-policies.md'), target: '_blank', rel: 'noopener noreferrer'), :learn_more_link_start, :learn_more_link_end) - popover_content = safe_format(s_("SecurityOrchestration|You can't change the default branch because its protection is enforced by one or more %{security_policies_link_start}security policies%{security_policies_link_end}. %{learn_more_link_start}Learn more%{learn_more_link_end}."), tag_pair_security_policies_docs, tag_pair_security_policies_page) - popover_title = s_("SecurityOrchestration|Security policy overwrites this setting") - popover_data = { container: 'body', toggle: 'popover', html: 'true', triggers: 'hover', title: popover_title, content: popover_content } @@ -21,7 +21,7 @@ .form-group - help_text = _("When merge requests and commits in the default branch close, any issues they reference also close.") - - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' + - help_icon = link_to sprite_icon('question-o'), help_page_path('user/project/issues/managing_issues.md', anchor: 'closing-issues-automatically'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_checkbox_component :autoclose_referenced_issues, s_('ProjectSettings|Auto-close referenced issues on default branch'), help_text: (help_text + " " + help_icon).html_safe diff --git a/app/views/projects/ci/lints/show.html.haml b/app/views/projects/ci/lints/show.html.haml index f09b65ee60a..2eb93458eee 100644 --- a/app/views/projects/ci/lints/show.html.haml +++ b/app/views/projects/ci/lints/show.html.haml @@ -3,4 +3,4 @@ %h4.pt-3.pb-3= _("Validate your GitLab CI configuration") -#js-ci-lint{ data: { endpoint: project_ci_lint_path(@project), pipeline_simulation_help_page_path: help_page_path('ci/yaml/lint', anchor: 'simulate-a-pipeline') , lint_help_page_path: help_page_path('ci/yaml/lint', anchor: 'check-cicd-syntax') } } +#js-ci-lint{ data: { endpoint: project_ci_lint_path(@project), pipeline_simulation_help_page_path: help_page_path('ci/yaml/lint.md', anchor: 'simulate-a-pipeline') , lint_help_page_path: help_page_path('ci/yaml/lint.md', anchor: 'check-cicd-syntax') } } diff --git a/app/views/projects/commit/_signature_badge.html.haml b/app/views/projects/commit/_signature_badge.html.haml index cb4b2b78b55..a33cbbf78d7 100644 --- a/app/views/projects/commit/_signature_badge.html.haml +++ b/app/views/projects/commit/_signature_badge.html.haml @@ -19,17 +19,17 @@ - elsif signature.x509? = render partial: "projects/commit/x509/certificate_details", locals: { signature: signature } - = link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509'), class: 'gl-link gl-block') + = link_to(_('Learn more about X.509 signed commits'), help_page_path('user/project/repository/signed_commits/x509.md'), class: 'gl-link gl-block') - elsif signature.ssh? = _('SSH key fingerprint:') %span.gl-font-monospace= signature.key_fingerprint_sha256 || _('Unknown') - = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh'), class: 'gl-link gl-block gl-mt-3') + = link_to(_('Learn about signing commits with SSH keys.'), help_page_path('user/project/repository/signed_commits/ssh.md'), class: 'gl-link gl-block gl-mt-3') - else = _('GPG Key ID:') %span.gl-font-monospace= signature.gpg_key_primary_keyid - = link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index'), class: 'gl-link gl-block gl-mt-3') + = link_to(_('Learn about signing commits'), help_page_path('user/project/repository/signed_commits/index.md'), class: 'gl-link gl-block gl-mt-3') %a.signature-badge.gl-inline-block.gl-ml-4{ role: 'button', tabindex: 0, data: { toggle: 'popover', html: 'true', placement: 'top', title: title, content: content } } = gl_badge_tag label, variant: variant diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index 11b621d0f5c..895cdbad5c6 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -3,7 +3,7 @@ - add_page_specific_style 'page_bundles/projects_edit' - reduce_visibility_form_id = 'reduce-visibility-form' - @force_desktop_expanded_sidebar = true -- project_docs_path = help_page_path('user/project/working_with_projects') +- project_docs_path = help_page_path('user/project/working_with_projects.md') - project_docs_link_start = ''.html_safe % { url: project_docs_path } %h1.gl-sr-only= @breadcrumb_title @@ -36,7 +36,7 @@ expanded: expanded_by_default?) do |c| - c.with_description do = s_('ProjectSettings|Add badges to display information about this project.') - = link_to s_('ProjectSettings|What are badges?'), help_page_path('user/project/badges') + = link_to s_('ProjectSettings|What are badges?'), help_page_path('user/project/badges.md') - c.with_body do = render 'shared/badges/badge_settings' @@ -61,13 +61,13 @@ %h4.gl-text-base.gl-leading-24.gl-m-0= _('Housekeeping') %p.gl-text-subtle.gl-text-sm.gl-m-0 = _('Runs a number of housekeeping tasks within the current repository, such as compressing file revisions and removing unreachable objects.') - = link_to _('Learn more.'), help_page_path('administration/housekeeping'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/housekeeping.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do .gl-flex.gl-flex-wrap.gl-gap-3 = render Pajamas::ButtonComponent.new(method: :post, href: housekeeping_project_path(@project)) do = _('Run housekeeping') - #js-project-prune-unreachable-objects-button{ data: { prune_objects_path: housekeeping_project_path(@project, prune: true), prune_objects_doc_path: help_page_path('administration/housekeeping', anchor: 'prune-unreachable-objects') } } + #js-project-prune-unreachable-objects-button{ data: { prune_objects_path: housekeeping_project_path(@project, prune: true), prune_objects_doc_path: help_page_path('administration/housekeeping.md', anchor: 'prune-unreachable-objects') } } = render 'export', project: @project @@ -78,7 +78,7 @@ .gl-flex.gl-grow %h4.gl-text-base.gl-leading-24.gl-m-0= _('Change path') %p.gl-text-subtle.gl-text-sm.gl-m-0 - - link = link_to('', help_page_path('user/project/working_with_projects', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/working_with_projects.md', anchor: 'rename-a-repository'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_("A project’s repository name defines its URL (the one you use to access the project via a browser) and its place on the file disk where GitLab is installed. %{link_start}Learn more.%{link_end}"), tag_pair(link, :link_start, :link_end)) - c.with_body do diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml index f706a532477..5245cf03f4b 100644 --- a/app/views/projects/empty.html.haml +++ b/app/views/projects/empty.html.haml @@ -34,8 +34,8 @@ = _('You can also upload existing files from your computer using the instructions below.') .git-empty.js-git-empty %h3.gl-text-lg= _('Configure your Git identity') - - git_get_started_doc = link_to('', help_page_path('topics/git/get_started'), target: '_blank', rel: 'noopener noreferrer') - - git_config_doc = link_to('', help_page_path('topics/git/how_to_install_git/index', anchor: 'configure-git'), target: '_blank', rel: 'noopener noreferrer') + - git_get_started_doc = link_to('', help_page_path('topics/git/get_started.md'), target: '_blank', rel: 'noopener noreferrer') + - git_config_doc = link_to('', help_page_path('topics/git/how_to_install_git/index.md', anchor: 'configure-git'), target: '_blank', rel: 'noopener noreferrer') %p= safe_format(_("%{get_started}Get started with Git%{get_started_end} and learn %{git_config}how to configure it%{git_config_end}."), tag_pair(git_get_started_doc, :get_started, :get_started_end), tag_pair(git_config_doc, :git_config, :git_config_end)) .scrolling-tabs-container.inner-page-scroll-tabs = gl_tabs_nav({ class: 'js-configure-git-tabs' }) do diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index a55d1078b7b..e4b8750b96c 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -5,7 +5,7 @@ "can-read-environment" => can?(current_user, :read_environment, @project).to_s, "can-create-environment" => can?(current_user, :create_environment, @project).to_s, "new-environment-path" => new_project_environment_path(@project), - "help-page-path" => help_page_path("ci/environments/index"), + "help-page-path" => help_page_path("ci/environments/index.md"), "project-path" => @project.full_path, "project-id" => @project.id, "default-branch-name" => @project.default_branch_or_main } } diff --git a/app/views/projects/feature_flags/index.html.haml b/app/views/projects/feature_flags/index.html.haml index ec0830ad153..9774a1d35cc 100644 --- a/app/views/projects/feature_flags/index.html.haml +++ b/app/views/projects/feature_flags/index.html.haml @@ -4,9 +4,9 @@ "project-id" => @project.id, "project-name" => @project.name, "error-state-svg-path" => image_path('illustrations/empty-state/empty-feature-flag-md.svg'), - "feature-flags-help-page-path" => help_page_path("operations/feature_flags"), - "feature-flags-client-libraries-help-page-path" => help_page_path("operations/feature_flags", anchor: "choose-a-client-library"), - "feature-flags-client-example-help-page-path" => help_page_path("operations/feature_flags", anchor: "go-application-example"), + "feature-flags-help-page-path" => help_page_path("operations/feature_flags.md"), + "feature-flags-client-libraries-help-page-path" => help_page_path("operations/feature_flags.md", anchor: "choose-a-client-library"), + "feature-flags-client-example-help-page-path" => help_page_path("operations/feature_flags.md", anchor: "go-application-example"), "feature-flags-limit-exceeded" => @project.actual_limits.exceeded?(:project_feature_flags, @project.operations_feature_flags.count), "feature-flags-limit" => @project.actual_limits.project_feature_flags, "unleash-api-url" => (unleash_api_url(@project) if can?(current_user, :admin_feature_flag, @project)), diff --git a/app/views/projects/feature_flags/new.html.haml b/app/views/projects/feature_flags/new.html.haml index 1f723cb96b0..9f119a37c43 100644 --- a/app/views/projects/feature_flags/new.html.haml +++ b/app/views/projects/feature_flags/new.html.haml @@ -9,6 +9,6 @@ user_callouts_path: callouts_path, user_callout_id: Users::CalloutsHelper::FEATURE_FLAGS_NEW_VERSION, show_user_callout: show_feature_flags_new_version?.to_s, - strategy_type_docs_page_path: help_page_path('operations/feature_flags', anchor: 'feature-flag-strategies'), - environments_scope_docs_path: help_page_path('ci/environments/index', anchor: 'limit-the-environment-scope-of-a-cicd-variable'), + strategy_type_docs_page_path: help_page_path('operations/feature_flags.md', anchor: 'feature-flag-strategies'), + environments_scope_docs_path: help_page_path('ci/environments/index.md', anchor: 'limit-the-environment-scope-of-a-cicd-variable'), project_id: @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/edit.html.haml b/app/views/projects/feature_flags_user_lists/edit.html.haml index 70d614fc327..417b6354ec0 100644 --- a/app/views/projects/feature_flags_user_lists/edit.html.haml +++ b/app/views/projects/feature_flags_user_lists/edit.html.haml @@ -3,6 +3,6 @@ - breadcrumb_title s_('FeatureFlags|Edit User List') - page_title s_('FeatureFlags|Edit User List') -#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'), +#js-edit-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), 'user-list-iid' => @user_list.iid, 'project-id' => @project.id } } diff --git a/app/views/projects/feature_flags_user_lists/index.html.haml b/app/views/projects/feature_flags_user_lists/index.html.haml index 2e279d71758..21e975eac27 100644 --- a/app/views/projects/feature_flags_user_lists/index.html.haml +++ b/app/views/projects/feature_flags_user_lists/index.html.haml @@ -3,6 +3,6 @@ - page_title s_('FeatureFlags|Feature flag User Lists') #js-user-lists{ data: { project_id: @project.id, - feature_flags_help_page_path: help_page_path("operations/feature_flags"), + feature_flags_help_page_path: help_page_path("operations/feature_flags.md"), new_user_list_path: can?(current_user, :create_feature_flag, @project) ? new_project_feature_flags_user_list_path(@project): nil, error_state_svg_path: image_path('illustrations/empty-state/empty-feature-flag-md.svg') } } diff --git a/app/views/projects/feature_flags_user_lists/new.html.haml b/app/views/projects/feature_flags_user_lists/new.html.haml index 7f20fc4a9ec..cea55c0ca2a 100644 --- a/app/views/projects/feature_flags_user_lists/new.html.haml +++ b/app/views/projects/feature_flags_user_lists/new.html.haml @@ -4,6 +4,6 @@ - breadcrumb_title s_('FeatureFlags|New User List') - page_title s_('FeatureFlags|New User List') -#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags', anchor: 'user-list'), +#js-new-user-list{ data: { 'user-lists-docs-path' => help_page_path('operations/feature_flags.md', anchor: 'user-list'), 'feature-flags-path' => project_feature_flags_path(@project), 'project-id' => @project.id } } diff --git a/app/views/projects/forks/new.html.haml b/app/views/projects/forks/new.html.haml index 1194a361753..293afc4ecef 100644 --- a/app/views/projects/forks/new.html.haml +++ b/app/views/projects/forks/new.html.haml @@ -4,7 +4,7 @@ endpoint: new_project_fork_path(@project, format: :json), new_group_path: new_group_path, project_full_path: @project.full_path, - visibility_help_path: help_page_path("user/public_access"), + visibility_help_path: help_page_path("user/public_access.md"), cancel_path: project_path(@project), project_id: @project.id, project_name: @project.name, diff --git a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml index 3af8bbafa0f..c377f408669 100644 --- a/app/views/projects/issues/_alert_moved_from_service_desk.html.haml +++ b/app/views/projects/issues/_alert_moved_from_service_desk.html.haml @@ -1,5 +1,5 @@ - return unless show_moved_service_desk_issue_warning?(issue) -- service_desk_link_url = help_page_path('user/project/service_desk/index') +- service_desk_link_url = help_page_path('user/project/service_desk/index.md') - service_desk_link_start = ''.html_safe % { url: service_desk_link_url } = render Pajamas::AlertComponent.new(variant: :warning, diff --git a/app/views/projects/issues/_design_management.html.haml b/app/views/projects/issues/_design_management.html.haml index 121dfcbf5b8..cce6c570441 100644 --- a/app/views/projects/issues/_design_management.html.haml +++ b/app/views/projects/issues/_design_management.html.haml @@ -1,6 +1,6 @@ - return if @issue.work_item_type&.incident? -- requirements_link_url = help_page_path('user/project/issues/design_management', anchor: 'prerequisites') +- requirements_link_url = help_page_path('user/project/issues/design_management.md', anchor: 'prerequisites') - requirements_link_start = ''.html_safe % { url: requirements_link_url } - link_end = ''.html_safe - enable_lfs_message = s_("DesignManagement|To upload designs, you'll need to enable LFS and have an admin enable hashed storage. %{requirements_link_start}More information%{requirements_link_end}").html_safe % { requirements_link_start: requirements_link_start, requirements_link_end: link_end } diff --git a/app/views/projects/issues/_new_branch.html.haml b/app/views/projects/issues/_new_branch.html.haml index 449f1328a6b..37b45459b3c 100644 --- a/app/views/projects/issues/_new_branch.html.haml +++ b/app/views/projects/issues/_new_branch.html.haml @@ -45,7 +45,7 @@ %li.droplab-item-ignore.gl-ml-3.gl-mr-3.gl-mt-5 - if can_create_confidential_merge_request? - #js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index') } } + #js-forked-project{ data: { namespace_path: @project.namespace.full_path, project_path: @project.full_path, new_fork_path: new_project_fork_path(@project), help_page_path: help_page_path('user/project/merge_requests/index.md') } } .form-group %label{ for: 'new-branch-name' } = _('Branch name') diff --git a/app/views/projects/issues/_related_issues.html.haml b/app/views/projects/issues/_related_issues.html.haml index 43a02344940..e3c96487f42 100644 --- a/app/views/projects/issues/_related_issues.html.haml +++ b/app/views/projects/issues/_related_issues.html.haml @@ -3,7 +3,7 @@ can_add_related_issues: "#{can?(current_user, :admin_issue_link, @issue)}", full_path: @project.full_path, has_issue_weights_feature: @project.licensed_feature_available?(:issue_weights).to_s, - help_path: help_page_path('user/project/issues/related_issues'), + help_path: help_page_path('user/project/issues/related_issues.md'), is_group: 'false', issuable_type: @issue.issue_type, show_categorized_issues: @project.licensed_feature_available?(:blocked_issues).to_s, diff --git a/app/views/projects/issues/service_desk.html.haml b/app/views/projects/issues/service_desk.html.haml index c1174e78e5a..672b269f728 100644 --- a/app/views/projects/issues/service_desk.html.haml +++ b/app/views/projects/issues/service_desk.html.haml @@ -13,6 +13,6 @@ can_edit_project_settings: can?(current_user, :admin_project, @project).to_s, service_desk_callout_svg_path: image_path('illustrations/service-desk-sm.svg'), service_desk_settings_path: edit_project_path(@project, anchor: 'js-service-desk'), - service_desk_help_path: help_page_path('user/project/service_desk/index'), + service_desk_help_path: help_page_path('user/project/service_desk/index.md'), is_service_desk_supported: Gitlab::ServiceDesk.supported?.to_s, is_service_desk_enabled: @project.service_desk_enabled?.to_s } } diff --git a/app/views/projects/maintenance/_cleanup.html.haml b/app/views/projects/maintenance/_cleanup.html.haml index 049281ab3e9..75035890731 100644 --- a/app/views/projects/maintenance/_cleanup.html.haml +++ b/app/views/projects/maintenance/_cleanup.html.haml @@ -6,7 +6,7 @@ - help_link_title = _('What happens during repository cleanup?') = _("Upload a text file of objects, and then GitLab removes internal Git references to these objects. Use %{git_filter_link_start}git filter-repo%{git_filter_link_end} on the repository to generate the list of objects to remove as a commit-map file.").html_safe % { git_filter_link_start: git_filter_link_start, git_filter_link_end: link_end } = link_to sprite_icon('question-o'), - help_page_path('user/project/repository/reducing_the_repo_size_using_git', + help_page_path('user/project/repository/reducing_the_repo_size_using_git.md', anchor: 'repository-cleanup'), title: help_link_title, aria: { label: help_link_title }, diff --git a/app/views/projects/maintenance/_remove_blobs.html.haml b/app/views/projects/maintenance/_remove_blobs.html.haml index f09512c7851..26fc7e6c7c2 100644 --- a/app/views/projects/maintenance/_remove_blobs.html.haml +++ b/app/views/projects/maintenance/_remove_blobs.html.haml @@ -1,7 +1,7 @@ %h5.gl-heading-4= s_('ProjectMaintenance|Remove blobs') %p.gl-text-secondary = s_('ProjectMaintenance|Provide a list of blob object IDs to be removed.') - = link_to s_('ProjectMaintenance|How do I get a list of object IDs?'), help_page_path('user/project/repository/reducing_the_repo_size_using_git', anchor: 'get-a-list-of-object-ids') + = link_to s_('ProjectMaintenance|How do I get a list of object IDs?'), help_page_path('user/project/repository/reducing_the_repo_size_using_git.md', anchor: 'get-a-list-of-object-ids') %p.gl-text-secondary = s_('ProjectMaintenance|Afterwards, run housekeeping manually to remove old versions of the file from Git history.') diff --git a/app/views/projects/maintenance/_show.html.haml b/app/views/projects/maintenance/_show.html.haml index 42590dd69ff..d406d432cf0 100644 --- a/app/views/projects/maintenance/_show.html.haml +++ b/app/views/projects/maintenance/_show.html.haml @@ -9,7 +9,7 @@ = render Pajamas::AlertComponent.new(variant: :danger, alert_options: { class: 'gl-mb-5' }, dismissible: false) do |c| - c.with_body do - link_start = ''.html_safe - - docs_link_start = link_start % { url: help_page_path('user/project/settings/import_export') } + - docs_link_start = link_start % { url: help_page_path('user/project/settings/import_export.md') } - link_end = ''.html_safe = s_('ProjectMaintenance|To ensure that a full backup is available in case changes need to be restored, you should make an %{docs_link_start}export of the project%{docs_link_end}.').html_safe % { docs_link_start: docs_link_start, docs_link_end: link_end } diff --git a/app/views/projects/merge_requests/_page.html.haml b/app/views/projects/merge_requests/_page.html.haml index 44d74acd19f..cd570c2ef16 100644 --- a/app/views/projects/merge_requests/_page.html.haml +++ b/app/views/projects/merge_requests/_page.html.haml @@ -4,7 +4,7 @@ - page_title "#{@merge_request.title} (#{@merge_request.to_reference})", _("Merge requests") - page_description @merge_request.description_html - page_card_attributes @merge_request.card_attributes -- suggest_changes_help_path = help_page_path('user/project/merge_requests/reviews/suggestions') +- suggest_changes_help_path = help_page_path('user/project/merge_requests/reviews/suggestions.md') - mr_action = j(params[:tab].presence || 'show') - add_issuable_stylesheet - add_page_specific_style 'page_bundles/design_management' diff --git a/app/views/projects/merge_requests/_widget.html.haml b/app/views/projects/merge_requests/_widget.html.haml index c6bc49293d0..241d9ab4a59 100644 --- a/app/views/projects/merge_requests/_widget.html.haml +++ b/app/views/projects/merge_requests/_widget.html.haml @@ -8,17 +8,17 @@ window.gl.mrWidgetData.artifacts_endpoint = '#{downloadable_artifacts_project_pipeline_path(@project, artifacts_endpoint_placeholder, format: :json)}'; window.gl.mrWidgetData.artifacts_endpoint_placeholder = '#{artifacts_endpoint_placeholder}'; window.gl.mrWidgetData.pipeline_etag = '#{graphql_etag_pipeline_sha_path(@merge_request.diff_head_sha)}'; - window.gl.mrWidgetData.squash_before_merge_help_path = '#{help_page_path("user/project/merge_requests/squash_and_merge")}'; + window.gl.mrWidgetData.squash_before_merge_help_path = '#{help_page_path("user/project/merge_requests/squash_and_merge.md")}'; window.gl.mrWidgetData.ci_troubleshooting_docs_path = '#{help_page_path('ci/debugging.md')}'; window.gl.mrWidgetData.mr_troubleshooting_docs_path = '#{help_page_path('user/project/merge_requests/reviews/index.md', anchor: 'troubleshooting')}'; window.gl.mrWidgetData.pipeline_must_succeed_docs_path = '#{help_page_path('user/project/merge_requests/merge_when_pipeline_succeeds.md', anchor: 'require-a-successful-pipeline-for-merge')}'; window.gl.mrWidgetData.code_coverage_check_help_page_path = '#{help_page_path('ci/testing/code_coverage.md', anchor: 'coverage-check-approval-rule')}'; window.gl.mrWidgetData.security_configuration_path = '#{project_security_configuration_path(@project)}'; - window.gl.mrWidgetData.license_compliance_docs_path = '#{help_page_path('user/compliance/license_scanning_of_cyclonedx_files')}'; + window.gl.mrWidgetData.license_compliance_docs_path = '#{help_page_path('user/compliance/license_scanning_of_cyclonedx_files/index.md')}'; window.gl.mrWidgetData.eligible_approvers_docs_path = '#{help_page_path('user/project/merge_requests/approvals/rules.md', anchor: 'eligible-approvers')}'; window.gl.mrWidgetData.approvals_help_path = '#{help_page_path("user/project/merge_requests/approvals/index.md")}'; - window.gl.mrWidgetData.codequality_help_path = '#{help_page_path("user/project/merge_requests/code_quality", anchor: "code-quality-reports")}'; - window.gl.mrWidgetData.false_positive_doc_url = '#{help_page_path('user/application_security/vulnerabilities/index')}'; + window.gl.mrWidgetData.codequality_help_path = '#{help_page_path("ci/testing/code_quality.md", anchor: "code-quality-reports")}'; + window.gl.mrWidgetData.false_positive_doc_url = '#{help_page_path('user/application_security/vulnerabilities/index.md')}'; window.gl.mrWidgetData.can_view_false_positive = '#{@merge_request.project.licensed_feature_available?(:sast_fp_reduction).to_s}'; window.gl.mrWidgetData.user_preferences_gitpod_path = '#{profile_preferences_path(anchor: 'user_gitpod_enabled')}'; window.gl.mrWidgetData.user_profile_enable_gitpod_path = '#{user_settings_profile_path(user: { gitpod_enabled: true })}'; diff --git a/app/views/projects/merge_requests/index.html.haml b/app/views/projects/merge_requests/index.html.haml index 6ef34e53b88..b626620d70e 100644 --- a/app/views/projects/merge_requests/index.html.haml +++ b/app/views/projects/merge_requests/index.html.haml @@ -15,6 +15,8 @@ - if Feature.enabled?(:vue_merge_request_list, @project) .js-merge-request-list-root{ data: project_merge_requests_list_data(@project, current_user) } + - if @can_bulk_update + = render 'shared/issuable/bulk_update_sidebar', type: :merge_requests - else - if @project.merge_requests.exists? .top-area @@ -34,4 +36,4 @@ - if new_merge_request_email && can?(current_user, :create_merge_request_in, @project) .gl-text-center.gl-pt-5.gl-pb-7 - .js-issuable-by-email{ data: { initial_email: new_merge_request_email, issuable_type: issuable_type, emails_help_page_path: help_page_path('development/emails', anchor: 'email-namespace'), quick_actions_help_path: help_page_path('user/project/quick_actions'), markdown_help_path: help_page_path('user/markdown'), reset_path: new_issuable_address_project_path(@project, issuable_type: issuable_type) } } + .js-issuable-by-email{ data: { initial_email: new_merge_request_email, issuable_type: issuable_type, emails_help_page_path: help_page_path('development/emails.md', anchor: 'email-namespace'), quick_actions_help_path: help_page_path('user/project/quick_actions.md'), markdown_help_path: help_page_path('user/markdown.md'), reset_path: new_issuable_address_project_path(@project, issuable_type: issuable_type) } } diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index bf60c14cb8b..388a37b2a28 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -14,7 +14,7 @@ = f.label :description, _('Description') - @gfm_form = true .js-markdown-editor{ data: { render_markdown_path: preview_markdown_path(@project), - markdown_docs_path: help_page_path('user/markdown'), + markdown_docs_path: help_page_path('user/markdown.md'), testid: 'milestone-description-field', form_field_placeholder: _('Write milestone description...'), supports_quick_actions: 'false', diff --git a/app/views/projects/mirrors/_branch_filter.html.haml b/app/views/projects/mirrors/_branch_filter.html.haml index e2734dc11df..3859f1d5913 100644 --- a/app/views/projects/mirrors/_branch_filter.html.haml +++ b/app/views/projects/mirrors/_branch_filter.html.haml @@ -6,4 +6,4 @@ = _('Mirror only protected branches') - c.with_help_text do = _('If enabled, only protected branches will be mirrored.') - = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('user/project/repository/mirror/index.md', anchor: 'mirror-only-protected-branches'), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/projects/mirrors/_mirror_repos.html.haml b/app/views/projects/mirrors/_mirror_repos.html.haml index f02bba387ca..4d54f6597d4 100644 --- a/app/views/projects/mirrors/_mirror_repos.html.haml +++ b/app/views/projects/mirrors/_mirror_repos.html.haml @@ -10,7 +10,7 @@ expanded: expanded) do |c| - c.with_description do = _('Set up your project to automatically push and/or pull changes to/from another repository. Branches, tags, and commits will be synced automatically.') - = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/mirror/index'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('How do I mirror repositories?'), help_page_path('user/project/repository/mirror/index.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do = render ::Layouts::CrudComponent.new(_('Mirrored repositories'), icon: 'earth', diff --git a/app/views/projects/mirrors/_mirror_repos_push.html.haml b/app/views/projects/mirrors/_mirror_repos_push.html.haml index fb075d0f468..1d2d9968915 100644 --- a/app/views/projects/mirrors/_mirror_repos_push.html.haml +++ b/app/views/projects/mirrors/_mirror_repos_push.html.haml @@ -16,4 +16,4 @@ = _('Keep divergent refs') - c.with_help_text do - link_opening_tag = ''.html_safe - = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/mirror/push', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors')}, link_closing_tag: ''.html_safe } + = html_escape(_('Do not force push over diverged refs. After the mirror is created, this setting can only be modified using the API. %{mirroring_docs_link_start}Learn more about this option%{link_closing_tag} and %{mirroring_api_docs_link_start}the API.%{link_closing_tag}')) % { mirroring_docs_link_start: link_opening_tag % {url: help_page_path('user/project/repository/mirror/push.md', anchor: 'keep-divergent-refs')}, mirroring_api_docs_link_start: link_opening_tag % {url: help_page_path('api/remote_mirrors.md')}, link_closing_tag: ''.html_safe } diff --git a/app/views/projects/new.html.haml b/app/views/projects/new.html.haml index b553f398e54..045e547806f 100644 --- a/app/views/projects/new.html.haml +++ b/app/views/projects/new.html.haml @@ -14,7 +14,7 @@ has_errors: @project.errors.any?.to_s, new_project_guidelines: brand_new_project_guidelines, push_to_create_project_command: push_to_create_project_command, - project_help_path: help_page_path("user/project/index"), + project_help_path: help_page_path("user/project/index.md"), root_path: root_path, parent_group_url: @project.parent && group_url(@project.parent), parent_group_name: @project.parent&.name, diff --git a/app/views/projects/pages/_access.html.haml b/app/views/projects/pages/_access.html.haml index 0dc958be06c..1646c794227 100644 --- a/app/views/projects/pages/_access.html.haml +++ b/app/views/projects/pages/_access.html.haml @@ -18,7 +18,7 @@ - unless @project.public_pages? - c.with_footer do - - help_page = help_page_path('user/project/pages/pages_access_control') + - help_page = help_page_path('user/project/pages/pages_access_control.md') - link_start = ''.html_safe % { url: help_page } - link_end = ''.html_safe = html_escape_once(s_('GitLabPages|Access Control is enabled for this Pages website; only authorized users will be able to access it. To make your website publicly available, navigate to your project\'s %{strong_start}Settings > General > Visibility%{strong_end} and select %{strong_start}Everyone%{strong_end} in pages section. Read the %{link_start}documentation%{link_end} for more information.')).html_safe % { link_start: link_start, link_end: link_end, strong_start: ''.html_safe, strong_end: ''.html_safe } diff --git a/app/views/projects/pages/_header.html.haml b/app/views/projects/pages/_header.html.haml index 126670955f5..fe46af56c24 100644 --- a/app/views/projects/pages/_header.html.haml +++ b/app/views/projects/pages/_header.html.haml @@ -1,5 +1,5 @@ = render ::Layouts::PageHeadingComponent.new(s_('GitLabPages|Pages')) do |c| - c.with_description do - - docs_link_start = "".html_safe + - docs_link_start = "".html_safe - docs_link_end = ''.html_safe = s_('GitLabPages|With GitLab Pages you can host your static website directly from your GitLab repository. %{docs_link_start}Learn more.%{link_end}').html_safe % { docs_link_start: docs_link_start, link_end: docs_link_end } diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml index fcfcd96bd7b..9b6094aaa95 100644 --- a/app/views/projects/pages/_pages_settings.html.haml +++ b/app/views/projects/pages/_pages_settings.html.haml @@ -7,7 +7,7 @@ s_('GitLabPages|Force HTTPS (requires valid certificates)'), checkbox_options: { disabled: pages_https_only_disabled? }, label_options: { class: 'label-bold' } - - docs_link_start = "".html_safe + - docs_link_start = "".html_safe - link_end = ''.html_safe %p.gl-pl-6 = s_("GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}").html_safe % { docs_link_start: docs_link_start, link_end: link_end } @@ -28,7 +28,7 @@ label_options: { class: 'label-bold' } %p.gl-pl-6 = safe_format(s_("GitLabPages|When enabled, you can create parallel deployments of your pages site. %{docs_link_start}Learn more.%{link_end}"), - tag_pair(tag.a(href: help_page_path('user/project/pages/index', anchor: 'parallel-deployments'), target: '_blank'), + tag_pair(tag.a(href: help_page_path('user/project/pages/index.md', anchor: 'parallel-deployments'), target: '_blank'), :docs_link_start, :link_end)) .gl-mt-3 diff --git a/app/views/projects/pages/_ssl_limitations_warning.html.haml b/app/views/projects/pages/_ssl_limitations_warning.html.haml index c6740b55b5d..56010536e5f 100644 --- a/app/views/projects/pages/_ssl_limitations_warning.html.haml +++ b/app/views/projects/pages/_ssl_limitations_warning.html.haml @@ -4,6 +4,6 @@ - c.with_body do %strong= _("Warning:") - pages_host = Gitlab.config.pages.host - - docs_link_start = "".html_safe + - docs_link_start = "".html_safe - link_end = ''.html_safe = s_("GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}").html_safe % { pages_host: pages_host, docs_link_start: docs_link_start, link_end: link_end } diff --git a/app/views/projects/pages/_use.html.haml b/app/views/projects/pages/_use.html.haml index 4c39c1be060..45126128bf7 100644 --- a/app/views/projects/pages/_use.html.haml +++ b/app/views/projects/pages/_use.html.haml @@ -3,7 +3,7 @@ - c.with_header do = s_('GitLabPages|Configure pages') - c.with_body do - - docs_link_start = "".html_safe + - docs_link_start = "".html_safe - samples_link_start = "".html_safe - link_end = ''.html_safe = s_('GitLabPages|Your Pages site is not configured yet. See the %{docs_link_start}GitLab Pages documentation%{link_end} to learn how to upload your static site and have GitLab serve it. You can also take some inspiration from the %{samples_link_start}sample Pages projects%{link_end}.').html_safe % { docs_link_start: docs_link_start, samples_link_start: samples_link_start, link_end: link_end } diff --git a/app/views/projects/pages_domains/_certificate.html.haml b/app/views/projects/pages_domains/_certificate.html.haml index bb7a8b2a8a8..347bd342389 100644 --- a/app/views/projects/pages_domains/_certificate.html.haml +++ b/app/views/projects/pages_domains/_certificate.html.haml @@ -19,7 +19,7 @@ label_position: :hidden) = f.hidden_field :auto_ssl_enabled?, class: "js-project-feature-toggle-input" %p.gl-text-subtle.gl-mt-1 - - docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration") + - docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/lets_encrypt_integration.md") - docs_link_start = "".html_safe % { docs_link_url: docs_link_url } - docs_link_end = "".html_safe = _("Let's Encrypt is a free, automated, and open certificate authority (CA) that gives digital certificates in order to enable HTTPS (SSL/TLS) for websites. Learn more about Let's Encrypt configuration by following the %{docs_link_start}documentation on GitLab Pages%{docs_link_end}.").html_safe % { docs_link_url: docs_link_url, docs_link_start: docs_link_start, docs_link_end: docs_link_end } diff --git a/app/views/projects/pages_domains/_dns.html.haml b/app/views/projects/pages_domains/_dns.html.haml index 3a3c5959682..bf1998395c7 100644 --- a/app/views/projects/pages_domains/_dns.html.haml +++ b/app/views/projects/pages_domains/_dns.html.haml @@ -28,5 +28,5 @@ .input-group-append = clipboard_button(target: '#domain_verification', category: :primary, size: :medium) %p.form-text.gl-text-subtle - - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index', anchor: '4-verify-the-domains-ownership')) + - link_to_help = link_to(_('verify ownership'), help_page_path('user/project/pages/custom_domains_ssl_tls_certification/index.md', anchor: '4-verify-the-domains-ownership')) = _("To %{link_to_help} of your domain, add the above key to a TXT record within your DNS configuration within seven days.").html_safe % { link_to_help: link_to_help } diff --git a/app/views/projects/pages_domains/_helper_text.html.haml b/app/views/projects/pages_domains/_helper_text.html.haml index 2096bb8a56b..f0ff9e82433 100644 --- a/app/views/projects/pages_domains/_helper_text.html.haml +++ b/app/views/projects/pages_domains/_helper_text.html.haml @@ -1,4 +1,4 @@ -- docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/index", anchor: "adding-an-ssltls-certificate-to-pages") +- docs_link_url = help_page_path("user/project/pages/custom_domains_ssl_tls_certification/index.md", anchor: "adding-an-ssltls-certificate-to-pages") - docs_link_start = "".html_safe % { docs_link_url: docs_link_url } - docs_link_end = "".html_safe diff --git a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml index cd49f064613..0b22c77a8bc 100644 --- a/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml +++ b/app/views/projects/protected_tags/shared/_create_protected_tag.html.haml @@ -6,7 +6,7 @@ .protected-tags-dropdown = render partial: "projects/protected_tags/shared/dropdown", locals: { f: f } .form-text.text-muted - - wildcards_url = help_page_path('user/project/protected_tags', anchor: 'wildcard-protected-tags') + - wildcards_url = help_page_path('user/project/protected_tags.md', anchor: 'wildcard-protected-tags') - wildcards_link_start = ''.html_safe % { url: wildcards_url } = html_escape(_("%{wildcards_link_start}Wildcards%{wildcards_link_end} such as %{code_tag_start}v*%{code_tag_end} or %{code_tag_start}*-release%{code_tag_end} are supported.")) % { wildcards_link_start: wildcards_link_start, wildcards_link_end: ''.html_safe, code_tag_start: ''.html_safe, code_tag_end: ''.html_safe } .form-group diff --git a/app/views/projects/protected_tags/shared/_index.html.haml b/app/views/projects/protected_tags/shared/_index.html.haml index d0533d59f06..c1091cbbb6e 100644 --- a/app/views/projects/protected_tags/shared/_index.html.haml +++ b/app/views/projects/protected_tags/shared/_index.html.haml @@ -6,11 +6,11 @@ expanded: expanded) do |c| - c.with_description do = s_("ProtectedTag|Limit access to creating and updating tags.") - = link_to s_("ProtectedTag|What are protected tags?"), help_page_path("user/project/protected_tags") + = link_to s_("ProtectedTag|What are protected tags?"), help_page_path("user/project/protected_tags.md") - c.with_body do %p.gl-text-secondary = s_("ProtectedTag|By default, protected tags restrict who can modify the tag.") - = link_to s_("ProtectedTag|Learn more."), help_page_path("user/project/protected_tags", anchor: "who-can-modify-a-protected-tag") + = link_to s_("ProtectedTag|Learn more."), help_page_path("user/project/protected_tags.md", anchor: "who-can-modify-a-protected-tag") = render ::Layouts::CrudComponent.new(_('Protected tags'), icon: 'tag', diff --git a/app/views/projects/runners/_group_runners.html.haml b/app/views/projects/runners/_group_runners.html.haml index 44a8742166a..fff103e5447 100644 --- a/app/views/projects/runners/_group_runners.html.haml +++ b/app/views/projects/runners/_group_runners.html.haml @@ -1,4 +1,4 @@ -- link = link_to _('Runner API'), help_page_path('api/runners') +- link = link_to _('Runner API'), help_page_path('api/runners.md') %h4 = _('Group runners') diff --git a/app/views/projects/runners/_project_runners.html.haml b/app/views/projects/runners/_project_runners.html.haml index f8f8f5bc446..8d218ec7d2b 100644 --- a/app/views/projects/runners/_project_runners.html.haml +++ b/app/views/projects/runners/_project_runners.html.haml @@ -15,7 +15,7 @@ } } - else = _('Please contact an admin to create runners.') - = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('administration/settings/continuous_integration.md', anchor: 'restrict-runner-registration-by-all-users-in-an-instance'), target: '_blank', rel: 'noopener noreferrer' %hr - if @project_runners.any? diff --git a/app/views/projects/settings/_archive.html.haml b/app/views/projects/settings/_archive.html.haml index 3d4a6cc6b34..b5a6c90efbf 100644 --- a/app/views/projects/settings/_archive.html.haml +++ b/app/views/projects/settings/_archive.html.haml @@ -11,12 +11,12 @@ - c.with_body do - if @project.archived? - - link_start = ''.html_safe % { url: help_page_path('user/project/working_with_projects', anchor: 'unarchive-a-project') } + - link_start = ''.html_safe % { url: help_page_path('user/project/working_with_projects.md', anchor: 'unarchive-a-project') } %p= _("Unarchiving the project restores its members' ability to make commits, and create issues, comments, and other entities. %{strong_start}After you unarchive the project, it displays in the search and on the dashboard.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: ''.html_safe, strong_end: ''.html_safe, link_start: link_start, link_end: ''.html_safe } = render Pajamas::ButtonComponent.new(method: :post, href: unarchive_project_path(@project), variant: :confirm, button_options: { aria: { label: _('Unarchive project') }, data: { confirm: _("Are you sure that you want to unarchive this project?"), testid: 'unarchive-project-link' } }) do = _('Unarchive project') - else - - link_start = ''.html_safe % { url: help_page_path('user/project/working_with_projects', anchor: 'archive-a-project') } + - link_start = ''.html_safe % { url: help_page_path('user/project/working_with_projects.md', anchor: 'archive-a-project') } %p= _("Archiving the project makes it entirely read-only. It is hidden from the dashboard and doesn't display in searches. %{strong_start}The repository cannot be committed to, and no issues, comments, or other entities can be created.%{strong_end} %{link_start}Learn more.%{link_end}").html_safe % { strong_start: ''.html_safe, strong_end: ''.html_safe, link_start: link_start, link_end: ''.html_safe } = render Pajamas::ButtonComponent.new(method: :post, href: archive_project_path(@project), variant: :confirm, button_options: { aria: { label: _('Archive project') }, data: { confirm: _("Are you sure that you want to archive this project?"), testid: 'archive-project-link', 'confirm-btn-variant': 'confirm' } }) do = _('Archive project') diff --git a/app/views/projects/settings/_branch_rules_callout.html.haml b/app/views/projects/settings/_branch_rules_callout.html.haml index 9d07441e2e7..8578b8477dc 100644 --- a/app/views/projects/settings/_branch_rules_callout.html.haml +++ b/app/views/projects/settings/_branch_rules_callout.html.haml @@ -3,5 +3,5 @@ alert_options: { class: 'js-branch-rules-tip-callout gl-mt-5', data: { feature_id: Users::CalloutsHelper::BRANCH_RULES_TIP_CALLOUT, dismiss_endpoint: callouts_path, defer_links: 'true' }}, close_button_options: { data: { testid: 'close-branch-rules-callout' }}) do |c| - c.with_body do - - docs_link = link_to('', help_page_path('user/project/repository/branches/index', anchor: 'create-a-branch-rule'), target: '_blank', rel: 'noopener noreferrer') + - docs_link = link_to('', help_page_path('user/project/repository/branches/index.md', anchor: 'create-a-branch-rule'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('BranchRules|Edit branch protections, approval rules, and status checks from a single page. %{docs_link_start} How to use branch rules?%{docs_link_end}'), tag_pair(docs_link, :docs_link_start, :docs_link_end)) diff --git a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml index 46bc068f9e7..973612ab785 100644 --- a/app/views/projects/settings/ci_cd/_autodevops_form.html.haml +++ b/app/views/projects/settings/ci_cd/_autodevops_form.html.haml @@ -3,15 +3,15 @@ - link_start = ''.html_safe - link_end = ''.html_safe -- kubernetes_cluster_path = help_page_path('user/project/clusters/index') +- kubernetes_cluster_path = help_page_path('user/project/clusters/index.md') - kubernetes_cluster_link_start = link_start % { url: kubernetes_cluster_path } -- base_domain_path = help_page_path('user/project/clusters/gitlab_managed_clusters', anchor: 'base-domain') +- base_domain_path = help_page_path('user/project/clusters/gitlab_managed_clusters.md', anchor: 'base-domain') - base_domain_link_start = link_start % { url: base_domain_path } -- help_link_continouos = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/stages', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener noreferrer' -- help_link_timed = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables', anchor: 'timed-incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' -- help_link_incremental = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables', anchor: 'incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' +- help_link_continouos = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/stages.md', anchor: 'auto-deploy'), target: '_blank', rel: 'noopener noreferrer' +- help_link_timed = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables.md', anchor: 'timed-incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' +- help_link_incremental = link_to sprite_icon('question-o'), help_page_path('topics/autodevops/cicd_variables.md', anchor: 'incremental-rollout-to-production'), target: '_blank', rel: 'noopener noreferrer' .row .col-lg-12 @@ -22,7 +22,7 @@ = f.fields_for :auto_devops_attributes, @auto_devops do |form| = render Pajamas::CardComponent.new(card_options: { class: 'gl-mb-3' }, footer_options: { class: "js-extra-settings #{auto_devops_enabled || 'hidden'}", data: { testid: 'extra-auto-devops-settings' } }) do |c| - c.with_body do - - autodevops_help_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer' + - autodevops_help_link = link_to _('Learn more.'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer' - auto_devops_badge = auto_devops_enabled ? (gl_badge_tag badge_for_auto_devops_scope(@project), { variant: :info }, { class: 'js-instance-default-badge gl-ml-3 -gl-mt-1'}) : '' = form.gitlab_ui_checkbox_component :enabled, (s_('CICD|Default to Auto DevOps pipeline') + auto_devops_badge).html_safe, diff --git a/app/views/projects/settings/ci_cd/_form.html.haml b/app/views/projects/settings/ci_cd/_form.html.haml index 0efd55f2e50..385fb6890a9 100644 --- a/app/views/projects/settings/ci_cd/_form.html.haml +++ b/app/views/projects/settings/ci_cd/_form.html.haml @@ -1,8 +1,8 @@ -- help_link_public_pipelines = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer' -- help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer' -- help_link_prevent_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'prevent-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer' -- help_link_prevent_outdated_allow_rollback = link_to sprite_icon('question-o'), help_page_path('ci/environments/deployment_safety', anchor: 'job-retries-for-rollback-deployments'), target: '_blank', rel: 'noopener noreferrer' -- help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/index', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer' +- help_link_public_pipelines = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'change-which-users-can-view-your-pipelines'), target: '_blank', rel: 'noopener noreferrer' +- help_link_auto_canceling = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'auto-cancel-redundant-pipelines'), target: '_blank', rel: 'noopener noreferrer' +- help_link_prevent_outdated = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'prevent-outdated-deployment-jobs'), target: '_blank', rel: 'noopener noreferrer' +- help_link_prevent_outdated_allow_rollback = link_to sprite_icon('question-o'), help_page_path('ci/environments/deployment_safety.md', anchor: 'job-retries-for-rollback-deployments'), target: '_blank', rel: 'noopener noreferrer' +- help_link_separated_caches = link_to sprite_icon('question-o'), help_page_path('ci/caching/index.md', anchor: 'cache-key-names'), target: '_blank', rel: 'noopener noreferrer' .row.gl-mt-3 .col-lg-12 @@ -43,7 +43,7 @@ = f.text_field :ci_config_path, class: 'form-control', placeholder: '.gitlab-ci.yml' %p.form-text.text-muted = html_escape(_("The name of the CI/CD configuration file. A path relative to the root directory is optional (for example %{code_open}my/path/.myfile.yml%{code_close}).")) % { code_open: ''.html_safe, code_close: ''.html_safe } - = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'specify-a-custom-cicd-configuration-file'), target: '_blank', rel: 'noopener noreferrer' %hr .form-group @@ -51,7 +51,7 @@ = _("Git strategy") .gl-mb-3 = _("Choose which Git strategy to use when fetching the project.") - = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'choose-the-default-git-strategy'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'choose-the-default-git-strategy'), target: '_blank', rel: 'noopener noreferrer' = f.gitlab_ui_radio_component :build_allow_git_fetch, false, "git clone", @@ -67,7 +67,7 @@ = form.number_field :default_git_depth, { class: 'form-control gl-form-input', min: 0, max: 1000 } %p.form-text.text-muted = html_escape(_('The number of changes to fetch from GitLab when cloning a repository. Lower values can speed up pipeline execution. Set to %{code_open}0%{code_close} or blank to fetch all branches and tags for each job')) % { code_open: ''.html_safe, code_close: ''.html_safe } - = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'limit-the-number-of-changes-fetched-during-clone'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'limit-the-number-of-changes-fetched-during-clone'), target: '_blank', rel: 'noopener noreferrer' %hr .form-group @@ -75,7 +75,7 @@ = f.text_field :build_timeout_human_readable, class: 'form-control gl-form-input' %p.form-text.text-muted = html_escape(_('Jobs fail if they run longer than the timeout time. Input value is in seconds by default. Human readable input is also accepted, for example %{code_open}1 hour%{code_close}.')) % { code_open: ''.html_safe, code_close: ''.html_safe } - = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings', anchor: 'set-a-limit-for-how-long-jobs-can-run'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('ci/pipelines/settings.md', anchor: 'set-a-limit-for-how-long-jobs-can-run'), target: '_blank', rel: 'noopener noreferrer' - if can?(current_user, :update_max_artifacts_size, @project) .form-group @@ -83,7 +83,7 @@ = f.number_field :max_artifacts_size, class: 'form-control gl-form-input' %p.form-text.text-muted = _("The maximum file size in megabytes for individual job artifacts.") - = link_to sprite_icon('question-o'), help_page_path('administration/settings/continuous_integration', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('administration/settings/continuous_integration.md', anchor: 'maximum-artifacts-size'), target: '_blank', rel: 'noopener noreferrer' = f.submit _('Save changes'), pajamas_button: true diff --git a/app/views/projects/settings/ci_cd/show.html.haml b/app/views/projects/settings/ci_cd/show.html.haml index 5a2795df348..124668fb822 100644 --- a/app/views/projects/settings/ci_cd/show.html.haml +++ b/app/views/projects/settings/ci_cd/show.html.haml @@ -21,8 +21,8 @@ testid: 'autodevops-settings-content', expanded: expanded) do |c| - c.with_description do - - auto_devops_url = help_page_path('topics/autodevops/index') - - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke') + - auto_devops_url = help_page_path('topics/autodevops/index.md') + - quickstart_url = help_page_path('topics/autodevops/cloud_deployments/auto_devops_with_gke.md') - auto_devops_link = link_to('', auto_devops_url, target: '_blank', rel: 'noopener noreferrer') - quickstart_link = link_to('', quickstart_url, target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('AutoDevOps|%{auto_devops_start}Automate building, testing, and deploying%{auto_devops_end} your applications based on your continuous integration and delivery configuration. %{quickstart_start}How do I get started?%{quickstart_end}'), tag_pair(auto_devops_link, :auto_devops_start, :auto_devops_end), tag_pair(quickstart_link, :quickstart_start, :quickstart_end)) @@ -51,7 +51,7 @@ - c.with_description do = _("A job artifact is an archive of files and directories saved by a job when it finishes.") - c.with_body do - #js-artifacts-settings-app{ data: { full_path: @project.full_path, help_page_path: help_page_path('ci/jobs/job_artifacts', anchor: 'keep-artifacts-from-most-recent-successful-jobs') } } + #js-artifacts-settings-app{ data: { full_path: @project.full_path, help_page_path: help_page_path('ci/jobs/job_artifacts.md', anchor: 'keep-artifacts-from-most-recent-successful-jobs') } } - if can?(current_user, :admin_cicd_variables, @project) = render ::Layouts::SettingsBlockComponent.new(_('Variables'), @@ -69,7 +69,7 @@ expanded: expanded) do |c| - c.with_description do = _("Trigger a pipeline for a branch or tag by generating a trigger token and using it with an API call. The token impersonates a user's project access and permissions.") - = link_to _('Learn more.'), help_page_path('ci/triggers/index'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('ci/triggers/index.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do = render 'projects/triggers/index' @@ -80,7 +80,7 @@ id: 'js-deploy-freeze-settings', expanded: expanded) do |c| - c.with_description do - - freeze_period_docs = help_page_path('user/project/releases/index', anchor: 'prevent-unintentional-releases-by-setting-a-deploy-freeze') + - freeze_period_docs = help_page_path('user/project/releases/index.md', anchor: 'prevent-unintentional-releases-by-setting-a-deploy-freeze') - freeze_period_link_start = ''.html_safe % { url: freeze_period_docs } = html_escape(s_('DeployFreeze|Add a freeze period to prevent unintended releases during a period of time for a given environment. You must update the deployment jobs in %{filename} according to the deploy freezes added here. %{freeze_period_link_start}Learn more.%{freeze_period_link_end}')) % { freeze_period_link_start: freeze_period_link_start, freeze_period_link_end: ''.html_safe, filename: tag.code('.gitlab-ci.yml') } @@ -104,6 +104,6 @@ expanded: expanded) do |c| - c.with_description do = _("Use secure files to store files used by your pipelines such as Android keystores, or Apple provisioning profiles and signing certificates.") - = link_to _('Learn more'), help_page_path('ci/secure_files/index'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('ci/secure_files/index.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do #js-ci-secure-files{ data: { project_id: @project.id, admin: can?(current_user, :admin_secure_files, @project).to_s, file_size_limit: Ci::SecureFile::FILE_SIZE_LIMIT.to_mb } } diff --git a/app/views/projects/settings/integrations/index.html.haml b/app/views/projects/settings/integrations/index.html.haml index 6cb93128669..e3f729a0e3b 100644 --- a/app/views/projects/settings/integrations/index.html.haml +++ b/app/views/projects/settings/integrations/index.html.haml @@ -7,7 +7,7 @@ %section.js-search-settings-section = render ::Layouts::PageHeadingComponent.new(_('Integrations')) do |c| - c.with_description do - - integrations_link = link_to('', help_page_url('user/project/integrations/index')) + - integrations_link = link_to('', help_page_url('user/project/integrations/index.md')) - webhooks_link = link_to('', project_hooks_path(@project)) = safe_format(_("%{integrations_link_start}Integrations%{link_end} enable you to make third-party applications part of your GitLab workflow. If the available integrations don't meet your needs, consider using a %{webhooks_link_start}webhook%{link_end}."), tag_pair(integrations_link, :integrations_link_start, :link_end), tag_pair(webhooks_link, :webhooks_link_start, :link_end)) end diff --git a/app/views/projects/settings/merge_requests/_merge_request_merge_commit_template.html.haml b/app/views/projects/settings/merge_requests/_merge_request_merge_commit_template.html.haml index 0a6f940e41a..da1965f549c 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_merge_commit_template.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_merge_commit_template.html.haml @@ -9,5 +9,5 @@ %p.form-text.text-muted = s_('ProjectSettings|Leave empty to use default template.') = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Project::MAX_COMMIT_TEMPLATE_LENGTH }) - - link = link_to('', help_page_path('user/project/merge_requests/commit_templates'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/merge_requests/commit_templates.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('ProjectSettings|%{link_start}What variables can I use?%{link_end}'), tag_pair(link, :link_start, :link_end)) diff --git a/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml b/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml index 3ce9630a333..a995c5d0f36 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_merge_method_settings.html.haml @@ -12,7 +12,7 @@ - ffOnly = s_('ProjectSettings|Fast-forward merges only.') - ffConflictRebase = s_('ProjectSettings|When there is a merge conflict, the user is given the option to rebase.') - ffTrains = s_('ProjectSettings|If merge trains are enabled, merging is only possible if the branch can be rebased without conflicts.') -- ffTrainsHelp = link_to s_('ProjectSettings|What are merge trains?'), help_page_path('ci/pipelines/merge_trains', anchor: 'enable-merge-trains'), target: '_blank', rel: 'noopener noreferrer' +- ffTrainsHelp = link_to s_('ProjectSettings|What are merge trains?'), help_page_path('ci/pipelines/merge_trains.md', anchor: 'enable-merge-trains'), target: '_blank', rel: 'noopener noreferrer' - ffTrainsHelpFullHelpText = (noMergeCommit + "
" + ffOnly + "
" + ffConflictRebase + "
" + ffTrains + " " + ffTrainsHelp).html_safe @@ -20,7 +20,7 @@ %b= s_('ProjectSettings|Merge method') %p.text-secondary = s_('ProjectSettings|Determine what happens to the commit history when you merge a merge request.') - = link_to s_('ProjectSettings|How do they differ?'), help_page_path('user/project/merge_requests/methods/index'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('ProjectSettings|How do they differ?'), help_page_path('user/project/merge_requests/methods/index.md'), target: '_blank', rel: 'noopener noreferrer' = form.gitlab_ui_radio_component :merge_method, :merge, labelMerge, diff --git a/app/views/projects/settings/merge_requests/_merge_request_merge_suggestions_settings.html.haml b/app/views/projects/settings/merge_requests/_merge_request_merge_suggestions_settings.html.haml index 8b600544778..5be7ee77c38 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_merge_suggestions_settings.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_merge_suggestions_settings.html.haml @@ -9,5 +9,5 @@ %p.form-text.text-muted = s_('ProjectSettings|Leave empty to use default template.') = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Project::MAX_SUGGESTIONS_TEMPLATE_LENGTH }) - - link = link_to('', help_page_path('user/project/merge_requests/reviews/suggestions', anchor: 'configure-the-commit-message-for-applied-suggestions'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/merge_requests/reviews/suggestions.md', anchor: 'configure-the-commit-message-for-applied-suggestions'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('ProjectSettings|%{link_start}What variables can I use?%{link_end}'), tag_pair(link, :link_start, :link_end)) diff --git a/app/views/projects/settings/merge_requests/_merge_request_squash_commit_template.html.haml b/app/views/projects/settings/merge_requests/_merge_request_squash_commit_template.html.haml index 26b038f1bf7..bc6530b927c 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_squash_commit_template.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_squash_commit_template.html.haml @@ -9,5 +9,5 @@ %p.form-text.text-muted = s_('ProjectSettings|Leave empty to use default template.') = sprintf(s_('ProjectSettings|Maximum %{maxLength} characters.'), { maxLength: Project::MAX_COMMIT_TEMPLATE_LENGTH }) - - link = link_to('', help_page_path('user/project/merge_requests/commit_templates'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/merge_requests/commit_templates.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('ProjectSettings|%{link_start}What variables can I use?%{link_end}'), tag_pair(link, :link_start, :link_end)) diff --git a/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml b/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml index 120b183bf51..372c0723600 100644 --- a/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml +++ b/app/views/projects/settings/merge_requests/_merge_request_squash_options_settings.html.haml @@ -5,7 +5,7 @@ %b= s_('ProjectSettings|Squash commits when merging') %p.text-secondary = s_('ProjectSettings|Set the default behavior of this option in merge requests. Changes to this are also applied to existing merge requests.') - = link_to s_('ProjectSettings|What is squashing?'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_('ProjectSettings|What is squashing?'), help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer' = settings.gitlab_ui_radio_component :squash_option, :never, diff --git a/app/views/projects/settings/operations/_alert_management.html.haml b/app/views/projects/settings/operations/_alert_management.html.haml index e86a196a270..9694331d851 100644 --- a/app/views/projects/settings/operations/_alert_management.html.haml +++ b/app/views/projects/settings/operations/_alert_management.html.haml @@ -9,6 +9,6 @@ expanded: expanded) do |c| - c.with_description do = _('Display alerts from all configured monitoring tools.') - = link_to _('Learn more.'), help_page_path('operations/incident_management/integrations'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('operations/incident_management/integrations.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do .js-alerts-settings{ data: alerts_settings_data } diff --git a/app/views/projects/settings/operations/_error_tracking.html.haml b/app/views/projects/settings/operations/_error_tracking.html.haml index bb99f72a275..7d6490e28f6 100644 --- a/app/views/projects/settings/operations/_error_tracking.html.haml +++ b/app/views/projects/settings/operations/_error_tracking.html.haml @@ -6,7 +6,7 @@ id: 'js-error-tracking-settings') do |c| - c.with_description do = _('Link Sentry to GitLab to discover and view the errors your application generates.') - = link_to _('Learn more.'), help_page_path('operations/error_tracking'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more.'), help_page_path('operations/error_tracking.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_body do .js-error-tracking-form{ data: { list_projects_endpoint: project_error_tracking_projects_path(@project, format: :json), operations_settings_endpoint: project_settings_operations_path(@project), diff --git a/app/views/projects/terraform/_period_in_terraform_state_name_alert.html.haml b/app/views/projects/terraform/_period_in_terraform_state_name_alert.html.haml index 58ee014bfc0..b9ee89fd927 100644 --- a/app/views/projects/terraform/_period_in_terraform_state_name_alert.html.haml +++ b/app/views/projects/terraform/_period_in_terraform_state_name_alert.html.haml @@ -1,4 +1,4 @@ -- link_url = help_page_path('user/infrastructure/iac/troubleshooting', anchor: 'state-not-found-if-the-state-name-contains-a-period') +- link_url = help_page_path('user/infrastructure/iac/troubleshooting.md', anchor: 'state-not-found-if-the-state-name-contains-a-period') - link = link_to('', link_url, target: '_blank', rel: 'noopener noreferrer') = render Pajamas::AlertComponent.new(variant: 'info', alert_options: { class: 'gl-mt-5 js-period-in-terraform-state-name-alert', data: { feature_id: Users::CalloutsHelper::PERIOD_IN_TERRAFORM_STATE_NAME_ALERT, dismiss_endpoint: callouts_path, defer_links: 'true' }}) do |c| diff --git a/app/views/projects/triggers/_index.html.haml b/app/views/projects/triggers/_index.html.haml index 877cc7e9e7a..c867223685c 100644 --- a/app/views/projects/triggers/_index.html.haml +++ b/app/views/projects/triggers/_index.html.haml @@ -17,7 +17,7 @@ %h4.gl-mt-0 = _('Add new pipeline trigger token') = render Pajamas::AlertComponent.new(variant: :danger, alert_options: { class: 'gl-mb-5 gl-pb-2' }, dismissible: false) do |c| - - keep_tokens_secure_link = link_to(s_('PipelineTriggerTokens|How can I keep my tokens secure?'), help_page_path('security/tokens/index', anchor: 'security-considerations'), target: '_blank', rel: 'noopener noreferrer') + - keep_tokens_secure_link = link_to(s_('PipelineTriggerTokens|How can I keep my tokens secure?'), help_page_path('security/tokens/index.md', anchor: 'security-considerations'), target: '_blank', rel: 'noopener noreferrer') - c.with_body do %p = s_('PipelineTriggerTokens|It is a security risk to save tokens in plain text in your project, or store them in a way that malicious users could access them. A leaked trigger token could be used to force an unscheduled deployment, attempt to access CI/CD variables, or other malicious uses. %{keep_tokens_secure_link}').html_safe % { keep_tokens_secure_link: keep_tokens_secure_link } diff --git a/app/views/projects/usage_quotas/index.html.haml b/app/views/projects/usage_quotas/index.html.haml index 687ad9e3d70..a96356a5384 100644 --- a/app/views/projects/usage_quotas/index.html.haml +++ b/app/views/projects/usage_quotas/index.html.haml @@ -9,7 +9,7 @@ = safe_format(s_('UsageQuota|Usage of project resources across the %{strong_start}%{project_name}%{strong_end} project.'), { project_name: @project.name }, tag_pair(tag.strong, :strong_start, :strong_end)) - %a{ href: help_page_path('user/usage_quotas'), target: '_blank', rel: 'noopener noreferrer' } + %a{ href: help_page_path('user/usage_quotas.md'), target: '_blank', rel: 'noopener noreferrer' } = s_('UsageQuota|Learn more about usage quotas.') - content_for :usage_quotas_tabs do diff --git a/app/views/protected_branches/shared/_index.html.haml b/app/views/protected_branches/shared/_index.html.haml index ad62bc2977c..7b6e43bc82c 100644 --- a/app/views/protected_branches/shared/_index.html.haml +++ b/app/views/protected_branches/shared/_index.html.haml @@ -7,7 +7,7 @@ expanded: expanded) do |c| - c.with_description do = s_("ProtectedBranch|Keep stable branches secure and force developers to use merge requests.") - = link_to s_("ProtectedBranch|What are protected branches?"), help_page_path("user/project/repository/branches/protected") + = link_to s_("ProtectedBranch|What are protected branches?"), help_page_path("user/project/repository/branches/protected.md") - c.with_body do .js-alert-protected-branch-created-container.gl-mt-5 @@ -16,7 +16,7 @@ dismissible: false) do |c| - c.with_body do = s_("ProtectedBranch|Giving merge rights to a protected branch also gives elevated permissions for certain CI/CD features.") - = link_to s_("ProtectedBranch|What are the security implications?"), help_page_path('ci/pipelines/index', anchor: 'pipeline-security-on-protected-branches'), target: '_blank', rel: 'noopener noreferrer' + = link_to s_("ProtectedBranch|What are the security implications?"), help_page_path('ci/pipelines/index.md', anchor: 'pipeline-security-on-protected-branches'), target: '_blank', rel: 'noopener noreferrer' = render ::Layouts::CrudComponent.new(s_("ProtectedBranch|Protected branches"), icon: 'branch', @@ -25,7 +25,7 @@ toggle_options: { data: { testid: 'add-protected-branch-button' } }) do |c| - c.with_description do = s_("ProtectedBranch|By default, protected branches restrict who can modify the branch.") - = link_to s_("ProtectedBranch|Learn more."), help_page_path("user/project/repository/branches/protected", anchor: "who-can-modify-a-protected-branch") + = link_to s_("ProtectedBranch|Learn more."), help_page_path("user/project/repository/branches/protected.md", anchor: "who-can-modify-a-protected-branch") - c.with_body do = content_for :branches_list diff --git a/app/views/shared/_auto_devops_callout.html.haml b/app/views/shared/_auto_devops_callout.html.haml index e7b07e98fbd..e1788029ca2 100644 --- a/app/views/shared/_auto_devops_callout.html.haml +++ b/app/views/shared/_auto_devops_callout.html.haml @@ -8,6 +8,6 @@ = s_('AutoDevOps|Auto DevOps') %p - - link = link_to(s_('AutoDevOps|Auto DevOps documentation'), help_page_path('topics/autodevops/index'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to(s_('AutoDevOps|Auto DevOps documentation'), help_page_path('topics/autodevops/index.md'), target: '_blank', rel: 'noopener noreferrer') = s_('AutoDevOps|Automatically build, test, and deploy your application based on a predefined CI/CD configuration.') = s_('AutoDevOps|Learn more in the %{link_to_documentation}.').html_safe % { link_to_documentation: link } diff --git a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml index 05a3fd2abc9..1e7184faca0 100644 --- a/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml +++ b/app/views/shared/_auto_devops_implicitly_enabled_banner.html.haml @@ -9,4 +9,4 @@ = _('Container registry is not enabled on this GitLab instance. Ask an administrator to enable it in order for Auto DevOps to work.') - c.with_actions do = link_button_to _('Settings'), project_settings_ci_cd_path(project), class: 'alert-link', variant: :confirm - = link_button_to _('More information'), help_page_path('topics/autodevops/index'), target: '_blank', class: 'alert-link gl-ml-3' + = link_button_to _('More information'), help_page_path('topics/autodevops/index.md'), target: '_blank', class: 'alert-link gl-ml-3' diff --git a/app/views/shared/_custom_attributes.html.haml b/app/views/shared/_custom_attributes.html.haml index a18077628d9..f837a78204d 100644 --- a/app/views/shared/_custom_attributes.html.haml +++ b/app/views/shared/_custom_attributes.html.haml @@ -2,7 +2,7 @@ = render ::Layouts::CrudComponent.new(_('Custom attributes')) do |c| - c.with_actions do - = render Pajamas::ButtonComponent.new(href: help_page_path('api/custom_attributes'), size: :small, category: :tertiary, variant: :confirm) do + = render Pajamas::ButtonComponent.new(href: help_page_path('api/custom_attributes.md'), size: :small, category: :tertiary, variant: :confirm) do = _('Learn more') - c.with_body do %ul.content-list diff --git a/app/views/shared/_default_branch_protection_defaults.html.haml b/app/views/shared/_default_branch_protection_defaults.html.haml index 4e554d38b6a..43fa19f9b36 100644 --- a/app/views/shared/_default_branch_protection_defaults.html.haml +++ b/app/views/shared/_default_branch_protection_defaults.html.haml @@ -28,7 +28,7 @@ - c.with_label do = s_("ProtectedBranch|Allowed to force push") - c.with_help_text do - - force_push_docs_url = help_page_url('topics/git/git_rebase', anchor: 'force-pushing') + - force_push_docs_url = help_page_url('topics/git/git_rebase.md', anchor: 'force-pushing') - force_push_link_start = ''.html_safe % { url: force_push_docs_url } = (s_("ProtectedBranch|Allow all users with push access to %{tag_start}force push%{tag_end}.") % { tag_start: force_push_link_start, tag_end: '' }).html_safe diff --git a/app/views/shared/_outdated_browser.html.haml b/app/views/shared/_outdated_browser.html.haml index e62e3bb4a6c..d26f377272b 100644 --- a/app/views/shared/_outdated_browser.html.haml +++ b/app/views/shared/_outdated_browser.html.haml @@ -3,5 +3,5 @@ - c.with_body do = s_('OutdatedBrowser|GitLab may not work properly, because you are using an outdated web browser.') %br - - link = link_to('', help_page_path('install/requirements', anchor: 'supported-web-browsers'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('install/requirements.md', anchor: 'supported-web-browsers'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('OutdatedBrowser|Please install a %{browser_link_start}supported web browser%{browser_link_end} for a better experience.'), tag_pair(link, :browser_link_start, :browser_link_end)) diff --git a/app/views/shared/_registration_features_discovery_message.html.haml b/app/views/shared/_registration_features_discovery_message.html.haml index 5fa554171aa..6e386866dfb 100644 --- a/app/views/shared/_registration_features_discovery_message.html.haml +++ b/app/views/shared/_registration_features_discovery_message.html.haml @@ -1,5 +1,5 @@ - feature_title = local_assigns.fetch(:feature_title, s_('RegistrationFeatures|use this feature')) -- registration_features_docs_path = help_page_path('administration/settings/usage_statistics', anchor: 'registration-features-program') +- registration_features_docs_path = help_page_path('administration/settings/usage_statistics.md', anchor: 'registration-features-program') - registration_features_link_start = ''.html_safe % { url: registration_features_docs_path } %div diff --git a/app/views/shared/_service_ping_consent.html.haml b/app/views/shared/_service_ping_consent.html.haml index b65808bfcd2..a5e63896367 100644 --- a/app/views/shared/_service_ping_consent.html.haml +++ b/app/views/shared/_service_ping_consent.html.haml @@ -1,7 +1,7 @@ - if session[:ask_for_usage_stats_consent] = render Pajamas::AlertComponent.new(alert_options: { class: 'service-ping-consent-message' }) do |c| - c.with_body do - - docs_link = link_to '', help_page_path('administration/settings/usage_statistics'), class: 'gl-link' + - docs_link = link_to '', help_page_path('administration/settings/usage_statistics.md'), class: 'gl-link' - settings_link = link_to '', metrics_and_profiling_admin_application_settings_path(anchor: 'js-usage-settings'), class: 'gl-link' = safe_format s_('ServicePing|To help improve GitLab, we would like to periodically %{link_start}collect usage information%{link_end}.'), tag_pair(docs_link, :link_start, :link_end) = safe_format s_('ServicePing|This can be changed at any time in %{link_start}your settings%{link_end}.'), tag_pair(settings_link, :link_start, :link_end) diff --git a/app/views/shared/_silent_mode_banner.html.haml b/app/views/shared/_silent_mode_banner.html.haml index 6b0eb7b6d27..62d62fbbc69 100644 --- a/app/views/shared/_silent_mode_banner.html.haml +++ b/app/views/shared/_silent_mode_banner.html.haml @@ -6,4 +6,4 @@ dismissible: false, variant: :warning) do |c| - c.with_body do - = s_('SilentMode|All outbound communications are blocked. %{link_start}Learn more%{link_end}.').html_safe % { link_start: "".html_safe, link_end: ''.html_safe } + = s_('SilentMode|All outbound communications are blocked. %{link_start}Learn more%{link_end}.').html_safe % { link_start: "".html_safe, link_end: ''.html_safe } diff --git a/app/views/shared/_token_expiration_banner.html.haml b/app/views/shared/_token_expiration_banner.html.haml index e68fe613c22..f154eb24b22 100644 --- a/app/views/shared/_token_expiration_banner.html.haml +++ b/app/views/shared/_token_expiration_banner.html.haml @@ -4,6 +4,6 @@ - return unless show_token_expiration_banner? - return unless cookies[cookie_key].blank? -- link = link_to('', help_page_path('security/tokens/token_troubleshooting'), target: '_blank', rel: 'noopener noreferrer') +- link = link_to('', help_page_path('security/tokens/token_troubleshooting.md'), target: '_blank', rel: 'noopener noreferrer') - message = safe_format(s_('AccessTokens|GitLab now enforces expiry dates on tokens that originally had no set expiration date. Those tokens were given an expiration date of one year later. Please review your personal access tokens, project access tokens, and group access tokens to ensure you are aware of upcoming expirations. Administrators of GitLab can find more information on how to identify and mitigate interruption in our %{link_start}documentation%{link_end}.'), tag_pair(link, :link_start, :link_end)) = render Pajamas::BroadcastBannerComponent.new(message: message, id: id, theme: 'light-indigo', dismissable: true, expire_date: Time.now.next_year.iso8601, cookie_key: cookie_key) diff --git a/app/views/shared/_visibility_level.html.haml b/app/views/shared/_visibility_level.html.haml index 3cf13222f4e..7216b24f514 100644 --- a/app/views/shared/_visibility_level.html.haml +++ b/app/views/shared/_visibility_level.html.haml @@ -5,7 +5,7 @@ = f.label :visibility_level, _('Visibility level'), class: 'label-bold gl-mb-0' %p = _('Who can see this group?') - - link = link_to('', help_page_path('user/public_access'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/public_access.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_('%{docs_link_start}Learn about visibility levels.%{docs_link_end}'), tag_pair(link, :docs_link_start, :docs_link_end)) - if can_change_visibility_level = render('shared/visibility_radios', model_method: :visibility_level, form: f, selected_level: visibility_level, form_model: form_model) diff --git a/app/views/shared/deploy_keys/_form.html.haml b/app/views/shared/deploy_keys/_form.html.haml index 304f4dbe204..c961009d285 100644 --- a/app/views/shared/deploy_keys/_form.html.haml +++ b/app/views/shared/deploy_keys/_form.html.haml @@ -13,7 +13,7 @@ = form.label :key %p.gl-text-secondary - - link_start = "".html_safe + - link_start = "".html_safe - link_end = '' = _('Paste a public key here. %{link_start}How do I generate it?%{link_end}').html_safe % { link_start: link_start, link_end: link_end.html_safe } = form.text_area :key, class: 'form-control gl-form-input thin_area', rows: 5, data: { testid: 'deploy-key-field' } diff --git a/app/views/shared/deploy_keys/_index.html.haml b/app/views/shared/deploy_keys/_index.html.haml index d4bf3ece91a..6e31ff85dd7 100644 --- a/app/views/shared/deploy_keys/_index.html.haml +++ b/app/views/shared/deploy_keys/_index.html.haml @@ -6,7 +6,7 @@ css_class: 'rspec-deploy-keys-settings', expanded: expanded) do |c| - c.with_description do - - link = link_to('', help_page_path('user/project/deploy_keys/index'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/deploy_keys/index.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_("Add deploy keys to grant read/write access to this repository. %{link_start}What are deploy keys?%{link_end}"), tag_pair(link, :link_start, :link_end)) - c.with_body do = render ::Layouts::CrudComponent.new(_('Deploy keys'), diff --git a/app/views/shared/deploy_keys/_project_group_form.html.haml b/app/views/shared/deploy_keys/_project_group_form.html.haml index 3a764d87240..509aaf1ac69 100644 --- a/app/views/shared/deploy_keys/_project_group_form.html.haml +++ b/app/views/shared/deploy_keys/_project_group_form.html.haml @@ -12,7 +12,7 @@ = f.text_area :key, class: 'form-control gl-form-input gl-form-input-xl !gl-h-auto', rows: 5, required: true, data: { testid: 'deploy-key-field' } .form-text.text-muted = _('Paste a public key here.') - = link_to _('How do I generate it?'), help_page_path("user/ssh") + = link_to _('How do I generate it?'), help_page_path("user/ssh.md") = f.fields_for :deploy_keys_projects do |deploy_keys_project_form| .form-group diff --git a/app/views/shared/deploy_tokens/_form.html.haml b/app/views/shared/deploy_tokens/_form.html.haml index 98f01128451..58339106a15 100644 --- a/app/views/shared/deploy_tokens/_form.html.haml +++ b/app/views/shared/deploy_tokens/_form.html.haml @@ -1,5 +1,5 @@ %p - - link = link_to('', help_page_path('user/project/deploy_tokens/index'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/deploy_tokens/index.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('DeployTokens|Create a new deploy token for all projects in this group. %{link_start}What are deploy tokens?%{link_end}'), tag_pair(link, :link_start, :link_end)) = gitlab_ui_form_for token, url: create_deploy_token_path(group_or_project, anchor: 'js-deploy-tokens'), method: :post, remote: true do |f| diff --git a/app/views/shared/deploy_tokens/_table.html.haml b/app/views/shared/deploy_tokens/_table.html.haml index 66c099f2935..ab8819ab3e0 100644 --- a/app/views/shared/deploy_tokens/_table.html.haml +++ b/app/views/shared/deploy_tokens/_table.html.haml @@ -42,6 +42,6 @@ packages_registry_enabled: packages_registry_enabled?(group_or_project), create_new_token_path: create_deploy_token_path(group_or_project), token_type: group_or_project.is_a?(Group) ? 'group' : 'project', - deploy_tokens_help_url: help_page_path('user/project/deploy_tokens/index') + deploy_tokens_help_url: help_page_path('user/project/deploy_tokens/index.md') } } diff --git a/app/views/shared/empty_states/_issues.html.haml b/app/views/shared/empty_states/_issues.html.haml index 457c4252d92..4a8b8063814 100644 --- a/app/views/shared/empty_states/_issues.html.haml +++ b/app/views/shared/empty_states/_issues.html.haml @@ -48,7 +48,7 @@ %strong = s_('JiraService|Using Jira for issue tracking?') %p.gl-text-center.gl-mb-0 - - jira_docs_link_url = help_page_url('integration/jira/configure', anchor: 'view-jira-issues') + - jira_docs_link_url = help_page_url('integration/jira/configure.md', anchor: 'view-jira-issues') - jira_docs_link_start = ''.html_safe % { url: jira_docs_link_url } = html_escape(s_('JiraService|%{jira_docs_link_start}Enable the Jira integration%{jira_docs_link_end} to view your Jira issues in GitLab.')) % { jira_docs_link_start: jira_docs_link_start.html_safe, jira_docs_link_end: ''.html_safe } %p.gl-text-center.gl-mb-0.gl-text-gray-500 diff --git a/app/views/shared/empty_states/_milestones.html.haml b/app/views/shared/empty_states/_milestones.html.haml index 4902934a6ae..31b06dbd812 100644 --- a/app/views/shared/empty_states/_milestones.html.haml +++ b/app/views/shared/empty_states/_milestones.html.haml @@ -1,4 +1,4 @@ -- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index')) +- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index.md')) - learn_more_link = link_to _('Learn more.'), learn_more_path = render Pajamas::EmptyStateComponent.new(svg_path: 'illustrations/empty-state/empty-milestone-md.svg', diff --git a/app/views/shared/empty_states/_milestones_tab.html.haml b/app/views/shared/empty_states/_milestones_tab.html.haml index 7681c905ede..c939c197488 100644 --- a/app/views/shared/empty_states/_milestones_tab.html.haml +++ b/app/views/shared/empty_states/_milestones_tab.html.haml @@ -1,4 +1,4 @@ -- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index')) +- learn_more_path = local_assigns.fetch(:learn_more_path, help_page_path('user/project/milestones/index.md')) - learn_more_link = link_to _('Learn more.'), learn_more_path - closed_tab_selected = params[:state] == 'closed' - title = s_('Milestones|There are no open milestones') diff --git a/app/views/shared/empty_states/_snippets.html.haml b/app/views/shared/empty_states/_snippets.html.haml index 38b810d1783..e7c499dcbaa 100644 --- a/app/views/shared/empty_states/_snippets.html.haml +++ b/app/views/shared/empty_states/_snippets.html.haml @@ -14,7 +14,7 @@ - c.with_description do = s_('SnippetsEmptyState|Store, share, and embed small pieces of code and text.') - = link_to _('Learn more.'), help_page_path('user/snippets'), target: '_blank', rel: 'noopener noreferrer', class: 'gl-underline' + = link_to _('Learn more.'), help_page_path('user/snippets.md'), target: '_blank', rel: 'noopener noreferrer', class: 'gl-underline' - else = render Pajamas::EmptyStateComponent.new(svg_path: illustration, diff --git a/app/views/shared/file_hooks/_index.html.haml b/app/views/shared/file_hooks/_index.html.haml index 68697588fa4..b17cf14f501 100644 --- a/app/views/shared/file_hooks/_index.html.haml +++ b/app/views/shared/file_hooks/_index.html.haml @@ -3,7 +3,7 @@ = render ::Layouts::SettingsSectionComponent.new(s_('Webhooks|File hooks')) do |c| - c.with_description do = _('File hooks are similar to system hooks but are executed as files instead of sending data to a URL.') - = link_to _('For more information, see the file hooks documentation.'), help_page_path('administration/file_hooks') + = link_to _('For more information, see the file hooks documentation.'), help_page_path('administration/file_hooks.md') - c.with_body do = render ::Layouts::CrudComponent.new(s_('Webhooks|File hooks'), icon: 'document', count: file_hooks.count, options: { class: 'gl-mt-3' }) do |c| - c.with_body do diff --git a/app/views/shared/form_elements/_description.html.haml b/app/views/shared/form_elements/_description.html.haml index 6c5480b40c5..ac54f05c1fd 100644 --- a/app/views/shared/form_elements/_description.html.haml +++ b/app/views/shared/form_elements/_description.html.haml @@ -22,8 +22,8 @@ = render 'shared/form_elements/apply_generated_description_warning', issuable: model .js-markdown-editor{ data: { render_markdown_path: preview_url, - markdown_docs_path: help_page_path('user/markdown'), - quick_actions_docs_path: help_page_path('user/project/quick_actions'), + markdown_docs_path: help_page_path('user/markdown.md'), + quick_actions_docs_path: help_page_path('user/project/quick_actions.md'), testid: 'issuable-form-description-field', form_field_placeholder: placeholder, autofocus: 'false', diff --git a/app/views/shared/hook_logs/_index.html.haml b/app/views/shared/hook_logs/_index.html.haml index ee7d5b79560..1492ac887ea 100644 --- a/app/views/shared/hook_logs/_index.html.haml +++ b/app/views/shared/hook_logs/_index.html.haml @@ -1,4 +1,4 @@ -- docs_link_url = help_page_path('user/project/integrations/webhooks', anchor: 'troubleshooting') +- docs_link_url = help_page_path('user/project/integrations/webhooks.md', anchor: 'troubleshooting') - link_start = ''.html_safe % { url: docs_link_url } - link_end = ''.html_safe diff --git a/app/views/shared/integrations/_slack_notifications_deprecation_alert.html.haml b/app/views/shared/integrations/_slack_notifications_deprecation_alert.html.haml index bd7250113d1..0bf8e3a6385 100644 --- a/app/views/shared/integrations/_slack_notifications_deprecation_alert.html.haml +++ b/app/views/shared/integrations/_slack_notifications_deprecation_alert.html.haml @@ -4,7 +4,7 @@ dismissible: false, alert_options: { class: 'gl-mt-5 js-hide-when-nothing-matches-search', data: { testid: "slack-notifications-deprecation" } }) do |c| - c.with_body do - - help_page_link = help_page_url('user/project/integrations/gitlab_slack_application') + - help_page_link = help_page_url('user/project/integrations/gitlab_slack_application.md') - learn_more_link = ''.html_safe % { url: help_page_link } = html_escape(s_('The Slack notifications integration is deprecated and will be removed in a future release. To continue to receive notifications from Slack, use the GitLab for Slack app instead. %{learn_more_link_start}Learn more%{link_end}.')) % { learn_more_link_start: learn_more_link, link_end: ''.html_safe } @@ -14,7 +14,7 @@ dismissible: false, alert_options: { class: 'gl-mt-5 js-hide-when-nothing-matches-search', data: { testid: "slack-notifications-deprecation" } }) do |c| - c.with_body do - - help_page_link = help_page_url('user/project/integrations/gitlab_slack_application') + - help_page_link = help_page_url('user/project/integrations/gitlab_slack_application.md') - learn_more_link = ''.html_safe % { url: help_page_link } = html_escape(s_('Slack notifications will be brought into the GitLab for Slack app so you can manage both integrations from one place. %{learn_more_link_start}Learn more%{link_end}.')) % { learn_more_link_start: learn_more_link, link_end: ''.html_safe } diff --git a/app/views/shared/integrations/gitlab_slack_application/_help.html.haml b/app/views/shared/integrations/gitlab_slack_application/_help.html.haml index dfbfcf15773..9cd5b9034b1 100644 --- a/app/views/shared/integrations/gitlab_slack_application/_help.html.haml +++ b/app/views/shared/integrations/gitlab_slack_application/_help.html.haml @@ -2,7 +2,7 @@ .well-segment %p = s_("SlackIntegration|This integration allows users to perform common operations on their projects by entering slash commands in Slack.") - = link_to _('Learn more'), help_page_path('user/project/integrations/gitlab_slack_application') + = link_to _('Learn more'), help_page_path('user/project/integrations/gitlab_slack_application.md') %p = s_("SlackIntegration|See the list of available commands in Slack after setting up this integration by entering") %kbd.gl-inline-block /gitlab help diff --git a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml index e90f386a569..b272cd0373b 100644 --- a/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml +++ b/app/views/shared/integrations/gitlab_slack_application/_slack_integration_form.html.haml @@ -30,7 +30,7 @@ = render Pajamas::ButtonComponent.new(href: add_to_slack_link(integration.parent, slack_app_id), disabled: inherited, button_options: { data: { testid: 'install-slack-app-button' } }) do = s_('SlackIntegration|Reinstall GitLab for Slack app…') %p - = html_escape(s_('SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}.')) % { linkStart: %().html_safe, linkEnd: ''.html_safe} + = html_escape(s_('SlackIntegration|You may need to reinstall the GitLab for Slack app when we %{linkStart}make updates or change permissions%{linkEnd}.')) % { linkStart: %().html_safe, linkEnd: ''.html_safe} - else = render Pajamas::ButtonComponent.new(href: add_to_slack_link(integration.parent, slack_app_id), button_options: { data: { testid: 'install-slack-app-button' } }) do = s_('SlackIntegration|Install GitLab for Slack app…') diff --git a/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml index f1e2b8fff47..c49cfaff5f9 100644 --- a/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml +++ b/app/views/shared/integrations/mattermost_slash_commands/_detailed_help.html.haml @@ -5,11 +5,11 @@ %p= s_("ProjectService|To configure this integration, you should:") %ol.indent-list %li - - enable_slash_commands_link_url = help_page_url('user/project/integrations/mattermost_slash_commands', anchor: 'enable-custom-slash-commands-in-mattermost') + - enable_slash_commands_link_url = help_page_url('user/project/integrations/mattermost_slash_commands.md', anchor: 'enable-custom-slash-commands-in-mattermost') - enable_slash_commands_link = link_to '', enable_slash_commands_link_url, target: '_blank', rel: 'noopener noreferrer' = safe_format(s_('MattermostService|%{link_start}Enable custom slash commands %{icon}%{link_end} on your Mattermost installation.'), tag_pair(enable_slash_commands_link, :link_start, :link_end), icon: external_link_icon) %li - - create_slash_commands_link_url = help_page_url('user/project/integrations/mattermost_slash_commands', anchor: 'create-a-slash-command-in-mattermost') + - create_slash_commands_link_url = help_page_url('user/project/integrations/mattermost_slash_commands.md', anchor: 'create-a-slash-command-in-mattermost') - create_slash_commands_link = link_to '', create_slash_commands_link_url, target: '_blank', rel: 'noopener noreferrer' = safe_format(s_('MattermostService|%{link_start}Add a slash command %{icon}%{link_end} in your Mattermost team with the options listed below.'), tag_pair(create_slash_commands_link, :link_start, :link_end), icon: external_link_icon) %li diff --git a/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml index 0ed0423fb57..12c37937414 100644 --- a/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml +++ b/app/views/shared/integrations/mattermost_slash_commands/_help.html.haml @@ -4,7 +4,7 @@ .well-segment %p = s_("MattermostService|Use this service to perform common tasks in your project by entering slash commands in Mattermost.") - = link_to help_page_path('user/project/integrations/mattermost_slash_commands'), target: '_blank' do + = link_to help_page_path('user/project/integrations/mattermost_slash_commands.md'), target: '_blank' do = _("How do I configure this integration?") = sprite_icon('external-link') %p.gl-inline-block diff --git a/app/views/shared/integrations/slack/_help.haml b/app/views/shared/integrations/slack/_help.haml index c5fcd5ca5fe..133d64f66ef 100644 --- a/app/views/shared/integrations/slack/_help.haml +++ b/app/views/shared/integrations/slack/_help.haml @@ -1,4 +1,4 @@ .info-well .well-segment %p= s_('SlackIntegration|Sends notifications about project events to Slack channels.') - = link_to _('How do I set up this service?'), help_page_path('user/project/integrations/slack') + = link_to _('How do I set up this service?'), help_page_path('user/project/integrations/slack.md') diff --git a/app/views/shared/integrations/slack_slash_commands/_help.html.haml b/app/views/shared/integrations/slack_slash_commands/_help.html.haml index 9ac6d566e91..46c5c6127ee 100644 --- a/app/views/shared/integrations/slack_slash_commands/_help.html.haml +++ b/app/views/shared/integrations/slack_slash_commands/_help.html.haml @@ -5,7 +5,7 @@ .well-segment %p = s_("SlackService|Perform common operations in this project by entering slash commands in Slack.") - = link_to help_page_path('user/project/integrations/slack_slash_commands'), target: '_blank' do + = link_to help_page_path('user/project/integrations/slack_slash_commands.md'), target: '_blank' do = _("Learn more.") = sprite_icon('external-link') %p.gl-inline-block diff --git a/app/views/shared/issuable/_user_dropdown_item.html.haml b/app/views/shared/issuable/_user_dropdown_item.html.haml index 0bd211a2cc5..51147bc2ae9 100644 --- a/app/views/shared/issuable/_user_dropdown_item.html.haml +++ b/app/views/shared/issuable/_user_dropdown_item.html.haml @@ -4,7 +4,7 @@ %li.filter-dropdown-item{ class: ('js-current-user' if user == current_user) } = render Pajamas::ButtonComponent.new(variant: :link, button_text_classes: 'gl-flex gl-items-center') do .gl-shrink-0 - = user_avatar_without_link(user: user, lazy: avatar[:lazy], url: avatar[:url], size: 40, has_tooltip: false) + = user_avatar_without_link(user: user, lazy: avatar[:lazy], url: avatar[:url], size: 32, has_tooltip: false) .gl-flex.gl-flex-col %span.gl-font-bold.gl-whitespace-normal.gl-break-words = user.name diff --git a/app/views/shared/issuable/form/_contribution.html.haml b/app/views/shared/issuable/form/_contribution.html.haml index f9c70236c8f..724ea5bd041 100644 --- a/app/views/shared/issuable/form/_contribution.html.haml +++ b/app/views/shared/issuable/form/_contribution.html.haml @@ -1,6 +1,6 @@ - issuable = local_assigns.fetch(:issuable) - form = local_assigns.fetch(:form) -- contribution_help_link = help_page_path('user/project/merge_requests/allow_collaboration') +- contribution_help_link = help_page_path('user/project/merge_requests/allow_collaboration.md') - contribution_help_link_start = ''.html_safe % { url: contribution_help_link } - return unless issuable.is_a?(MergeRequest) diff --git a/app/views/shared/issuable/form/_default_templates.html.haml b/app/views/shared/issuable/form/_default_templates.html.haml index be6ca475f5c..8beea62fa7d 100644 --- a/app/views/shared/issuable/form/_default_templates.html.haml +++ b/app/views/shared/issuable/form/_default_templates.html.haml @@ -1,4 +1,4 @@ .gl-mt-3.gl-text-secondary - - link = link_to('', help_page_path('user/project/description_templates'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('user/project/description_templates.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(s_('Promotions|Add %{link_start} description templates %{link_end} to help your contributors to communicate effectively!'), tag_pair(link, :link_start, :link_end)) diff --git a/app/views/shared/issuable/form/_merge_params.html.haml b/app/views/shared/issuable/form/_merge_params.html.haml index 051a1a75f2b..f0cb3e4c86e 100644 --- a/app/views/shared/issuable/form/_merge_params.html.haml +++ b/app/views/shared/issuable/form/_merge_params.html.haml @@ -22,7 +22,7 @@ = render Pajamas::CheckboxTagComponent.new(name: 'merge_request[squash]', checked: project.squash_enabled_by_default?, value: '1', checkbox_options: { class: 'js-form-update', disabled: true }) do |c| - c.with_label do = _("Squash commits when merge request is accepted.") - = link_to sprite_icon('question-o'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer' - c.with_help_text do = _('Required in this project.') - else @@ -30,4 +30,4 @@ = render Pajamas::CheckboxTagComponent.new(name: 'merge_request[squash]', checked: issuable_squash_option?(issuable, project), value: '1', checkbox_options: { class: 'js-form-update' }) do |c| - c.with_label do = _("Squash commits when merge request is accepted.") - = link_to sprite_icon('question-o'), help_page_path('user/project/merge_requests/squash_and_merge'), target: '_blank', rel: 'noopener noreferrer' + = link_to sprite_icon('question-o'), help_page_path('user/project/merge_requests/squash_and_merge.md'), target: '_blank', rel: 'noopener noreferrer' diff --git a/app/views/shared/issuable/form/_type_selector.html.haml b/app/views/shared/issuable/form/_type_selector.html.haml index 321c47c2df1..9e6e773445c 100644 --- a/app/views/shared/issuable/form/_type_selector.html.haml +++ b/app/views/shared/issuable/form/_type_selector.html.haml @@ -10,6 +10,6 @@ - if issuable.incident_type_issue? %p.form-text.text-muted - - incident_docs_url = help_page_path('operations/incident_management/incidents') + - incident_docs_url = help_page_path('operations/incident_management/incidents.md') - incident_docs_start = format('', url: incident_docs_url) = format(_('A %{incident_docs_start}modified issue%{incident_docs_end} to guide the resolution of incidents.'), incident_docs_start: incident_docs_start, incident_docs_end: '').html_safe diff --git a/app/views/shared/notes/_hints.html.haml b/app/views/shared/notes/_hints.html.haml index 69743cfa14b..80c48a69346 100644 --- a/app/views/shared/notes/_hints.html.haml +++ b/app/views/shared/notes/_hints.html.haml @@ -1,7 +1,7 @@ - supports_file_upload = local_assigns.fetch(:supports_file_upload, true) .comment-toolbar.gl-px-2.gl-flex.gl-justify-end.gl-rounded-bl-base.gl-rounded-br-base.clearfix .content-editor-switcher.gl-inline-flex.gl-items-center - = render Pajamas::ButtonComponent.new(category: :tertiary, icon: 'markdown-mark', size: :small, href: help_page_path('user/markdown'), target: '_blank', button_options: { class: '!gl-px-3' }) + = render Pajamas::ButtonComponent.new(category: :tertiary, icon: 'markdown-mark', size: :small, href: help_page_path('user/markdown.md'), target: '_blank', button_options: { class: '!gl-px-3' }) - if supports_file_upload %span.uploading-container.gl-leading-32.gl-text-sm %span.uploading-progress-container.hide diff --git a/app/views/shared/packages/_no_packages.html.haml b/app/views/shared/packages/_no_packages.html.haml index 9f165a198d6..923f300a5e9 100644 --- a/app/views/shared/packages/_no_packages.html.haml +++ b/app/views/shared/packages/_no_packages.html.haml @@ -3,5 +3,5 @@ .text-content %h4.text-center= _('There are no packages yet') %p - - link = link_to('', help_page_path('administration/packages/index'), target: '_blank', rel: 'noopener noreferrer') + - link = link_to('', help_page_path('administration/packages/index.md'), target: '_blank', rel: 'noopener noreferrer') = safe_format(_('Learn how to %{no_packages_link_start}publish and share your packages%{no_packages_link_end} with GitLab.'), tag_pair(link, :no_packages_link_start, :no_packages_link_end)) diff --git a/app/views/shared/projects/_inactive_project_deletion_alert.html.haml b/app/views/shared/projects/_inactive_project_deletion_alert.html.haml index 8ac5c8b8def..6c209ce1d79 100644 --- a/app/views/shared/projects/_inactive_project_deletion_alert.html.haml +++ b/app/views/shared/projects/_inactive_project_deletion_alert.html.haml @@ -1,5 +1,5 @@ - if show_inactive_project_deletion_banner?(@project) - - link_start = ''.html_safe % { url: help_page_path('administration/inactive_project_deletion') } + - link_start = ''.html_safe % { url: help_page_path('administration/inactive_project_deletion.md') } - link_end = ''.html_safe - deletion_date = inactive_project_deletion_date(@project) - title = _('Due to inactivity, this project is scheduled to be deleted on %{deletion_date}. %{link_start}Why is this scheduled?%{link_end}').html_safe % { deletion_date: deletion_date, link_start: link_start, link_end: link_end } diff --git a/app/views/shared/promotions/_promote_servicedesk.html.haml b/app/views/shared/promotions/_promote_servicedesk.html.haml index 735223891fd..1b2280e6c55 100644 --- a/app/views/shared/promotions/_promote_servicedesk.html.haml +++ b/app/views/shared/promotions/_promote_servicedesk.html.haml @@ -1,7 +1,7 @@ = render Pajamas::BannerComponent.new(banner_options: {class: 'js-service-desk-callout', data: {uid: 'promote_service_desk_dismissed'}, id: 'promote_service_desk'}, close_options: {'aria-label' => s_('Promotions|Dismiss Service Desk promotion'), class: 'js-close-callout'}, svg_path: 'illustrations/service-desk-sm.svg', - button_text: s_('Promotions|Configure Service Desk'), button_link: help_page_path('user/project/service_desk/configure')) do |c| + button_text: s_('Promotions|Configure Service Desk'), button_link: help_page_path('user/project/service_desk/configure.md')) do |c| - c.with_title do = _('Improve customer support with Service Desk') %p diff --git a/app/views/shared/runners/_runner_description.html.haml b/app/views/shared/runners/_runner_description.html.haml index 77e282b4cf8..bfc47162cb2 100644 --- a/app/views/shared/runners/_runner_description.html.haml +++ b/app/views/shared/runners/_runner_description.html.haml @@ -19,4 +19,4 @@ %p = s_("Runners|Tags control which type of jobs a runner can handle. By tagging a runner, you make sure runners only handle the jobs they are equipped to run.") - = link_to _("Learn more."), help_page_path("ci/runners/configure_runners", anchor: "how-the-runner-uses-tags"), target: '_blank' + = link_to _("Learn more."), help_page_path("ci/runners/configure_runners.md", anchor: "how-the-runner-uses-tags"), target: '_blank' diff --git a/app/views/shared/runners/_shared_runners_description.html.haml b/app/views/shared/runners/_shared_runners_description.html.haml index a5145bbce40..d53d003a8fa 100644 --- a/app/views/shared/runners/_shared_runners_description.html.haml +++ b/app/views/shared/runners/_shared_runners_description.html.haml @@ -1,4 +1,4 @@ -- shared_link_start = ''.html_safe % { url: help_page_path('ci/runners/runners_scope', anchor: 'instance-runners') } +- shared_link_start = ''.html_safe % { url: help_page_path('ci/runners/runners_scope.md', anchor: 'instance-runners') } %h4 = s_('Runners|Instance runners') diff --git a/app/views/shared/snippets/_form.html.haml b/app/views/shared/snippets/_form.html.haml index 33b0e1f693e..82e9a6f16b2 100644 --- a/app/views/shared/snippets/_form.html.haml +++ b/app/views/shared/snippets/_form.html.haml @@ -1,2 +1,2 @@ - available_visibility_levels = available_visibility_levels(@snippet) -#js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown'), 'visibility-help-link': help_page_path("user/public_access"), 'visibility_levels': available_visibility_levels, 'selected_level': snippets_selected_visibility_level(available_visibility_levels, @snippet.visibility_level), 'multiple_levels_restricted': multiple_visibility_levels_restricted? } } +#js-snippet-edit.snippet-form{ data: {'project_path': @snippet.project&.full_path, 'snippet-gid': @snippet.new_record? ? '' : @snippet.to_global_id, 'markdown-preview-path': preview_markdown_path(parent), 'markdown-docs-path': help_page_path('user/markdown.md'), 'visibility-help-link': help_page_path("user/public_access.md"), 'visibility_levels': available_visibility_levels, 'selected_level': snippets_selected_visibility_level(available_visibility_levels, @snippet.visibility_level), 'multiple_levels_restricted': multiple_visibility_levels_restricted? } } diff --git a/app/views/shared/web_hooks/_form.html.haml b/app/views/shared/web_hooks/_form.html.haml index 8579e3ac0f6..1228789085c 100644 --- a/app/views/shared/web_hooks/_form.html.haml +++ b/app/views/shared/web_hooks/_form.html.haml @@ -72,12 +72,12 @@ help_text: s_('Webhooks|A release is created, updated, or deleted.') - if Feature.enabled?(:emoji_webhooks, hook.parent) %li.gl-pb-3 - - emoji_help_link = link_to s_('Which emoji events trigger webhooks'), help_page_path('user/project/integrations/webhook_events', anchor: 'emoji-events') + - emoji_help_link = link_to s_('Which emoji events trigger webhooks'), help_page_path('user/project/integrations/webhook_events.md', anchor: 'emoji-events') = form.gitlab_ui_checkbox_component :emoji_events, integration_webhook_event_human_name(:emoji_events), help_text: s_('Webhooks|An emoji is awarded or revoked. %{help_link}?').html_safe % { help_link: emoji_help_link } %li.gl-pb-3 - - access_token_help_link = link_to s_('Which project or group access token events trigger webhooks'), help_page_path('user/project/integrations/webhook_events', anchor: 'project-and-group-access-token-events') + - access_token_help_link = link_to s_('Which project or group access token events trigger webhooks'), help_page_path('user/project/integrations/webhook_events.md', anchor: 'project-and-group-access-token-events') = form.gitlab_ui_checkbox_component :resource_access_token_events, integration_webhook_event_human_name(:resource_access_token_events), help_text: s_('Webhooks|An access token is going to expire in the next 7 days. %{help_link}?').html_safe % { help_link: access_token_help_link } @@ -87,7 +87,7 @@ = form.label :custom_webhook_template, s_('Webhooks|Custom webhook template (optional)'), class: 'label-bold' = form.text_area :custom_webhook_template, value: hook.custom_webhook_template, class: 'form-control gl-form-input gl-form-input-xl', rows: 8, maxlength: 4096 %p.form-text.text-muted - = link_to s_('Webhooks|How to create a custom webhook template?'), help_page_path('user/project/integrations/webhooks', anchor: 'custom-webhook-template') + = link_to s_('Webhooks|How to create a custom webhook template?'), help_page_path('user/project/integrations/webhooks.md', anchor: 'custom-webhook-template') .form-group = form.label :enable_ssl_verification, s_('Webhooks|SSL verification'), class: 'label-bold checkbox' diff --git a/app/views/shared/web_hooks/_hook_errors.html.haml b/app/views/shared/web_hooks/_hook_errors.html.haml index cd3d969dd5e..dfae50d4b9b 100644 --- a/app/views/shared/web_hooks/_hook_errors.html.haml +++ b/app/views/shared/web_hooks/_hook_errors.html.haml @@ -13,7 +13,7 @@ - c.with_body do = safe_format(s_('Webhooks|The webhook failed to connect, and is disabled. To re-enable it, check %{strong_start}Recent events%{strong_end} for error details, then test your settings below.'), strong) - elsif hook.temporarily_disabled? - - help_link = link_to('', help_page_path('user/project/integrations/webhooks', anchor: 'auto-disabled-webhooks'), target: '_blank', rel: 'noopener noreferrer') + - help_link = link_to('', help_page_path('user/project/integrations/webhooks.md', anchor: 'auto-disabled-webhooks'), target: '_blank', rel: 'noopener noreferrer') - retry_time = { retry_time: time_interval_in_words(hook.disabled_until - Time.now) } = render Pajamas::AlertComponent.new(title: s_('Webhooks|Webhook fails to connect'), variant: :warning) do |c| diff --git a/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml b/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml index 7c4009ea7cc..601f8a2dd01 100644 --- a/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml +++ b/app/views/shared/web_hooks/_web_hook_disabled_alert.html.haml @@ -8,6 +8,6 @@ - c.with_body do = s_('Webhooks|A webhook in this project was automatically disabled after being retried multiple times.') = succeed '.' do - = link_to _('Learn more'), help_page_path('user/project/integrations/webhooks', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer' + = link_to _('Learn more'), help_page_path('user/project/integrations/webhooks.md', anchor: 'troubleshooting'), target: '_blank', rel: 'noopener noreferrer' - c.with_actions do = link_button_to s_('Webhooks|Go to webhooks'), project_hooks_path(@project), class: 'gl-alert-action', variant: :confirm diff --git a/app/views/user_settings/gpg_keys/index.html.haml b/app/views/user_settings/gpg_keys/index.html.haml index 93417526f2a..31814e31783 100644 --- a/app/views/user_settings/gpg_keys/index.html.haml +++ b/app/views/user_settings/gpg_keys/index.html.haml @@ -18,7 +18,7 @@ %h4.gl-mt-0 = _('Add a GPG key') %p - - help_link_start = ''.html_safe % { url: help_page_path('user/project/repository/signed_commits/gpg') } + - help_link_start = ''.html_safe % { url: help_page_path('user/project/repository/signed_commits/gpg.md') } = _('Add a GPG key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: ''.html_safe } = render 'form' diff --git a/app/views/user_settings/profiles/_email_settings.html.haml b/app/views/user_settings/profiles/_email_settings.html.haml index e7d3146a2fa..b05d58bc468 100644 --- a/app/views/user_settings/profiles/_email_settings.html.haml +++ b/app/views/user_settings/profiles/_email_settings.html.haml @@ -25,7 +25,7 @@ = s_("Profiles|This email will be displayed on your public profile.") .form-group.gl-form-group - - commit_email_link_url = help_page_path('user/profile/index', anchor: 'use-an-automatically-generated-private-commit-email') + - commit_email_link_url = help_page_path('user/profile/index.md', anchor: 'use-an-automatically-generated-private-commit-email') - commit_email_link_start = ''.html_safe % { url: commit_email_link_url } - commit_email_docs_link = s_('Profiles|This email is used for web-based operations, such as edits and merges. %{commit_email_link_start}What is a private commit email?%{commit_email_link_end}').html_safe % { commit_email_link_start: commit_email_link_start, commit_email_link_end: ''.html_safe } = form.label :commit_email, s_('Profiles|Commit email') diff --git a/app/views/user_settings/profiles/_private_profile.html.haml b/app/views/user_settings/profiles/_private_profile.html.haml index b5e4f9b3dc2..ce0220f64a7 100644 --- a/app/views/user_settings/profiles/_private_profile.html.haml +++ b/app/views/user_settings/profiles/_private_profile.html.haml @@ -1,6 +1,6 @@ - form = local_assigns.fetch(:form) -- private_profile_help_link = link_to _("What information is hidden?"), help_page_path('user/profile/index', anchor: 'make-your-user-profile-page-private') +- private_profile_help_link = link_to _("What information is hidden?"), help_page_path('user/profile/index.md', anchor: 'make-your-user-profile-page-private') - private_profile_label = safe_format(s_("Profiles|Don't display activity-related personal information on your profile. %{private_profile_help_link_start}What information is hidden?%{private_profile_help_link_end}"), tag_pair(private_profile_help_link, :private_profile_help_link_start, :private_profile_help_link_end)) = form.gitlab_ui_checkbox_component :private_profile, private_profile_label diff --git a/app/views/user_settings/ssh_keys/index.html.haml b/app/views/user_settings/ssh_keys/index.html.haml index af4886e0513..3391b021964 100644 --- a/app/views/user_settings/ssh_keys/index.html.haml +++ b/app/views/user_settings/ssh_keys/index.html.haml @@ -20,7 +20,7 @@ %h4.gl-mt-0 = _('Add an SSH key') %p - - help_link_start = ''.html_safe % { url: help_page_path('user/ssh') } + - help_link_start = ''.html_safe % { url: help_page_path('user/ssh.md') } = _('Add an SSH key for secure access to GitLab. %{help_link_start}Learn more%{help_link_end}.').html_safe % {help_link_start: help_link_start, help_link_end: ''.html_safe } = render 'form' diff --git a/app/views/users/_deletion_guidance.html.haml b/app/views/users/_deletion_guidance.html.haml index 64b4a8e1ae2..cdae5750399 100644 --- a/app/views/users/_deletion_guidance.html.haml +++ b/app/views/users/_deletion_guidance.html.haml @@ -3,7 +3,7 @@ %ul %li %p - - link = link_to('', help_page_path("user/profile/account/delete_account", anchor: "associated-records")) + - link = link_to('', help_page_path("user/profile/account/delete_account.md", anchor: "associated-records")) = safe_format(_('Certain user content will be moved to a system-wide "Ghost User" in order to maintain content for posterity. For further information, please refer to the %{link_start}user account deletion documentation.%{link_end}'), tag_pair(link, :link_start, :link_end)) - personal_projects_count = user.personal_projects.count - unless personal_projects_count == 0 diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml index c8c2eedbea4..e77d7734f92 100644 --- a/config/sidekiq_queues.yml +++ b/config/sidekiq_queues.yml @@ -769,6 +769,8 @@ - 1 - - security_delete_orchestration_configuration - 1 +- - security_delete_security_policy + - 1 - - security_generate_policy_violation_comment - 1 - - security_orchestration_configuration_create_bot @@ -807,6 +809,8 @@ - 2 - - security_scans_purge_by_job_id - 1 +- - security_sync_policy + - 1 - - security_sync_policy_violation_comment - 1 - - security_sync_scan_policies diff --git a/db/docs/vulnerability_management_policy_rules.yml b/db/docs/vulnerability_management_policy_rules.yml new file mode 100644 index 00000000000..bf9ee9822fd --- /dev/null +++ b/db/docs/vulnerability_management_policy_rules.yml @@ -0,0 +1,12 @@ +--- +table_name: vulnerability_management_policy_rules +classes: +- Security::VulnerabilityManagementPolicyRule +feature_categories: +- security_policy_management +description: Stores vulnerability management policy rules. +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/163867 +milestone: '17.5' +gitlab_schema: gitlab_main_cell +sharding_key: + security_policy_management_project_id: projects diff --git a/db/migrate/20240826074352_create_vulnerability_management_policy_rules.rb b/db/migrate/20240826074352_create_vulnerability_management_policy_rules.rb new file mode 100644 index 00000000000..b4f1c550136 --- /dev/null +++ b/db/migrate/20240826074352_create_vulnerability_management_policy_rules.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +class CreateVulnerabilityManagementPolicyRules < Gitlab::Database::Migration[2.2] + milestone '17.5' + + UNIQUE_INDEX_NAME = "index_vuln_mgmt_policy_rules_on_unique_policy_rule_index" + FK_INDEX_NAME = "index_vuln_mgmt_policy_rules_on_policy_mgmt_project_id" + + def change + create_table :vulnerability_management_policy_rules do |t| + t.references :security_policy, + null: false, + foreign_key: { on_delete: :cascade }, + index: false + t.references :security_policy_management_project, + null: false, + foreign_key: { on_delete: :cascade, to_table: :projects }, + index: false + t.timestamps_with_timezone null: false + t.integer :rule_index, limit: 2, null: false + t.integer :type, limit: 2, null: false + t.jsonb :content, default: {}, null: false + end + + add_index( + :vulnerability_management_policy_rules, + %i[security_policy_id rule_index], + unique: true, + name: UNIQUE_INDEX_NAME) + + add_index( + :vulnerability_management_policy_rules, + :security_policy_management_project_id, + name: FK_INDEX_NAME) + end +end diff --git a/db/schema_migrations/20240826074352 b/db/schema_migrations/20240826074352 new file mode 100644 index 00000000000..66a119d112b --- /dev/null +++ b/db/schema_migrations/20240826074352 @@ -0,0 +1 @@ +a71b8a450a5fb29ccba9205c47dc550e48be2b282028fdb2d762a136fd3f7efd \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 81aff541036..77950b1ff34 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -20156,6 +20156,26 @@ CREATE SEQUENCE vulnerability_issue_links_id_seq ALTER SEQUENCE vulnerability_issue_links_id_seq OWNED BY vulnerability_issue_links.id; +CREATE TABLE vulnerability_management_policy_rules ( + id bigint NOT NULL, + security_policy_id bigint NOT NULL, + security_policy_management_project_id bigint NOT NULL, + created_at timestamp with time zone NOT NULL, + updated_at timestamp with time zone NOT NULL, + rule_index smallint NOT NULL, + type smallint NOT NULL, + content jsonb DEFAULT '{}'::jsonb NOT NULL +); + +CREATE SEQUENCE vulnerability_management_policy_rules_id_seq + START WITH 1 + INCREMENT BY 1 + NO MINVALUE + NO MAXVALUE + CACHE 1; + +ALTER SEQUENCE vulnerability_management_policy_rules_id_seq OWNED BY vulnerability_management_policy_rules.id; + CREATE TABLE vulnerability_merge_request_links ( id bigint NOT NULL, vulnerability_id bigint NOT NULL, @@ -22659,6 +22679,8 @@ ALTER TABLE ONLY vulnerability_identifiers ALTER COLUMN id SET DEFAULT nextval(' ALTER TABLE ONLY vulnerability_issue_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_issue_links_id_seq'::regclass); +ALTER TABLE ONLY vulnerability_management_policy_rules ALTER COLUMN id SET DEFAULT nextval('vulnerability_management_policy_rules_id_seq'::regclass); + ALTER TABLE ONLY vulnerability_merge_request_links ALTER COLUMN id SET DEFAULT nextval('vulnerability_merge_request_links_id_seq'::regclass); ALTER TABLE ONLY vulnerability_namespace_historical_statistics ALTER COLUMN id SET DEFAULT nextval('vulnerability_namespace_historical_statistics_id_seq'::regclass); @@ -25453,6 +25475,9 @@ ALTER TABLE ONLY vulnerability_identifiers ALTER TABLE ONLY vulnerability_issue_links ADD CONSTRAINT vulnerability_issue_links_pkey PRIMARY KEY (id); +ALTER TABLE ONLY vulnerability_management_policy_rules + ADD CONSTRAINT vulnerability_management_policy_rules_pkey PRIMARY KEY (id); + ALTER TABLE ONLY vulnerability_merge_request_links ADD CONSTRAINT vulnerability_merge_request_links_pkey PRIMARY KEY (id); @@ -30911,6 +30936,10 @@ CREATE UNIQUE INDEX index_vuln_findings_on_uuid_including_vuln_id_1 ON vulnerabi CREATE UNIQUE INDEX index_vuln_historical_statistics_on_project_id_and_date ON vulnerability_historical_statistics USING btree (project_id, date); +CREATE INDEX index_vuln_mgmt_policy_rules_on_policy_mgmt_project_id ON vulnerability_management_policy_rules USING btree (security_policy_management_project_id); + +CREATE UNIQUE INDEX index_vuln_mgmt_policy_rules_on_unique_policy_rule_index ON vulnerability_management_policy_rules USING btree (security_policy_id, rule_index); + CREATE INDEX index_vuln_namespace_historical_statistics_on_namespace_id ON vulnerability_namespace_historical_statistics USING btree (namespace_id); CREATE UNIQUE INDEX index_vuln_namespace_historical_statistics_traversal_ids_date ON vulnerability_namespace_historical_statistics USING btree (traversal_ids, date); @@ -35589,6 +35618,9 @@ ALTER TABLE ONLY epic_issues ALTER TABLE ONLY packages_nuget_symbols ADD CONSTRAINT fk_rails_5df972da14 FOREIGN KEY (package_id) REFERENCES packages_packages(id) ON DELETE SET NULL; +ALTER TABLE ONLY vulnerability_management_policy_rules + ADD CONSTRAINT fk_rails_5e6b6e1b2c FOREIGN KEY (security_policy_management_project_id) REFERENCES projects(id) ON DELETE CASCADE; + ALTER TABLE ONLY resource_weight_events ADD CONSTRAINT fk_rails_5eb5cb92a1 FOREIGN KEY (issue_id) REFERENCES issues(id) ON DELETE CASCADE; @@ -35709,6 +35741,9 @@ ALTER TABLE ONLY ml_experiment_metadata ALTER TABLE ONLY error_tracking_errors ADD CONSTRAINT fk_rails_6b41f837ba FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; +ALTER TABLE ONLY vulnerability_management_policy_rules + ADD CONSTRAINT fk_rails_6b815ed813 FOREIGN KEY (security_policy_id) REFERENCES security_policies(id) ON DELETE CASCADE; + ALTER TABLE ONLY ml_model_version_metadata ADD CONSTRAINT fk_rails_6b8fcb2af1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE; diff --git a/doc/development/ai_features/index.md b/doc/development/ai_features/index.md index d9354a8e856..8c4a0c12e7f 100644 --- a/doc/development/ai_features/index.md +++ b/doc/development/ai_features/index.md @@ -722,7 +722,7 @@ To implement LLM-specific logging, use the `Gitlab::Llm::Logger` class. ### Feature Flag A feature flag named `expanded_ai_logging` controls the logging of sensitive data. -Use the `info_or_debug` helper method for conditional logging based on the feature flag status: +Use the `conditional_info` helper method for conditional logging based on the feature flag status: - If the feature flag is enabled for the current user, it logs the information on `info` level (logs are accessible in Kibana). - If the feature flag is disabled for the current user, it logs the information on `debug` level (logs are not accessible in Kibana). @@ -733,7 +733,7 @@ When implementing logging for LLM features, consider the following: - Identify critical information for debugging purposes. - Ensure compliance with privacy requirements by not logging sensitive user data without proper authorization. -- Use the `info_or_debug` helper method to respect the `expanded_ai_logging` feature flag. +- Use the `conditional_info` helper method to respect the `expanded_ai_logging` feature flag. - Structure your logs to provide meaningful insights for troubleshooting and analysis. ### Example Usage @@ -743,7 +743,7 @@ When implementing logging for LLM features, consider the following: Gitlab::Llm::Logger.build.info("LLM feature initialized") # Logging potentially sensitive information -Gitlab::Llm::Logger.build.info_or_debug(user, message:"User prompt processed: #{sanitized_prompt}") +Gitlab::Llm::Logger.build.conditional_info(user, message:"User prompt processed: #{sanitized_prompt}") # Logging application error information Gitlab::Llm::Logger.build.error(user, message: "System application error: #{sanitized_error_message}") diff --git a/lib/api/api.rb b/lib/api/api.rb index 010f93cb143..b3d624ec2e5 100644 --- a/lib/api/api.rb +++ b/lib/api/api.rb @@ -230,6 +230,7 @@ module API mount ::API::Badges mount ::API::Branches mount ::API::BulkImports + mount ::API::Ci::Catalog mount ::API::Ci::JobArtifacts mount ::API::Groups mount ::API::Ci::Jobs diff --git a/lib/api/ci/catalog.rb b/lib/api/ci/catalog.rb new file mode 100644 index 00000000000..abdcab90ada --- /dev/null +++ b/lib/api/ci/catalog.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module API + module Ci + class Catalog < ::API::Base + feature_category :pipeline_composition + + params do + requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project' + end + resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do + desc 'Publish a new component project release as version to the CI/CD catalog' do + detail 'Publishes a release of a catalog resource as version to the CI/CD catalog.' + named 'publish_version' + success Entities::Ci::Catalog::Resources::Version + failure [ + { code: 401, message: 'Unauthorized' }, + { code: 403, message: 'Forbidden' }, + { code: 404, message: 'Not found' }, + { code: 422, message: 'Unprocessable entity' } + ] + end + params do + requires :version, type: String, desc: 'The version of the catalog resource / tag of the release to publish' + requires :metadata, type: Hash, desc: 'The metadata for the release' + end + route_setting :authentication, job_token_allowed: true + # Note: This endpoint should only be used by `release-cli` and should be authenticated with a job token. + # For this reason, we should not document the endpoint in the API docs. + post ':id/catalog/publish' do + release = user_project.releases.find_by_tag!(params[:version]) + authorize! :publish_catalog_version, release + + result = ::Ci::Catalog::Resources::ReleaseService.new(release, current_user, params[:metadata]).execute + + if result.success? + present result.payload[:version], with: Entities::Ci::Catalog::Resources::Version + else + render_api_error!(result.message, 422) + end + end + end + end + end +end diff --git a/lib/api/entities/ci/catalog/resources/version.rb b/lib/api/entities/ci/catalog/resources/version.rb new file mode 100644 index 00000000000..dea8306fff2 --- /dev/null +++ b/lib/api/entities/ci/catalog/resources/version.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +module API + module Entities + module Ci + module Catalog + module Resources + class Version < Grape::Entity + expose :catalog_url, + documentation: { + type: 'string', + example: 'https://gitlab.example.com/explore/catalog/my-namespace/my-component-project' + } do |version| + Gitlab::Routing.url_helpers.explore_catalog_url(version.catalog_resource) + end + end + end + end + end + end +end diff --git a/lib/api/entities/ml/mlflow/model_version.rb b/lib/api/entities/ml/mlflow/model_version.rb index d57def4e1f2..c9aebcbc905 100644 --- a/lib/api/entities/ml/mlflow/model_version.rb +++ b/lib/api/entities/ml/mlflow/model_version.rb @@ -24,6 +24,10 @@ module API private + def version + object.id.to_s + end + def name object.name end @@ -73,7 +77,7 @@ module API end def aliases - [] + [object.version.to_s] end end end diff --git a/lib/api/entities/ml/mlflow/registered_model.rb b/lib/api/entities/ml/mlflow/registered_model.rb index bb547f9c46c..71faf82b2fd 100644 --- a/lib/api/entities/ml/mlflow/registered_model.rb +++ b/lib/api/entities/ml/mlflow/registered_model.rb @@ -11,6 +11,7 @@ module API expose :description expose(:user_id) { |model| model.user_id.to_s } expose :metadata, as: :tags, using: KeyValue + expose :versions, as: :latest_versions private diff --git a/lib/system_check/gitlab_shell_check.rb b/lib/system_check/gitlab_shell_check.rb index 0a325a96785..e7d438ef472 100644 --- a/lib/system_check/gitlab_shell_check.rb +++ b/lib/system_check/gitlab_shell_check.rb @@ -26,7 +26,7 @@ module SystemCheck def check_gitlab_shell_self_test gitlab_shell_repo_base = gitlab_shell_path - check_cmd = File.expand_path('bin/check', gitlab_shell_repo_base) + check_cmd = File.expand_path('bin/gitlab-shell-check', gitlab_shell_repo_base) $stdout.puts "Running #{check_cmd}" if system(check_cmd, chdir: gitlab_shell_repo_base) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4a8b0a2714f..35a205cc25a 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -3266,6 +3266,9 @@ msgstr "" msgid "Add environment" msgstr "" +msgid "Add exclusion" +msgstr "" + msgid "Add exclusions" msgstr "" @@ -7151,7 +7154,7 @@ msgstr "" msgid "Approvals|Rule cannot be approved" msgstr "" -msgid "Approvals|Section: %section" +msgid "Approvals|Section: %{section}" msgstr "" msgid "Approvals|The number of people who need to approve this is more than those who are allowed to. Please ask the project owner to update %{securityPolicy}." @@ -27412,7 +27415,7 @@ msgstr "" msgid "IDE|Confirm" msgstr "" -msgid "IDE|Contact your administrator or try to open the Web IDE again with another domain." +msgid "IDE|Contact your administrator or try to open the Web IDE again with another domain. %{linkStart}How can an administrator resolve the issue%{linkEnd}?" msgstr "" msgid "IDE|Could not find a callback URL entry for %{expectedCallbackUrl}." @@ -48842,33 +48845,101 @@ msgstr "" msgid "SecurityDescription|The linked group refers to the groups that are linked to security policy projects. Security policy projects store your organization's security policies. They are identified when policies are created, or when a project is linked as a security policy project. %{linkStart}Learn more%{linkEnd}." msgstr "" +msgid "SecurityExclusions|Add Exclusion" +msgstr "" + msgid "SecurityExclusions|Add exclusion" msgstr "" +msgid "SecurityExclusions|Description" +msgstr "" + +msgid "SecurityExclusions|Disable" +msgstr "" + +msgid "SecurityExclusions|Enable" +msgstr "" + msgid "SecurityExclusions|Enforcement" msgstr "" +msgid "SecurityExclusions|Enter one or more paths to exclude, separated by line breaks." +msgstr "" + +msgid "SecurityExclusions|Enter one or more raw values to ignore, separated by line breaks." +msgstr "" + +msgid "SecurityExclusions|Enter one or more rules to ignore, separated by line breaks." +msgstr "" + +msgid "SecurityExclusions|Exclusion has been created successfully" +msgstr "" + +msgid "SecurityExclusions|File or directory location" +msgstr "" + msgid "SecurityExclusions|Modified" msgstr "" +msgid "SecurityExclusions|Path" +msgstr "" + +msgid "SecurityExclusions|Provide context for why the content is being excluded." +msgstr "" + +msgid "SecurityExclusions|Raw value" +msgstr "" + +msgid "SecurityExclusions|Rule" +msgstr "" + +msgid "SecurityExclusions|Scanner rule identifier" +msgstr "" + msgid "SecurityExclusions|Secret push protection" msgstr "" +msgid "SecurityExclusions|Select the secret detection methods this exclusion should apply to." +msgstr "" + +msgid "SecurityExclusions|Select which type of content to exclude" +msgstr "" + msgid "SecurityExclusions|Specify file paths, raw values, and regex that should be excluded by secret detection in this project." msgstr "" msgid "SecurityExclusions|Status" msgstr "" +msgid "SecurityExclusions|The following error occured while saving the exclusion:" +msgid_plural "SecurityExclusions|The following errors occured while saving the exclusion:" +msgstr[0] "" +msgstr[1] "" + msgid "SecurityExclusions|Toggle exclusion" msgstr "" msgid "SecurityExclusions|Type" msgstr "" +msgid "SecurityExclusions|Unprocessed data" +msgstr "" + msgid "SecurityExclusions|Value" msgstr "" +msgid "SecurityExclusions|ex: This secret is used for testing" +msgstr "" + +msgid "SecurityExclusions|ex: gitlab_personal_access_token" +msgstr "" + +msgid "SecurityExclusions|ex: glpat-1234567890" +msgstr "" + +msgid "SecurityExclusions|ex: spec/**/*.rb" +msgstr "" + msgid "SecurityOrchestration| and " msgstr "" @@ -64643,6 +64714,9 @@ msgstr[1] "" msgid "has already been linked to another vulnerability" msgstr "" +msgid "has already been published" +msgstr "" + msgid "has already been taken" msgstr "" diff --git a/spec/features/admin/admin_sees_background_migrations_spec.rb b/spec/features/admin/admin_sees_background_migrations_spec.rb index 8f04f19d03a..d1b20e0d4c4 100644 --- a/spec/features/admin/admin_sees_background_migrations_spec.rb +++ b/spec/features/admin/admin_sees_background_migrations_spec.rb @@ -193,7 +193,7 @@ RSpec.describe "Admin > Admin sees background migrations", feature_category: :da visit admin_background_migrations_path within '#content-body' do - expect(page).to have_link('Learn more', href: help_page_path('update/background_migrations')) + expect(page).to have_link('Learn more', href: help_page_path('update/background_migrations.md')) end end diff --git a/spec/features/dashboard/snippets_spec.rb b/spec/features/dashboard/snippets_spec.rb index a9ef6f741c5..a623fb25d5e 100644 --- a/spec/features/dashboard/snippets_spec.rb +++ b/spec/features/dashboard/snippets_spec.rb @@ -59,7 +59,7 @@ RSpec.describe 'Dashboard snippets', :js, feature_category: :source_code_managem it 'shows documentation button in main comment area' do parent_element = page.find('.gl-empty-state') - expect(parent_element).to have_link('Learn more', href: help_page_path('user/snippets')) + expect(parent_element).to have_link('Learn more', href: help_page_path('user/snippets.md')) end it 'passes axe automated accessibility testing' do diff --git a/spec/features/issues/service_desk_spec.rb b/spec/features/issues/service_desk_spec.rb index 331a2a226c8..c865bf9b22b 100644 --- a/spec/features/issues/service_desk_spec.rb +++ b/spec/features/issues/service_desk_spec.rb @@ -55,7 +55,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des aggregate_failures do expect(page).to have_css('[data-testid="issues-service-desk-empty-state"]') expect(page).to have_text('Use Service Desk to connect with your users') - expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index')) + expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index.md')) expect(page).not_to have_link('Enable Service Desk') expect(page).to have_content(project.service_desk_address) end @@ -74,7 +74,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des aggregate_failures do expect(page).to have_css('[data-testid="issues-service-desk-empty-state"]') expect(page).to have_text('Use Service Desk to connect with your users') - expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index')) + expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index.md')) expect(page).not_to have_link('Enable Service Desk') expect(page).not_to have_content(project.service_desk_address) end @@ -96,7 +96,7 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des it 'displays the small info box, documentation, a button to configure service desk, and the address' do aggregate_failures do - expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index')) + expect(page).to have_link('Learn more about Service Desk', href: help_page_path('user/project/service_desk/index.md')) expect(page).not_to have_link('Enable Service Desk') expect(page).to have_content(project.service_desk_address) end diff --git a/spec/features/projects/settings/branch_rules_callout_spec.rb b/spec/features/projects/settings/branch_rules_callout_spec.rb index cf96a2b59d8..11c3378fc16 100644 --- a/spec/features/projects/settings/branch_rules_callout_spec.rb +++ b/spec/features/projects/settings/branch_rules_callout_spec.rb @@ -23,7 +23,7 @@ RSpec.describe 'Branch rule callout', feature_category: :source_code_management it 'displays callout on repository settings page' do expect(page).to have_content callout_message expect(page).to have_link('How to use branch rules', - href: help_page_path('user/project/repository/branches/index', anchor: 'create-a-branch-rule')) + href: help_page_path('user/project/repository/branches/index.md', anchor: 'create-a-branch-rule')) end context 'when callout is dismissed', :js do diff --git a/spec/frontend/members/components/table/drawer/utils_spec.js b/spec/frontend/members/components/table/drawer/utils_spec.js index d43ad33dc6c..590becc9b49 100644 --- a/spec/frontend/members/components/table/drawer/utils_spec.js +++ b/spec/frontend/members/components/table/drawer/utils_spec.js @@ -49,7 +49,9 @@ describe('Role details drawer utils', () => { await callRoleUpdateApi(member, role); expect(mockAxios.history.put).toHaveLength(1); - expect(mockAxios.history.put[0].data).toBe(JSON.stringify({ [propertyName]: 10 })); + expect(mockAxios.history.put[0].data).toBe( + JSON.stringify({ [propertyName]: 10, member_role_id: null }), + ); }, ); }); diff --git a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js index 7c62adc35a5..57634932899 100644 --- a/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js +++ b/spec/frontend/merge_requests/list/components/merge_requests_list_app_spec.js @@ -37,6 +37,7 @@ import MergeRequestsListApp from '~/merge_requests/list/components/merge_request import getMergeRequestsQuery from '~/merge_requests/list/queries/get_merge_requests.query.graphql'; import getMergeRequestsCountQuery from '~/merge_requests/list/queries/get_merge_requests_counts.query.graphql'; import IssuableList from '~/vue_shared/issuable/list/components/issuable_list_root.vue'; +import issuableEventHub from '~/issues/list/eventhub'; Vue.use(VueApollo); Vue.use(VueRouter); @@ -48,6 +49,7 @@ let getCountsQueryResponseMock; const findIssuableList = () => wrapper.findComponent(IssuableList); const findNewMrButton = () => wrapper.findByTestId('new-merge-request-button'); +const findBulkEditButton = () => wrapper.findByTestId('bulk-edit'); function createComponent({ provide = {}, @@ -79,6 +81,7 @@ function createComponent({ email: '', exportCsvPath: '', rssUrl: '', + canBulkUpdate: true, ...provide, }, apolloProvider, @@ -363,4 +366,58 @@ describe('Merge requests list app', () => { getQueryResponse.data.project.mergeRequests.nodes[0], ); }); + + describe('bulk edit', () => { + it('renders when user has permissions', () => { + createComponent({ provide: { canBulkUpdate: true }, mountFn: mountExtended }); + + expect(findBulkEditButton().exists()).toBe(true); + }); + + it('does not render when user does not have permissions', () => { + createComponent({ provide: { canBulkUpdate: false }, mountFn: mountExtended }); + + expect(findBulkEditButton().exists()).toBe(false); + }); + + it('emits "issuables:enableBulkEdit" event to legacy bulk edit class', async () => { + createComponent({ provide: { canBulkUpdate: true }, mountFn: mountExtended }); + jest.spyOn(issuableEventHub, '$emit'); + + findBulkEditButton().vm.$emit('click'); + await waitForPromises(); + + expect(issuableEventHub.$emit).toHaveBeenCalledWith('issuables:enableBulkEdit'); + }); + + describe.each([true, false])( + 'when "issuables:toggleBulkEdit" event is received with payload `%s`', + (isBulkEdit) => { + beforeEach(() => { + createComponent(); + + issuableEventHub.$emit('issuables:toggleBulkEdit', isBulkEdit); + }); + + it(`${isBulkEdit ? 'enables' : 'disables'} bulk edit`, () => { + expect(findIssuableList().props('showBulkEditSidebar')).toBe(isBulkEdit); + }); + }, + ); + + describe('when "update-legacy-bulk-edit" event is emitted by IssuableList', () => { + beforeEach(() => { + createComponent(); + jest.spyOn(issuableEventHub, '$emit'); + }); + + it('emits an "issuables:updateBulkEdit" event to the legacy bulk edit class', async () => { + findIssuableList().vm.$emit('update-legacy-bulk-edit'); + + await nextTick(); + + expect(issuableEventHub.$emit).toHaveBeenCalledWith('issuables:updateBulkEdit'); + }); + }); + }); }); diff --git a/spec/frontend/merge_requests/list/mock_data.js b/spec/frontend/merge_requests/list/mock_data.js index ff842cdfc9a..c816a84449d 100644 --- a/spec/frontend/merge_requests/list/mock_data.js +++ b/spec/frontend/merge_requests/list/mock_data.js @@ -70,6 +70,10 @@ export const getQueryResponse = { }, ], }, + taskCompletionStatus: { + completedCount: 0, + count: 1, + }, }, ], }, diff --git a/spec/helpers/merge_requests_helper_spec.rb b/spec/helpers/merge_requests_helper_spec.rb index 8ea7433c32b..ce88d5a3449 100644 --- a/spec/helpers/merge_requests_helper_spec.rb +++ b/spec/helpers/merge_requests_helper_spec.rb @@ -346,7 +346,8 @@ RSpec.describe MergeRequestsHelper, feature_category: :code_review_workflow do email: current_user.notification_email_or_default, export_csv_path: '/csv-url', rss_url: '/rss-url', - releases_endpoint: project_releases_path(project, format: :json) + releases_endpoint: project_releases_path(project, format: :json), + can_bulk_update: 'true' } expect(subject).to eq(expected_data) diff --git a/spec/policies/project_policy_spec.rb b/spec/policies/project_policy_spec.rb index ba905300ff9..5b9078bf6a1 100644 --- a/spec/policies/project_policy_spec.rb +++ b/spec/policies/project_policy_spec.rb @@ -2480,6 +2480,26 @@ RSpec.describe ProjectPolicy, feature_category: :system_access do end end + describe 'publish_catalog_version' do + using RSpec::Parameterized::TableSyntax + + where(:role, :allowed) do + :owner | true + :maintainer | true + :developer | true + :reporter | false + :guest | false + end + + with_them do + let(:current_user) { public_send(role) } + + it do + expect(subject.can?(:publish_catalog_version)).to be(allowed) + end + end + end + describe 'infrastructure feature' do using RSpec::Parameterized::TableSyntax diff --git a/spec/policies/release_policy_spec.rb b/spec/policies/release_policy_spec.rb index e96fc6e328c..b2870e7fce7 100644 --- a/spec/policies/release_policy_spec.rb +++ b/spec/policies/release_policy_spec.rb @@ -19,6 +19,7 @@ RSpec.describe ReleasePolicy, :request_store do is_expected.to be_allowed(:create_release) is_expected.to be_allowed(:update_release) is_expected.to be_allowed(:destroy_release) + is_expected.to be_allowed(:publish_catalog_version) end end @@ -29,6 +30,7 @@ RSpec.describe ReleasePolicy, :request_store do is_expected.to be_disallowed(:create_release) is_expected.to be_disallowed(:update_release) is_expected.to be_disallowed(:destroy_release) + is_expected.to be_disallowed(:publish_catalog_version) end end end diff --git a/spec/requests/api/ci/catalog_spec.rb b/spec/requests/api/ci/catalog_spec.rb new file mode 100644 index 00000000000..375f6f40b07 --- /dev/null +++ b/spec/requests/api/ci/catalog_spec.rb @@ -0,0 +1,138 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe API::Ci::Catalog, feature_category: :pipeline_composition do + include HttpBasicAuthHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project, :public, :catalog_resource_with_components) } + let_it_be(:catalog_resource) { create(:ci_catalog_resource, project: project) } + let_it_be(:release) do + create(:release, project: project, sha: project.repository.root_ref_sha, author: user) + end + + let(:metadata) do + { + components: [ + { name: 'hello-component', spec: { inputs: { hello: nil } }, component_type: 'template' }, + { name: 'world-component', spec: { inputs: { world: { default: 'abc' } } }, component_type: 'template' } + ] + } + end + + describe 'POST /projects/:id/catalog/publish' do + let(:url) { "/projects/#{project.id}/catalog/publish" } + + subject(:publish) do + post api(url, user), params: { version: release.tag, metadata: metadata } + end + + context 'when the project does not exist' do + let(:url) { "/projects/invalid-path/catalog/publish" } + + it 'returns a 404 response' do + publish + + expect(response).to have_gitlab_http_status(:not_found) + expect(json_response['message']).to eq('404 Project Not Found') + end + end + + context 'when the user is not authorized to project' do + it 'returns a 403 response' do + publish + + expect(response).to have_gitlab_http_status(:forbidden) + expect(json_response['message']).to eq('403 Forbidden') + end + end + + context 'when the user is not authorized to update the release' do + before_all do + project.add_guest(user) + end + + it 'returns a 403 response' do + publish + + expect(response).to have_gitlab_http_status(:forbidden) + expect(json_response['message']).to eq('403 Forbidden') + end + end + + context 'when the user is authorized as developer' do + before_all do + project.add_developer(user) + end + + it 'returns a success response' do + publish + + expect(response).to have_gitlab_http_status(:created) + + expect(json_response['catalog_url']).to eq( + "http://localhost/explore/catalog/#{project.full_path}" + ) + end + + it 'publishes the release to the catalog' do + expect do + expect do + publish + end.to change { project.catalog_resource_versions.count }.by(1) + end.to change { project.ci_components.count }.by(2) + + release = project.releases.last + version = project.catalog_resource_versions.last + components = project.ci_components.last(2) + + expect(version.release).to eq(release) + expect(version.name).to eq(release.tag) + expect(components.map(&:name)).to match_array(%w[hello-component world-component]) + expect(components.map(&:spec)).to match_array( + [ + { 'inputs' => { 'hello' => nil } }, + { 'inputs' => { 'world' => { 'default' => 'abc' } } } + ] + ) + expect(components.map(&:resource_type)).to all(eq('template')) + end + + context 'when the release was already published' do + before do + post api(url, user), params: { version: release.tag, metadata: metadata } + end + + it 'returns an error response' do + publish + + expect(response).to have_gitlab_http_status(:unprocessable_entity) + expect(json_response['message']).to eq('Release has already been published') + end + end + + context 'when the release author is different' do + let(:release) { create(:release, project: project, sha: project.repository.root_ref_sha) } + + it 'returns a 403 response' do + publish + + expect(response).to have_gitlab_http_status(:unprocessable_entity) + expect(json_response['message']).to eq('Published by must be the same as the release author') + end + end + + context 'when the release does not exist' do + let(:release) { create(:release) } + + it 'returns a 404 response' do + publish + + expect(response).to have_gitlab_http_status(:not_found) + expect(json_response['message']).to eq('404 Not found') + end + end + end + end +end diff --git a/spec/requests/api/ml/mlflow/model_versions_spec.rb b/spec/requests/api/ml/mlflow/model_versions_spec.rb index eda1949088e..0e615ba932d 100644 --- a/spec/requests/api/ml/mlflow/model_versions_spec.rb +++ b/spec/requests/api/ml/mlflow/model_versions_spec.rb @@ -44,7 +44,7 @@ RSpec.describe API::Ml::Mlflow::ModelVersions, feature_category: :mlops do is_expected.to have_gitlab_http_status(:ok) expect(json_response['model_version']).not_to be_nil expect(json_response['model_version']['name']).to eq(name) - expect(json_response['model_version']['version']).to eq(version) + expect(json_response['model_version']['version']).to eq(model_version.id.to_s) end describe 'Error States' do @@ -96,7 +96,7 @@ RSpec.describe API::Ml::Mlflow::ModelVersions, feature_category: :mlops do is_expected.to have_gitlab_http_status(:ok) expect(json_response['model_version']).not_to be_nil expect(json_response['model_version']['name']).to eq(name) - expect(json_response['model_version']['version']).to eq(version) + expect(json_response['model_version']['version']).to eq(model_version.id.to_s) end describe 'Error States' do @@ -151,10 +151,10 @@ RSpec.describe API::Ml::Mlflow::ModelVersions, feature_category: :mlops do end it 'increments the version if a model version already exists' do - create(:ml_model_versions, model: model, version: '1.0.0') + m = create(:ml_model_versions, model: model, version: '1.0.0') is_expected.to have_gitlab_http_status(:ok) - expect(json_response["model_version"]["version"]).to eq('2.0.0') + expect(json_response["model_version"]["version"]).to eq((m.id + 1).to_s) end describe 'user assigned version' do @@ -168,7 +168,6 @@ RSpec.describe API::Ml::Mlflow::ModelVersions, feature_category: :mlops do it 'assigns the supplied version string via the gitlab tag' do is_expected.to have_gitlab_http_status(:ok) - expect(json_response["model_version"]["version"]).to eq('1.2.3') expect(json_response["model_version"]["tags"]).to match_array([{ "key" => 'gitlab.version', "value" => '1.2.3' }]) end diff --git a/spec/requests/api/ml/mlflow/registered_models_spec.rb b/spec/requests/api/ml/mlflow/registered_models_spec.rb index 1e6df070014..a8f81a7641c 100644 --- a/spec/requests/api/ml/mlflow/registered_models_spec.rb +++ b/spec/requests/api/ml/mlflow/registered_models_spec.rb @@ -178,7 +178,7 @@ RSpec.describe API::Ml::Mlflow::RegisteredModels, feature_category: :mlops do is_expected.to have_gitlab_http_status(:ok) is_expected.to match_response_schema('ml/get_latest_versions') expect(json_response["model_versions"][0]["name"]).to eq(model_name) - expect(json_response["model_versions"][0]["version"]).to eq(version2.version) + expect(json_response["model_versions"][0]["version"]).to eq(version2.id.to_s) end describe 'Error States' do diff --git a/spec/services/ci/catalog/resources/release_service_spec.rb b/spec/services/ci/catalog/resources/release_service_spec.rb index ff7e3a11d11..04e309e3dc3 100644 --- a/spec/services/ci/catalog/resources/release_service_spec.rb +++ b/spec/services/ci/catalog/resources/release_service_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeline_composition do describe '#execute' do - let(:components_data) { nil } + let(:metadata) { nil } let(:project) { create(:project, :catalog_resource_with_components) } let(:release) do create(:release, project: project, sha: project.repository.root_ref_sha, author: project.first_owner) @@ -12,7 +12,7 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli let(:user) { project.first_owner } - subject(:execute) { described_class.new(release, user, components_data).execute } + subject(:execute) { described_class.new(release, user, metadata).execute } context 'when executing release service' do let(:histogram) { instance_double(Prometheus::Client::Histogram) } @@ -39,10 +39,12 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli context 'with a valid catalog resource and release from passed data' do let!(:catalog_resource) { create(:ci_catalog_resource, project: project) } - let(:components_data) do - [ - { name: 'hello-component', spec: { inputs: { hello: nil } } } - ] + let(:metadata) do + { + components: [ + { name: 'hello-component', spec: { inputs: { hello: nil } }, component_type: 'template' } + ] + } end it 'validates the catalog resource and creates a version' do @@ -51,6 +53,7 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli version = Ci::Catalog::Resources::Version.last expect(response).to be_success + expect(response.payload[:version]).to eq(version) expect(version.release).to eq(release) expect(version.catalog_resource).to eq(catalog_resource) expect(version.catalog_resource.project).to eq(project) @@ -58,6 +61,21 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli expect(version.components.first.name).to eq('hello-component') expect(version.components.first.spec).to eq({ 'inputs' => { 'hello' => nil } }) end + + context 'when the user does not have permission to publish a version' do + let(:user) { create(:user) } + + before do + project.add_reporter(user) + end + + it 'returns an error' do + response = execute + + expect(response).to be_error + expect(response.message).to include('You are not authorized to publish a version to the CI/CD catalog') + end + end end context 'with a valid catalog resource and release from fetched data (LEGACY)' do @@ -69,6 +87,7 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli version = Ci::Catalog::Resources::Version.last expect(response).to be_success + expect(response.payload[:version]).to eq(version) expect(version.release).to eq(release) expect(version.catalog_resource).to eq(catalog_resource) expect(version.catalog_resource.project).to eq(project) @@ -111,10 +130,12 @@ RSpec.describe Ci::Catalog::Resources::ReleaseService, feature_category: :pipeli let(:project) { create(:project, :catalog_resource_with_components) } let!(:catalog_resource) { create(:ci_catalog_resource, project: project) } - let(:components_data) do - [ - { invalid: 'data' } - ] + let(:metadata) do + { + components: [ + { invalid: 'data' } + ] + } end it 'returns an error and does not create a version' do diff --git a/spec/services/ci/catalog/resources/versions/build_components_service_spec.rb b/spec/services/ci/catalog/resources/versions/build_components_service_spec.rb index 3ef5662e661..210097654d9 100644 --- a/spec/services/ci/catalog/resources/versions/build_components_service_spec.rb +++ b/spec/services/ci/catalog/resources/versions/build_components_service_spec.rb @@ -11,10 +11,10 @@ RSpec.describe Ci::Catalog::Resources::Versions::BuildComponentsService, feature let(:components_data) do [ - { name: 'secret-detection', spec: { 'inputs' => { 'website' => nil } } }, - { name: 'dast', spec: {} }, - { name: 'blank-yaml', spec: {} }, - { name: 'template', spec: { 'inputs' => { 'environment' => nil } } } + { name: 'secret-detection', spec: { 'inputs' => { 'website' => nil } }, component_type: 'template' }, + { name: 'dast', spec: {}, component_type: 'template' }, + { name: 'blank-yaml', spec: {}, component_type: 'template' }, + { name: 'template', spec: { 'inputs' => { 'environment' => nil } }, component_type: 'template' } ] end @@ -38,7 +38,7 @@ RSpec.describe Ci::Catalog::Resources::Versions::BuildComponentsService, feature context 'when there are more than 30 components' do let(:components_data) do num_components = 31 - (0...num_components).map { |i| { name: "component_#{i}", spec: {} } } + (0...num_components).map { |i| { name: "component_#{i}", spec: {}, component_type: 'template' } } end it 'raises an error' do @@ -74,6 +74,21 @@ RSpec.describe Ci::Catalog::Resources::Versions::BuildComponentsService, feature expect(response.payload).to be_empty end end + + context 'with an invalid component type' do + let(:components_data) do + [ + { name: 'secret-detection', spec: { 'inputs' => { 'website' => nil } }, component_type: 'invalid' } + ] + end + + it 'returns an error' do + response = execute + + expect(response).to be_error + expect(response.message).to include("'invalid' is not a valid resource_type") + end + end end describe '#execute from fetched data (LEGACY)' do diff --git a/spec/services/ci/catalog/resources/versions/create_service_spec.rb b/spec/services/ci/catalog/resources/versions/create_service_spec.rb index 2cc2d6b7b6f..4856a1e94ef 100644 --- a/spec/services/ci/catalog/resources/versions/create_service_spec.rb +++ b/spec/services/ci/catalog/resources/versions/create_service_spec.rb @@ -4,8 +4,8 @@ require 'spec_helper' RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category: :pipeline_composition do describe '#execute from passed data' do - let!(:project) { create(:project, :small_repo) } - let!(:catalog_resource) { create(:ci_catalog_resource, project: project) } + let_it_be_with_refind(:project) { create(:project, :small_repo) } + let_it_be_with_refind(:catalog_resource) { create(:ci_catalog_resource, project: project) } let(:release) do create(:release, @@ -16,25 +16,27 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category let(:user) { project.first_owner } - let(:components_data) do - [ - { name: 'secret-detection', spec: { 'inputs' => { 'website' => nil } } }, - { name: 'dast', spec: {} }, - { name: 'blank-yaml', spec: {} }, - { name: 'template', spec: { 'inputs' => { 'environment' => nil } } } - ] + let(:metadata) do + { + components: [ + { name: 'secret-detection', spec: { 'inputs' => { 'website' => nil } }, component_type: 'template' }, + { name: 'dast', spec: {}, component_type: 'template' }, + { name: 'blank-yaml', spec: {}, component_type: 'template' }, + { name: 'template', spec: { 'inputs' => { 'environment' => nil } }, component_type: 'template' } + ] + } end - subject(:execute) { described_class.new(release, user, components_data).execute } + subject(:execute) { described_class.new(release, user, metadata).execute } context 'when the catalog resource has different types of components and a release' do it 'creates a version for the release and marks the catalog resource as published' do response = execute - expect(response).to be_success - version = Ci::Catalog::Resources::Version.last + expect(response).to be_success + expect(response.payload[:version]).to eq(version) expect(version.release).to eq(release) expect(version.semver.to_s).to eq(release.tag) expect(version.catalog_resource).to eq(catalog_resource) @@ -83,9 +85,11 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category end context 'when there are at max 30 components' do - let(:components_data) do + let(:metadata) do num_components = 30 - (0...num_components).map { |i| { name: "component_#{i}", spec: {} } } + { + components: (0...num_components).map { |i| { name: "component_#{i}", spec: {}, component_type: 'template' } } + } end it 'creates the components' do @@ -97,9 +101,11 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category end context 'when there are more than 30 components' do - let(:components_data) do + let(:metadata) do num_components = 31 - (0...num_components).map { |i| { name: "component_#{i}", spec: {} } } + { + components: (0..num_components).map { |i| { name: "component_#{i}", spec: {}, component_type: 'template' } } + } end it 'raises an error' do @@ -123,10 +129,12 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category end context 'with invalid data' do - let(:components_data) do - [ - { invalid: 'data' } - ] + let(:metadata) do + { + components: [ + { invalid: 'data' } + ] + } end it 'returns an error' do @@ -138,9 +146,9 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category end context 'when the user is not the author of the release' do - let(:user) { create(:user) } + let_it_be(:user) { create(:user) } - before do + before_all do project.add_maintainer(user) end @@ -154,7 +162,7 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category end context 'with no data' do - let(:components_data) { [] } + let(:metadata) { {} } it 'saves the version with no component' do response = execute @@ -222,10 +230,10 @@ RSpec.describe Ci::Catalog::Resources::Versions::CreateService, feature_category it 'creates a version for the release and marks the catalog resource as published' do response = execute - expect(response).to be_success - version = Ci::Catalog::Resources::Version.last + expect(response).to be_success + expect(response.payload[:version]).to eq(version) expect(version.release).to eq(release) expect(version.semver.to_s).to eq(release.tag) expect(version.catalog_resource).to eq(catalog_resource) diff --git a/spec/views/user_settings/profiles/show.html.haml_spec.rb b/spec/views/user_settings/profiles/show.html.haml_spec.rb index 4f55a9fdb58..9ffabac115b 100644 --- a/spec/views/user_settings/profiles/show.html.haml_spec.rb +++ b/spec/views/user_settings/profiles/show.html.haml_spec.rb @@ -21,7 +21,7 @@ RSpec.describe 'user_settings/profiles/show', feature_category: :user_profile do expect(rendered).to have_field('user_name', with: user.name) expect(rendered).to have_field('user_id', with: user.id) - expected_link = help_page_path('user/profile/index', + expected_link = help_page_path('user/profile/index.md', anchor: 'use-an-automatically-generated-private-commit-email') expected_link_html = "#{s_('Profiles|What is a private commit email?')}" @@ -64,7 +64,7 @@ RSpec.describe 'user_settings/profiles/show', feature_category: :user_profile do expect(rendered).to render_template('user_settings/profiles/_private_profile') expect(rendered).to have_link 'What information is hidden?', - href: help_page_path('user/profile/index', anchor: 'make-your-user-profile-page-private') + href: help_page_path('user/profile/index.md', anchor: 'make-your-user-profile-page-private') end end end diff --git a/workhorse/go.mod b/workhorse/go.mod index 9c27de6505f..223cc2f33f1 100644 --- a/workhorse/go.mod +++ b/workhorse/go.mod @@ -13,7 +13,7 @@ require ( github.com/aws/aws-sdk-go-v2/config v1.27.34 github.com/aws/aws-sdk-go-v2/credentials v1.17.32 github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18 - github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 + github.com/aws/aws-sdk-go-v2/service/s3 v1.62.0 github.com/disintegration/imaging v1.6.2 github.com/dlclark/regexp2 v1.11.4 github.com/getsentry/raven-go v0.2.0 @@ -24,7 +24,7 @@ require ( github.com/johannesboyne/gofakes3 v0.0.0-20240701191259-edd0227ffc37 github.com/jpillora/backoff v1.0.0 github.com/mitchellh/copystructure v1.2.0 - github.com/prometheus/client_golang v1.20.3 + github.com/prometheus/client_golang v1.20.4 github.com/redis/go-redis/v9 v9.6.1 github.com/sebest/xff v0.0.0-20210106013422-671bd2870b3a github.com/sirupsen/logrus v1.9.3 @@ -35,7 +35,7 @@ require ( go.uber.org/goleak v1.3.0 gocloud.dev v0.39.0 golang.org/x/image v0.20.0 - golang.org/x/net v0.28.0 + golang.org/x/net v0.29.0 golang.org/x/oauth2 v0.23.0 google.golang.org/grpc v1.65.0 google.golang.org/protobuf v1.34.2 @@ -137,10 +137,10 @@ require ( go.opentelemetry.io/otel/metric v1.28.0 // indirect go.opentelemetry.io/otel/trace v1.28.0 // indirect go.uber.org/atomic v1.11.0 // indirect - golang.org/x/crypto v0.26.0 // indirect + golang.org/x/crypto v0.27.0 // indirect golang.org/x/mod v0.20.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect + golang.org/x/sys v0.25.0 // indirect golang.org/x/text v0.18.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/tools v0.24.0 // indirect diff --git a/workhorse/go.sum b/workhorse/go.sum index d3fbdd76ad6..ef443398eca 100644 --- a/workhorse/go.sum +++ b/workhorse/go.sum @@ -132,8 +132,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19 h1:rfprUlsd github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.19/go.mod h1:SCWkEdRq8/7EK60NcvvQ6NXKuTcchAD4ROAsC37VEZE= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17 h1:u+EfGmksnJc/x5tq3A+OD7LrMbSSR/5TrKLvkdy/fhY= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.17/go.mod h1:VaMx6302JHax2vHJWgRo+5n9zvbacs3bLU/23DNQrTY= -github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2 h1:Kp6PWAlXwP1UvIflkIP6MFZYBNDCa4mFCGtxrpICVOg= -github.com/aws/aws-sdk-go-v2/service/s3 v1.61.2/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= +github.com/aws/aws-sdk-go-v2/service/s3 v1.62.0 h1:rd/aA3iDq1q7YsL5sc4dEwChutH7OZF9Ihfst6pXQzI= +github.com/aws/aws-sdk-go-v2/service/s3 v1.62.0/go.mod h1:5FmD/Dqq57gP+XwaUnd5WFPipAuzrf0HmupX27Gvjvc= github.com/aws/aws-sdk-go-v2/service/sso v1.22.7 h1:pIaGg+08llrP7Q5aiz9ICWbY8cqhTkyy+0SHvfzQpTc= github.com/aws/aws-sdk-go-v2/service/sso v1.22.7/go.mod h1:eEygMHnTKH/3kNp9Jr1n3PdejuSNcgwLe1dWgQtO0VQ= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.7 h1:/Cfdu0XV3mONYKaOt1Gr0k1KvQzkzPyiKUdlWJqy+J4= @@ -416,8 +416,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4= -github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= @@ -538,8 +538,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -630,8 +630,8 @@ golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/oauth2 v0.0.0-20170912212905-13449ad91cb2/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -728,8 +728,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=