diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-27 15:09:50 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-07-27 15:09:50 +0300 |
commit | 8827c1d18473a3d84db181c89212975418a25e37 (patch) | |
tree | 3f16c4b02b0b46fb2f501a6d5e9fc0f93f1a406f | |
parent | 43b35a88ca54379d8df4dad84b5a84f9eecae3f2 (diff) |
Add latest changes from gitlab-org/gitlab@master
206 files changed, 940 insertions, 526 deletions
diff --git a/.gitlab/issue_templates/Refactoring.md b/.gitlab/issue_templates/Refactoring.md index cd0ce8486f0..d9466185ff7 100644 --- a/.gitlab/issue_templates/Refactoring.md +++ b/.gitlab/issue_templates/Refactoring.md @@ -38,4 +38,12 @@ If you are aware of tests that need to be written or adjusted apart from unit te please list them here. --> -/label ~backstage +<!-- +Please select the appropriate label from the following: + ~"feature::addition" + ~"feature::maintenance" + ~"tooling::pipelines" + ~"tooling::workflow" +--> + +/label ~"feature::maintenance" diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 279ef50bc32..9152b5bdb8b 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -1273,9 +1273,6 @@ Rails/SaveBang: - 'ee/spec/finders/security/vulnerabilities_finder_spec.rb' - 'ee/spec/frontend/fixtures/analytics.rb' - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb' - - 'ee/spec/helpers/application_helper_spec.rb' - - 'ee/spec/helpers/ee/dashboard_helper_spec.rb' - - 'ee/spec/helpers/ee/issues_helper_spec.rb' - 'ee/spec/initializers/fog_google_https_private_urls_spec.rb' - 'ee/spec/lib/analytics/merge_request_metrics_calculator_spec.rb' - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb' @@ -1571,16 +1568,6 @@ Rails/SaveBang: - 'spec/graphql/mutations/merge_requests/set_locked_spec.rb' - 'spec/graphql/mutations/merge_requests/set_wip_spec.rb' - 'spec/graphql/resolvers/boards_resolver_spec.rb' - - 'spec/helpers/appearances_helper_spec.rb' - - 'spec/helpers/auto_devops_helper_spec.rb' - - 'spec/helpers/issuables_helper_spec.rb' - - 'spec/helpers/issues_helper_spec.rb' - - 'spec/helpers/members_helper_spec.rb' - - 'spec/helpers/notes_helper_spec.rb' - - 'spec/helpers/profiles_helper_spec.rb' - - 'spec/helpers/projects/alert_management_helper_spec.rb' - - 'spec/helpers/projects_helper_spec.rb' - - 'spec/helpers/visibility_level_helper_spec.rb' - 'spec/initializers/active_record_locking_spec.rb' - 'spec/initializers/fog_google_https_private_urls_spec.rb' - 'spec/lib/after_commit_queue_spec.rb' diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index ec31613daf2..c6b53966250 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -9a0283f5d3f930bc3c73e14ed1eb127f1321849f +1833948feca92eab5791a4358f862b9b9d6b680d diff --git a/GITLAB_ELASTICSEARCH_INDEXER_VERSION b/GITLAB_ELASTICSEARCH_INDEXER_VERSION index 197c4d5c2d7..437459cd94c 100644 --- a/GITLAB_ELASTICSEARCH_INDEXER_VERSION +++ b/GITLAB_ELASTICSEARCH_INDEXER_VERSION @@ -1 +1 @@ -2.4.0 +2.5.0 diff --git a/app/controllers/concerns/renders_blob.rb b/app/controllers/concerns/renders_blob.rb index b8026c7a01d..a15bf27a22f 100644 --- a/app/controllers/concerns/renders_blob.rb +++ b/app/controllers/concerns/renders_blob.rb @@ -29,6 +29,12 @@ module RendersBlob end def conditionally_expand_blob(blob) - blob.expand! if params[:expanded] == 'true' + conditionally_expand_blobs([blob]) + end + + def conditionally_expand_blobs(blobs) + return unless params[:expanded] == 'true' + + blobs.each { |blob| blob.expand! } end end diff --git a/app/controllers/concerns/snippets_actions.rb b/app/controllers/concerns/snippets_actions.rb index bb12efa2151..5552fd663f7 100644 --- a/app/controllers/concerns/snippets_actions.rb +++ b/app/controllers/concerns/snippets_actions.rb @@ -55,10 +55,9 @@ module SnippetsActions # rubocop:disable Gitlab/ModuleWithInstanceVariables def show - conditionally_expand_blob(blob) - respond_to do |format| format.html do + conditionally_expand_blob(blob) @note = Note.new(noteable: @snippet, project: @snippet.project) @noteable = @snippet @@ -68,11 +67,14 @@ module SnippetsActions end format.json do + conditionally_expand_blob(blob) render_blob_json(blob) end format.js do if @snippet.embeddable? + conditionally_expand_blobs(blobs) + render 'shared/snippets/show' else head :not_found @@ -109,13 +111,15 @@ module SnippetsActions # rubocop:disable Gitlab/ModuleWithInstanceVariables def blob - return unless snippet + @blob ||= blobs.first + end - @blob ||= if snippet.empty_repo? - snippet.blob - else - snippet.blobs.first - end + def blobs + @blobs ||= if snippet.empty_repo? + [snippet.blob] + else + snippet.blobs + end end # rubocop:enable Gitlab/ModuleWithInstanceVariables diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 99ec100e4c9..23eb9901805 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -105,7 +105,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController action_or_env_url = if stop_action - polymorphic_url([project.namespace.becomes(Namespace), project, stop_action]) + polymorphic_url([project, stop_action]) else project_environment_url(project, @environment) end diff --git a/app/controllers/projects/snippets/blobs_controller.rb b/app/controllers/projects/snippets/blobs_controller.rb index 148fc7c96f8..eaec8600d77 100644 --- a/app/controllers/projects/snippets/blobs_controller.rb +++ b/app/controllers/projects/snippets/blobs_controller.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true class Projects::Snippets::BlobsController < Projects::Snippets::ApplicationController - include Snippets::BlobsActions + include ::Snippets::BlobsActions end diff --git a/app/helpers/award_emoji_helper.rb b/app/helpers/award_emoji_helper.rb index 13df53a751b..af9ab93d459 100644 --- a/app/helpers/award_emoji_helper.rb +++ b/app/helpers/award_emoji_helper.rb @@ -12,7 +12,7 @@ module AwardEmojiHelper toggle_award_emoji_project_note_path(@project, awardable.id) end else - url_for([:toggle_award_emoji, @project.namespace.becomes(Namespace), @project, awardable]) + url_for([:toggle_award_emoji, @project, awardable]) end end end diff --git a/app/helpers/custom_metrics_helper.rb b/app/helpers/custom_metrics_helper.rb index fbea6d2050f..5ea386e268d 100644 --- a/app/helpers/custom_metrics_helper.rb +++ b/app/helpers/custom_metrics_helper.rb @@ -2,10 +2,8 @@ module CustomMetricsHelper def custom_metrics_data(project, metric) - custom_metrics_path = project.namespace.becomes(::Namespace) - { - 'custom-metrics-path' => url_for([custom_metrics_path, project, metric]), + 'custom-metrics-path' => url_for([project, metric]), 'metric-persisted' => metric.persisted?.to_s, 'edit-project-service-path' => edit_project_service_path(project, PrometheusService), 'validate-query-path' => validate_query_project_prometheus_metrics_path(project), diff --git a/app/helpers/environment_helper.rb b/app/helpers/environment_helper.rb index bd400009c96..c4487ae8e4a 100644 --- a/app/helpers/environment_helper.rb +++ b/app/helpers/environment_helper.rb @@ -19,7 +19,7 @@ module EnvironmentHelper end def deployment_path(deployment) - [deployment.project.namespace.becomes(Namespace), deployment.project, deployment.deployable] + [deployment.project, deployment.deployable] end def deployment_link(deployment, text: nil) diff --git a/app/helpers/events_helper.rb b/app/helpers/events_helper.rb index 207230fd92e..0167f2ef698 100644 --- a/app/helpers/events_helper.rb +++ b/app/helpers/events_helper.rb @@ -199,8 +199,7 @@ module EventsHelper elsif event.design_note? design_url(event.note_target, anchor: dom_id(event.note)) else - polymorphic_url([event.project.namespace.becomes(Namespace), - event.project, event.note_target], + polymorphic_url([event.project, event.note_target], anchor: dom_id(event.target)) end end diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb index 570278be950..d71e6b4c004 100644 --- a/app/helpers/gitlab_routing_helper.rb +++ b/app/helpers/gitlab_routing_helper.rb @@ -100,8 +100,12 @@ module GitlabRoutingHelper toggle_award_emoji_snippet_path(*args) end - def toggle_award_emoji_namespace_project_project_snippet_path(*args) - toggle_award_emoji_namespace_project_snippet_path(*args) + def toggle_award_emoji_project_project_snippet_path(*args) + toggle_award_emoji_project_snippet_path(*args) + end + + def toggle_award_emoji_project_project_snippet_url(*args) + toggle_award_emoji_project_snippet_url(*args) end ## Members diff --git a/app/helpers/import_helper.rb b/app/helpers/import_helper.rb index 1ee67211ab0..329bbb5ad82 100644 --- a/app/helpers/import_helper.rb +++ b/app/helpers/import_helper.rb @@ -56,7 +56,7 @@ module ImportHelper link_url = 'https://github.com/settings/tokens' link_start = '<a href="%{url}" target="_blank" rel="noopener noreferrer">'.html_safe % { url: link_url } - _('Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import.').html_safe % { link_start: link_start, link_end: '</a>'.html_safe } + html_escape(_('Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to import.')) % { link_start: link_start, link_end: '</a>'.html_safe, code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } end def import_configure_github_admin_message diff --git a/app/helpers/notes_helper.rb b/app/helpers/notes_helper.rb index 782f1d3e759..dd7a6d64e7b 100644 --- a/app/helpers/notes_helper.rb +++ b/app/helpers/notes_helper.rb @@ -126,7 +126,7 @@ module NotesHelper if @snippet.is_a?(PersonalSnippet) [@note] else - [@project.namespace.becomes(Namespace), @project, @note] + [@project, @note] end end diff --git a/app/helpers/notifications_helper.rb b/app/helpers/notifications_helper.rb index 68dfd008921..9a64fe98f86 100644 --- a/app/helpers/notifications_helper.rb +++ b/app/helpers/notifications_helper.rb @@ -120,8 +120,4 @@ module NotificationsHelper def can_read_project?(project) can?(current_user, :read_project, project) end - - def notification_event_disabled?(event) - event == :fixed_pipeline && !Gitlab::Ci::Features.pipeline_fixed_notifications? - end end diff --git a/app/helpers/snippets_helper.rb b/app/helpers/snippets_helper.rb index d6a9e447fbc..0fbede1806c 100644 --- a/app/helpers/snippets_helper.rb +++ b/app/helpers/snippets_helper.rb @@ -74,21 +74,20 @@ module SnippetsHelper end end - def embedded_raw_snippet_button - blob = @snippet.blob + def embedded_raw_snippet_button(snippet, blob) return if blob.empty? || blob.binary? || blob.stored_externally? link_to(external_snippet_icon('doc-code'), - gitlab_raw_snippet_url(@snippet), + gitlab_raw_snippet_blob_url(snippet, blob.path), class: 'btn', target: '_blank', rel: 'noopener noreferrer', title: 'Open raw') end - def embedded_snippet_download_button + def embedded_snippet_download_button(snippet, blob) link_to(external_snippet_icon('download'), - gitlab_raw_snippet_url(@snippet, inline: false), + gitlab_raw_snippet_blob_url(snippet, blob.path, nil, inline: false), class: 'btn', target: '_blank', title: 'Download', diff --git a/app/helpers/timeboxes_helper.rb b/app/helpers/timeboxes_helper.rb index 0bffdba7349..8c437b283a0 100644 --- a/app/helpers/timeboxes_helper.rb +++ b/app/helpers/timeboxes_helper.rb @@ -40,7 +40,7 @@ module TimeboxesHelper opts = { milestone_title: milestone.title, state: state } if @project - polymorphic_path([@project.namespace.becomes(Namespace), @project, type], opts) + polymorphic_path([@project, type], opts) elsif @group polymorphic_url([type, @group], opts) else diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 76af1b49ddc..dbce6d24102 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -1084,8 +1084,6 @@ module Ci end def ensure_ci_ref! - return unless Gitlab::Ci::Features.pipeline_fixed_notifications? - self.ci_ref = Ci::Ref.ensure_for(self) end diff --git a/app/models/ci/ref.rb b/app/models/ci/ref.rb index 29b44575d65..356af32b0d7 100644 --- a/app/models/ci/ref.rb +++ b/app/models/ci/ref.rb @@ -47,8 +47,6 @@ module Ci end def update_status_by!(pipeline) - return unless Gitlab::Ci::Features.pipeline_fixed_notifications? - retry_lock(self) do next unless last_finished_pipeline_id == pipeline.id diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb index 4ea2ec10f11..c5d70f3f207 100644 --- a/app/models/project_services/jira_service.rb +++ b/app/models/project_services/jira_service.rb @@ -375,7 +375,6 @@ class JiraService < IssueTrackerService def build_entity_url(noteable_type, entity_id) polymorphic_url( [ - self.project.namespace.becomes(Namespace), self.project, noteable_type.to_sym ], diff --git a/app/presenters/event_presenter.rb b/app/presenters/event_presenter.rb index 5657e0b96bc..8f2388c2c31 100644 --- a/app/presenters/event_presenter.rb +++ b/app/presenters/event_presenter.rb @@ -24,7 +24,7 @@ class EventPresenter < Gitlab::View::Presenter::Delegated when Group [event.group, event.target] when Project - [event.project.namespace.becomes(Namespace), event.project, event.target] + [event.project, event.target] else '' end diff --git a/app/services/concerns/incident_management/settings.rb b/app/services/concerns/incident_management/settings.rb index 491bd4fa6bf..13a047ec106 100644 --- a/app/services/concerns/incident_management/settings.rb +++ b/app/services/concerns/incident_management/settings.rb @@ -1,8 +1,11 @@ # frozen_string_literal: true + module IncidentManagement module Settings include Gitlab::Utils::StrongMemoize + delegate :send_email?, to: :incident_management_setting + def incident_management_setting strong_memoize(:incident_management_setting) do project.incident_management_setting || diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb index e08bc8efb15..f883c8c7bd8 100644 --- a/app/services/projects/alerting/notify_service.rb +++ b/app/services/projects/alerting/notify_service.rb @@ -58,10 +58,6 @@ module Projects AlertManagement::Alert.not_resolved.for_fingerprint(project, fingerprint).first end - def send_email? - incident_management_setting.send_email? - end - def process_incident_issues(alert) return if alert.issue diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb index ea557ebe20f..d32ead76d00 100644 --- a/app/services/projects/prometheus/alerts/notify_service.rb +++ b/app/services/projects/prometheus/alerts/notify_service.rb @@ -42,10 +42,6 @@ module Projects Gitlab::Utils::DeepSize.new(params).valid? end - def send_email? - incident_management_setting.send_email && firings.any? - end - def firings @firings ||= alerts_by_status('firing') end @@ -125,6 +121,8 @@ module Projects end def send_alert_email + return unless firings.any? + notification_service .async .prometheus_alerts_fired(project, firings) diff --git a/app/views/admin/groups/show.html.haml b/app/views/admin/groups/show.html.haml index f64fe2eff7d..cc480b2ba9e 100644 --- a/app/views/admin/groups/show.html.haml +++ b/app/views/admin/groups/show.html.haml @@ -74,7 +74,7 @@ - @projects.each do |project| %li %strong - = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project] + = link_to project.full_name, [:admin, project] %span.badge.badge-pill = storage_counter(project.statistics.storage_size) %span.float-right.light @@ -93,7 +93,7 @@ - shared_projects.each do |project| %li %strong - = link_to project.full_name, [:admin, project.namespace.becomes(Namespace), project] + = link_to project.full_name, [:admin, project] %span.badge.badge-pill = storage_counter(project.statistics.storage_size) %span.float-right.light diff --git a/app/views/import/fogbugz/new_user_map.html.haml b/app/views/import/fogbugz/new_user_map.html.haml index 8ed9dc68bb3..cdc53520e93 100644 --- a/app/views/import/fogbugz/new_user_map.html.haml +++ b/app/views/import/fogbugz/new_user_map.html.haml @@ -18,7 +18,7 @@ %li %strong= _("Map a FogBugz account ID to a GitLab user") %p - = _('Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. "By <a href="#">@johnsmith</a>"). It will also associate and/or assign these issues and comments with the selected user.').html_safe + = html_escape(_('Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. "By %{link_open}@johnsmith%{link_close}"). It will also associate and/or assign these issues and comments with the selected user.')) % { link_open: '<a href="#">'.html_safe, link_close: '</a>'.html_safe } .table-holder %table.table diff --git a/app/views/import/google_code/new.html.haml b/app/views/import/google_code/new.html.haml index 7a6ad28f0aa..7dec67191b9 100644 --- a/app/views/import/google_code/new.html.haml +++ b/app/views/import/google_code/new.html.haml @@ -19,31 +19,31 @@ = _("Make sure you're logged into the account that owns the projects you'd like to import.") %li %p - = _('Click the <strong>Select none</strong> button on the right, since we only need "Google Code Project Hosting".').html_safe + = html_escape(_('Click the %{strong_open}Select none%{strong_close} button on the right, since we only need "Google Code Project Hosting".')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } %li %p - = _('Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right.').html_safe + = html_escape(_('Scroll down to %{strong_open}Google Code Project Hosting%{strong_close} and enable the switch on the right.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } %li %p - = _('Choose <strong>Next</strong> at the bottom of the page.').html_safe + = html_escape(_('Choose %{strong_open}Next%{strong_close} at the bottom of the page.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } %li %p = _('Leave the "File type" and "Delivery method" options on their default values.') %li %p - = _('Choose <strong>Create archive</strong> and wait for archiving to complete.').html_safe + = html_escape(_('Choose %{strong_open}Create archive%{strong_close} and wait for archiving to complete.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } %li %p - = _('Click the <strong>Download</strong> button and wait for downloading to complete.').html_safe + = html_escape(_('Click the %{strong_open}Download%{strong_close} button and wait for downloading to complete.')) % { strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } %li %p = _('Find the downloaded ZIP file and decompress it.') %li %p - = _('Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file.').html_safe + = html_escape(_('Find the newly extracted %{code_open}Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json%{code_close} file.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %li %p - = _('Upload <code>GoogleCodeProjectHosting.json</code> here:').html_safe + = html_escape(_('Upload %{code_open}GoogleCodeProjectHosting.json%{code_close} here:')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %p %input{ type: "file", name: "dump_file", id: "dump_file" } %li @@ -57,6 +57,6 @@ = label_tag :create_user_map_1 do = radio_button_tag :create_user_map, 1, false = _('Yes, let me map Google Code users to full names or GitLab users.') - %li - %p - = submit_tag _('Continue to the next step'), class: "btn btn-success" + + %span + = submit_tag _('Continue to the next step'), class: "btn btn-success" diff --git a/app/views/import/google_code/new_user_map.html.haml b/app/views/import/google_code/new_user_map.html.haml index 732ba95a63f..1f1bfda7ee4 100644 --- a/app/views/import/google_code/new_user_map.html.haml +++ b/app/views/import/google_code/new_user_map.html.haml @@ -9,24 +9,24 @@ %p = _("Customize how Google Code email addresses and usernames are imported into GitLab. In the next step, you'll be able to select the projects you want to import.") %p - = _("The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.").html_safe + = html_escape(_("The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of %{code_open}:%{code_close}. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.")) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %ul %li %strong= _("Default: Directly import the Google Code email address or username") %p - = _('<code>"johnsmith@example.com": "johnsm...@example.com"</code> will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user\'s privacy.').html_safe + = html_escape(_('%{code_open}"johnsmith@example.com": "johnsm...@example.com"%{code_close} will add "By johnsm...@example.com" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user\'s privacy.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %li %strong= _("Map a Google Code user to a GitLab user") %p - = _('<code>"johnsmith@example.com": "@johnsmith"</code> will add "By <a href="#">@johnsmith</a>" to all issues and comments originally created by johnsmith@example.com, and will set <a href="#">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.').html_safe + = html_escape(_('%{code_open}"johnsmith@example.com": "@johnsmith"%{code_close} will add "By %{link_open}@johnsmith%{link_close}" to all issues and comments originally created by johnsmith@example.com, and will set %{link_open}@johnsmith%{link_close} as the assignee on all issues originally assigned to johnsmith@example.com.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe, link_open: '<a href="#">'.html_safe, link_close: '</a>'.html_safe } %li %strong= _("Map a Google Code user to a full name") %p - = _('<code>"johnsmith@example.com": "John Smith"</code> will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.').html_safe + = html_escape(_('%{code_open}"johnsmith@example.com": "John Smith"%{code_close} will add "By John Smith" to all issues and comments originally created by johnsmith@example.com.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %li %strong= _("Map a Google Code user to a full email address") %p - = _('<code>"johnsmith@example.com": "johnsmith@example.com"</code> will add "By <a href="#">johnsmith@example.com</a>" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user\'s privacy. Use this option if you want to show the full email address.').html_safe + = html_escape(_('%{code_open}"johnsmith@example.com": "johnsmith@example.com"%{code_close} will add "By %{link_open}johnsmith@example.com%{link_close}" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user\'s privacy. Use this option if you want to show the full email address.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe, link_open: '<a href="#">'.html_safe, link_close: '</a>'.html_safe } .form-group.row .col-sm-12 diff --git a/app/views/import/google_code/status.html.haml b/app/views/import/google_code/status.html.haml index f322b7a956a..8d8754e1069 100644 --- a/app/views/import/google_code/status.html.haml +++ b/app/views/import/google_code/status.html.haml @@ -37,7 +37,7 @@ %td = link_to project.import_source, "https://code.google.com/p/#{project.import_source}", target: "_blank", rel: 'noopener noreferrer' %td - = link_to project.full_path, [project.namespace.becomes(Namespace), project] + = link_to project.full_path, project %td.job-status - case project.import_status - when 'finished' diff --git a/app/views/notify/_relabeled_issuable_email.text.erb b/app/views/notify/_relabeled_issuable_email.text.erb index 6a83d79fd61..dc399ef548d 100644 --- a/app/views/notify/_relabeled_issuable_email.text.erb +++ b/app/views/notify/_relabeled_issuable_email.text.erb @@ -1,3 +1,3 @@ <%= 'Label'.pluralize(@label_names.size) %> added: <%= @label_names.to_sentence %> -<%= url_for([issuable.project.namespace.becomes(Namespace), issuable.project, issuable, { only_path: false }]) %> +<%= url_for([issuable.project, issuable, { only_path: false }]) %> diff --git a/app/views/notify/reassigned_issue_email.text.erb b/app/views/notify/reassigned_issue_email.text.erb index 7bf2e8e6ce3..dc0d8fc80b0 100644 --- a/app/views/notify/reassigned_issue_email.text.erb +++ b/app/views/notify/reassigned_issue_email.text.erb @@ -1,6 +1,6 @@ Reassigned Issue <%= @issue.iid %> -<%= url_for([@issue.project.namespace.becomes(Namespace), @issue.project, @issue, { only_path: false }]) %> +<%= url_for([@issue.project, @issue, { only_path: false }]) %> Assignee changed <%= "from #{sanitize_name(@previous_assignees.map(&:name).to_sentence)}" if @previous_assignees.any? -%> to <%= "#{@issue.assignees.any? ? @issue.assignee_list : 'Unassigned'}" %> diff --git a/app/views/notify/reassigned_merge_request_email.text.erb b/app/views/notify/reassigned_merge_request_email.text.erb index 82ec7aa0fa4..2b51f48db3a 100644 --- a/app/views/notify/reassigned_merge_request_email.text.erb +++ b/app/views/notify/reassigned_merge_request_email.text.erb @@ -1,6 +1,6 @@ Reassigned Merge Request <%= @merge_request.iid %> -<%= url_for([@merge_request.project.namespace.becomes(Namespace), @merge_request.project, @merge_request, { only_path: false }]) %> +<%= url_for([@merge_request.project, @merge_request, { only_path: false }]) %> Assignee changed <%= "from #{sanitize_name(@previous_assignees.map(&:name).to_sentence)}" if @previous_assignees.any? -%> to <%= "#{@merge_request.assignees.any? ? @merge_request.assignee_list : 'Unassigned'}" %> diff --git a/app/views/projects/commit/_change.html.haml b/app/views/projects/commit/_change.html.haml index e71615dd1c5..4f5d69c614c 100644 --- a/app/views/projects/commit/_change.html.haml +++ b/app/views/projects/commit/_change.html.haml @@ -21,7 +21,7 @@ .modal-body - if description %p= description - = form_tag [type.underscore, @project.namespace.becomes(Namespace), @project, commit], method: :post, remote: false, class: "js-#{type}-form js-requires-input" do + = form_tag [type.underscore, @project, commit], method: :post, remote: false, class: "js-#{type}-form js-requires-input" do .form-group.branch = label_tag 'start_branch', branch_label, class: 'label-bold' diff --git a/app/views/projects/default_branch/_show.html.haml b/app/views/projects/default_branch/_show.html.haml index 38bec0361b0..f6693f7cc52 100644 --- a/app/views/projects/default_branch/_show.html.haml +++ b/app/views/projects/default_branch/_show.html.haml @@ -9,7 +9,7 @@ = _('Select the branch you want to set as the default for this project. All merge requests and commits will automatically be made against this branch unless you specify a different one.') .settings-content - = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, anchor: 'default-branch-settings' }, authenticity_token: true do |f| + = form_for @project, remote: true, html: { multipart: true, anchor: 'default-branch-settings' }, authenticity_token: true do |f| %fieldset - if @project.empty_repo? .text-secondary diff --git a/app/views/projects/deploy_keys/edit.html.haml b/app/views/projects/deploy_keys/edit.html.haml index 7fa7036245c..805d4983002 100644 --- a/app/views/projects/deploy_keys/edit.html.haml +++ b/app/views/projects/deploy_keys/edit.html.haml @@ -3,7 +3,7 @@ %hr %div - = form_for [@project.namespace.becomes(Namespace), @project, @deploy_key], include_id: false, html: { class: 'js-requires-input' } do |f| + = form_for [@project, @deploy_key], include_id: false, html: { class: 'js-requires-input' } do |f| = render partial: 'shared/deploy_keys/form', locals: { form: f, deploy_key: @deploy_key } .form-actions = f.submit 'Save changes', class: 'btn-success btn' diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml index c84c376d57b..5127d8b77d5 100644 --- a/app/views/projects/deployments/_actions.haml +++ b/app/views/projects/deployments/_actions.haml @@ -10,5 +10,5 @@ - actions.each do |action| - next unless can?(current_user, :update_build, action) %li - = link_to [:play, @project.namespace.becomes(Namespace), @project, action], method: :post, rel: 'nofollow' do + = link_to [:play, @project, action], method: :post, rel: 'nofollow' do %span= action.name diff --git a/app/views/projects/deployments/_confirm_rollback_modal.html.haml b/app/views/projects/deployments/_confirm_rollback_modal.html.haml index 9162827b501..3735ead1559 100644 --- a/app/views/projects/deployments/_confirm_rollback_modal.html.haml +++ b/app/views/projects/deployments/_confirm_rollback_modal.html.haml @@ -16,7 +16,7 @@ = s_('Environments|This action will run the job defined by %{environment_name} for commit %{commit_id}, putting the environment in a previous version. You can revert it by re-deploying the latest version of your application. Are you sure you want to continue?').html_safe % {commit_id: commit_sha, environment_name: @environment.name} .modal-footer = button_tag _('Cancel'), type: 'button', class: 'btn btn-cancel', data: { dismiss: 'modal' } - = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-danger' do + = link_to [:retry, @project, deployment.deployable], method: :post, class: 'btn btn-danger' do - if deployment.last? = s_('Environments|Re-deploy') - else diff --git a/app/views/projects/edit.html.haml b/app/views/projects/edit.html.haml index e63b615115a..a2bd7e38a28 100644 --- a/app/views/projects/edit.html.haml +++ b/app/views/projects/edit.html.haml @@ -17,7 +17,7 @@ %p= _('Choose visibility level, enable/disable project features (issues, repository, wiki, snippets) and set permissions.') .settings-content - = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "sharing-permissions-form" }, authenticity_token: true do |f| + = form_for @project, remote: true, html: { multipart: true, class: "sharing-permissions-form" }, authenticity_token: true do |f| %input{ name: 'update_section', type: 'hidden', value: 'js-shared-permissions' } %template.js-project-permissions-form-data{ type: "application/json" }= project_permissions_panel_data_json(@project) .js-project-permissions-form @@ -34,7 +34,7 @@ .settings-content = render_if_exists 'shared/promotions/promote_mr_features' - = form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f| + = form_for @project, remote: true, html: { multipart: true, class: "merge-request-settings-form js-mr-settings-form" }, authenticity_token: true do |f| %input{ name: 'update_section', type: 'hidden', value: 'js-merge-request-settings' } = render 'projects/merge_request_settings', form: f = f.submit _('Save changes'), class: "btn btn-success qa-save-merge-request-changes rspec-save-merge-request-changes" @@ -77,7 +77,7 @@ .sub-section.rename-repository %h4.warning-title= _('Change path') = render 'projects/errors' - = form_for([@project.namespace.becomes(Namespace), @project]) do |f| + = form_for @project do |f| .form-group = f.label :path, _('Path'), class: 'label-bold' .form-group @@ -96,7 +96,7 @@ - if can?(current_user, :change_namespace, @project) .sub-section %h4.danger-title= _('Transfer project') - = form_for([@project.namespace.becomes(Namespace), @project], url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } ) do |f| + = form_for @project, url: transfer_project_path(@project), method: :put, remote: true, html: { class: 'js-project-transfer-form' } do |f| .form-group = label_tag :new_namespace_id, nil, class: 'label-bold' do %span= _('Select a new namespace') @@ -114,7 +114,7 @@ %h4.danger-title= _('Remove fork relationship') %p= remove_fork_project_description_message(@project) - = form_for([@project.namespace.becomes(Namespace), @project], url: remove_fork_project_path(@project), method: :delete, remote: true, html: { class: 'transfer-project' }) do |f| + = form_for @project, url: remove_fork_project_path(@project), method: :delete, remote: true, html: { class: 'transfer-project' } do |f| %p %strong= _('Once removed, the fork relationship cannot be restored and you will no longer be able to send merge requests to the source.') = button_to _('Remove fork relationship'), '#', class: "btn btn-remove js-confirm-danger", data: { "confirm-danger-message" => remove_fork_project_warning_message(@project) } diff --git a/app/views/projects/environments/_form.html.haml b/app/views/projects/environments/_form.html.haml index 39eda493d69..0b8f9fe220d 100644 --- a/app/views/projects/environments/_form.html.haml +++ b/app/views/projects/environments/_form.html.haml @@ -6,7 +6,7 @@ - link_to_read_more = link_to(_("More information"), help_page_path("ci/environments/index.md")) = _("Environments allow you to track deployments of your application %{link_to_read_more}.").html_safe % { link_to_read_more: link_to_read_more } - = form_for [@project.namespace.becomes(Namespace), @project, @environment], html: { class: 'col-lg-9' } do |f| + = form_for [@project, @environment], html: { class: 'col-lg-9' } do |f| = form_errors(@environment) .form-group diff --git a/app/views/projects/hooks/edit.html.haml b/app/views/projects/hooks/edit.html.haml index e0ef0c0d3f9..f728ef5ac1a 100644 --- a/app/views/projects/hooks/edit.html.haml +++ b/app/views/projects/hooks/edit.html.haml @@ -7,7 +7,7 @@ = render 'shared/web_hooks/title_and_docs', hook: @hook .col-lg-9.gl-mb-3 - = form_for [@project.namespace.becomes(Namespace), @project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f| + = form_for [@project, @hook], as: :hook, url: project_hook_path(@project, @hook) do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } %span>= f.submit 'Save changes', class: 'btn btn-success gl-mr-3' diff --git a/app/views/projects/hooks/index.html.haml b/app/views/projects/hooks/index.html.haml index 1845bd190d3..e40c36da29d 100644 --- a/app/views/projects/hooks/index.html.haml +++ b/app/views/projects/hooks/index.html.haml @@ -7,7 +7,7 @@ = render 'shared/web_hooks/title_and_docs', hook: @hook .col-lg-8.gl-mb-3 - = form_for @hook, as: :hook, url: polymorphic_path([@project.namespace.becomes(Namespace), @project, :hooks]) do |f| + = form_for @hook, as: :hook, url: polymorphic_path([@project, :hooks]) do |f| = render partial: 'shared/web_hooks/form', locals: { form: f, hook: @hook } = f.submit 'Add webhook', class: 'btn btn-success' diff --git a/app/views/projects/issues/_form.html.haml b/app/views/projects/issues/_form.html.haml index 1be1087b36f..dcc8000c0c5 100644 --- a/app/views/projects/issues/_form.html.haml +++ b/app/views/projects/issues/_form.html.haml @@ -1,3 +1,3 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @issue], += form_for [@project, @issue], html: { class: 'issue-form common-note-form js-quick-submit js-requires-input' } do |f| = render 'shared/issuable/form', f: f, issuable: @issue diff --git a/app/views/projects/issues/export_csv/_modal.html.haml b/app/views/projects/issues/export_csv/_modal.html.haml index 342c3ba27bb..57a18ad5daa 100644 --- a/app/views/projects/issues/export_csv/_modal.html.haml +++ b/app/views/projects/issues/export_csv/_modal.html.haml @@ -16,6 +16,6 @@ - issues_count = issuables_count_for_state(:issues, params[:state]) = n_('%d issue selected', '%d issues selected', issues_count) % issues_count .modal-text - = _('The CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment.').html_safe % { email: @current_user.notification_email } + = html_escape(_('The CSV export will be created in the background. Once finished, it will be sent to %{strong_open}%{email}%{strong_close} in an attachment.')) % { email: @current_user.notification_email, strong_open: '<strong>'.html_safe, strong_close: '</strong>'.html_safe } .modal-footer = link_to _('Export issues'), export_csv_project_issues_path(@project, request.query_parameters), method: :post, class: 'btn btn-success float-left', title: _('Export issues'), data: { track_label: "export_issues_csv", track_event: "click_button", track_value: "", qa_selector: "export_issues_button" } diff --git a/app/views/projects/issues/verify.html.haml b/app/views/projects/issues/verify.html.haml index 6da7c317f3a..935a3493a37 100644 --- a/app/views/projects/issues/verify.html.haml +++ b/app/views/projects/issues/verify.html.haml @@ -1,5 +1,3 @@ -- form = [@project.namespace.becomes(Namespace), @project, @issue] - -= render layout: 'layouts/recaptcha_verification', locals: { spammable: @issue, form: form } do += render layout: 'layouts/recaptcha_verification', locals: { spammable: @issue } do = hidden_field_tag(:merge_request_to_resolve_discussions_of, params[:merge_request_to_resolve_discussions_of]) = hidden_field_tag(:discussion_to_resolve, params[:discussion_to_resolve]) diff --git a/app/views/projects/merge_requests/_form.html.haml b/app/views/projects/merge_requests/_form.html.haml index a7c9e54506d..a68a4318538 100644 --- a/app/views/projects/merge_requests/_form.html.haml +++ b/app/views/projects/merge_requests/_form.html.haml @@ -1,3 +1,3 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], += form_for [@project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f| = render 'shared/issuable/form', f: f, issuable: @merge_request, presenter: @mr_presenter diff --git a/app/views/projects/merge_requests/creations/_new_compare.html.haml b/app/views/projects/merge_requests/creations/_new_compare.html.haml index 99537ba8152..874adb19734 100644 --- a/app/views/projects/merge_requests/creations/_new_compare.html.haml +++ b/app/views/projects/merge_requests/creations/_new_compare.html.haml @@ -1,7 +1,7 @@ %h3.page-title New Merge Request -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], url: project_new_merge_request_path(@project), method: :get, html: { class: "merge-request-form js-requires-input" } do |f| += form_for [@project, @merge_request], url: project_new_merge_request_path(@project), method: :get, html: { class: "merge-request-form js-requires-input" } do |f| - if params[:nav_source].present? = hidden_field_tag(:nav_source, params[:nav_source]) .hide.alert.alert-danger.mr-compare-errors diff --git a/app/views/projects/merge_requests/creations/_new_submit.html.haml b/app/views/projects/merge_requests/creations/_new_submit.html.haml index fdf0bfe8e50..79781e4a311 100644 --- a/app/views/projects/merge_requests/creations/_new_submit.html.haml +++ b/app/views/projects/merge_requests/creations/_new_submit.html.haml @@ -1,6 +1,6 @@ %h3.page-title New Merge Request -= form_for [@project.namespace.becomes(Namespace), @project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f| += form_for [@project, @merge_request], html: { class: 'merge-request-form common-note-form js-requires-input js-quick-submit' } do |f| = render 'shared/issuable/form', f: f, issuable: @merge_request, commits: @commits, presenter: @mr_presenter = f.hidden_field :source_project_id = f.hidden_field :source_branch diff --git a/app/views/projects/milestones/_form.html.haml b/app/views/projects/milestones/_form.html.haml index eeff91f631c..907af326ec5 100644 --- a/app/views/projects/milestones/_form.html.haml +++ b/app/views/projects/milestones/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @milestone], += form_for [@project, @milestone], html: { class: 'milestone-form common-note-form js-quick-submit js-requires-input' } do |f| = form_errors(@milestone) .row diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml index 58eddf630f4..0049ce1b873 100644 --- a/app/views/projects/pages/_pages_settings.html.haml +++ b/app/views/projects/pages/_pages_settings.html.haml @@ -1,4 +1,4 @@ -= form_for @project, url: namespace_project_pages_path(@project.namespace.becomes(Namespace), @project), html: { class: 'inline', title: pages_https_only_title } do |f| += form_for @project, url: project_pages_path(@project), html: { class: 'inline', title: pages_https_only_title } do |f| - if Gitlab.config.pages.external_http || Gitlab.config.pages.external_https = render_if_exists 'shared/pages/max_pages_size_input', form: f diff --git a/app/views/projects/pages_domains/new.html.haml b/app/views/projects/pages_domains/new.html.haml index f5dc3ccc60e..0c3ab4f10a6 100644 --- a/app/views/projects/pages_domains/new.html.haml +++ b/app/views/projects/pages_domains/new.html.haml @@ -4,7 +4,7 @@ = _("New Pages Domain") = render 'projects/pages_domains/helper_text' %div - = form_for [@project.namespace.becomes(Namespace), @project, domain_presenter], html: { class: 'fieldset-form' } do |f| + = form_for [@project, domain_presenter], html: { class: 'fieldset-form' } do |f| = render 'form', { f: f } .form-actions = f.submit _('Create New Domain'), class: "btn btn-success" diff --git a/app/views/projects/pages_domains/show.html.haml b/app/views/projects/pages_domains/show.html.haml index e1be7335a3f..20ecf948447 100644 --- a/app/views/projects/pages_domains/show.html.haml +++ b/app/views/projects/pages_domains/show.html.haml @@ -14,7 +14,7 @@ = _('Pages Domain') = render 'projects/pages_domains/helper_text' %div - = form_for [@project.namespace.becomes(Namespace), @project, domain_presenter], html: { class: 'fieldset-form' } do |f| + = form_for [@project, domain_presenter], html: { class: 'fieldset-form' } do |f| = render 'form', { f: f } .form-actions.d-flex.justify-content-between = f.submit _('Save Changes'), class: "btn btn-success" diff --git a/app/views/projects/pipeline_schedules/_form.html.haml b/app/views/projects/pipeline_schedules/_form.html.haml index 20cf2ed63b5..dd2955f564f 100644 --- a/app/views/projects/pipeline_schedules/_form.html.haml +++ b/app/views/projects/pipeline_schedules/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @schedule], as: :schedule, html: { id: "new-pipeline-schedule-form", class: "js-pipeline-schedule-form pipeline-schedule-form" } do |f| += form_for [@project, @schedule], as: :schedule, html: { id: "new-pipeline-schedule-form", class: "js-pipeline-schedule-form pipeline-schedule-form" } do |f| = form_errors(@schedule) .form-group.row .col-md-9 diff --git a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml index f84c7b39733..7131e9925b3 100644 --- a/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml +++ b/app/views/projects/protected_branches/shared/_create_protected_branch.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f| += form_for [@project, @protected_branch], html: { class: 'new-protected-branch js-new-protected-branch' } do |f| %input{ type: 'hidden', name: 'update_section', value: 'js-protected-branches-settings' } .card .card-header diff --git a/app/views/projects/protected_branches/shared/_protected_branch.html.haml b/app/views/projects/protected_branches/shared/_protected_branch.html.haml index 4ca6ebe9c78..d62e9513d56 100644 --- a/app/views/projects/protected_branches/shared/_protected_branch.html.haml +++ b/app/views/projects/protected_branches/shared/_protected_branch.html.haml @@ -20,4 +20,4 @@ - if can_admin_project %td - = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-warning" + = link_to 'Unprotect', [@project, protected_branch, { update_section: 'js-protected-branches-settings' }], disabled: local_assigns[:disabled], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-warning" 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 8a6ae53a7c4..b5005b7d3b5 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 @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @protected_tag], html: { class: 'new-protected-tag js-new-protected-tag' } do |f| += form_for [@project, @protected_tag], html: { class: 'new-protected-tag js-new-protected-tag' } do |f| %input{ type: 'hidden', name: 'update_section', value: 'js-protected-tags-settings' } .card .card-header diff --git a/app/views/projects/protected_tags/shared/_protected_tag.html.haml b/app/views/projects/protected_tags/shared/_protected_tag.html.haml index b0563163c9c..71c29f9b7b6 100644 --- a/app/views/projects/protected_tags/shared/_protected_tag.html.haml +++ b/app/views/projects/protected_tags/shared/_protected_tag.html.haml @@ -19,4 +19,4 @@ - if can? current_user, :admin_project, @project %td - = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, protected_tag, { update_section: 'js-protected-tags-settings' }], data: { confirm: 'Tag will be writable for developers. Are you sure?' }, method: :delete, class: 'btn btn-warning' + = link_to 'Unprotect', [@project, protected_tag, { update_section: 'js-protected-tags-settings' }], data: { confirm: 'Tag will be writable for developers. Are you sure?' }, method: :delete, class: 'btn btn-warning' diff --git a/app/views/projects/runners/_runner.html.haml b/app/views/projects/runners/_runner.html.haml index 92680a70da2..8773c239ce6 100644 --- a/app/views/projects/runners/_runner.html.haml +++ b/app/views/projects/runners/_runner.html.haml @@ -27,7 +27,7 @@ - runner_project = @project.runner_projects.find_by(runner_id: runner) # rubocop: disable CodeReuse/ActiveRecord = link_to _('Disable for this project'), project_runner_project_path(@project, runner_project), data: { confirm: _("Are you sure?") }, method: :delete, class: 'btn btn-danger btn-sm' - elsif runner.project_type? - = form_for [@project.namespace.becomes(Namespace), @project, @project.runner_projects.new] do |f| + = form_for [@project, @project.runner_projects.new] do |f| = f.hidden_field :runner_id, value: runner.id = f.submit _('Enable for this project'), class: 'btn btn-sm' .float-right diff --git a/app/views/projects/settings/_general.html.haml b/app/views/projects/settings/_general.html.haml index 3ffa029a25d..811cec709c2 100644 --- a/app/views/projects/settings/_general.html.haml +++ b/app/views/projects/settings/_general.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project], remote: true, html: { multipart: true, class: "edit-project js-general-settings-form" }, authenticity_token: true do |f| += form_for [@project], remote: true, html: { multipart: true, class: "edit-project js-general-settings-form" }, authenticity_token: true do |f| %input{ name: 'update_section', type: 'hidden', value: 'js-general-settings' } = form_errors(@project) diff --git a/app/views/projects/snippets/verify.html.haml b/app/views/projects/snippets/verify.html.haml index eb56f03b3f4..3c4f08e1df7 100644 --- a/app/views/projects/snippets/verify.html.haml +++ b/app/views/projects/snippets/verify.html.haml @@ -1,4 +1,2 @@ -- form = [@project.namespace.becomes(Namespace), @project, @snippet.becomes(Snippet)] - -= render 'layouts/recaptcha_verification', spammable: @snippet, form: form += render 'layouts/recaptcha_verification', spammable: @snippet diff --git a/app/views/projects/triggers/_form.html.haml b/app/views/projects/triggers/_form.html.haml index a9abfac239c..dec71cdb56a 100644 --- a/app/views/projects/triggers/_form.html.haml +++ b/app/views/projects/triggers/_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @trigger], html: { class: 'gl-show-field-errors' } do |f| += form_for [@project, @trigger], html: { class: 'gl-show-field-errors' } do |f| = form_errors(@trigger) - if @trigger.token diff --git a/app/views/search/_results.html.haml b/app/views/search/_results.html.haml index 8ada8c875f7..1f995ffe482 100644 --- a/app/views/search/_results.html.haml +++ b/app/views/search/_results.html.haml @@ -8,7 +8,7 @@ = search_entries_info(@search_objects, @scope, @search_term) - unless @show_snippets - if @project - - link_to_project = link_to(@project.full_name, [@project.namespace.becomes(Namespace), @project], class: 'ml-md-1') + - link_to_project = link_to(@project.full_name, @project, class: 'ml-md-1') - if @scope == 'blobs' - repository_ref = params[:repository_ref].to_s.presence || @project.default_branch = s_("SearchCodeResults|in") diff --git a/app/views/search/results/_issue.html.haml b/app/views/search/results/_issue.html.haml index b88e9a75053..2f6024c3f2b 100644 --- a/app/views/search/results/_issue.html.haml +++ b/app/views/search/results/_issue.html.haml @@ -1,7 +1,7 @@ .search-result-row %h4 = confidential_icon(issue) - = link_to namespace_project_issue_path(issue.project.namespace.becomes(Namespace), issue.project, issue) do + = link_to project_issue_path(issue.project, issue) do %span.term.str-truncated= issue.title - if issue.closed? %span.badge.badge-danger.gl-ml-2= _("Closed") diff --git a/app/views/search/results/_merge_request.html.haml b/app/views/search/results/_merge_request.html.haml index 45b6cb06753..680c2ea0208 100644 --- a/app/views/search/results/_merge_request.html.haml +++ b/app/views/search/results/_merge_request.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to namespace_project_merge_request_path(merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request) do + = link_to project_merge_request_path(merge_request.target_project, merge_request) do %span.term.str-truncated= merge_request.title - if merge_request.merged? %span.badge.badge-primary.gl-ml-2= _("Merged") diff --git a/app/views/search/results/_milestone.html.haml b/app/views/search/results/_milestone.html.haml index 3201f1a7815..53c2d380bc5 100644 --- a/app/views/search/results/_milestone.html.haml +++ b/app/views/search/results/_milestone.html.haml @@ -1,6 +1,6 @@ .search-result-row %h4 - = link_to namespace_project_milestone_path(milestone.project.namespace.becomes(Namespace), milestone.project, milestone) do + = link_to project_milestone_path(milestone.project, milestone) do %span.term.str-truncated= milestone.title - if milestone.description.present? diff --git a/app/views/sent_notifications/unsubscribe.html.haml b/app/views/sent_notifications/unsubscribe.html.haml index 7aeecf26c39..2ad29707c9f 100644 --- a/app/views/sent_notifications/unsubscribe.html.haml +++ b/app/views/sent_notifications/unsubscribe.html.haml @@ -3,7 +3,7 @@ - noteable_text = show_unsubscribe_title?(noteable) ? %(#{noteable.title} (#{noteable.to_reference})) : %(#{noteable.to_reference}) - show_project_path = can_read_project?(@sent_notification.project) - project_path = show_project_path ? @sent_notification.project.full_name : _("GitLab / Unsubscribe") -- noteable_url = show_project_path ? url_for([@sent_notification.project.namespace.becomes(Namespace), @sent_notification.project, noteable]) : breadcrumb_title_link +- noteable_url = show_project_path ? url_for([@sent_notification.project, noteable]) : breadcrumb_title_link - page_title _('Unsubscribe'), noteable_text, noteable_type.pluralize, project_path %h3.page-title diff --git a/app/views/shared/_import_form.html.haml b/app/views/shared/_import_form.html.haml index b2ea45d6f1a..36d8aab6d53 100644 --- a/app/views/shared/_import_form.html.haml +++ b/app/views/shared/_import_form.html.haml @@ -26,8 +26,8 @@ .well-segment %ul %li - = _('The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.').html_safe - %li= _('When using the <code>http://</code> or <code>https://</code> protocols, please provide the exact URL to the repository. HTTP redirects will not be followed.').html_safe + = html_escape(_('The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } + %li= html_escape(_('When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed.')) % { code_open: '<code>'.html_safe, code_close: '</code>'.html_safe } %li = _('If your HTTP repository is not publicly accessible, add your credentials.') %li 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 4e569050827..a5694fce0fa 100644 --- a/app/views/shared/deploy_keys/_project_group_form.html.haml +++ b/app/views/shared/deploy_keys/_project_group_form.html.haml @@ -1,4 +1,4 @@ -= form_for [@project.namespace.becomes(Namespace), @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f| += form_for [@project.namespace, @project, @deploy_keys.new_key], url: namespace_project_deploy_keys_path, html: { class: "js-requires-input container" } do |f| = form_errors(@deploy_keys.new_key) .form-group.row = f.label :title, class: "label-bold" diff --git a/app/views/shared/issuable/_bulk_update_sidebar.html.haml b/app/views/shared/issuable/_bulk_update_sidebar.html.haml index ec7ff127ed5..50d24ff8d92 100644 --- a/app/views/shared/issuable/_bulk_update_sidebar.html.haml +++ b/app/views/shared/issuable/_bulk_update_sidebar.html.haml @@ -4,7 +4,7 @@ %aside.issues-bulk-update.js-right-sidebar.right-sidebar{ "aria-live" => "polite", data: { 'signed-in': current_user.present? } } .issuable-sidebar.hidden - = form_tag [:bulk_update, @project.namespace.becomes(Namespace), @project, type], method: :post, class: "bulk-update" do + = form_tag [:bulk_update, @project, type], method: :post, class: "bulk-update" do .block.issuable-sidebar-header .filter-item.inline.update-issues-btn.float-left = button_tag _('Update all'), class: "btn update-selected-issues btn-info", disabled: true diff --git a/app/views/shared/issuable/_form.html.haml b/app/views/shared/issuable/_form.html.haml index f54457b8b33..083b4759dc4 100644 --- a/app/views/shared/issuable/_form.html.haml +++ b/app/views/shared/issuable/_form.html.haml @@ -9,7 +9,7 @@ .alert.alert-danger Someone edited the #{issuable.class.model_name.human.downcase} the same time you did. Please check out - = link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable]), target: "_blank", rel: 'noopener noreferrer' + = link_to "the #{issuable.class.model_name.human.downcase}", polymorphic_path([@project, issuable]), target: "_blank", rel: 'noopener noreferrer' and make sure your changes will not unintentionally remove theirs = render 'shared/issuable/form/branch_chooser', issuable: issuable, form: form @@ -63,11 +63,11 @@ .row-content-block{ class: (is_footer ? "footer-block" : "middle-block") } .float-right - if issuable.new_record? - = link_to 'Cancel', polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable.class]), class: 'btn btn-cancel' + = link_to 'Cancel', polymorphic_path([@project, issuable.class]), class: 'btn btn-cancel' - else - if can?(current_user, :"destroy_#{issuable.to_ability_name}", @project) - = link_to 'Delete', polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable], params: { destroy_confirm: true }), data: { confirm: "#{issuable.human_class_name} will be removed! Are you sure?" }, method: :delete, class: 'btn btn-danger btn-grouped' - = link_to 'Cancel', polymorphic_path([@project.namespace.becomes(Namespace), @project, issuable]), class: 'btn btn-grouped btn-cancel' + = link_to 'Delete', polymorphic_path([@project, issuable], params: { destroy_confirm: true }), data: { confirm: "#{issuable.human_class_name} will be removed! Are you sure?" }, method: :delete, class: 'btn btn-danger btn-grouped' + = link_to 'Cancel', polymorphic_path([@project, issuable]), class: 'btn btn-grouped btn-cancel' %span.gl-mr-3 - if issuable.new_record? diff --git a/app/views/shared/notifications/_custom_notifications.html.haml b/app/views/shared/notifications/_custom_notifications.html.haml index 9bd08c2296f..51b7da7dee8 100644 --- a/app/views/shared/notifications/_custom_notifications.html.haml +++ b/app/views/shared/notifications/_custom_notifications.html.haml @@ -23,7 +23,6 @@ #{ paragraph.html_safe } .col-lg-8 - notification_setting.email_events.each_with_index do |event, index| - - next if notification_event_disabled?(event) - field_id = "#{notifications_menu_identifier("modal", notification_setting)}_notification_setting[#{event}]" .form-group .form-check{ class: ("gl-mt-0" if index == 0) } diff --git a/app/views/shared/snippets/_embed.html.haml b/app/views/shared/snippets/_embed.html.haml index f1abd3a2ce4..f698e1a301b 100644 --- a/app/views/shared/snippets/_embed.html.haml +++ b/app/views/shared/snippets/_embed.html.haml @@ -5,17 +5,17 @@ %strong.file-title-name %a.gitlab-embedded-snippets-title{ href: url_for(only_path: false, overwrite_params: nil) } - = @blob.name + = blob.name %small - = number_to_human_size(@blob.raw_size) + = number_to_human_size(blob.size) %a.gitlab-logo-wrapper{ href: url_for(only_path: false, overwrite_params: nil), title: 'view on gitlab' } %img.gitlab-logo{ src: image_url('ext_snippet_icons/logo.svg'), alt: "GitLab logo" } .file-actions.d-none.d-sm-block .btn-group{ role: "group" }< - = embedded_raw_snippet_button + = embedded_raw_snippet_button(@snippet, blob) - = embedded_snippet_download_button + = embedded_snippet_download_button(@snippet, blob) %article.file-holder.snippet-file-content - = render 'projects/blob/viewer', viewer: @blob.simple_viewer, load_async: false, external_embed: true + = render 'projects/blob/viewer', viewer: blob.simple_viewer, load_async: false, external_embed: true diff --git a/app/views/shared/snippets/show.js.haml b/app/views/shared/snippets/show.js.haml index d552c1a723b..23cebc97f63 100644 --- a/app/views/shared/snippets/show.js.haml +++ b/app/views/shared/snippets/show.js.haml @@ -1,2 +1,2 @@ document.write('#{escape_javascript(stylesheet_link_tag("#{stylesheet_url 'snippets'}"))}'); -document.write('#{escape_javascript(render('shared/snippets/embed'))}'); +document.write('#{escape_javascript(render(partial: 'shared/snippets/embed', collection: @blobs, as: :blob))}'); diff --git a/app/views/snippets/verify.html.haml b/app/views/snippets/verify.html.haml index cb623ccab57..3c4f08e1df7 100644 --- a/app/views/snippets/verify.html.haml +++ b/app/views/snippets/verify.html.haml @@ -1,4 +1,2 @@ -- form = [@snippet.becomes(Snippet)] - -= render 'layouts/recaptcha_verification', spammable: @snippet, form: form += render 'layouts/recaptcha_verification', spammable: @snippet diff --git a/app/views/users/calendar_activities.html.haml b/app/views/users/calendar_activities.html.haml index d5fb7207903..a0dc7580757 100644 --- a/app/views/users/calendar_activities.html.haml +++ b/app/views/users/calendar_activities.html.haml @@ -20,7 +20,7 @@ - if event.note? = link_to event.note_target.to_reference, event_note_target_url(event), class: 'has-tooltip', title: event.target_title - elsif event.target - = link_to event.target.to_reference, [event.project.namespace.becomes(Namespace), event.project, event.target], class: 'has-tooltip', title: event.target_title + = link_to event.target.to_reference, [event.project, event.target], class: 'has-tooltip', title: event.target_title = s_('UserProfile|at') %strong diff --git a/bin/feature-flag b/bin/feature-flag index 46d93a11ebd..d4ab295b30c 100755 --- a/bin/feature-flag +++ b/bin/feature-flag @@ -118,6 +118,9 @@ class FeatureFlagOptionParser end def read_type + # if there's only one type, do not ask, return + return TYPES.first.first if TYPES.one? + $stdout.puts ">> Please specify the type of your feature flag:" $stdout.puts TYPES.each do |type, data| diff --git a/changelogs/unreleased/fj-39279-include-all-files-in-snippet-js-requests.yml b/changelogs/unreleased/fj-39279-include-all-files-in-snippet-js-requests.yml new file mode 100644 index 00000000000..1f035a5d553 --- /dev/null +++ b/changelogs/unreleased/fj-39279-include-all-files-in-snippet-js-requests.yml @@ -0,0 +1,5 @@ +--- +title: Show all snippet files when embedding +merge_request: 37412 +author: +type: changed diff --git a/changelogs/unreleased/rails-save-bang-5.yml b/changelogs/unreleased/rails-save-bang-5.yml new file mode 100644 index 00000000000..5fdb72b71a9 --- /dev/null +++ b/changelogs/unreleased/rails-save-bang-5.yml @@ -0,0 +1,5 @@ +--- +title: Refactor spec/helpers and ee/spec/helpers to fix SaveBang Cop +merge_request: 37446 +author: Rajendra Kadam +type: fixed diff --git a/db/migrate/20200720053909_add_elasticsearch_indexed_file_size_limit_kb_to_application_settings.rb b/db/migrate/20200720053909_add_elasticsearch_indexed_file_size_limit_kb_to_application_settings.rb new file mode 100644 index 00000000000..bab5fe827d0 --- /dev/null +++ b/db/migrate/20200720053909_add_elasticsearch_indexed_file_size_limit_kb_to_application_settings.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class AddElasticsearchIndexedFileSizeLimitKbToApplicationSettings < ActiveRecord::Migration[6.0] + DOWNTIME = false + + def change + add_column :application_settings, + :elasticsearch_indexed_file_size_limit_kb, + :integer, + null: false, + default: 1024 # 1 MiB (units in KiB) + end +end diff --git a/db/schema_migrations/20200720053909 b/db/schema_migrations/20200720053909 new file mode 100644 index 00000000000..da9379a4e13 --- /dev/null +++ b/db/schema_migrations/20200720053909 @@ -0,0 +1 @@ +dfe979676a74b09ed6d0ffe258162f7d5af2bdea7c21b307aafbbb9ceb7c0334
\ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index b4a6ede0877..3289e0875e9 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -9247,6 +9247,7 @@ CREATE TABLE public.application_settings ( maintenance_mode boolean DEFAULT false NOT NULL, maintenance_mode_message text, wiki_page_max_content_bytes bigint DEFAULT 52428800 NOT NULL, + elasticsearch_indexed_file_size_limit_kb integer DEFAULT 1024 NOT NULL, CONSTRAINT check_51700b31b5 CHECK ((char_length(default_branch_name) <= 255)), CONSTRAINT check_9c6c447a13 CHECK ((char_length(maintenance_mode_message) <= 255)), CONSTRAINT check_d03919528d CHECK ((char_length(container_registry_vendor) <= 255)), diff --git a/doc/administration/img/repository_storages_admin_ui_v13_1.png b/doc/administration/img/repository_storages_admin_ui_v13_1.png Binary files differindex f8c13a35369..a2b88d14a36 100644 --- a/doc/administration/img/repository_storages_admin_ui_v13_1.png +++ b/doc/administration/img/repository_storages_admin_ui_v13_1.png diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md index 6e8f23fd58d..6ffde46a212 100644 --- a/doc/administration/instance_limits.md +++ b/doc/administration/instance_limits.md @@ -440,6 +440,24 @@ Reports that go over the 20 MB limit won't be loaded. Affected reports: ## Advanced Global Search limits +### Maximum file size indexed + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8638) in GitLab 13.3. + +You can set a limit on the content of repository files that are indexed in +Elasticsearch. Any files larger than this limit will not be indexed, and thus +will not be searchable. + +Setting a limit helps reduce the memory usage of the indexing processes as well +as the overall index size. This value defaults to `1024 KiB` (1 MiB) as any +text files larger than this likely aren't meant to be read by humans. + +NOTE: **Note:** +You must set a limit, as an unlimited file size is not supported. Setting this +value to be greater than the amount of memory on GitLab's Sidekiq nodes will +lead to GitLab's Sidekiq nodes running out of memory as they will pre-allocate +this amount of memory during indexing. + ### Maximum field length > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/201826) in GitLab 12.8. @@ -448,6 +466,9 @@ You can set a limit on the content of text fields indexed for Global Search. Setting a maximum helps to reduce the load of the indexing processes. If any text field exceeds this limit then the text will be truncated to this number of characters and the rest will not be indexed and hence will not be searchable. +This is applicable to all indexed data except repository files that get +indexed, which have a separate limit (see [Maximum file size +indexed](#maximum-file-size-indexed)). - On GitLab.com this is limited to 20000 characters - For self-managed installations it is unlimited by default diff --git a/doc/administration/reference_architectures/img/reference-architectures.png b/doc/administration/reference_architectures/img/reference-architectures.png Binary files differindex e15609e78e1..0f8e663b57b 100644 --- a/doc/administration/reference_architectures/img/reference-architectures.png +++ b/doc/administration/reference_architectures/img/reference-architectures.png diff --git a/doc/administration/troubleshooting/img/network_monitor_xid.png b/doc/administration/troubleshooting/img/network_monitor_xid.png Binary files differindex 41a9fc125b6..5392f77327f 100644 --- a/doc/administration/troubleshooting/img/network_monitor_xid.png +++ b/doc/administration/troubleshooting/img/network_monitor_xid.png diff --git a/doc/api/graphql/img/user_query_example_v13_2.png b/doc/api/graphql/img/user_query_example_v13_2.png Binary files differindex 8935bb7fa3c..270cf5da7fd 100644 --- a/doc/api/graphql/img/user_query_example_v13_2.png +++ b/doc/api/graphql/img/user_query_example_v13_2.png diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 65add93e0bc..e3fb9ae48a9 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -2160,6 +2160,56 @@ enum DastScanTypeEnum { } """ +Autogenerated input type of DastScannerProfileCreate +""" +input DastScannerProfileCreateInput { + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + + """ + The project the scanner profile belongs to. + """ + fullPath: ID! + + """ + The name of the scanner profile. + """ + profileName: String! + + """ + The maximum number of seconds allowed for the spider to traverse the site. + """ + spiderTimeout: Int + + """ + The maximum number of seconds allowed for the site under test to respond to a request. + """ + targetTimeout: Int +} + +""" +Autogenerated return type of DastScannerProfileCreate +""" +type DastScannerProfileCreatePayload { + """ + A unique identifier for the client performing the mutation. + """ + clientMutationId: String + + """ + Errors encountered during execution of the mutation. + """ + errors: [String!]! + + """ + ID of the scanner profile. + """ + id: ID +} + +""" Autogenerated input type of DastSiteProfileCreate """ input DastSiteProfileCreateInput { @@ -8225,6 +8275,7 @@ type Mutation { createNote(input: CreateNoteInput!): CreateNotePayload createRequirement(input: CreateRequirementInput!): CreateRequirementPayload createSnippet(input: CreateSnippetInput!): CreateSnippetPayload + dastScannerProfileCreate(input: DastScannerProfileCreateInput!): DastScannerProfileCreatePayload dastSiteProfileCreate(input: DastSiteProfileCreateInput!): DastSiteProfileCreatePayload deleteAnnotation(input: DeleteAnnotationInput!): DeleteAnnotationPayload designManagementDelete(input: DesignManagementDeleteInput!): DesignManagementDeletePayload diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 732a8d4416e..9c2e04e34c0 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -5787,6 +5787,142 @@ }, { "kind": "INPUT_OBJECT", + "name": "DastScannerProfileCreateInput", + "description": "Autogenerated input type of DastScannerProfileCreate", + "fields": null, + "inputFields": [ + { + "name": "fullPath", + "description": "The project the scanner profile belongs to.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "profileName", + "description": "The name of the scanner profile.", + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + }, + "defaultValue": null + }, + { + "name": "spiderTimeout", + "description": "The maximum number of seconds allowed for the spider to traverse the site.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "targetTimeout", + "description": "The maximum number of seconds allowed for the site under test to respond to a request.", + "type": { + "kind": "SCALAR", + "name": "Int", + "ofType": null + }, + "defaultValue": null + }, + { + "name": "clientMutationId", + "description": "A unique identifier for the client performing the mutation.", + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null + } + ], + "interfaces": null, + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "OBJECT", + "name": "DastScannerProfileCreatePayload", + "description": "Autogenerated return type of DastScannerProfileCreate", + "fields": [ + { + "name": "clientMutationId", + "description": "A unique identifier for the client performing the mutation.", + "args": [ + + ], + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "errors", + "description": "Errors encountered during execution of the mutation.", + "args": [ + + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "LIST", + "name": null, + "ofType": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "String", + "ofType": null + } + } + } + }, + "isDeprecated": false, + "deprecationReason": null + }, + { + "name": "id", + "description": "ID of the scanner profile.", + "args": [ + + ], + "type": { + "kind": "SCALAR", + "name": "ID", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + } + ], + "inputFields": null, + "interfaces": [ + + ], + "enumValues": null, + "possibleTypes": null + }, + { + "kind": "INPUT_OBJECT", "name": "DastSiteProfileCreateInput", "description": "Autogenerated input type of DastSiteProfileCreate", "fields": null, @@ -23577,6 +23713,33 @@ "deprecationReason": null }, { + "name": "dastScannerProfileCreate", + "description": null, + "args": [ + { + "name": "input", + "description": null, + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "INPUT_OBJECT", + "name": "DastScannerProfileCreateInput", + "ofType": null + } + }, + "defaultValue": null + } + ], + "type": { + "kind": "OBJECT", + "name": "DastScannerProfileCreatePayload", + "ofType": null + }, + "isDeprecated": false, + "deprecationReason": null + }, + { "name": "dastSiteProfileCreate", "description": null, "args": [ diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 088b87ea187..e15d0fea8ca 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -382,6 +382,16 @@ Autogenerated return type of CreateSnippet | `errors` | String! => Array | Errors encountered during execution of the mutation. | | `snippet` | Snippet | The snippet after mutation | +## DastScannerProfileCreatePayload + +Autogenerated return type of DastScannerProfileCreate + +| Name | Type | Description | +| --- | ---- | ---------- | +| `clientMutationId` | String | A unique identifier for the client performing the mutation. | +| `errors` | String! => Array | Errors encountered during execution of the mutation. | +| `id` | ID | ID of the scanner profile. | + ## DastSiteProfileCreatePayload Autogenerated return type of DastSiteProfileCreate diff --git a/doc/api/settings.md b/doc/api/settings.md index 1effe58e6d0..2169ff0f67b 100644 --- a/doc/api/settings.md +++ b/doc/api/settings.md @@ -238,6 +238,7 @@ are listed in the descriptions of the relevant settings. | `elasticsearch_aws` | boolean | no | **(PREMIUM)** Enable the use of AWS hosted Elasticsearch | | `elasticsearch_aws_region` | string | no | **(PREMIUM)** The AWS region the Elasticsearch domain is configured | | `elasticsearch_aws_secret_access_key` | string | no | **(PREMIUM)** AWS IAM secret access key | +| `elasticsearch_indexed_file_size_limit_kb` | integer | no | **(PREMIUM)** Maximum size of repository and wiki files that will be indexed by Elasticsearch. | | `elasticsearch_indexed_field_length_limit` | integer | no | **(PREMIUM)** Maximum size of text fields that will be indexed by Elasticsearch. 0 value means no limit. This does not apply to repository and wiki indexing. | | `elasticsearch_indexing` | boolean | no | **(PREMIUM)** Enable Elasticsearch indexing | | `elasticsearch_limit_indexing` | boolean | no | **(PREMIUM)** Limit Elasticsearch to index certain namespaces and projects | diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-production.png b/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-production.png Binary files differindex 65c8546deb2..16c15071dd7 100644 --- a/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-production.png +++ b/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-production.png diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-staging.png b/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-staging.png Binary files differindex 2399d8f8879..7a92a3c2d50 100644 --- a/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-staging.png +++ b/doc/ci/examples/authenticating-with-hashicorp-vault/img/vault-read-secrets-staging.png diff --git a/doc/ci/img/metrics_reports_advanced_v13_0.png b/doc/ci/img/metrics_reports_advanced_v13_0.png Binary files differindex c092c6a84e4..e96fdcf620a 100644 --- a/doc/ci/img/metrics_reports_advanced_v13_0.png +++ b/doc/ci/img/metrics_reports_advanced_v13_0.png diff --git a/doc/development/cicd/img/ci_architecture.png b/doc/development/cicd/img/ci_architecture.png Binary files differindex b888f2f07aa..0dd8ba57f51 100644 --- a/doc/development/cicd/img/ci_architecture.png +++ b/doc/development/cicd/img/ci_architecture.png diff --git a/doc/development/cicd/img/ci_template_selection_v13_1.png b/doc/development/cicd/img/ci_template_selection_v13_1.png Binary files differindex af9f6dd1a90..32de35f5c1f 100644 --- a/doc/development/cicd/img/ci_template_selection_v13_1.png +++ b/doc/development/cicd/img/ci_template_selection_v13_1.png diff --git a/doc/development/img/bullet_v13_0.png b/doc/development/img/bullet_v13_0.png Binary files differindex 04b476db581..e185bdef76d 100644 --- a/doc/development/img/bullet_v13_0.png +++ b/doc/development/img/bullet_v13_0.png diff --git a/doc/development/img/telemetry_system_overview.png b/doc/development/img/telemetry_system_overview.png Binary files differindex 1667039e8cd..f2e6b300e94 100644 --- a/doc/development/img/telemetry_system_overview.png +++ b/doc/development/img/telemetry_system_overview.png diff --git a/doc/development/integrations/example_vuln.png b/doc/development/integrations/example_vuln.png Binary files differindex f7a3c8b38f2..bbfeb3c805f 100644 --- a/doc/development/integrations/example_vuln.png +++ b/doc/development/integrations/example_vuln.png diff --git a/doc/install/aws/img/aws_ha_architecture_diagram.png b/doc/install/aws/img/aws_ha_architecture_diagram.png Binary files differindex dc63d36e0b3..b8b60d13ac5 100644 --- a/doc/install/aws/img/aws_ha_architecture_diagram.png +++ b/doc/install/aws/img/aws_ha_architecture_diagram.png diff --git a/doc/integration/elasticsearch.md b/doc/integration/elasticsearch.md index 25e93b4fc3d..551b372d3d9 100644 --- a/doc/integration/elasticsearch.md +++ b/doc/integration/elasticsearch.md @@ -155,6 +155,7 @@ The following Elasticsearch settings are available: | `AWS Region` | The AWS region your Elasticsearch service is located in. | | `AWS Access Key` | The AWS access key. | | `AWS Secret Access Key` | The AWS secret access key. | +| `Maximum file size indexed` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-file-size-indexed). | | `Maximum field length` | See [the explanation in instance limits.](../administration/instance_limits.md#maximum-field-length). | | `Maximum bulk request size (MiB)` | The Maximum Bulk Request size is used by GitLab's Golang-based indexer processes and indicates how much data it ought to collect (and store in memory) in a given indexing process before submitting the payload to Elasticsearch’s Bulk API. This setting should be used with the Bulk request concurrency setting (see below) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running GitLab's Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. | | `Bulk request concurrency` | The Bulk request concurrency indicates how many of GitLab's Golang-based indexer processes (or threads) can run in parallel to collect data to subsequently submit to Elasticsearch’s Bulk API. This increases indexing performance, but fills the Elasticsearch bulk requests queue faster. This setting should be used together with the Maximum bulk request size setting (see above) and needs to accommodate the resource constraints of both the Elasticsearch host(s) and the host(s) running GitLab's Golang-based indexer either from the `gitlab-rake` command or the Sidekiq tasks. | diff --git a/doc/topics/git/img/create_merge_request_v13_1.png b/doc/topics/git/img/create_merge_request_v13_1.png Binary files differindex a725149f6a2..d59cfc74290 100644 --- a/doc/topics/git/img/create_merge_request_v13_1.png +++ b/doc/topics/git/img/create_merge_request_v13_1.png diff --git a/doc/topics/git/img/modify_branches_v13_1.png b/doc/topics/git/img/modify_branches_v13_1.png Binary files differindex dc517dd249f..781f54fc3c0 100644 --- a/doc/topics/git/img/modify_branches_v13_1.png +++ b/doc/topics/git/img/modify_branches_v13_1.png diff --git a/doc/user/admin_area/img/scope_mr_approval_settings_v13_1.png b/doc/user/admin_area/img/scope_mr_approval_settings_v13_1.png Binary files differindex c6ca2bac83c..fe85d567a57 100644 --- a/doc/user/admin_area/img/scope_mr_approval_settings_v13_1.png +++ b/doc/user/admin_area/img/scope_mr_approval_settings_v13_1.png diff --git a/doc/user/admin_area/settings/img/import_export_rate_limits_v13_2.png b/doc/user/admin_area/settings/img/import_export_rate_limits_v13_2.png Binary files differindex 78c94b3803c..76015ce0ee3 100644 --- a/doc/user/admin_area/settings/img/import_export_rate_limits_v13_2.png +++ b/doc/user/admin_area/settings/img/import_export_rate_limits_v13_2.png diff --git a/doc/user/analytics/img/repository_analytics_v13_0.png b/doc/user/analytics/img/repository_analytics_v13_0.png Binary files differindex b70b63a6239..dd943b4f44d 100644 --- a/doc/user/analytics/img/repository_analytics_v13_0.png +++ b/doc/user/analytics/img/repository_analytics_v13_0.png diff --git a/doc/user/analytics/img/vsa_time_metrics_v13_0.png b/doc/user/analytics/img/vsa_time_metrics_v13_0.png Binary files differindex 073976fd740..799a81584a0 100644 --- a/doc/user/analytics/img/vsa_time_metrics_v13_0.png +++ b/doc/user/analytics/img/vsa_time_metrics_v13_0.png diff --git a/doc/user/application_security/dast/img/dast_on_demand_v13_2.png b/doc/user/application_security/dast/img/dast_on_demand_v13_2.png Binary files differindex 8a733c27be1..045221d713c 100644 --- a/doc/user/application_security/dast/img/dast_on_demand_v13_2.png +++ b/doc/user/application_security/dast/img/dast_on_demand_v13_2.png diff --git a/doc/user/application_security/img/adding_a_dismissal_reason_v13_0.png b/doc/user/application_security/img/adding_a_dismissal_reason_v13_0.png Binary files differindex 385236d08f2..cb8911b14b1 100644 --- a/doc/user/application_security/img/adding_a_dismissal_reason_v13_0.png +++ b/doc/user/application_security/img/adding_a_dismissal_reason_v13_0.png diff --git a/doc/user/application_security/img/interacting_with_vulnerability_v13_0.png b/doc/user/application_security/img/interacting_with_vulnerability_v13_0.png Binary files differindex 866ad74d42c..19d47712f9e 100644 --- a/doc/user/application_security/img/interacting_with_vulnerability_v13_0.png +++ b/doc/user/application_security/img/interacting_with_vulnerability_v13_0.png diff --git a/doc/user/application_security/img/vulnerability-check_v13_0.png b/doc/user/application_security/img/vulnerability-check_v13_0.png Binary files differindex 536fc4f10f7..9f0bd0f759b 100644 --- a/doc/user/application_security/img/vulnerability-check_v13_0.png +++ b/doc/user/application_security/img/vulnerability-check_v13_0.png diff --git a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png b/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png Binary files differindex 7266cfdcf3a..10d9effb811 100644 --- a/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png +++ b/doc/user/application_security/img/vulnerability_related_issues_add_button_v13_2.png diff --git a/doc/user/application_security/security_dashboard/img/group_security_dashboard_export_csv_v13_1.png b/doc/user/application_security/security_dashboard/img/group_security_dashboard_export_csv_v13_1.png Binary files differindex d98fb71ae37..8fab4e39175 100644 --- a/doc/user/application_security/security_dashboard/img/group_security_dashboard_export_csv_v13_1.png +++ b/doc/user/application_security/security_dashboard/img/group_security_dashboard_export_csv_v13_1.png diff --git a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_dropdown_v13_1.png b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_dropdown_v13_1.png Binary files differindex 2063762d3eb..05ca74c3d5c 100644 --- a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_dropdown_v13_1.png +++ b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_dropdown_v13_1.png diff --git a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_v13_1.png b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_v13_1.png Binary files differindex ee4e97bcafe..a3034a7db04 100644 --- a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_v13_1.png +++ b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_merge_request_button_v13_1.png diff --git a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_v13_1.png b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_v13_1.png Binary files differindex e0e0fdb6f6e..30a7195e1ab 100644 --- a/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_v13_1.png +++ b/doc/user/application_security/vulnerabilities/img/standalone_vulnerability_page_v13_1.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_add_license_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_add_license_v13_0.png Binary files differindex 992c08edcd3..1366c569f17 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_add_license_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_add_license_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_decision_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_decision_v13_0.png Binary files differindex d6c6142c0e7..42bf8bd1ed5 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_decision_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_decision_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_pipeline_tab_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_pipeline_tab_v13_0.png Binary files differindex 9ae59e2b96b..49c66832f00 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_pipeline_tab_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_pipeline_tab_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_search_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_search_v13_0.png Binary files differindex 8ee55003768..5a4216dd645 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_search_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_search_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_settings_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_settings_v13_0.png Binary files differindex 52b26abd9c5..91f1eec2a23 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_settings_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_settings_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_compliance_v13_0.png b/doc/user/compliance/license_compliance/img/license_compliance_v13_0.png Binary files differindex dc227bf05ef..20ed30a21e7 100644 --- a/doc/user/compliance/license_compliance/img/license_compliance_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_compliance_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/license_list_v13_0.png b/doc/user/compliance/license_compliance/img/license_list_v13_0.png Binary files differindex 3964c837c6a..3c15d4fc99a 100644 --- a/doc/user/compliance/license_compliance/img/license_list_v13_0.png +++ b/doc/user/compliance/license_compliance/img/license_list_v13_0.png diff --git a/doc/user/compliance/license_compliance/img/policies_v13_0.png b/doc/user/compliance/license_compliance/img/policies_v13_0.png Binary files differindex 4712d2b7aba..4918a0e6b62 100644 --- a/doc/user/compliance/license_compliance/img/policies_v13_0.png +++ b/doc/user/compliance/license_compliance/img/policies_v13_0.png diff --git a/doc/user/discussions/img/quickly_assign_commenter_v13_1.png b/doc/user/discussions/img/quickly_assign_commenter_v13_1.png Binary files differindex e19a3ed4f75..7f8ce62fe88 100644 --- a/doc/user/discussions/img/quickly_assign_commenter_v13_1.png +++ b/doc/user/discussions/img/quickly_assign_commenter_v13_1.png diff --git a/doc/user/group/epics/img/epic_activity_sort_order_v13_2.png b/doc/user/group/epics/img/epic_activity_sort_order_v13_2.png Binary files differindex c7e1448fea9..ce85efe3e67 100644 --- a/doc/user/group/epics/img/epic_activity_sort_order_v13_2.png +++ b/doc/user/group/epics/img/epic_activity_sort_order_v13_2.png diff --git a/doc/user/group/epics/img/issue_list_v13_1.png b/doc/user/group/epics/img/issue_list_v13_1.png Binary files differindex f08f774e986..ed0b4842bfe 100644 --- a/doc/user/group/epics/img/issue_list_v13_1.png +++ b/doc/user/group/epics/img/issue_list_v13_1.png diff --git a/doc/user/group/epics/img/new_epic_form_v13.2.png b/doc/user/group/epics/img/new_epic_form_v13.2.png Binary files differindex 3d24763d105..ac1450ae111 100644 --- a/doc/user/group/epics/img/new_epic_form_v13.2.png +++ b/doc/user/group/epics/img/new_epic_form_v13.2.png diff --git a/doc/user/group/epics/img/new_epic_from_groups_v13.2.png b/doc/user/group/epics/img/new_epic_from_groups_v13.2.png Binary files differindex 85bc4255595..bb75605af60 100644 --- a/doc/user/group/epics/img/new_epic_from_groups_v13.2.png +++ b/doc/user/group/epics/img/new_epic_from_groups_v13.2.png diff --git a/doc/user/group/img/ldap_sync_cn_v13_1.png b/doc/user/group/img/ldap_sync_cn_v13_1.png Binary files differindex 1b0a20b7e64..279b3192328 100644 --- a/doc/user/group/img/ldap_sync_cn_v13_1.png +++ b/doc/user/group/img/ldap_sync_cn_v13_1.png diff --git a/doc/user/group/img/ldap_sync_filter_v13_1.png b/doc/user/group/img/ldap_sync_filter_v13_1.png Binary files differindex 3fc1f28becd..655bed58d46 100644 --- a/doc/user/group/img/ldap_sync_filter_v13_1.png +++ b/doc/user/group/img/ldap_sync_filter_v13_1.png diff --git a/doc/user/group/img/manual_permissions_v13_1.png b/doc/user/group/img/manual_permissions_v13_1.png Binary files differindex 504e6ab3a42..0ada9a4839c 100644 --- a/doc/user/group/img/manual_permissions_v13_1.png +++ b/doc/user/group/img/manual_permissions_v13_1.png diff --git a/doc/user/group/issues_analytics/img/issues_table_v13_1.png b/doc/user/group/issues_analytics/img/issues_table_v13_1.png Binary files differindex 0f94f1ba2c5..3e8a729a884 100644 --- a/doc/user/group/issues_analytics/img/issues_table_v13_1.png +++ b/doc/user/group/issues_analytics/img/issues_table_v13_1.png diff --git a/doc/user/profile/notifications.md b/doc/user/profile/notifications.md index dbf486e399e..336c1b8f254 100644 --- a/doc/user/profile/notifications.md +++ b/doc/user/profile/notifications.md @@ -187,7 +187,7 @@ To minimize the number of notifications that do not require any action, from [Gi | Remove milestone merge request | Subscribers, participants mentioned, and Custom notification level with this event selected | | New comment | The above, plus anyone mentioned by `@username` in the comment, with notification level "Mention" or higher | | Failed pipeline | The author of the pipeline | -| Fixed pipeline | The author of the pipeline. Enabled by default. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1. Administrators can disable this notification option using the `ci_pipeline_fixed_notifications` [feature flag](../../administration/feature_flags.md). | +| Fixed pipeline | The author of the pipeline. Enabled by default. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/24309) in GitLab 13.1. | | Successful pipeline | The author of the pipeline, if they have the custom notification setting for successful pipelines set. If the pipeline failed previously, a `Fixed pipeline` message will be sent for the first successful pipeline after the failure, then a `Successful pipeline` message for any further successful pipelines. | | New epic **(ULTIMATE)** | | | Close epic **(ULTIMATE)** | | diff --git a/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png b/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png Binary files differindex 462141ef82a..15e6e71803c 100644 --- a/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png +++ b/doc/user/project/deploy_keys/img/deploy_keys_v13_0.png diff --git a/doc/user/project/deploy_keys/img/public_deploy_key_v13_0.png b/doc/user/project/deploy_keys/img/public_deploy_key_v13_0.png Binary files differindex 3e6d1605f95..2f708555af1 100644 --- a/doc/user/project/deploy_keys/img/public_deploy_key_v13_0.png +++ b/doc/user/project/deploy_keys/img/public_deploy_key_v13_0.png diff --git a/doc/user/project/img/code_intelligence_v13_1.png b/doc/user/project/img/code_intelligence_v13_1.png Binary files differindex 0dff27bab43..744195caed2 100644 --- a/doc/user/project/img/code_intelligence_v13_1.png +++ b/doc/user/project/img/code_intelligence_v13_1.png diff --git a/doc/user/project/img/sectional_code_owners_v13.2.png b/doc/user/project/img/sectional_code_owners_v13.2.png Binary files differindex 894771c26af..58b331950f4 100644 --- a/doc/user/project/img/sectional_code_owners_v13.2.png +++ b/doc/user/project/img/sectional_code_owners_v13.2.png diff --git a/doc/user/project/img/service_desk_custom_email_address_v13_0.png b/doc/user/project/img/service_desk_custom_email_address_v13_0.png Binary files differindex 6ce8bf45085..3789e039904 100644 --- a/doc/user/project/img/service_desk_custom_email_address_v13_0.png +++ b/doc/user/project/img/service_desk_custom_email_address_v13_0.png diff --git a/doc/user/project/import/img/jira/import_issues_from_jira_form_v12_10.png b/doc/user/project/import/img/jira/import_issues_from_jira_form_v12_10.png Binary files differindex d98ad2aaa6e..317a426394c 100644 --- a/doc/user/project/import/img/jira/import_issues_from_jira_form_v12_10.png +++ b/doc/user/project/import/img/jira/import_issues_from_jira_form_v12_10.png diff --git a/doc/user/project/import/img/jira/import_issues_from_jira_form_v13_2.png b/doc/user/project/import/img/jira/import_issues_from_jira_form_v13_2.png Binary files differindex 9cbffe2bb36..8a94d33d47b 100644 --- a/doc/user/project/import/img/jira/import_issues_from_jira_form_v13_2.png +++ b/doc/user/project/import/img/jira/import_issues_from_jira_form_v13_2.png diff --git a/doc/user/project/integrations/img/webex_teams_configuration.png b/doc/user/project/integrations/img/webex_teams_configuration.png Binary files differindex 66993e0887d..493b3ea50a0 100644 --- a/doc/user/project/integrations/img/webex_teams_configuration.png +++ b/doc/user/project/integrations/img/webex_teams_configuration.png diff --git a/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png b/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png Binary files differindex d60f1234b6d..25a02eef406 100644 --- a/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png +++ b/doc/user/project/issues/img/design_drag_and_drop_uploads_v13_2.png diff --git a/doc/user/project/issues/img/design_management_upload_v13.3.png b/doc/user/project/issues/img/design_management_upload_v13.3.png Binary files differindex 8df90e8642f..f7b3f79fb22 100644 --- a/doc/user/project/issues/img/design_management_upload_v13.3.png +++ b/doc/user/project/issues/img/design_management_upload_v13.3.png diff --git a/doc/user/project/issues/img/design_management_v13_2.png b/doc/user/project/issues/img/design_management_v13_2.png Binary files differindex 0a6e2be17ab..6d7e03d6f20 100644 --- a/doc/user/project/issues/img/design_management_v13_2.png +++ b/doc/user/project/issues/img/design_management_v13_2.png diff --git a/doc/user/project/issues/img/epic_tree_health_status_v12_10.png b/doc/user/project/issues/img/epic_tree_health_status_v12_10.png Binary files differindex c6d0117b1c4..1a603656fd8 100644 --- a/doc/user/project/issues/img/epic_tree_health_status_v12_10.png +++ b/doc/user/project/issues/img/epic_tree_health_status_v12_10.png diff --git a/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png b/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png Binary files differindex bd9d1f7a77c..8791419b919 100644 --- a/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png +++ b/doc/user/project/issues/img/resolve_design-discussion_checkbox_v13_1.png diff --git a/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png b/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png Binary files differindex 5cd005f0799..fc1fff321ba 100644 --- a/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png +++ b/doc/user/project/issues/img/resolve_design-discussion_icon_v13_1.png diff --git a/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png b/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png Binary files differindex c52bf9964f1..4ada7e25b65 100644 --- a/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png +++ b/doc/user/project/merge_requests/img/accessibility_mr_widget_v13_0.png diff --git a/doc/user/project/merge_requests/img/browser_performance_testing.png b/doc/user/project/merge_requests/img/browser_performance_testing.png Binary files differindex c270462f7a8..016abb89f7c 100644 --- a/doc/user/project/merge_requests/img/browser_performance_testing.png +++ b/doc/user/project/merge_requests/img/browser_performance_testing.png diff --git a/doc/user/project/merge_requests/img/code_quality.png b/doc/user/project/merge_requests/img/code_quality.png Binary files differindex 3c6c92baad2..1e7dd64baff 100644 --- a/doc/user/project/merge_requests/img/code_quality.png +++ b/doc/user/project/merge_requests/img/code_quality.png diff --git a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png b/doc/user/project/merge_requests/img/comment-on-any-diff-line.png Binary files differindex b5c4b12a6a7..cff5acb98ef 100644 --- a/doc/user/project/merge_requests/img/comment-on-any-diff-line.png +++ b/doc/user/project/merge_requests/img/comment-on-any-diff-line.png diff --git a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png Binary files differindex beb12c581d6..f7968772500 100644 --- a/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png +++ b/doc/user/project/merge_requests/img/draft_blocked_merge_button_v13_2.png diff --git a/doc/user/project/merge_requests/img/load_performance_testing.png b/doc/user/project/merge_requests/img/load_performance_testing.png Binary files differindex 3a58e9c28d4..d5623867ee7 100644 --- a/doc/user/project/merge_requests/img/load_performance_testing.png +++ b/doc/user/project/merge_requests/img/load_performance_testing.png diff --git a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png b/doc/user/project/merge_requests/img/multiline-comment-highlighted.png Binary files differindex c254af06c8f..1bdcc37e274 100644 --- a/doc/user/project/merge_requests/img/multiline-comment-highlighted.png +++ b/doc/user/project/merge_requests/img/multiline-comment-highlighted.png diff --git a/doc/user/project/merge_requests/img/multiline-comment-saved.png b/doc/user/project/merge_requests/img/multiline-comment-saved.png Binary files differindex 6c44ee9f777..cceab36e62b 100644 --- a/doc/user/project/merge_requests/img/multiline-comment-saved.png +++ b/doc/user/project/merge_requests/img/multiline-comment-saved.png diff --git a/doc/user/project/merge_requests/img/versions_compare_head_v12_10.png b/doc/user/project/merge_requests/img/versions_compare_head_v12_10.png Binary files differindex 353cf458243..61cf72e7bf9 100644 --- a/doc/user/project/merge_requests/img/versions_compare_head_v12_10.png +++ b/doc/user/project/merge_requests/img/versions_compare_head_v12_10.png diff --git a/doc/user/project/pages/img/change_path_v12_10.png b/doc/user/project/pages/img/change_path_v12_10.png Binary files differindex 9b5c17f1dda..b6ed011c6d9 100644 --- a/doc/user/project/pages/img/change_path_v12_10.png +++ b/doc/user/project/pages/img/change_path_v12_10.png diff --git a/doc/user/project/pages/img/choose_ci_template_v13_1.png b/doc/user/project/pages/img/choose_ci_template_v13_1.png Binary files differindex 84dd9fe2e0f..a0c25ba1642 100644 --- a/doc/user/project/pages/img/choose_ci_template_v13_1.png +++ b/doc/user/project/pages/img/choose_ci_template_v13_1.png diff --git a/doc/user/project/pages/img/pages_project_templates_v13_1.png b/doc/user/project/pages/img/pages_project_templates_v13_1.png Binary files differindex 3f6d1ecd786..d67a82f0623 100644 --- a/doc/user/project/pages/img/pages_project_templates_v13_1.png +++ b/doc/user/project/pages/img/pages_project_templates_v13_1.png diff --git a/doc/user/project/pages/img/remove_fork_relationship_v13_1.png b/doc/user/project/pages/img/remove_fork_relationship_v13_1.png Binary files differindex 1bc7bcd253b..84aa2e571c7 100644 --- a/doc/user/project/pages/img/remove_fork_relationship_v13_1.png +++ b/doc/user/project/pages/img/remove_fork_relationship_v13_1.png diff --git a/doc/user/project/releases/img/milestone_list_with_releases_v12_5.png b/doc/user/project/releases/img/milestone_list_with_releases_v12_5.png Binary files differindex efe48058d9a..b9eb18e9279 100644 --- a/doc/user/project/releases/img/milestone_list_with_releases_v12_5.png +++ b/doc/user/project/releases/img/milestone_list_with_releases_v12_5.png diff --git a/doc/user/project/releases/img/release_with_milestone_v12_9.png b/doc/user/project/releases/img/release_with_milestone_v12_9.png Binary files differindex c828e36114a..4a904a854f1 100644 --- a/doc/user/project/releases/img/release_with_milestone_v12_9.png +++ b/doc/user/project/releases/img/release_with_milestone_v12_9.png diff --git a/doc/user/project/releases/img/releases_count_v13_2.png b/doc/user/project/releases/img/releases_count_v13_2.png Binary files differindex 1c0493326d1..d2d77e016bc 100644 --- a/doc/user/project/releases/img/releases_count_v13_2.png +++ b/doc/user/project/releases/img/releases_count_v13_2.png diff --git a/doc/user/project/repository/img/file_finder_find_button_v12_10.png b/doc/user/project/repository/img/file_finder_find_button_v12_10.png Binary files differindex e93db946005..51545f63fde 100644 --- a/doc/user/project/repository/img/file_finder_find_button_v12_10.png +++ b/doc/user/project/repository/img/file_finder_find_button_v12_10.png diff --git a/doc/user/project/repository/img/file_finder_find_file_v12_10.png b/doc/user/project/repository/img/file_finder_find_file_v12_10.png Binary files differindex 1404ccc6d0b..e54de6a3065 100644 --- a/doc/user/project/repository/img/file_finder_find_file_v12_10.png +++ b/doc/user/project/repository/img/file_finder_find_file_v12_10.png diff --git a/doc/user/project/repository/img/forking_workflow_choose_namespace_v13_2.png b/doc/user/project/repository/img/forking_workflow_choose_namespace_v13_2.png Binary files differindex 6b3abeee5c3..4843cc671ae 100644 --- a/doc/user/project/repository/img/forking_workflow_choose_namespace_v13_2.png +++ b/doc/user/project/repository/img/forking_workflow_choose_namespace_v13_2.png diff --git a/doc/user/project/requirements/img/requirements_archived_list_view_v13_1.png b/doc/user/project/requirements/img/requirements_archived_list_view_v13_1.png Binary files differindex aafc8543bae..04cb011ff89 100644 --- a/doc/user/project/requirements/img/requirements_archived_list_view_v13_1.png +++ b/doc/user/project/requirements/img/requirements_archived_list_view_v13_1.png diff --git a/doc/user/project/requirements/img/requirements_list_v13_1.png b/doc/user/project/requirements/img/requirements_list_v13_1.png Binary files differindex 3d2adfac074..0ebda571928 100644 --- a/doc/user/project/requirements/img/requirements_list_v13_1.png +++ b/doc/user/project/requirements/img/requirements_list_v13_1.png diff --git a/doc/user/search/img/filter_approved_by_merge_requests_v13_0.png b/doc/user/search/img/filter_approved_by_merge_requests_v13_0.png Binary files differindex ef4c65aea4b..5020da90297 100644 --- a/doc/user/search/img/filter_approved_by_merge_requests_v13_0.png +++ b/doc/user/search/img/filter_approved_by_merge_requests_v13_0.png diff --git a/lib/gitlab/ci/features.rb b/lib/gitlab/ci/features.rb index 6d433c07abb..f97ee4a4135 100644 --- a/lib/gitlab/ci/features.rb +++ b/lib/gitlab/ci/features.rb @@ -14,10 +14,6 @@ module Gitlab ::Feature.enabled?(:ci_job_heartbeats_runner, project, default_enabled: true) end - def self.pipeline_fixed_notifications? - ::Feature.enabled?(:ci_pipeline_fixed_notifications, default_enabled: true) - end - def self.instance_variables_ui_enabled? ::Feature.enabled?(:ci_instance_variables_ui, default_enabled: true) end diff --git a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb index 6b9af51a6ab..4fbbfdc4914 100644 --- a/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb +++ b/lib/gitlab/database/rename_reserved_paths_migration/v1/rename_namespaces.rb @@ -45,7 +45,7 @@ module Gitlab reverts_for_type('namespace') do |path_before_rename, current_path| matches_path = MigrationClasses::Route.arel_table[:path].matches(current_path) namespace = MigrationClasses::Namespace.joins(:route) - .find_by(matches_path)&.becomes(MigrationClasses::Namespace) + .find_by(matches_path)&.becomes(MigrationClasses::Namespace) # rubocop: disable Cop/AvoidBecomes if namespace perform_rename(namespace, current_path, path_before_rename) diff --git a/lib/gitlab/i18n/html_todo.yml b/lib/gitlab/i18n/html_todo.yml index f7eb7711003..19780991e54 100644 --- a/lib/gitlab/i18n/html_todo.yml +++ b/lib/gitlab/i18n/html_todo.yml @@ -74,68 +74,6 @@ - "< 1 hora" - "< 1 saat" - "< 1 Stunde" -"<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> will add \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\\\"#\\\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.": - plural_id: - translations: - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的議題和留言中加上「來自 <a href=\\\"#\\\">@johnsmith</a>」並將原本分配給 johnsmith@example.com 的所有議題設定 <a href=\\\"#\\\">@johnsmith</a> 為被指派人。" - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com e definirá <a href=\\\"#\\\">@johnsmith</a> como o responsável em todas as issues originalmente atribuídas a johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> は johnsmith@example.com による全ての課題とコメントに \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" を追加します。また、 <a href=\\\"#\\\">@johnsmith</a> を元々 johnsmith@example.com に割り当てられていた全ての課題の担当者として設定します。" - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> aggiungerà \\\"Da <a href=\\\"#\\\">@johnsmith</a>\\\"per tutti gli issue e i commenti creati originariamente da johnsmith@example.com, e imposterà <a href=\\\"#\\\">@johnsmith</a> come assegnatario su tutti gli issue originariamente assegnati a johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 將會把「由 <a href=\\\"#\\\">@johnsmith</a>」加入到原本由 johnsmith@example.com 建立的所有議題和留言中,並將 <a href=\\\"#\\\">@johnsmith</a> 設為原本分配給johnsmith@example.com 所有議題的受讓人。" - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com e definirá <a href=\\\"#\\\">@johnsmith</a> como o responsável de todos os problemas, originalmente, atribuídos a johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 将会把“由<a href=\\\"#\\\">@johnsmith</a>”添加到原本由johnsmith@example.com创建的所有议题和评论中,并将 <a href=\\\"#\\\">@johnsmith</a> 设为原本分配给johnsmith@example.com所有问题的受让人。" - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> додасть \\\"<a href=\\\"#\\\">@johnsmith</a>\\\" до всіх задач та коментарів, що були створені johnsmith@example.com, а також призначить на <a href=\\\"#\\\">@johnsmith</a> усі задачі, які були призначені на на johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> fügt allen von johnsmith@example.com erstellten Tickets und Kommentaren \\\"Von <a href=\\\"#\\\">@johnsmith</a>\\\" hinzu und setzt <a href=\\\"#\\\">@johnsmith</a> als Zuständigen für alle Tickets die ursprünglich johnsmith@example.com zugewiesen waren." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 의견에 \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\"을 추가하고 원래 johnsmith@example.com에 할당된 모든 이슈에 양수인으로 <a href=\\\"#\\\">@ johnsmith</a> 로 설정합니다." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> ajoutera « Par <a href=\\\"#\\\">@johnsmith</a> » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com, et tous les tickets initialement assignés à johnsmith@example.com seront assignés à <a href=\\\"#\\\">@johnsmith</a>." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> añadirá \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todas las incidencias y comentarios creados por johnsmith@example.com, y colocará a <a href=\\\"#\\\">@johnsmith</a> como la persona asiganda a todas las incidencias inicialmente asignadas a johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> добавил \\\"<a href=\\\"#\\\">@johnsmith</a>\\\" ко всем обсуждениям и комментариям, изначально созданным johnsmith@example.com, и установил <a href=\\\"#\\\">@johnsmith</a> в качестве ответственного по всем обсуждениям, на которые изначально был назначен johnsmith@example.com." -"<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> will add \\\"By John Smith\\\" to all issues and comments originally created by johnsmith@example.com.": - plural_id: - translations: - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的跟進事宣和留言中加上「來自 John Smith」。" - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> adicionará \\\"Por John Smith\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> は、johnsmith@example.com によって元々作成された全ての課題とコメントに \\\"By John Smith\\\" を追加します。" - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> aggiungerà \\\"Da John Smith\\\" per tutti i problemi e i commenti creati originariamente da johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 將會把「由 John Smith」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。" - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> adicionará \\\"Por John Smith\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> добавит \\\"От John Smith\\\" ко всем обсуждениям и комментариям, созданным johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 将会把\\\"由John Smith\\\"添加到原本由johnsmith@example.com创建的所有议题和评论中。" - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> додасть \\\"John Smith\\\" до усіх задач та коментарів, які були створені johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> fügt \\\"Von John Smith\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 은 johnsmith@example.com이 처음 생성한 모든 이슈와 주석에 \\\"By John Smith\\\"를 추가합니다." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> ajoutera « Par John Smith » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com." - - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code>añadirá \\\"por John Smith\\\" a todas las incidencias y comentarios creados originalmente por johnsmith@example.com." -"<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> will add \\\"By johnsm...@example.com\\\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy.": - plural_id: - translations: - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的議題和留言中加上「來自 johnsm...@example.com」。電子信箱位址或使用者名稱將受遮蔽,保障用家私隱。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> adicionará \\\"Por johnsm...@example.com\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com. O endereço de e-mail ou nome de usuário é mascarado para garantir a privacidade do usuário." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> は、johnsmith@example.com が作成した全ての課題とコメントに \\\"By johnsm...@example.com\\\" を追加します。このメールアドレスやユーザー名を隠してユーザーのプライバシーを保護されます。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> Aggiungerà \\\"Da johnsm...@example.com\\\"per tutti i problemi e i commenti creati originariamente da johnsmith@example.com. L'indirizzo email o il nome utente sono mascherati per garantire la privacy dell'utente." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 將會把「由 johnsm...@example.com」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。為保護使用者的隱私,電子郵件地址或使用者名稱會被遮住。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> adicionará \\\"Por johnsm...@example.com\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com. O endereço de email ou nome de utilizador é ocultado para garantir a privacidade do utilizador." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> добавит \\\"От johnsm...@example.com\\\" ко всем обсуждениям и комментариям, созданным пользователем johnsmith@example.com. Почтовый адрес и имя пользователя скрываются для обеспечения конфиденциальности." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 将会把\\\"由johnsm...@example.com\\\"添加到原本由johnsmith@example.com创建的所有议题和评论中。 为保护用户的隐私,电子邮件地址或用户名将被屏蔽。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> додасть \\\"johnsm...@example.com\\\" до усіх задач та коментарів, які були створені johnsmith@example.com. Ім’я користувача та його електронна адреса замасковані для забезпечення конфіденційності." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> fügt \\\"Von johnsm...@example.com\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden. Die E-Mail-Adresse oder der Benutzername ist maskiert, um die Privatsphäre des/der Benutzers/Benutzerin zu gewährleisten." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm... @ example.com\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 주석에 \\\"By johnsm... @ example.com\\\"을 추가합니다. 전자 메일 주소 또는 사용자 이름은 사용자의 개인 정보를 보호하기 위해 마스킹 처리됩니다." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> ajoutera « Par johnsm...@example.com » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com. L’adresse de courriel ou le nom d’utilisateur est masqué pour garantir la confidentialité de l’utilisateur." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> añadirá \\\"Por johnsm...@example.com\\\" a todas las incidencias y comentarios originalmente creados por johnsmith@example.com. El correo electrónico o nombre de usuario está oculto para asegurar la privacidad del usuario." -"<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> will add \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address.": - plural_id: - translations: - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com. Por padrão, o endereço de e-mail ou nome de usuário é mascarado para garantir a privacidade do usuário. Use esta opção se você quiser mostrar o endereço de e-mail completo." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> は、johnsmith@example.com が作成した全ての課題とコメントに \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\" を追加します。デフォルトで、メールアドレスやユーザー名を隠してユーザーのプライバシーを保護されます。メールアドレスを全て表示したい場合、この方法を指定してください。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 將會把「由 <a href=\\\"#\\\">@johnsmith</a>」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。為保護使用者的隱私,電子郵件地址或使用者名稱預設會被遮住。如需顯示完整郵件地址,可使用此選項。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com. Por padrão, o endereço de email ou nome de utilizador é ocultado para garantir a privacidade do utilizador. Use esta opção se quiser mostrar o endereço de email completo." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> добавит \\\"От <a href=\\\"#\\\">johnsmith@example.com</a>\\\" ко всем обсуждениям и комментариям, созданным johnsmith@example.com. По умолчанию адрес почты и имя пользователя скрываются для обеспечения конфиденциальности. Используйте эту опцию, если хотите показывать полный адрес электронной почты." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 将会把“由<a href=\\\"#\\\">@johnsmith</a>”添加到原本由johnsmith@example.com创建的所有议题和评论中。 为保护用户的隐私,电子邮件地址或用户名默认将被屏蔽。如需显示完整邮件地址,可使用此选项。" - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> додасть \\\"<a href=\\\"#\\\">johnsmith@example.com</a>\\\" до всіх задач та коментарів, які були створені johnsmith@example.com. За замовчуванням ім’я користувача та його електронна адреса заблоковані для забезпечення конфіденційності. Використовуйте цю опцію, якщо ви хочете показувати електронну адресу повністю." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> fügt \\\"Von <a href=\\\"#\\\">johnsmith@example.com</a>\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden. Standardmäßig wird die E-Mail-Adresse maskiert, um den Datenschutz des Nutzers zu gewährleisten. Nutze diese Option, wenn du die volle E-Mail-Adresse anzeigen willst." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 주석에 \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\"을 추가합니다. 기본적으로 이메일 주소 또는 사용자 이름은 가려져 있어서 사용자의 개인정보를 보호합니다. 전체 전자 메일 주소를 표시하려면 이 옵션을 사용하십시오." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> ajoutera « Par <a href=\\\"#\\\">johnsmith@example.com</a> » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com. Par défaut, l’adresse de courriel ou le nom d’utilisateur est masqué pour garantir la confidentialité de l’utilisateur. Utilisez cette option si vous souhaitez afficher l’adresse de courriel complète." - - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> añadirá \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todas las incidencias y comentarios originalmente creados por johnsmith@example.com. Por defecto, el correo electrónico o el nombre de usuario está oculto para asegurar la privacidad del usuario. Utilice esta opción si desea mostrar la dirección de correo electrónico completa." "<strong>%{label_name}</strong> <span>will be permanently deleted from %{subject_name}. This cannot be undone.</span>": plural_id: translations: @@ -219,31 +157,6 @@ - "변경 사항은 <b>source</b> 리비전이 <b>target</b> 리비전에 머지된 것처럼 표시됩니다." - "Les modifications sont affichées comme si la révision <b>source</b> était fusionnée dans la révision<b>cible</b>." - "Los cambios se muestran como si la revisión del <b>origen</b> se ha fusionado con la revisión del <b>objetivo</b>." -"Choose <strong>Create archive</strong> and wait for archiving to complete.": - plural_id: - translations: - - "Escolha <strong>Criar arquivo</strong> e aguarde até que o arquivamento seja concluído." - - "<strong>アーカイブの作成</strong>を選択し、アーカイブ作成の完了をお待ちください。" - - "Escolhe <strong>Criar arquivo</strong> e aguarda até que o arquivamento seja concluído." - - "选择<strong>创建归档</strong> 并等待归档过程完成。" - - "Оберіть <strong>Створити архів</strong> і чекайте, поки архівування буде завершено." - - "Wähle <strong>Archiv erstellen</strong> und warte, bis die Archivierung abgeschlossen ist." - - "<strong>보관 파일 생성</strong>을 선택하고 보관이 완료 될 때까지 기다립니다." - - "Sélectionnez <strong>Créer une archive</strong> et attendez que l’archivage soit terminé." - - "Elija <strong>Crear archivo</strong> y espere a que se complete el archivo." -"Choose <strong>Next</strong> at the bottom of the page.": - plural_id: - translations: - - "Escolha <strong>Próximo</strong> na parte inferior da página." - - "このページの下部にある<strong>次へ</strong>を選択してください。" - - "Escolhe <strong>Próximo</strong> na parte inferior da página." - - "选择页面底部的<strong>下一步</strong>。" - - "Оберіть <strong>Далі</strong> внизу сторінки." - - "Wähle <strong>Nächste</strong> unten auf der Seite." - - "페이지의 아래의 <strong>다음</strong> 선택" - - "Cliquez sur <strong>Suivant</strong> au bas de la page." - - "Elija <strong>Siguiente</strong> en la parte inferior de la página." - - "Sayfanın altındaki <strong>Sonraki</strong> düğmesini seçin." "Choose between <code>clone</code> or <code>fetch</code> to get the recent application code": plural_id: translations: @@ -257,31 +170,6 @@ - "Choisissez entre <code>clone</code> ou <code>fetch</code> pour obtenir les dernières modifications du code de l’application" - "Elija entre <code>clone</code> o <code>fetch</code> para obtener el código de la aplicación más reciente" - "Wybierz pomiędzy <code>klonem</code> lub <code>pobierz</code> aby uzyskać najnowszy kod aplikacji" -"Click the <strong>Download</strong> button and wait for downloading to complete.": - plural_id: - translations: - - "Clique no botão <strong>Baixar</strong> e aguarde a conclusão do download." - - "<strong>ダウンロード</strong> ボタンをクリックし、ダウンロードの完了をお待ちください。" - - "Clica no botão <strong>Transferir</strong> e aguarda a finalização do mesmo." - - "点击 <strong>下载</strong> 按钮,等待下载完成。" - - "Натисніть кнопку <strong>Завантаження</strong> і зачекайте поки завантаження не завершиться." - - "Klicke auf den <strong>Download</strong>-Button und warte bis das Herunterladen abgeschlossen ist." - - "<strong>다운로드</strong> 버튼을 클릭하고 다운로드가 완료 될 때까지 기다려 주세요." - - "Cliquez sur le bouton <strong>Télécharger</strong> et attendez que le téléchargement soit terminé." - - "Haga click en el botón <strong>Descargar</strong> y espere a que se complete la descarga." - - "<strong>İndirme</strong> düğmesini tıklayın ve indirme işleminin tamamlanmasını bekleyin." -"Click the <strong>Select none</strong> button on the right, since we only need \\\"Google Code Project Hosting\\\".": - plural_id: - translations: - - "Clique no botão à direita <strong>Selecionar nenhum</strong>, uma vez que só precisamos do \\\"Google Code Project Hosting\\\"." - - "右の<strong>Select none</strong>ボタンをクリックしてください。これは、GitLabに必要なのは\\\"Google Code Project Hosting\\\"だけだからです。" - - "Clica no botão <strong>Selecionar nenhum</strong> à direita, pois, só precisamos de \\\"Google Code Project Hosting\\\"." - - "请点击右边的 <strong>无</strong> 按钮,因为我们只需要“Google Code项目托管”。" - - "Натисніть кнопку <strong>Обрати нічого</strong> справа, оскільки нам потрібен лише \\\"Хостинг проектів Google Code\\\"." - - "Klicke auf die Schaltfläche <strong>Keine auswählen</strong> auf der rechten Seite, da wir nur \\\"Google Code Project Hosting\\\" benötigen." - - "오른쪽의 <strong>선택 없음</strong> 버튼을 클릭 하십시오. 우리는 \\\"\\\"Google Code Project Hosting\\\" 만 사용하기 때문에 다른 것은 필요 없습니다. " - - "Cliquez sur le bouton <strong>Sélectionner aucun</strong> sur la droite, puisque nous n’avons seulement besoin que de « Google Code Project Hosting »." - - "Haga click en el botón <strong>Seleccionar uno</strong> en la parte derecha, ya que sólo necesitamos \\\"Google Code Project Hosting\\\"." "ClusterIntegration| This will permanently delete the following resources: <ul> <li>All installed applications and related resources</li> <li>The <code>gitlab-managed-apps</code> namespace</li> <li>Any project namespaces</li> <li><code>clusterroles</code></li> <li><code>clusterrolebindings</code></li> </ul>": plural_id: translations: @@ -334,13 +222,6 @@ - "Contributions du <strong>%{calendar_date}</strong>" - "Contribuciones para <strong>%{calendar_date}</strong>" - "<strong>%{calendar_date}</strong> için katkılar" -"Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import.": - plural_id: - translations: - - "GitHub の%{link_start}Personal Access Token%{link_end} を作成して、提供してください。<code>repo</code> スコープを選択する必要があります。これによりインポートできる公開または非公開リポジトリの一覧を表示できます。" - - "请创建并提供您的GitHub%{link_start}个人访问令牌%{link_end}。您需要选择<code>repo</code>范围,这样我们才可以显示可导入的公共和私有仓库的列表。" - - "Створіть або вкажіть ваш %{link_start}Персональний токен доступу%{link_end} GitHub. Вам необхідно буде вибрати область дії <code>repo</code> для того, щоб ми змогли відобразити список ваших публічних та приватних репозиторіїв, доступних для імпорту." - - "Cree y proporcione su %{link_start}token de acceso personal %{link_end}de GitHub. Necesitará seleccionar el alcance del <code>repositorio</code>, para que podamos mostrar una lista de sus repositorios públicos y privados que estén disponibles para importar." "Define environments in the deploy stage(s) in <code>.gitlab-ci.yml</code> to track deployments here.": plural_id: translations: @@ -384,16 +265,6 @@ - "Fülle die Felder unten aus, schalte <strong>%{enable_label}</strong> an, und drücke <strong>%{save_changes}</strong>" - "Renseignez les champs ci‐dessous, activez <strong>%{enable_label}</strong> et appuyez sur <strong>%{save_changes}</strong>" - "Rellene los siguientes campos, active <strong>%{enable_label}</strong>y presione <strong>%{save_changes}</strong>" -"Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file.": - plural_id: - translations: - - "Encontre o arquivo recém-extraído <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." - - "新しく抽出された <code>テイクアウト/ Googleコードプロジェクトホスティング/ GoogleCodeProjectHosting.json</code> ファイルを探します。" - - "查找新提取的 <code>Takeout/Google Code项目托管/GoogleCodeProjectHosting. json</code> 文件。" - - "Знайдіть щойно розпакований <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> файл." - - "Suche die neu extrahierte Datei <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." - - "Cherchez le fichier <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> fraîchement extrait." - - "Busque el archivo extraído <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." "Finish setting up your dedicated account for <strong>%{group_name}</strong>.": plural_id: translations: @@ -557,26 +428,6 @@ - "SSH主机密钥在此系统上不可用。请使用<code>ssh-keyscan</code>命令或与您的GitLab管理员联系以获取更多信息。" - "SSH-ключі хоста не доступні в цій системі. Будь ласка, використовуйте команду <code>ssh-keyscan</code> або зверніться до вашого адміністратора GitLab для додаткової інформації." - "Las claves SSH del host no se encuentran disponibles en este sistema. Utilice el comando <code>ssh-keyscan</code> o póngase en contacto con su administrador de GitLab para obtener más información." -"Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right.": - plural_id: - translations: - - "Role para baixo até <strong>Google Code Project Hosting</strong> e ative a opção à direita." - - "<strong>Google Code Project Hosting</strong> にスクロールし、右側のスイッチを有効にします。" - - "向下滚动到 <strong>Google Code项目托管</strong> 并通过右侧的开关启用。" - - "Прокрутіть вниз до <strong>Google Code Project Hosting</strong> і увімкніть перемикач праворуч." - - "Scrolle nach unten zu <strong>Google Code Project Hosting</strong> und aktiviere den Schalter auf der rechten Seite." - - "Faites défiler jusqu’à <strong>Hébergement de projet Google Code</strong> et activez le commutateur sur la droite." - - "Desplácese hasta <strong>Google Code Project</strong> y active el selector de la derecha." -"Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\"). It will also associate and/or assign these issues and comments with the selected user.": - plural_id: - translations: - - "A seleção de um usuário do GitLab adicionará um link para o usuário do GitLab nas descrições de issues e comentários (por exemplo, \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\"). Isto também associará e/ou atribuirá esses issues e comentários ao usuário selecionado." - - "GitLab ユーザーを選択すると、GitLab ユーザーへのリンクが課題やコメントの説明に追加されます (例:\\\"By <a href=\\\"#\\\">@johnsmith</a>\\\")。また、これらの課題やコメントを選択したユーザーに関連付けや割り当てができます。" - - "选中GitLab用户将在议题和评论的描述中加入指向该GitLab用户的链接(例如“By <a href=\\\"#\\\">@johnsmith</a>”)。它还将与所选用户关联和/或分配这些议题和评论。" - - "При виборі користувача Gitlab посилання на нього буде додане до опису задачі та коментарів (напр. \\\"<a href=\\\"#\\\"> @johnsmith</a>\\\"). Також це призведе до асоціації та/або призначення цих задач та коментарів на вибраного користувача." - - "Wenn du eine(n) GitLab-Benutzer(in) azswählst, wird in der Beschreibung des Tickets und den Kommentaren ein Link zum/zur Benutzer(in) hinzugefügt (z. B. \\\"Von <a href=\\\"#\\\">@johnsmith</a>\\\"). Außerdem wird der/die ausgewählte Benutzer(in) dem Ticket oder Kommentar zugeordnet und/oder es ihm/ihr zugewiesen." - - "La sélection d’un utilisateur de GitLab va ajouter un lien vers cet utilisateur dans les descriptions des tickets et des commentaires (p. ex., « Par <a href=\\\"#\\\">@johnsmith</a> »). Les tickets et commentaires seront également associés ou assignés à cet utilisateur." - - "Al seleccionar un usuario de GitLab añadirá un link al usuario en la descripción de las incidencias, así como también, en los comentarios (por ejemplo, \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\"). Al hacer esto, también asociará y asignará dichas incidencias y comentarios con el usuario seleccionado." "Share the <strong>%{sso_label}</strong> with members so they can sign in to your group through your identity provider": plural_id: translations: @@ -618,14 +469,6 @@ plural_id: translations: - "Acelere sus DevOps<br>con GitLab" -"The CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment.": - plural_id: - translations: - - "CSVエクスポートをバックグラウンドで作成します。終了後に、<strong>%{email}</strong> に添付してメールで送信されます。" - - "Экспорт в CSV будет произведён в фоновом режиме. По завершении результат будет отправлен на <strong>%{email}</strong> во вложении." - - "CSV导出将在后台创建。完成后,它将以附件形式发送到<strong>%{email}</strong>。" - - "Експорт CSV буде створено у фоновому режимі. Після завершення його буде надіслано на <strong>%{email}</strong> у вкладенні." - - "La exportación CSV se creará en segundo plano. Una vez finalizada, será enviada a <strong>%{email}</strong> como un fichero adjunto al correo electrónico." "The Git LFS objects will <strong>not</strong> be synced.": plural_id: translations: @@ -645,18 +488,6 @@ - "CI配置文件的路径。默认为<code>.gitlab-ci.yml</code>" - "Шлях до кофігураційного файлу CI. За замовчуванням <code>.gitlab-ci.yml</code>" - "La ruta al archivo de configuración CI. Por defecto <code>.gitlab-ci.yml</code>" -"The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.": - plural_id: - translations: - - "O repositório deve ser acessível por <code>http://</code>, <code>https://</code> ou <code>git://</code>." - - "リポジトリには、<code>http://</code>、 <code>https://</code> または <code>git://</code>で接続できなければなりません。" - - "Репозиторий должен быть доступен через протоколы <code>http: //</code>, <code>https: //</code> или <code>git: //</code>." - - "该仓库必须可通过<code>http://</code>, <code>https://</code> 或 <code>git://</code>进行访问。" - - "Репозиторій має бути доступним через <code>http://</code>, <code>https://</code> або <code>git://</code>." - - "Das Repository muss über <code>http://</code>, <code>https://</code> oder <code>git://</code> erreichbar sein." - - "저장소를 <code>http://</code>, <code>https://</code> 또는 <code>git://</code> 통해 액세스할 수 있어야 합니다." - - "Le dépôt doit être accessible via <code>http://</code>, <code>https://</code> ou <code>git://</code>." - - "El repositorio debe ser accesible a través de <code>http://</code>, <code>https://</code> o <code>git://</code>." "The repository must be accessible over <code>http://</code>, <code>https://</code>, <code>ssh://</code> or <code>git://</code>.": plural_id: translations: @@ -665,17 +496,6 @@ - "该仓库必须可通过 <code>http://</code>,<code>https://</code>,<code>ssh://</code> 或 <code>git://</code>进行访问。" - "Репозиторій має бути доступним через <code>http://</code>, <code>https://</code>, <code>ssh://</code> or <code>git://</code>." - "El repositorio debe ser accesible a través de <code>http://</code>, <code>https://</code>, <code>ssh://</code> y <code>git://</code>." -"The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.": - plural_id: - translations: - - "O mapa do usuário é um documento JSON que mapeia os usuários do Google Code que participaram de seus projetos para a maneira como seus endereços de e-mail e nomes de usuários são importados para o GitLab. Você pode mudar isso alterando o valor no lado direito de <code>:</code>. Certifique-se de preservar as aspas duplas adjacentes, outros sinais de pontuação e o endereço de e-mail ou nome de usuário no lado esquerdo." - - "ユーザーマップは、あなたのプロジェクトに参加した Google コードのユーザーのメールアドレスとユーザー名を GitLab にインポートするときにマッピングする JSON ファイルです。これを変更するには、 <code>:</code> の右側の値を変更します。左側の二重引用符、その他の句読点、メールアドレスまたはユーザー名が保存されます。" - - "用户映射是一个JSON文档,将参与项目的Google Code用户映射到他们将导入GitLab的电子邮件地址和用户名的方式。您可以通过更改 <code>:</code>右侧的值来更改此值。请务必在左侧保留周围的双引号,其他标点符号以及电子邮件地址或用户名。" - - "Мапа користувачів — це JSON-документ, який задає як адреси електронної пошти та імена користувачів Google Code, що приймали участь у ваших проектах будуть імпортовані у GitLab. Ви можете змінити його шляхом зміни значень, що стоять справа від <code>:</code>. Не видаляйте лапки та інші знаки пунктуації, а також не змінюйте адреси електронної пошти чи імена користувачів зліва." - - "Die Benutzerzuordnung ist ein JSON-Dokument das festlegt, wie die E-Mail-Adressen und Benutzernamen der Google Code-Benutzer(innen), die an deinem Projekt teilnehmen, in GitLab importiert werden. Du kannst dies ändern, indem du den Wert auf der rechten Seite von <code>:</code> anpasst. Stelle sicher, dass du umgebenden Anführungszeichen, andere Interpunktion sowie die E-Mail-Adresse oder den Benutzernamen auf der linken Seite erhältst." - - "La carte des utilisateurs (<code>user map</code>) est un document JSON qui met en correspondance les utilisateurs de Google Code qui ont participé à vos projets en précisant la manière dont leurs adresses de courriel et leurs noms d’utilisateur sont importés dans GitLab. Vous pouvez y apporter des modifications en changeant la valeur à droite du « <code>:</code> ». Assurez‐vous de conserver les guillemets droits doubles (<code>\\\"</code>), les autres signes de ponctuation, ainsi que l’adresse de courriel ou le nom d’utilisateur à gauche du deux‐points." - - "El mapa del usuarios es un documento JSON que asigna los usuarios de Google Code que participaron en sus proyectos a la forma en que se importarán sus direcciones de correo electrónico y nombres de usuario en GitLab. Puede cambiar esto cambiando el valor en el lado derecho de <code>:</code>. Asegúrese de conservar las comillas dobles circundantes, otros signos de puntuación y la dirección de correo electrónico o nombre de usuario en el lado izquierdo." - - "Mapa użytkownika to dokument JSON mapujący użytkowników Google Code, którzy uczestniczyli w Twoich projektach, w celu zaimportowania ich adresów e-mail i nazw użytkowników do GitLab. Możesz to zmienić poprzez zmianę wartości po prawej stronie <code>:</code>. Pamiętaj, aby zachować występujące podwójne cudzysłowy, inną interpunkcję i adres e-mail lub nazwę użytkownika po lewej stronie." "This %{issuable} is locked. Only <strong>project members</strong> can comment.": plural_id: translations: @@ -736,17 +556,6 @@ "This project will live in your group <strong>%{namespace}</strong>. A project is where you house your files (repository), plan your work (issues), publish your documentation (wiki), and so much more.": plural_id: translations: -"To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect.": - plural_id: - translations: - - "Para conectar repositórios do GitHub, você pode usar um %{personal_access_token_link}. Ao criar seu Token de Acesso Pessoal, você precisará selecionar o escopo do <code>repositório</code>, então podemos exibir uma lista de seus repositórios públicos e privados que estão disponíveis para conexão." - - "GitHub リポジトリに接続するために %{personal_access_token_link} を使用できます。個人用アクセストークンを作成するには<code>リポジトリ</code> スコープを選択する必要があります。これにより接続できる公開・非公開リポジトリの一覧を表示することができます。" - - "可以使用 %{personal_access_token_link} 连接GitHub仓库。当创建个人访问令牌时,需要选择 <code>repo</code> 范围,以显示可供连接的公开和私有的仓库列表。" - - "Для підключення репозиторіїв з GitHub, ви можете використовувати %{personal_access_token_link}. Коли ви створюватимете ваш персональний токен доступу, вам потрібно буде вибрати область дії <code>repo</code>, щоб ми могли відобразити список ваших публічних та приватних репозиторіїв, доступних для підключення." - - "Um GitHub-Repositories zu verbinden kannst du einen %{personal_access_token_link} verwenden. Wenn du deinen persönlichen Access-Token erzeugst, musst du den Gültigkeitsbereich <code>repo</code> auswählen, damit wir eine Liste deiner öffentlichen und privaten Repositories anzeigen können, die für die Verbindung verfügbar sind." - - "GitHub 저장소 연결할때, %{personal_access_token_link}을 사용할 수 있습니다. 개인 엑세스 토큰을 생성할때 <code>repo</code> scope를 선택해야 연결에 사용할 수 있는 공개, 비공개 저장소가 표시되어 연결할 수 있게 됩니다." - - "Pour connecter des dépôts GitHub, vous pouvez utiliser un %{personal_access_token_link}. Lorsque vous créerez votre jeton d’accès, vous devrez sélectionner la portée <code>dépôt</code>, afin de permettre l’affichage d’une liste de vos dépôts publics et privés disponibles à la connexion." - - "Para conectar a los repositorios de GitHub, puede utilizar un %{personal_access_token_link}. Cuando cree su token de acceso personal, deberá seleccionar el alcance del <code>repo</code>, para que podamos mostrarle una lista de sus repositorios públicos y privados que están disponibles para conectarse." "To only use CI/CD features for an external repository, choose <strong>CI/CD for external repo</strong>.": plural_id: translations: @@ -777,17 +586,6 @@ - "%{issuableDisplayName}(을)를 잠금해제 하시겠습니까? <strong>모두가</strong> 코멘트 할 수 있게 됩니다." - "Déverrouiller %{issuableDisplayName} ? <strong>Tout le monde</strong> sera en mesure de commenter." - "Desbloquear este %{issuableDisplayName}? <strong>Todos</strong> podrán comentar." -"Upload <code>GoogleCodeProjectHosting.json</code> here:": - plural_id: - translations: - - "Envie o <code>GoogleCodeProjectHosting.json</code> aqui:" - - "<code>GoogleCodeProjectHosting.json</code> をアップロードします:" - - "Enviar <code>GoogleCodeProjectHosting.json</code> aqui:" - - "在这里上传 <code>GoogleCodeProjectHosting.json</code>:" - - "Надіслати <code>GoogleCodeProjectHosting.json</code> тут:" - - "Lade <code>GoogleCodeProjectHosting.json</code> hier hoch:" - - "Téléversez le fichier <code>GoogleCodeProjectHosting.json</code> ici :" - - "Subir el fichero <code>GoogleCodeProjectHosting.json</code> aquí:" "Upon performing this action, the contents of this group, its subgroup and projects will be permanently removed after %{deletion_adjourned_period} days on <strong>%{date}</strong>. Until that time:": plural_id: translations: @@ -814,14 +612,6 @@ - "Добро пожаловать в GitLab.com<br>@%{name}!" - "Ласкаво просимо до GitLab.com<br>@%{name}!" - "¡Bienvenido a GitLab.com<br>@%{name}!" -"When using the <code>http://</code> or <code>https://</code> protocols, please provide the exact URL to the repository. HTTP redirects will not be followed.": - plural_id: - translations: - - "<code>http://</code> または <code>https://</code> プロトコルを使用する場合、リポジトリの正確なURLを指定してください。 HTTPリダイレクトは追跡されません。" - - "Используя <code>http://</code> или <code>https://</code> протокол, пожалуйста указывайте точный адрес репозитория. Переадресация выполняться не будет." - - "使用<code>http://</code>或<code>https://</code>协议时,请提供仓库的实际地址。不支持HTTP重定向。" - - "При використанні протоколів <code>http://</code> або <code>https://</code> вказуйте, будь ласка, точну URL-адресу репозиторію. Перенаправлення HTTP не будуть виконуватися." - - "Al utilizar los protocolos <code>http://</code> o <code>https://</code>, por favor, proporcione la URL exacta del repositorio. No se seguirán las redirecciones HTTP." "WikiMarkdownTip|To link to a (new) page, simply type <code class=\\\"js-markup-link-example\\\">%{link_example}</code>": plural_id: translations: @@ -1053,3 +843,213 @@ "Your license will be included in your GitLab backup and will survive upgrades, so in normal usage you should never need to re-upload your <code>.gitlab-license</code> file.": plural_id: translations: +"<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> will add \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\\\"#\\\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com.": + plural_id: + translations: + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的議題和留言中加上「來自 <a href=\\\"#\\\">@johnsmith</a>」並將原本分配給 johnsmith@example.com 的所有議題設定 <a href=\\\"#\\\">@johnsmith</a> 為被指派人。" + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com e definirá <a href=\\\"#\\\">@johnsmith</a> como o responsável em todas as issues originalmente atribuídas a johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> は johnsmith@example.com による全ての課題とコメントに \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\" を追加します。また、 <a href=\\\"#\\\">@johnsmith</a> を元々 johnsmith@example.com に割り当てられていた全ての課題の担当者として設定します。" + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> aggiungerà \\\"Da <a href=\\\"#\\\">@johnsmith</a>\\\"per tutti gli issue e i commenti creati originariamente da johnsmith@example.com, e imposterà <a href=\\\"#\\\">@johnsmith</a> come assegnatario su tutti gli issue originariamente assegnati a johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 將會把「由 <a href=\\\"#\\\">@johnsmith</a>」加入到原本由 johnsmith@example.com 建立的所有議題和留言中,並將 <a href=\\\"#\\\">@johnsmith</a> 設為原本分配給johnsmith@example.com 所有議題的受讓人。" + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com e definirá <a href=\\\"#\\\">@johnsmith</a> como o responsável de todos os problemas, originalmente, atribuídos a johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 将会把“由<a href=\\\"#\\\">@johnsmith</a>”添加到原本由johnsmith@example.com创建的所有议题和评论中,并将 <a href=\\\"#\\\">@johnsmith</a> 设为原本分配给johnsmith@example.com所有问题的受让人。" + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> додасть \\\"<a href=\\\"#\\\">@johnsmith</a>\\\" до всіх задач та коментарів, що були створені johnsmith@example.com, а також призначить на <a href=\\\"#\\\">@johnsmith</a> усі задачі, які були призначені на на johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> fügt allen von johnsmith@example.com erstellten Tickets und Kommentaren \\\"Von <a href=\\\"#\\\">@johnsmith</a>\\\" hinzu und setzt <a href=\\\"#\\\">@johnsmith</a> als Zuständigen für alle Tickets die ursprünglich johnsmith@example.com zugewiesen waren." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 의견에 \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\"을 추가하고 원래 johnsmith@example.com에 할당된 모든 이슈에 양수인으로 <a href=\\\"#\\\">@ johnsmith</a> 로 설정합니다." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> ajoutera « Par <a href=\\\"#\\\">@johnsmith</a> » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com, et tous les tickets initialement assignés à johnsmith@example.com seront assignés à <a href=\\\"#\\\">@johnsmith</a>." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> añadirá \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\" a todas las incidencias y comentarios creados por johnsmith@example.com, y colocará a <a href=\\\"#\\\">@johnsmith</a> como la persona asiganda a todas las incidencias inicialmente asignadas a johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"@johnsmith\\\"</code> добавил \\\"<a href=\\\"#\\\">@johnsmith</a>\\\" ко всем обсуждениям и комментариям, изначально созданным johnsmith@example.com, и установил <a href=\\\"#\\\">@johnsmith</a> в качестве ответственного по всем обсуждениям, на которые изначально был назначен johnsmith@example.com." +"<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> will add \\\"By John Smith\\\" to all issues and comments originally created by johnsmith@example.com.": + plural_id: + translations: + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的跟進事宣和留言中加上「來自 John Smith」。" + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> adicionará \\\"Por John Smith\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> は、johnsmith@example.com によって元々作成された全ての課題とコメントに \\\"By John Smith\\\" を追加します。" + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> aggiungerà \\\"Da John Smith\\\" per tutti i problemi e i commenti creati originariamente da johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 將會把「由 John Smith」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。" + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> adicionará \\\"Por John Smith\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> добавит \\\"От John Smith\\\" ко всем обсуждениям и комментариям, созданным johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 将会把\\\"由John Smith\\\"添加到原本由johnsmith@example.com创建的所有议题和评论中。" + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> додасть \\\"John Smith\\\" до усіх задач та коментарів, які були створені johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> fügt \\\"Von John Smith\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> 은 johnsmith@example.com이 처음 생성한 모든 이슈와 주석에 \\\"By John Smith\\\"를 추가합니다." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code> ajoutera « Par John Smith » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com." + - "<code>\\\"johnsmith@example.com\\\": \\\"John Smith\\\"</code>añadirá \\\"por John Smith\\\" a todas las incidencias y comentarios creados originalmente por johnsmith@example.com." +"<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> will add \\\"By johnsm...@example.com\\\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy.": + plural_id: + translations: + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 將會在所有原本由 johnsmith@example.com 建立的議題和留言中加上「來自 johnsm...@example.com」。電子信箱位址或使用者名稱將受遮蔽,保障用家私隱。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> adicionará \\\"Por johnsm...@example.com\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com. O endereço de e-mail ou nome de usuário é mascarado para garantir a privacidade do usuário." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> は、johnsmith@example.com が作成した全ての課題とコメントに \\\"By johnsm...@example.com\\\" を追加します。このメールアドレスやユーザー名を隠してユーザーのプライバシーを保護されます。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> Aggiungerà \\\"Da johnsm...@example.com\\\"per tutti i problemi e i commenti creati originariamente da johnsmith@example.com. L'indirizzo email o il nome utente sono mascherati per garantire la privacy dell'utente." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 將會把「由 johnsm...@example.com」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。為保護使用者的隱私,電子郵件地址或使用者名稱會被遮住。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> adicionará \\\"Por johnsm...@example.com\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com. O endereço de email ou nome de utilizador é ocultado para garantir a privacidade do utilizador." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> добавит \\\"От johnsm...@example.com\\\" ко всем обсуждениям и комментариям, созданным пользователем johnsmith@example.com. Почтовый адрес и имя пользователя скрываются для обеспечения конфиденциальности." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> 将会把\\\"由johnsm...@example.com\\\"添加到原本由johnsmith@example.com创建的所有议题和评论中。 为保护用户的隐私,电子邮件地址或用户名将被屏蔽。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> додасть \\\"johnsm...@example.com\\\" до усіх задач та коментарів, які були створені johnsmith@example.com. Ім’я користувача та його електронна адреса замасковані для забезпечення конфіденційності." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> fügt \\\"Von johnsm...@example.com\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden. Die E-Mail-Adresse oder der Benutzername ist maskiert, um die Privatsphäre des/der Benutzers/Benutzerin zu gewährleisten." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm... @ example.com\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 주석에 \\\"By johnsm... @ example.com\\\"을 추가합니다. 전자 메일 주소 또는 사용자 이름은 사용자의 개인 정보를 보호하기 위해 마스킹 처리됩니다." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> ajoutera « Par johnsm...@example.com » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com. L’adresse de courriel ou le nom d’utilisateur est masqué pour garantir la confidentialité de l’utilisateur." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsm...@example.com\\\"</code> añadirá \\\"Por johnsm...@example.com\\\" a todas las incidencias y comentarios originalmente creados por johnsmith@example.com. El correo electrónico o nombre de usuario está oculto para asegurar la privacidad del usuario." +"<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> will add \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address.": + plural_id: + translations: + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todas as issues e comentários originalmente criados por johnsmith@example.com. Por padrão, o endereço de e-mail ou nome de usuário é mascarado para garantir a privacidade do usuário. Use esta opção se você quiser mostrar o endereço de e-mail completo." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> は、johnsmith@example.com が作成した全ての課題とコメントに \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\" を追加します。デフォルトで、メールアドレスやユーザー名を隠してユーザーのプライバシーを保護されます。メールアドレスを全て表示したい場合、この方法を指定してください。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 將會把「由 <a href=\\\"#\\\">@johnsmith</a>」加入到原本由 johnsmith@example.com 建立的所有議題和留言中。為保護使用者的隱私,電子郵件地址或使用者名稱預設會被遮住。如需顯示完整郵件地址,可使用此選項。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> adicionará \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todos os problemas e comentários, originalmente, criados por johnsmith@example.com. Por padrão, o endereço de email ou nome de utilizador é ocultado para garantir a privacidade do utilizador. Use esta opção se quiser mostrar o endereço de email completo." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> добавит \\\"От <a href=\\\"#\\\">johnsmith@example.com</a>\\\" ко всем обсуждениям и комментариям, созданным johnsmith@example.com. По умолчанию адрес почты и имя пользователя скрываются для обеспечения конфиденциальности. Используйте эту опцию, если хотите показывать полный адрес электронной почты." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 将会把“由<a href=\\\"#\\\">@johnsmith</a>”添加到原本由johnsmith@example.com创建的所有议题和评论中。 为保护用户的隐私,电子邮件地址或用户名默认将被屏蔽。如需显示完整邮件地址,可使用此选项。" + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> додасть \\\"<a href=\\\"#\\\">johnsmith@example.com</a>\\\" до всіх задач та коментарів, які були створені johnsmith@example.com. За замовчуванням ім’я користувача та його електронна адреса заблоковані для забезпечення конфіденційності. Використовуйте цю опцію, якщо ви хочете показувати електронну адресу повністю." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> fügt \\\"Von <a href=\\\"#\\\">johnsmith@example.com</a>\\\" zu allen Tickets und Kommentaren hinzu, die ursprünglich von johnsmith@example.com erstellt wurden. Standardmäßig wird die E-Mail-Adresse maskiert, um den Datenschutz des Nutzers zu gewährleisten. Nutze diese Option, wenn du die volle E-Mail-Adresse anzeigen willst." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> 은 원래 johnsmith@example.com이 생성한 모든 이슈와 주석에 \\\"By <a href=\\\"#\\\">johnsmith@example.com</a>\\\"을 추가합니다. 기본적으로 이메일 주소 또는 사용자 이름은 가려져 있어서 사용자의 개인정보를 보호합니다. 전체 전자 메일 주소를 표시하려면 이 옵션을 사용하십시오." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> ajoutera « Par <a href=\\\"#\\\">johnsmith@example.com</a> » à tous les tickets et commentaires créés à l’origine par johnsmith@example.com. Par défaut, l’adresse de courriel ou le nom d’utilisateur est masqué pour garantir la confidentialité de l’utilisateur. Utilisez cette option si vous souhaitez afficher l’adresse de courriel complète." + - "<code>\\\"johnsmith@example.com\\\": \\\"johnsmith@example.com\\\"</code> añadirá \\\"Por <a href=\\\"#\\\">johnsmith@example.com</a>\\\" a todas las incidencias y comentarios originalmente creados por johnsmith@example.com. Por defecto, el correo electrónico o el nombre de usuario está oculto para asegurar la privacidad del usuario. Utilice esta opción si desea mostrar la dirección de correo electrónico completa." +"Choose <strong>Create archive</strong> and wait for archiving to complete.": + plural_id: + translations: + - "Escolha <strong>Criar arquivo</strong> e aguarde até que o arquivamento seja concluído." + - "<strong>アーカイブの作成</strong>を選択し、アーカイブ作成の完了をお待ちください。" + - "Escolhe <strong>Criar arquivo</strong> e aguarda até que o arquivamento seja concluído." + - "选择<strong>创建归档</strong> 并等待归档过程完成。" + - "Оберіть <strong>Створити архів</strong> і чекайте, поки архівування буде завершено." + - "Wähle <strong>Archiv erstellen</strong> und warte, bis die Archivierung abgeschlossen ist." + - "<strong>보관 파일 생성</strong>을 선택하고 보관이 완료 될 때까지 기다립니다." + - "Sélectionnez <strong>Créer une archive</strong> et attendez que l’archivage soit terminé." + - "Elija <strong>Crear archivo</strong> y espere a que se complete el archivo." +"Choose <strong>Next</strong> at the bottom of the page.": + plural_id: + translations: + - "Escolha <strong>Próximo</strong> na parte inferior da página." + - "このページの下部にある<strong>次へ</strong>を選択してください。" + - "Escolhe <strong>Próximo</strong> na parte inferior da página." + - "选择页面底部的<strong>下一步</strong>。" + - "Оберіть <strong>Далі</strong> внизу сторінки." + - "Wähle <strong>Nächste</strong> unten auf der Seite." + - "페이지의 아래의 <strong>다음</strong> 선택" + - "Cliquez sur <strong>Suivant</strong> au bas de la page." + - "Elija <strong>Siguiente</strong> en la parte inferior de la página." + - "Sayfanın altındaki <strong>Sonraki</strong> düğmesini seçin." +"Click the <strong>Download</strong> button and wait for downloading to complete.": + plural_id: + translations: + - "Clique no botão <strong>Baixar</strong> e aguarde a conclusão do download." + - "<strong>ダウンロード</strong> ボタンをクリックし、ダウンロードの完了をお待ちください。" + - "Clica no botão <strong>Transferir</strong> e aguarda a finalização do mesmo." + - "点击 <strong>下载</strong> 按钮,等待下载完成。" + - "Натисніть кнопку <strong>Завантаження</strong> і зачекайте поки завантаження не завершиться." + - "Klicke auf den <strong>Download</strong>-Button und warte bis das Herunterladen abgeschlossen ist." + - "<strong>다운로드</strong> 버튼을 클릭하고 다운로드가 완료 될 때까지 기다려 주세요." + - "Cliquez sur le bouton <strong>Télécharger</strong> et attendez que le téléchargement soit terminé." + - "Haga click en el botón <strong>Descargar</strong> y espere a que se complete la descarga." + - "<strong>İndirme</strong> düğmesini tıklayın ve indirme işleminin tamamlanmasını bekleyin." +"Click the <strong>Select none</strong> button on the right, since we only need \\\"Google Code Project Hosting\\\".": + plural_id: + translations: + - "Clique no botão à direita <strong>Selecionar nenhum</strong>, uma vez que só precisamos do \\\"Google Code Project Hosting\\\"." + - "右の<strong>Select none</strong>ボタンをクリックしてください。これは、GitLabに必要なのは\\\"Google Code Project Hosting\\\"だけだからです。" + - "Clica no botão <strong>Selecionar nenhum</strong> à direita, pois, só precisamos de \\\"Google Code Project Hosting\\\"." + - "请点击右边的 <strong>无</strong> 按钮,因为我们只需要“Google Code项目托管”。" + - "Натисніть кнопку <strong>Обрати нічого</strong> справа, оскільки нам потрібен лише \\\"Хостинг проектів Google Code\\\"." + - "Klicke auf die Schaltfläche <strong>Keine auswählen</strong> auf der rechten Seite, da wir nur \\\"Google Code Project Hosting\\\" benötigen." + - "오른쪽의 <strong>선택 없음</strong> 버튼을 클릭 하십시오. 우리는 \\\"\\\"Google Code Project Hosting\\\" 만 사용하기 때문에 다른 것은 필요 없습니다. " + - "Cliquez sur le bouton <strong>Sélectionner aucun</strong> sur la droite, puisque nous n’avons seulement besoin que de « Google Code Project Hosting »." + - "Haga click en el botón <strong>Seleccionar uno</strong> en la parte derecha, ya que sólo necesitamos \\\"Google Code Project Hosting\\\"." +"Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file.": + plural_id: + translations: + - "Encontre o arquivo recém-extraído <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." + - "新しく抽出された <code>テイクアウト/ Googleコードプロジェクトホスティング/ GoogleCodeProjectHosting.json</code> ファイルを探します。" + - "查找新提取的 <code>Takeout/Google Code项目托管/GoogleCodeProjectHosting. json</code> 文件。" + - "Знайдіть щойно розпакований <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> файл." + - "Suche die neu extrahierte Datei <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." + - "Cherchez le fichier <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> fraîchement extrait." + - "Busque el archivo extraído <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code>." +"Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right.": + plural_id: + translations: + - "Role para baixo até <strong>Google Code Project Hosting</strong> e ative a opção à direita." + - "<strong>Google Code Project Hosting</strong> にスクロールし、右側のスイッチを有効にします。" + - "向下滚动到 <strong>Google Code项目托管</strong> 并通过右侧的开关启用。" + - "Прокрутіть вниз до <strong>Google Code Project Hosting</strong> і увімкніть перемикач праворуч." + - "Scrolle nach unten zu <strong>Google Code Project Hosting</strong> und aktiviere den Schalter auf der rechten Seite." + - "Faites défiler jusqu’à <strong>Hébergement de projet Google Code</strong> et activez le commutateur sur la droite." + - "Desplácese hasta <strong>Google Code Project</strong> y active el selector de la derecha." +"The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side.": + plural_id: + translations: + - "O mapa do usuário é um documento JSON que mapeia os usuários do Google Code que participaram de seus projetos para a maneira como seus endereços de e-mail e nomes de usuários são importados para o GitLab. Você pode mudar isso alterando o valor no lado direito de <code>:</code>. Certifique-se de preservar as aspas duplas adjacentes, outros sinais de pontuação e o endereço de e-mail ou nome de usuário no lado esquerdo." + - "ユーザーマップは、あなたのプロジェクトに参加した Google コードのユーザーのメールアドレスとユーザー名を GitLab にインポートするときにマッピングする JSON ファイルです。これを変更するには、 <code>:</code> の右側の値を変更します。左側の二重引用符、その他の句読点、メールアドレスまたはユーザー名が保存されます。" + - "用户映射是一个JSON文档,将参与项目的Google Code用户映射到他们将导入GitLab的电子邮件地址和用户名的方式。您可以通过更改 <code>:</code>右侧的值来更改此值。请务必在左侧保留周围的双引号,其他标点符号以及电子邮件地址或用户名。" + - "Мапа користувачів — це JSON-документ, який задає як адреси електронної пошти та імена користувачів Google Code, що приймали участь у ваших проектах будуть імпортовані у GitLab. Ви можете змінити його шляхом зміни значень, що стоять справа від <code>:</code>. Не видаляйте лапки та інші знаки пунктуації, а також не змінюйте адреси електронної пошти чи імена користувачів зліва." + - "Die Benutzerzuordnung ist ein JSON-Dokument das festlegt, wie die E-Mail-Adressen und Benutzernamen der Google Code-Benutzer(innen), die an deinem Projekt teilnehmen, in GitLab importiert werden. Du kannst dies ändern, indem du den Wert auf der rechten Seite von <code>:</code> anpasst. Stelle sicher, dass du umgebenden Anführungszeichen, andere Interpunktion sowie die E-Mail-Adresse oder den Benutzernamen auf der linken Seite erhältst." + - "La carte des utilisateurs (<code>user map</code>) est un document JSON qui met en correspondance les utilisateurs de Google Code qui ont participé à vos projets en précisant la manière dont leurs adresses de courriel et leurs noms d’utilisateur sont importés dans GitLab. Vous pouvez y apporter des modifications en changeant la valeur à droite du « <code>:</code> ». Assurez‐vous de conserver les guillemets droits doubles (<code>\\\"</code>), les autres signes de ponctuation, ainsi que l’adresse de courriel ou le nom d’utilisateur à gauche du deux‐points." + - "El mapa del usuarios es un documento JSON que asigna los usuarios de Google Code que participaron en sus proyectos a la forma en que se importarán sus direcciones de correo electrónico y nombres de usuario en GitLab. Puede cambiar esto cambiando el valor en el lado derecho de <code>:</code>. Asegúrese de conservar las comillas dobles circundantes, otros signos de puntuación y la dirección de correo electrónico o nombre de usuario en el lado izquierdo." + - "Mapa użytkownika to dokument JSON mapujący użytkowników Google Code, którzy uczestniczyli w Twoich projektach, w celu zaimportowania ich adresów e-mail i nazw użytkowników do GitLab. Możesz to zmienić poprzez zmianę wartości po prawej stronie <code>:</code>. Pamiętaj, aby zachować występujące podwójne cudzysłowy, inną interpunkcję i adres e-mail lub nazwę użytkownika po lewej stronie." +"Upload <code>GoogleCodeProjectHosting.json</code> here:": + plural_id: + translations: + - "Envie o <code>GoogleCodeProjectHosting.json</code> aqui:" + - "<code>GoogleCodeProjectHosting.json</code> をアップロードします:" + - "Enviar <code>GoogleCodeProjectHosting.json</code> aqui:" + - "在这里上传 <code>GoogleCodeProjectHosting.json</code>:" + - "Надіслати <code>GoogleCodeProjectHosting.json</code> тут:" + - "Lade <code>GoogleCodeProjectHosting.json</code> hier hoch:" + - "Téléversez le fichier <code>GoogleCodeProjectHosting.json</code> ici :" + - "Subir el fichero <code>GoogleCodeProjectHosting.json</code> aquí:" +"Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import.": + plural_id: + translations: + - "GitHub の%{link_start}Personal Access Token%{link_end} を作成して、提供してください。<code>repo</code> スコープを選択する必要があります。これによりインポートできる公開または非公開リポジトリの一覧を表示できます。" + - "请创建并提供您的GitHub%{link_start}个人访问令牌%{link_end}。您需要选择<code>repo</code>范围,这样我们才可以显示可导入的公共和私有仓库的列表。" + - "Створіть або вкажіть ваш %{link_start}Персональний токен доступу%{link_end} GitHub. Вам необхідно буде вибрати область дії <code>repo</code> для того, щоб ми змогли відобразити список ваших публічних та приватних репозиторіїв, доступних для імпорту." + - "Cree y proporcione su %{link_start}token de acceso personal %{link_end}de GitHub. Necesitará seleccionar el alcance del <code>repositorio</code>, para que podamos mostrar una lista de sus repositorios públicos y privados que estén disponibles para importar." +"To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect.": + plural_id: + translations: + - "Para conectar repositórios do GitHub, você pode usar um %{personal_access_token_link}. Ao criar seu Token de Acesso Pessoal, você precisará selecionar o escopo do <code>repositório</code>, então podemos exibir uma lista de seus repositórios públicos e privados que estão disponíveis para conexão." + - "GitHub リポジトリに接続するために %{personal_access_token_link} を使用できます。個人用アクセストークンを作成するには<code>リポジトリ</code> スコープを選択する必要があります。これにより接続できる公開・非公開リポジトリの一覧を表示することができます。" + - "可以使用 %{personal_access_token_link} 连接GitHub仓库。当创建个人访问令牌时,需要选择 <code>repo</code> 范围,以显示可供连接的公开和私有的仓库列表。" + - "Для підключення репозиторіїв з GitHub, ви можете використовувати %{personal_access_token_link}. Коли ви створюватимете ваш персональний токен доступу, вам потрібно буде вибрати область дії <code>repo</code>, щоб ми могли відобразити список ваших публічних та приватних репозиторіїв, доступних для підключення." + - "Um GitHub-Repositories zu verbinden kannst du einen %{personal_access_token_link} verwenden. Wenn du deinen persönlichen Access-Token erzeugst, musst du den Gültigkeitsbereich <code>repo</code> auswählen, damit wir eine Liste deiner öffentlichen und privaten Repositories anzeigen können, die für die Verbindung verfügbar sind." + - "GitHub 저장소 연결할때, %{personal_access_token_link}을 사용할 수 있습니다. 개인 엑세스 토큰을 생성할때 <code>repo</code> scope를 선택해야 연결에 사용할 수 있는 공개, 비공개 저장소가 표시되어 연결할 수 있게 됩니다." + - "Pour connecter des dépôts GitHub, vous pouvez utiliser un %{personal_access_token_link}. Lorsque vous créerez votre jeton d’accès, vous devrez sélectionner la portée <code>dépôt</code>, afin de permettre l’affichage d’une liste de vos dépôts publics et privés disponibles à la connexion." + - "Para conectar a los repositorios de GitHub, puede utilizar un %{personal_access_token_link}. Cuando cree su token de acceso personal, deberá seleccionar el alcance del <code>repo</code>, para que podamos mostrarle una lista de sus repositorios públicos y privados que están disponibles para conectarse." +"The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>.": + plural_id: + translations: + - "O repositório deve ser acessível por <code>http://</code>, <code>https://</code> ou <code>git://</code>." + - "リポジトリには、<code>http://</code>、 <code>https://</code> または <code>git://</code>で接続できなければなりません。" + - "Репозиторий должен быть доступен через протоколы <code>http: //</code>, <code>https: //</code> или <code>git: //</code>." + - "该仓库必须可通过<code>http://</code>, <code>https://</code> 或 <code>git://</code>进行访问。" + - "Репозиторій має бути доступним через <code>http://</code>, <code>https://</code> або <code>git://</code>." + - "Das Repository muss über <code>http://</code>, <code>https://</code> oder <code>git://</code> erreichbar sein." + - "저장소를 <code>http://</code>, <code>https://</code> 또는 <code>git://</code> 통해 액세스할 수 있어야 합니다." + - "Le dépôt doit être accessible via <code>http://</code>, <code>https://</code> ou <code>git://</code>." + - "El repositorio debe ser accesible a través de <code>http://</code>, <code>https://</code> o <code>git://</code>." +"When using the <code>http://</code> or <code>https://</code> protocols, please provide the exact URL to the repository. HTTP redirects will not be followed.": + plural_id: + translations: + - "<code>http://</code> または <code>https://</code> プロトコルを使用する場合、リポジトリの正確なURLを指定してください。 HTTPリダイレクトは追跡されません。" + - "Используя <code>http://</code> или <code>https://</code> протокол, пожалуйста указывайте точный адрес репозитория. Переадресация выполняться не будет." + - "使用<code>http://</code>或<code>https://</code>协议时,请提供仓库的实际地址。不支持HTTP重定向。" + - "При використанні протоколів <code>http://</code> або <code>https://</code> вказуйте, будь ласка, точну URL-адресу репозиторію. Перенаправлення HTTP не будуть виконуватися." + - "Al utilizar los protocolos <code>http://</code> o <code>https://</code>, por favor, proporcione la URL exacta del repositorio. No se seguirán las redirecciones HTTP." +"Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \\\"By <a href=\\\"#\\\">@johnsmith</a>\\\"). It will also associate and/or assign these issues and comments with the selected user.": + plural_id: + translations: + - "A seleção de um usuário do GitLab adicionará um link para o usuário do GitLab nas descrições de issues e comentários (por exemplo, \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\"). Isto também associará e/ou atribuirá esses issues e comentários ao usuário selecionado." + - "GitLab ユーザーを選択すると、GitLab ユーザーへのリンクが課題やコメントの説明に追加されます (例:\\\"By <a href=\\\"#\\\">@johnsmith</a>\\\")。また、これらの課題やコメントを選択したユーザーに関連付けや割り当てができます。" + - "选中GitLab用户将在议题和评论的描述中加入指向该GitLab用户的链接(例如“By <a href=\\\"#\\\">@johnsmith</a>”)。它还将与所选用户关联和/或分配这些议题和评论。" + - "При виборі користувача Gitlab посилання на нього буде додане до опису задачі та коментарів (напр. \\\"<a href=\\\"#\\\"> @johnsmith</a>\\\"). Також це призведе до асоціації та/або призначення цих задач та коментарів на вибраного користувача." + - "Wenn du eine(n) GitLab-Benutzer(in) azswählst, wird in der Beschreibung des Tickets und den Kommentaren ein Link zum/zur Benutzer(in) hinzugefügt (z. B. \\\"Von <a href=\\\"#\\\">@johnsmith</a>\\\"). Außerdem wird der/die ausgewählte Benutzer(in) dem Ticket oder Kommentar zugeordnet und/oder es ihm/ihr zugewiesen." + - "La sélection d’un utilisateur de GitLab va ajouter un lien vers cet utilisateur dans les descriptions des tickets et des commentaires (p. ex., « Par <a href=\\\"#\\\">@johnsmith</a> »). Les tickets et commentaires seront également associés ou assignés à cet utilisateur." + - "Al seleccionar un usuario de GitLab añadirá un link al usuario en la descripción de las incidencias, así como también, en los comentarios (por ejemplo, \\\"Por <a href=\\\"#\\\">@johnsmith</a>\\\"). Al hacer esto, también asociará y asignará dichas incidencias y comentarios con el usuario seleccionado." +"The CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment.": + plural_id: + translations: + - "CSVエクスポートをバックグラウンドで作成します。終了後に、<strong>%{email}</strong> に添付してメールで送信されます。" + - "Экспорт в CSV будет произведён в фоновом режиме. По завершении результат будет отправлен на <strong>%{email}</strong> во вложении." + - "CSV导出将在后台创建。完成后,它将以附件形式发送到<strong>%{email}</strong>。" + - "Експорт CSV буде створено у фоновому режимі. Після завершення його буде надіслано на <strong>%{email}</strong> у вкладенні." + - "La exportación CSV se creará en segundo plano. Una vez finalizada, será enviada a <strong>%{email}</strong> como un fichero adjunto al correo electrónico." diff --git a/lib/gitlab/slash_commands/presenters/base.rb b/lib/gitlab/slash_commands/presenters/base.rb index b60f0b78fef..b8affb42372 100644 --- a/lib/gitlab/slash_commands/presenters/base.rb +++ b/lib/gitlab/slash_commands/presenters/base.rb @@ -69,7 +69,6 @@ module Gitlab def resource_url url_for( [ - resource.project.namespace.becomes(Namespace), resource.project, resource ] diff --git a/lib/gitlab/slash_commands/presenters/issue_search.rb b/lib/gitlab/slash_commands/presenters/issue_search.rb index fffa082baac..f5b1670b2e9 100644 --- a/lib/gitlab/slash_commands/presenters/issue_search.rb +++ b/lib/gitlab/slash_commands/presenters/issue_search.rb @@ -22,7 +22,7 @@ module Gitlab def attachments resource.map do |issue| - url = "[#{issue.to_reference}](#{url_for([namespace, project, issue])})" + url = "[#{issue.to_reference}](#{url_for([project, issue])})" { color: color(issue), @@ -39,10 +39,6 @@ module Gitlab def project @project ||= resource.first.project end - - def namespace - @namespace ||= project.namespace.becomes(Namespace) - end end end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 3ae5b75afe8..fd739397a27 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -298,6 +298,18 @@ msgstr "" msgid "%{authorsName}'s thread" msgstr "" +msgid "%{code_open}\"johnsmith@example.com\": \"@johnsmith\"%{code_close} will add \"By %{link_open}@johnsmith%{link_close}\" to all issues and comments originally created by johnsmith@example.com, and will set %{link_open}@johnsmith%{link_close} as the assignee on all issues originally assigned to johnsmith@example.com." +msgstr "" + +msgid "%{code_open}\"johnsmith@example.com\": \"John Smith\"%{code_close} will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com." +msgstr "" + +msgid "%{code_open}\"johnsmith@example.com\": \"johnsm...@example.com\"%{code_close} will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy." +msgstr "" + +msgid "%{code_open}\"johnsmith@example.com\": \"johnsmith@example.com\"%{code_close} will add \"By %{link_open}johnsmith@example.com%{link_close}\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address." +msgstr "" + msgid "%{code_open}Masked%{code_close} to prevent the values from being displayed in job logs (must match certain regexp requirements)." msgstr "" @@ -1022,18 +1034,6 @@ msgstr "" msgid "< 1 hour" msgstr "" -msgid "<code>\"johnsmith@example.com\": \"@johnsmith\"</code> will add \"By <a href=\"#\">@johnsmith</a>\" to all issues and comments originally created by johnsmith@example.com, and will set <a href=\"#\">@johnsmith</a> as the assignee on all issues originally assigned to johnsmith@example.com." -msgstr "" - -msgid "<code>\"johnsmith@example.com\": \"John Smith\"</code> will add \"By John Smith\" to all issues and comments originally created by johnsmith@example.com." -msgstr "" - -msgid "<code>\"johnsmith@example.com\": \"johnsm...@example.com\"</code> will add \"By johnsm...@example.com\" to all issues and comments originally created by johnsmith@example.com. The email address or username is masked to ensure the user's privacy." -msgstr "" - -msgid "<code>\"johnsmith@example.com\": \"johnsmith@example.com\"</code> will add \"By <a href=\"#\">johnsmith@example.com</a>\" to all issues and comments originally created by johnsmith@example.com. By default, the email address or username is masked to ensure the user's privacy. Use this option if you want to show the full email address." -msgstr "" - msgid "<project name>" msgstr "" @@ -2847,6 +2847,9 @@ msgstr "" msgid "Any encrypted tokens" msgstr "" +msgid "Any files larger than this limit will not be indexed, and thus will not be searchable." +msgstr "" + msgid "Any label" msgstr "" @@ -4650,10 +4653,10 @@ msgstr "" msgid "Child epic doesn't exist." msgstr "" -msgid "Choose <strong>Create archive</strong> and wait for archiving to complete." +msgid "Choose %{strong_open}Create archive%{strong_close} and wait for archiving to complete." msgstr "" -msgid "Choose <strong>Next</strong> at the bottom of the page." +msgid "Choose %{strong_open}Next%{strong_close} at the bottom of the page." msgstr "" msgid "Choose a branch/tag (e.g. %{master}) or enter a commit (e.g. %{sha}) to see what's changed or to create a merge request." @@ -4899,10 +4902,10 @@ msgstr "" msgid "Clears weight." msgstr "" -msgid "Click the <strong>Download</strong> button and wait for downloading to complete." +msgid "Click the %{strong_open}Download%{strong_close} button and wait for downloading to complete." msgstr "" -msgid "Click the <strong>Select none</strong> button on the right, since we only need \"Google Code Project Hosting\"." +msgid "Click the %{strong_open}Select none%{strong_close} button on the right, since we only need \"Google Code Project Hosting\"." msgstr "" msgid "Click the button below to begin the install process by navigating to the Kubernetes page" @@ -6935,7 +6938,7 @@ msgstr "" msgid "Create an issue. Issues are created for each alert triggered." msgstr "" -msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to import." +msgid "Create and provide your GitHub %{link_start}Personal Access Token%{link_end}. You will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to import." msgstr "" msgid "Create board" @@ -10528,7 +10531,7 @@ msgstr "" msgid "Find the downloaded ZIP file and decompress it." msgstr "" -msgid "Find the newly extracted <code>Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json</code> file." +msgid "Find the newly extracted %{code_open}Takeout/Google Code Project Hosting/GoogleCodeProjectHosting.json%{code_close} file." msgstr "" msgid "Fingerprint" @@ -14558,6 +14561,9 @@ msgstr "" msgid "Maximum field length" msgstr "" +msgid "Maximum file size indexed (KiB)" +msgstr "" + msgid "Maximum file size is 2MB. Please select a smaller file." msgstr "" @@ -20683,7 +20689,7 @@ msgstr "" msgid "Scroll down" msgstr "" -msgid "Scroll down to <strong>Google Code Project Hosting</strong> and enable the switch on the right." +msgid "Scroll down to %{strong_open}Google Code Project Hosting%{strong_close} and enable the switch on the right." msgstr "" msgid "Scroll left" @@ -21384,7 +21390,7 @@ msgstr "" msgid "Selected levels cannot be used by non-admin users for groups, projects or snippets. If the public level is restricted, user profiles are only visible to logged in users." msgstr "" -msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By <a href=\"#\">@johnsmith</a>\"). It will also associate and/or assign these issues and comments with the selected user." +msgid "Selecting a GitLab user will add a link to the GitLab user in the descriptions of issues and comments (e.g. \"By %{link_open}@johnsmith%{link_close}\"). It will also associate and/or assign these issues and comments with the selected user." msgstr "" msgid "Selective synchronization" @@ -23544,7 +23550,7 @@ msgstr "" msgid "The Advanced Global Search in GitLab is a powerful search service that saves you time. Instead of creating duplicate code and wasting time, you can now search for code within other teams that can help your own project." msgstr "" -msgid "The CSV export will be created in the background. Once finished, it will be sent to <strong>%{email}</strong> in an attachment." +msgid "The CSV export will be created in the background. Once finished, it will be sent to %{strong_open}%{email}%{strong_close} in an attachment." msgstr "" msgid "The Git LFS objects will <strong>not</strong> be synced." @@ -23828,7 +23834,7 @@ msgstr "" msgid "The repository is being updated..." msgstr "" -msgid "The repository must be accessible over <code>http://</code>, <code>https://</code> or <code>git://</code>." +msgid "The repository must be accessible over %{code_open}http://%{code_close}, %{code_open}https://%{code_close} or %{code_open}git://%{code_close}." msgstr "" msgid "The repository must be accessible over <code>http://</code>, <code>https://</code>, <code>ssh://</code> or <code>git://</code>." @@ -23888,7 +23894,7 @@ msgstr "" msgid "The user map has been saved. Continue by selecting the projects you want to import." msgstr "" -msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of <code>:</code>. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side." +msgid "The user map is a JSON document mapping the Google Code users that participated on your projects to the way their email addresses and usernames will be imported into GitLab. You can change this by changing the value on the right hand side of %{code_open}:%{code_close}. Be sure to preserve the surrounding double quotes, other punctuation and the email address or username on the left hand side." msgstr "" msgid "The user map is a mapping of the FogBugz users that participated on your projects to the way their email address and usernames will be imported into GitLab. You can change this by populating the table below." @@ -24969,7 +24975,7 @@ msgstr "" msgid "To add the entry manually, provide the following details to the application on your phone." msgstr "" -msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the <code>repo</code> scope, so we can display a list of your public and private repositories which are available to connect." +msgid "To connect GitHub repositories, you can use a %{personal_access_token_link}. When you create your Personal Access Token, you will need to select the %{code_open}repo%{code_close} scope, so we can display a list of your public and private repositories which are available to connect." msgstr "" msgid "To connect GitHub repositories, you first need to authorize GitLab to access the list of your GitHub repositories." @@ -25782,7 +25788,7 @@ msgstr "" msgid "Upgrade your plan to improve Merge Requests." msgstr "" -msgid "Upload <code>GoogleCodeProjectHosting.json</code> here:" +msgid "Upload %{code_open}GoogleCodeProjectHosting.json%{code_close} here:" msgstr "" msgid "Upload CSV file" @@ -26662,9 +26668,6 @@ msgstr "" msgid "Vulnerability|Image" msgstr "" -msgid "Vulnerability|Instances" -msgstr "" - msgid "Vulnerability|Links" msgstr "" @@ -26862,6 +26865,9 @@ msgid_plural "When these merge requests are accepted" msgstr[0] "" msgstr[1] "" +msgid "When using the %{code_open}http://%{code_close} or %{code_open}https://%{code_close} protocols, please provide the exact URL to the repository. HTTP redirects will not be followed." +msgstr "" + msgid "When using the <code>http://</code> or <code>https://</code> protocols, please provide the exact URL to the repository. HTTP redirects will not be followed." msgstr "" diff --git a/package.json b/package.json index 7e0233e6062..99fec1c2dd6 100644 --- a/package.json +++ b/package.json @@ -43,11 +43,11 @@ "@babel/preset-env": "^7.10.1", "@gitlab/at.js": "1.5.5", "@gitlab/svgs": "1.153.0", - "@gitlab/ui": "17.36.2", + "@gitlab/ui": "17.37.0", "@gitlab/visual-review-tools": "1.6.1", "@rails/actioncable": "^6.0.3-1", "@sentry/browser": "^5.10.2", - "@sourcegraph/code-host-integration": "0.0.48", + "@sourcegraph/code-host-integration": "0.0.49", "@toast-ui/editor": "^2.2.0", "@toast-ui/vue-editor": "^2.3.0", "apollo-cache-inmemory": "^1.6.6", diff --git a/rubocop/cop/avoid_becomes.rb b/rubocop/cop/avoid_becomes.rb new file mode 100644 index 00000000000..cfd6b3d2164 --- /dev/null +++ b/rubocop/cop/avoid_becomes.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +module RuboCop + module Cop + # Cop that blacklists the use of ".becomes(SomeConstant)". + # + # The use of becomes() will result in a new object being created, throwing + # away any eager loaded assocations. This in turn can cause N+1 query + # problems, even when a developer eager loaded all necessary associations. + # + # See https://gitlab.com/gitlab-org/gitlab/-/issues/23182 for more information. + class AvoidBecomes < RuboCop::Cop::Cop + MSG = 'Avoid the use of becomes(SomeConstant), as this creates a ' \ + 'new object and throws away any eager loaded associations. ' \ + 'When creating URLs in views, just use the path helpers directly. ' \ + 'For example, instead of `link_to(..., [group.becomes(Namespace), ...])` ' \ + 'use `link_to(..., namespace_foo_path(group, ...))`. Most of the time there is no ' \ + 'need to pass in namespace to the path helpers after implementaton of ' \ + 'https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/12566' + + def_node_matcher :becomes?, <<~PATTERN + (send {send ivar lvar} :becomes ...) + PATTERN + + def on_send(node) + add_offense(node, location: :expression) if becomes?(node) + end + end + end +end diff --git a/scripts/trigger-build b/scripts/trigger-build index 7cca2f3e30b..cfaccaf4fe3 100755 --- a/scripts/trigger-build +++ b/scripts/trigger-build @@ -196,6 +196,10 @@ module Trigger end class Docs < Base + def self.access_token + ENV['DOCS_API_TOKEN'] + end + SUCCESS_MESSAGE = <<~MSG => You should now be able to preview your changes under the following URL: diff --git a/spec/bin/feature_flag_spec.rb b/spec/bin/feature_flag_spec.rb index 3a315a13686..e0fa24fb484 100644 --- a/spec/bin/feature_flag_spec.rb +++ b/spec/bin/feature_flag_spec.rb @@ -115,24 +115,45 @@ RSpec.describe 'bin/feature-flag' do describe '.read_type' do let(:type) { 'development' } - it 'reads type from $stdin' do - expect($stdin).to receive(:gets).and_return(type) - expect do + context 'when there is only a single type defined' do + before do + stub_const('FeatureFlagOptionParser::TYPES', + development: { description: 'short' } + ) + end + + it 'returns that type' do expect(described_class.read_type).to eq(:development) - end.to output(/specify the type/).to_stdout + end end - context 'invalid type given' do - let(:type) { 'invalid' } + context 'when there are many types defined' do + before do + stub_const('FeatureFlagOptionParser::TYPES', + development: { description: 'short' }, + licensed: { description: 'licensed' } + ) + end - it 'shows error message and retries' do + it 'reads type from $stdin' do expect($stdin).to receive(:gets).and_return(type) - expect($stdin).to receive(:gets).and_raise('EOF') - expect do - expect { described_class.read_type }.to raise_error(/EOF/) + expect(described_class.read_type).to eq(:development) end.to output(/specify the type/).to_stdout - .and output(/Invalid type specified/).to_stderr + end + + context 'when invalid type is given' do + let(:type) { 'invalid' } + + it 'shows error message and retries' do + expect($stdin).to receive(:gets).and_return(type) + expect($stdin).to receive(:gets).and_raise('EOF') + + expect do + expect { described_class.read_type }.to raise_error(/EOF/) + end.to output(/specify the type/).to_stdout + .and output(/Invalid type specified/).to_stderr + end end end end diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 4327e0bbb7a..8e1b250cd3c 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -334,7 +334,7 @@ RSpec.describe Projects::MergeRequestsController do it 'closes MR without errors' do update_merge_request(state_event: 'close') - expect(response).to redirect_to([merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request]) + expect(response).to redirect_to([merge_request.target_project, merge_request]) expect(merge_request.reload.closed?).to be_truthy end @@ -343,7 +343,7 @@ RSpec.describe Projects::MergeRequestsController do update_merge_request(title: 'New title') - expect(response).to redirect_to([merge_request.target_project.namespace.becomes(Namespace), merge_request.target_project, merge_request]) + expect(response).to redirect_to([merge_request.target_project, merge_request]) expect(merge_request.reload.title).to eq 'New title' end diff --git a/spec/controllers/projects/snippets_controller_spec.rb b/spec/controllers/projects/snippets_controller_spec.rb index 6fcb24da3cd..bb9b556f442 100644 --- a/spec/controllers/projects/snippets_controller_spec.rb +++ b/spec/controllers/projects/snippets_controller_spec.rb @@ -416,12 +416,13 @@ RSpec.describe Projects::SnippetsController do describe "GET #show for embeddable content" do let(:project_snippet) { create(:project_snippet, :repository, snippet_permission, project: project, author: user) } + let(:extra_params) { {} } before do sign_in(user) end - subject { get :show, params: { namespace_id: project.namespace, project_id: project, id: project_snippet.to_param }, format: :js } + subject { get :show, params: { namespace_id: project.namespace, project_id: project, id: project_snippet.to_param, **extra_params }, format: :js } context 'when snippet is private' do let(:snippet_permission) { :private } @@ -436,7 +437,29 @@ RSpec.describe Projects::SnippetsController do context 'when snippet is public' do let(:snippet_permission) { :public } - it_behaves_like 'successful response' + it 'renders the blob from the repository' do + subject + + expect(assigns(:snippet)).to eq(project_snippet) + expect(assigns(:blobs)).to eq(project_snippet.blobs) + expect(response).to have_gitlab_http_status(:ok) + end + + it 'does not show the blobs expanded by default' do + subject + + expect(project_snippet.blobs.map(&:expanded?)).to be_all(false) + end + + context 'when param expanded is set' do + let(:extra_params) { { expanded: true } } + + it 'shows all blobs expanded' do + subject + + expect(project_snippet.blobs.map(&:expanded?)).to be_all(true) + end + end end context 'when the project is private' do diff --git a/spec/features/projects/show/user_manages_notifications_spec.rb b/spec/features/projects/show/user_manages_notifications_spec.rb index 58a2c793b7b..739bcdb2923 100644 --- a/spec/features/projects/show/user_manages_notifications_spec.rb +++ b/spec/features/projects/show/user_manages_notifications_spec.rb @@ -67,20 +67,6 @@ RSpec.describe 'Projects > Show > User manages notifications', :js do end end end - - context 'when ci_pipeline_fixed_notifications is disabled' do - before do - stub_feature_flags(ci_pipeline_fixed_notifications: false) - end - - it 'hides fixed_pipeline checkbox' do - visit project_path(project) - click_notifications_button - page.find('a[data-notification-level="custom"]').click - - expect(page).not_to have_selector("input[name='notification_setting[fixed_pipeline]']") - end - end end context 'when project emails are disabled' do diff --git a/spec/features/snippets/embedded_snippet_spec.rb b/spec/features/snippets/embedded_snippet_spec.rb index 4f2ab598a6f..b799fb2fc00 100644 --- a/spec/features/snippets/embedded_snippet_spec.rb +++ b/spec/features/snippets/embedded_snippet_spec.rb @@ -3,11 +3,13 @@ require 'spec_helper' RSpec.describe 'Embedded Snippets' do - let(:snippet) { create(:personal_snippet, :public, file_name: 'random_dir.rb', content: content) } - let(:content) { "require 'fileutils'\nFileUtils.mkdir_p 'some/random_dir'\n" } + let_it_be(:snippet) { create(:personal_snippet, :public, :repository) } + let(:blobs) { snippet.blobs.first(3) } it 'loads snippet', :js do - script_url = "http://#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}/#{snippet_path(snippet, format: 'js')}" + expect_any_instance_of(Snippet).to receive(:blobs).and_return(blobs) + + script_url = "http://#{Capybara.current_session.server.host}:#{Capybara.current_session.server.port}#{snippet_path(snippet, format: 'js')}" embed_body = "<html><body><script src=\"#{script_url}\"></script></body></html>" rack_app = proc do @@ -19,9 +21,15 @@ RSpec.describe 'Embedded Snippets' do visit("http://#{server.host}:#{server.port}/embedded_snippet.html") - expect(page).to have_content("random_dir.rb") - expect(page).to have_content("require 'fileutils'") - expect(page).to have_link('Open raw') - expect(page).to have_link('Download') + wait_for_requests + + aggregate_failures do + blobs.each do |blob| + expect(page).to have_content(blob.path) + expect(page.find(".snippet-file-content .blob-content[data-blob-id='#{blob.id}'] code")).to have_content(blob.data.squish) + expect(page).to have_link('Open raw', href: /-\/snippets\/#{snippet.id}\/raw\/master\/#{blob.path}/) + expect(page).to have_link('Download', href: /-\/snippets\/#{snippet.id}\/raw\/master\/#{blob.path}\?inline=false/) + end + end end end diff --git a/spec/frontend/environment.js b/spec/frontend/environment.js index c9d77a34595..5622ba17deb 100644 --- a/spec/frontend/environment.js +++ b/spec/frontend/environment.js @@ -50,16 +50,6 @@ class CustomEnvironment extends JSDOMEnvironment { */ this.global.fetch = () => {}; - // Not yet supported by JSDOM: https://github.com/jsdom/jsdom/issues/317 - this.global.document.createRange = () => ({ - setStart: () => {}, - setEnd: () => {}, - commonAncestorContainer: { - nodeName: 'BODY', - ownerDocument: this.global.document, - }, - }); - // Expose the jsdom (created in super class) to the global so that we can call reconfigure({ url: '' }) to properly set `window.location` this.global.dom = this.dom; } diff --git a/spec/frontend/helpers/dom_shims/index.js b/spec/frontend/helpers/dom_shims/index.js index d18bb94c107..2ba5701fc77 100644 --- a/spec/frontend/helpers/dom_shims/index.js +++ b/spec/frontend/helpers/dom_shims/index.js @@ -4,7 +4,7 @@ import './element_scroll_to'; import './form_element'; import './get_client_rects'; import './inner_text'; -import './mutation_observer'; +import './range'; import './window_scroll_to'; import './scroll_by'; import './size_properties'; diff --git a/spec/frontend/helpers/dom_shims/mutation_observer.js b/spec/frontend/helpers/dom_shims/mutation_observer.js deleted file mode 100644 index 68c494f19ea..00000000000 --- a/spec/frontend/helpers/dom_shims/mutation_observer.js +++ /dev/null @@ -1,7 +0,0 @@ -/* eslint-disable class-methods-use-this */ -class MutationObserverStub { - disconnect() {} - observe() {} -} - -global.MutationObserver = MutationObserverStub; diff --git a/spec/frontend/helpers/dom_shims/range.js b/spec/frontend/helpers/dom_shims/range.js new file mode 100644 index 00000000000..4ffdf3280ad --- /dev/null +++ b/spec/frontend/helpers/dom_shims/range.js @@ -0,0 +1,13 @@ +if (window.Range.prototype.getBoundingClientRect) { + throw new Error('window.Range.prototype.getBoundingClientRect already exists. Remove this stub!'); +} +window.Range.prototype.getBoundingClientRect = function getBoundingClientRect() { + return { x: 0, y: 0, width: 0, height: 0, top: 0, right: 0, bottom: 0, left: 0 }; +}; + +if (window.Range.prototype.getClientRects) { + throw new Error('window.Range.prototype.getClientRects already exists. Remove this stub!'); +} +window.Range.prototype.getClientRects = function getClientRects() { + return [this.getBoundingClientRect()]; +}; diff --git a/spec/frontend/lazy_loader_spec.js b/spec/frontend/lazy_loader_spec.js index 79a49aedf37..c50f8157b9e 100644 --- a/spec/frontend/lazy_loader_spec.js +++ b/spec/frontend/lazy_loader_spec.js @@ -45,10 +45,24 @@ describe('LazyLoader', () => { return newImg; }; + const mockLoadEvent = () => { + const addEventListener = window.addEventListener.bind(window); + + jest.spyOn(window, 'addEventListener').mockImplementation((event, callback) => { + if (event === 'load') { + callback(); + } else { + addEventListener(event, callback); + } + }); + }; + beforeEach(() => { jest.spyOn(window, 'requestAnimationFrame').mockImplementation(execImmediately); jest.spyOn(window, 'requestIdleCallback').mockImplementation(execImmediately); jest.spyOn(LazyLoader, 'loadImage'); + + mockLoadEvent(); }); afterEach(() => { diff --git a/spec/frontend/vue_shared/components/rich_content_editor/rich_content_editor_integration_spec.js b/spec/frontend/vue_shared/components/rich_content_editor/rich_content_editor_integration_spec.js new file mode 100644 index 00000000000..70317d333d9 --- /dev/null +++ b/spec/frontend/vue_shared/components/rich_content_editor/rich_content_editor_integration_spec.js @@ -0,0 +1,52 @@ +import Editor from '@toast-ui/editor'; +import { registerHTMLToMarkdownRenderer } from '~/vue_shared/components/rich_content_editor/services/editor_service'; + +describe('vue_shared/components/rich_content_editor', () => { + let editor; + + const buildEditor = () => { + editor = new Editor({ + el: document.body, + }); + + registerHTMLToMarkdownRenderer(editor); + }; + + beforeEach(() => { + buildEditor(); + }); + + describe('HTML to Markdown', () => { + it('uses "-" character list marker in unordered lists', () => { + editor.setHtml('<ul><li>List item 1</li><li>List item 2</li></ul>'); + + const markdown = editor.getMarkdown(); + + expect(markdown).toBe('- List item 1\n- List item 2'); + }); + + it('does not increment the list marker in ordered lists', () => { + editor.setHtml('<ol><li>List item 1</li><li>List item 2</li></ol>'); + + const markdown = editor.getMarkdown(); + + expect(markdown).toBe('1. List item 1\n1. List item 2'); + }); + + it('indents lists using four spaces', () => { + editor.setHtml('<ul><li>List item 1</li><ul><li>List item 2</li></ul></ul>'); + + const markdown = editor.getMarkdown(); + + expect(markdown).toBe('- List item 1\n - List item 2'); + }); + + it('uses * for strong and _ for emphasis text', () => { + editor.setHtml('<strong>strong text</strong><i>emphasis text</i>'); + + const markdown = editor.getMarkdown(); + + expect(markdown).toBe('**strong text**_emphasis text_'); + }); + }); +}); diff --git a/spec/helpers/appearances_helper_spec.rb b/spec/helpers/appearances_helper_spec.rb index 179c69b2a67..d972ac27119 100644 --- a/spec/helpers/appearances_helper_spec.rb +++ b/spec/helpers/appearances_helper_spec.rb @@ -70,7 +70,7 @@ RSpec.describe AppearancesHelper do context 'when there is a logo but no associated upload' do before do # Legacy attachments were not tracked in the uploads table - appearance.logo.upload.destroy + appearance.logo.upload.destroy! appearance.reload end diff --git a/spec/helpers/auto_devops_helper_spec.rb b/spec/helpers/auto_devops_helper_spec.rb index ad705dc5a7b..4f060a0ae3b 100644 --- a/spec/helpers/auto_devops_helper_spec.rb +++ b/spec/helpers/auto_devops_helper_spec.rb @@ -128,7 +128,7 @@ RSpec.describe AutoDevopsHelper do context 'with groups' do before do - receiver.update(parent: parent) + receiver.update!(parent: parent) end context 'when auto devops is enabled on parent' do diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb index 4c93a8387a9..581c2fb0afe 100644 --- a/spec/helpers/issuables_helper_spec.rb +++ b/spec/helpers/issuables_helper_spec.rb @@ -160,7 +160,7 @@ RSpec.describe IssuablesHelper do end before do - user.destroy + user.destroy! end it 'returns "Ghost user" as edited_by' do diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb index f2757f0e3ed..3f84eeb12c2 100644 --- a/spec/helpers/issues_helper_spec.rb +++ b/spec/helpers/issues_helper_spec.rb @@ -162,7 +162,7 @@ RSpec.describe IssuesHelper do context 'with linked issue' do context 'with moved issue' do before do - issue.update(moved_to: new_issue) + issue.update!(moved_to: new_issue) end context 'when user has permission to see new issue' do @@ -181,7 +181,7 @@ RSpec.describe IssuesHelper do context 'with duplicated issue' do before do - issue.update(duplicated_to: new_issue) + issue.update!(duplicated_to: new_issue) end context 'when user has permission to see new issue' do @@ -203,7 +203,7 @@ RSpec.describe IssuesHelper do let(:user) { project.owner } before do - issue.update(moved_to: nil, duplicated_to: nil) + issue.update!(moved_to: nil, duplicated_to: nil) end it_behaves_like 'does not display link' @@ -220,7 +220,7 @@ RSpec.describe IssuesHelper do allow(Gitlab::IncomingEmail).to receive(:enabled?) { true } allow(Gitlab::IncomingEmail).to receive(:supports_wildcard?) { true } - old_issue.update(moved_to: new_issue) + old_issue.update!(moved_to: new_issue) end it 'is true when moved issue project has service desk disabled' do diff --git a/spec/helpers/members_helper_spec.rb b/spec/helpers/members_helper_spec.rb index 99e8696e960..84b3f99b89a 100644 --- a/spec/helpers/members_helper_spec.rb +++ b/spec/helpers/members_helper_spec.rb @@ -25,7 +25,7 @@ RSpec.describe MembersHelper do context 'an accepted user invitation with no user associated' do before do - group_member_invite.update(invite_email: "#{SecureRandom.hex}@example.com", invite_token: nil, user_id: nil) + group_member_invite.update_columns(invite_email: "#{SecureRandom.hex}@example.com", invite_token: nil, user_id: nil) end it 'logs an exception and shows orphaned status' do diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb index 19dcd698c0b..41511b65cc4 100644 --- a/spec/helpers/notes_helper_spec.rb +++ b/spec/helpers/notes_helper_spec.rb @@ -77,9 +77,9 @@ RSpec.describe NotesHelper do context 'for a merge request discusion' do let(:merge_request) { create(:merge_request, source_project: project, target_project: project, importing: true) } - let!(:merge_request_diff1) { merge_request.merge_request_diffs.create(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') } - let!(:merge_request_diff2) { merge_request.merge_request_diffs.create(head_commit_sha: nil) } - let!(:merge_request_diff3) { merge_request.merge_request_diffs.create(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e') } + let!(:merge_request_diff1) { merge_request.merge_request_diffs.create!(head_commit_sha: '6f6d7e7ed97bb5f0054f2b1df789b39ca89b6ff9') } + let!(:merge_request_diff2) { merge_request.merge_request_diffs.create!(head_commit_sha: nil) } + let!(:merge_request_diff3) { merge_request.merge_request_diffs.create!(head_commit_sha: '5937ac0a7beb003549fc5fd26fc247adbce4a52e') } context 'for a diff discussion' do context 'when the discussion is active' do @@ -284,7 +284,7 @@ RSpec.describe NotesHelper do @snippet = create(:project_snippet, project: @project) @note = create(:note_on_personal_snippet) - expect(helper.form_resources).to eq([@project.namespace, @project, @note]) + expect(helper.form_resources).to eq([@project, @note]) end it 'returns namespace, project and note path for other noteables' do @@ -292,7 +292,7 @@ RSpec.describe NotesHelper do @project = create(:project, path: 'test', namespace: namespace) @note = create(:note_on_issue, project: @project) - expect(helper.form_resources).to eq([@project.namespace, @project, @note]) + expect(helper.form_resources).to eq([@project, @note]) end end diff --git a/spec/helpers/profiles_helper_spec.rb b/spec/helpers/profiles_helper_spec.rb index 4a8ba2b7113..61b7ff94edb 100644 --- a/spec/helpers/profiles_helper_spec.rb +++ b/spec/helpers/profiles_helper_spec.rb @@ -31,7 +31,7 @@ RSpec.describe ProfilesHelper do end it 'returns DB stored commit_email' do - user.update(commit_email: Gitlab::PrivateCommitEmail::TOKEN) + user.update!(commit_email: Gitlab::PrivateCommitEmail::TOKEN) expect(helper.selected_commit_email(user)).to eq(Gitlab::PrivateCommitEmail::TOKEN) end diff --git a/spec/helpers/projects/alert_management_helper_spec.rb b/spec/helpers/projects/alert_management_helper_spec.rb index 859c08b194a..20464d7f64d 100644 --- a/spec/helpers/projects/alert_management_helper_spec.rb +++ b/spec/helpers/projects/alert_management_helper_spec.rb @@ -49,7 +49,7 @@ RSpec.describe Projects::AlertManagementHelper do context 'when alerts service is inactive' do it 'disables alert management' do - alerts_service.update(active: false) + alerts_service.update!(active: false) expect(data).to include( 'alert-management-enabled' => 'false' diff --git a/spec/helpers/projects_helper_spec.rb b/spec/helpers/projects_helper_spec.rb index a3d0673f1b3..2b345ff3ae6 100644 --- a/spec/helpers/projects_helper_spec.rb +++ b/spec/helpers/projects_helper_spec.rb @@ -126,7 +126,7 @@ RSpec.describe ProjectsHelper do it "returns false if there are permissions and origin project is PRIVATE" do allow(helper).to receive(:can?) { true } - project.update(visibility_level: Gitlab::VisibilityLevel::PRIVATE) + project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) expect(helper.can_change_visibility_level?(forked_project, user)).to be_falsey end @@ -134,7 +134,7 @@ RSpec.describe ProjectsHelper do it "returns true if there are permissions and origin project is INTERNAL" do allow(helper).to receive(:can?) { true } - project.update(visibility_level: Gitlab::VisibilityLevel::INTERNAL) + project.update!(visibility_level: Gitlab::VisibilityLevel::INTERNAL) expect(helper.can_change_visibility_level?(forked_project, user)).to be_truthy end @@ -647,7 +647,7 @@ RSpec.describe ProjectsHelper do context 'user has a configured commit email' do before do confirmed_email = create(:email, :confirmed, user: user) - user.update(commit_email: confirmed_email) + user.update!(commit_email: confirmed_email) end it 'returns the commit email' do @@ -866,7 +866,7 @@ RSpec.describe ProjectsHelper do when :developer, :maintainer project.add_user(user, access) when :owner - project.namespace.update(owner: user) + project.namespace.update!(owner: user) end end diff --git a/spec/helpers/snippets_helper_spec.rb b/spec/helpers/snippets_helper_spec.rb index 7878f877299..1215286daed 100644 --- a/spec/helpers/snippets_helper_spec.rb +++ b/spec/helpers/snippets_helper_spec.rb @@ -6,21 +6,29 @@ RSpec.describe SnippetsHelper do include Gitlab::Routing include IconsHelper - let_it_be(:public_personal_snippet) { create(:personal_snippet, :public) } - let_it_be(:public_project_snippet) { create(:project_snippet, :public) } + let_it_be(:public_personal_snippet) { create(:personal_snippet, :public, :repository) } + let_it_be(:public_project_snippet) { create(:project_snippet, :public, :repository) } describe '#embedded_raw_snippet_button' do - subject { embedded_raw_snippet_button.to_s } + let(:blob) { snippet.blobs.first } + let(:ref) { blob.repository.root_ref } - it 'returns view raw button of embedded snippets for personal snippets' do - @snippet = create(:personal_snippet, :public) - expect(subject).to eq(download_link("http://test.host/-/snippets/#{@snippet.id}/raw")) + subject { embedded_raw_snippet_button(snippet, blob) } + + context 'for Personal Snippets' do + let(:snippet) { public_personal_snippet } + + it 'returns view raw button of embedded snippets' do + expect(subject).to eq(download_link("http://test.host/-/snippets/#{snippet.id}/raw/#{ref}/#{blob.path}")) + end end - it 'returns view raw button of embedded snippets for project snippets' do - @snippet = create(:project_snippet, :public) + context 'for Project Snippets' do + let(:snippet) { public_project_snippet } - expect(subject).to eq(download_link("http://test.host/#{@snippet.project.path_with_namespace}/-/snippets/#{@snippet.id}/raw")) + it 'returns view raw button of embedded snippets' do + expect(subject).to eq(download_link("http://test.host/#{snippet.project.path_with_namespace}/-/snippets/#{snippet.id}/raw/#{ref}/#{blob.path}")) + end end def download_link(url) @@ -29,18 +37,25 @@ RSpec.describe SnippetsHelper do end describe '#embedded_snippet_download_button' do - subject { embedded_snippet_download_button } + let(:blob) { snippet.blobs.first } + let(:ref) { blob.repository.root_ref } - it 'returns download button of embedded snippets for personal snippets' do - @snippet = create(:personal_snippet, :public) + subject { embedded_snippet_download_button(snippet, blob) } - expect(subject).to eq(download_link("http://test.host/-/snippets/#{@snippet.id}/raw")) + context 'for Personal Snippets' do + let(:snippet) { public_personal_snippet } + + it 'returns download button of embedded snippets' do + expect(subject).to eq(download_link("http://test.host/-/snippets/#{snippet.id}/raw/#{ref}/#{blob.path}")) + end end - it 'returns download button of embedded snippets for project snippets' do - @snippet = create(:project_snippet, :public) + context 'for Project Snippets' do + let(:snippet) { public_project_snippet } - expect(subject).to eq(download_link("http://test.host/#{@snippet.project.path_with_namespace}/-/snippets/#{@snippet.id}/raw")) + it 'returns download button of embedded snippets' do + expect(subject).to eq(download_link("http://test.host/#{snippet.project.path_with_namespace}/-/snippets/#{snippet.id}/raw/#{ref}/#{blob.path}")) + end end def download_link(url) diff --git a/spec/helpers/visibility_level_helper_spec.rb b/spec/helpers/visibility_level_helper_spec.rb index 9cbace3cfd0..7ef911131ba 100644 --- a/spec/helpers/visibility_level_helper_spec.rb +++ b/spec/helpers/visibility_level_helper_spec.rb @@ -171,13 +171,14 @@ RSpec.describe VisibilityLevelHelper do with_them do it "provides correct visibility level for forked project" do - project.update(visibility_level: max_allowed) + project.update!(visibility_level: max_allowed) expect(selected_visibility_level(forked_project, requested_level)).to eq(expected) end - it "provides correct visibiility level for project in group" do - project.group.update(visibility_level: max_allowed) + it "provides correct visibility level for project in group" do + project.update!(visibility_level: max_allowed) + project.group.update!(visibility_level: max_allowed) expect(selected_visibility_level(project, requested_level)).to eq(expected) end diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index ed2466d6413..525639f6b98 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -2918,25 +2918,9 @@ RSpec.describe Ci::Pipeline, :mailer do describe '#ensure_ci_ref!' do subject { pipeline.ensure_ci_ref! } - shared_examples_for 'protected by feature flag' do - context 'when feature flag is disabled' do - before do - stub_feature_flags(ci_pipeline_fixed_notifications: false) - end - - it 'does not do anything' do - expect(Ci::Ref).not_to receive(:ensure_for) - - subject - end - end - end - context 'when ci_ref does not exist yet' do let!(:pipeline) { create(:ci_pipeline, ci_ref_presence: false) } - it_behaves_like 'protected by feature flag' - it 'creates a new ci_ref and assigns it' do expect { subject }.to change { Ci::Ref.count }.by(1) @@ -2947,8 +2931,6 @@ RSpec.describe Ci::Pipeline, :mailer do context 'when ci_ref already exists' do let!(:pipeline) { create(:ci_pipeline) } - it_behaves_like 'protected by feature flag' - it 'fetches a new ci_ref and assigns it' do expect { subject }.not_to change { Ci::Ref.count } diff --git a/spec/models/ci/ref_spec.rb b/spec/models/ci/ref_spec.rb index fd4742a8ad2..dcb1b2d1f03 100644 --- a/spec/models/ci/ref_spec.rb +++ b/spec/models/ci/ref_spec.rb @@ -161,16 +161,6 @@ RSpec.describe Ci::Ref do it_behaves_like 'no-op' end - context 'when feature flag is disabled' do - let(:pipeline) { create(:ci_pipeline, :success, ci_ref: ci_ref) } - - before do - stub_feature_flags(ci_pipeline_fixed_notifications: false) - end - - it_behaves_like 'no-op' - end - context 'when pipeline is not the latest pipeline' do let!(:pipeline) { create(:ci_pipeline, :success, ci_ref: ci_ref) } let!(:latest_pipeline) { create(:ci_pipeline, :success, ci_ref: ci_ref) } diff --git a/spec/models/concerns/manual_inverse_association_spec.rb b/spec/models/concerns/manual_inverse_association_spec.rb index 1349d2cc680..0d56d06c624 100644 --- a/spec/models/concerns/manual_inverse_association_spec.rb +++ b/spec/models/concerns/manual_inverse_association_spec.rb @@ -14,7 +14,7 @@ RSpec.describe ManualInverseAssociation do stub_const("#{described_class}::Model", model) end - let(:instance) { create(:merge_request).becomes(model) } + let(:instance) { create(:merge_request).becomes(model) } # rubocop: disable Cop/AvoidBecomes describe '.manual_inverse_association' do context 'when the relation exists' do diff --git a/spec/presenters/event_presenter_spec.rb b/spec/presenters/event_presenter_spec.rb index 2d4872ea29e..6798be21d28 100644 --- a/spec/presenters/event_presenter_spec.rb +++ b/spec/presenters/event_presenter_spec.rb @@ -35,7 +35,7 @@ RSpec.describe EventPresenter do context 'with project label' do subject { project_event.present.target_link_options } - it { is_expected.to eq([group.becomes(Namespace), project, target]) } + it { is_expected.to eq([project, target]) } end end end diff --git a/spec/rubocop/cop/avoid_becomes_spec.rb b/spec/rubocop/cop/avoid_becomes_spec.rb new file mode 100644 index 00000000000..3e3e3abc27d --- /dev/null +++ b/spec/rubocop/cop/avoid_becomes_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'fast_spec_helper' +require 'rubocop' +require 'rubocop/rspec/support' +require_relative '../../../rubocop/cop/avoid_becomes' + +RSpec.describe RuboCop::Cop::AvoidBecomes, type: :rubocop do + include CopHelper + + subject(:cop) { described_class.new } + + it 'flags the use of becomes with a constant parameter' do + inspect_source('foo.becomes(Project)') + + expect(cop.offenses.size).to eq(1) + end + + it 'flags the use of becomes with a namespaced constant parameter' do + inspect_source('foo.becomes(Namespace::Group)') + + expect(cop.offenses.size).to eq(1) + end + + it 'flags the use of becomes with a dynamic parameter' do + inspect_source(<<~RUBY) + model = Namespace + project = Project.first + project.becomes(model) + RUBY + + expect(cop.offenses.size).to eq(1) + end +end diff --git a/yarn.lock b/yarn.lock index d40e3c0dac0..94c7c322c01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -848,10 +848,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-1.153.0.tgz#79db0598382e6990d242f2e8dc0911903b1f558c" integrity sha512-9letemutba300jT8BgxmYjUjMGDJifFFulPBNT4bxT+U2Ki+X+xs57Il3o/FNv5feJOPAlYS8Z/aEII8145g1g== -"@gitlab/ui@17.36.2": - version "17.36.2" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.36.2.tgz#745a04357c631f28677bd37bc81433602b8cf71f" - integrity sha512-aO85RZYYMfWmTzhuGlSIZFSVaGYeOTMT6gmgr1UQrMnrgM7noxSh9An3byuZLbQSa7EuxjCQ2w7u2Au5WiIRKw== +"@gitlab/ui@17.37.0": + version "17.37.0" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-17.37.0.tgz#1d6116b9820ff6d343886cb870ad90922ed354ce" + integrity sha512-Xq9WHhKchpr0EpCYTf+YZTMwRgRqyZ9V3byjGL54iY/a3iXfSm8EbRUIIjIe2nNLaXfJTUasms+e5WWUtWBl/w== dependencies: "@babel/standalone" "^7.0.0" "@gitlab/vue-toasted" "^1.3.0" @@ -1135,10 +1135,10 @@ dependencies: type-detect "4.0.8" -"@sourcegraph/code-host-integration@0.0.48": - version "0.0.48" - resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.48.tgz#327bd04182e8a9a8daabebc6f2b50c8186b19514" - integrity sha512-O4jQyfYmmZaZahLj2BbqjEh7MarQRhZHYdWhL4D3CdUGH4y3XOTGCmVHWEFb23UaV/izze1XoGDxbQeAnps7EA== +"@sourcegraph/code-host-integration@0.0.49": + version "0.0.49" + resolved "https://registry.yarnpkg.com/@sourcegraph/code-host-integration/-/code-host-integration-0.0.49.tgz#d0d1e61fd058d63a2798d5131d05738aa0ac4765" + integrity sha512-aMSTy+JqVaJ6E8zpQUU1bH5kwGvpt1pWPkT5/o/HnN113ZLlBfvPpNdiXDiTUYcc3zHAtFa49VD34AgxglXG9w== "@szmarczak/http-timer@^1.1.2": version "1.1.2" |