From d1fd19e525135c2805ae93d3a571ffcbc2414b0e Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 5 May 2021 21:09:59 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .../commit/pipelines/pipelines_bundle.js | 4 + app/assets/javascripts/merge_request_tabs.js | 2 + ...ity_report_mr_download_paths.query.graphql | 24 ++ ...port_pipeline_download_paths.query.graphql | 18 + .../security_reports/security_reports_app.vue | 4 +- .../vue_shared/security_reports/utils.js | 14 +- app/models/ci/runner_namespace.rb | 5 + app/models/ci/runner_project.rb | 5 + app/models/concerns/limitable.rb | 2 + app/models/members_preloader.rb | 2 +- ...create_project_from_remote_file_service.rb | 74 +++++ ...eate_project_from_uploaded_file_service.rb | 65 ++++ .../projects/commit/_pipelines_list.haml | 4 + ...escription-rollover-iteration-cadences.yml | 5 + ...io-import-from-external-object-storage.yml | 7 + ...ombeiro-321368-limit-number-of-runners.yml | 5 + .../sh-fix-commit-pipelines-table.yml | 5 + .../development/ci_runner_limits.yml | 8 + .../import_project_from_remote_file.yml | 8 + .../counts_28d/20210216182034_deploy_keys.yml | 8 +- .../counts_28d/20210216182036_keys.yml | 8 +- .../20210216182038_remote_mirrors.yml | 8 +- ...tion_monthly_active_users_project_repo.yml | 8 +- ..._action_monthly_active_users_git_write.yml | 8 +- ...ojects_with_sectional_code_owner_rules.yml | 16 - ...049_projects_with_repositories_enabled.yml | 16 - .../20210216182051_protected_branches.yml | 8 +- .../20210216182102_wiki_action_monthly.yml | 8 +- .../20210216182106_design_action_monthly.yml | 8 +- .../20210216182109_project_action_monthly.yml | 8 +- ...10216183613_total_number_of_path_locks.yml | 16 - ...216183614_total_number_of_locked_files.yml | 16 - ...0210216184047_git_write_action_monthly.yml | 14 +- .../20210216182100_wiki_action_weekly.yml | 18 + .../20210216182104_design_action_weekly.yml | 18 + .../20210216182107_project_action_weekly.yml | 18 + ...0210216184045_git_write_action_weekly.yml} | 12 +- ...959_projects_with_repositories_enabled.yml | 16 - .../20210216182001_protected_branches.yml | 16 - .../20210216182002_remote_mirrors.yml | 6 +- .../20210216182004_commit_comment.yml | 10 +- .../20210216182006_source_code_pushes.yml | 8 +- .../20210216182008_template_repositories.yml | 16 - .../counts_all/20210216182010_deploy_keys.yml | 8 +- .../counts_all/20210216182012_keys.yml | 8 +- ...overriding_approvers_per_merge_request.yml | 7 +- ...overriding_approvers_per_merge_request.yml | 7 +- .../20210216182017_remote_mirrors.yml | 8 +- ...projects_enforcing_code_owner_approval.yml | 16 - ...ojects_with_sectional_code_owner_rules.yml | 16 - ...023_projects_with_repositories_enabled.yml | 16 - .../20210216182025_protected_branches.yml | 16 - ...10216182027_total_number_of_path_locks.yml | 16 - ...216182028_total_number_of_locked_files.yml | 16 - ...2454_protected_branches_except_default.yml | 14 +- .../20210216183344_users_using_path_locks.yml | 16 - .../20210216183346_users_using_lfs_locks.yml | 16 - ...mote_import_url_to_import_export_upload.rb | 8 + ...t_to_import_url_in_import_export_upload.rb | 15 + ..._add_runner_registration_to_plan_limits.rb | 8 + ..._insert_runner_registration_plan_limits.rb | 26 ++ ...iption_roll_over_to_iterations_cadences.rb | 19 ++ ...imit_to_iterations_cadences_description.rb | 15 + db/schema_migrations/20210419203017 | 1 + db/schema_migrations/20210419203018 | 1 + db/schema_migrations/20210423155059 | 1 + db/schema_migrations/20210423164702 | 1 + db/schema_migrations/20210427194958 | 1 + db/schema_migrations/20210427200840 | 1 + db/structure.sql | 11 +- .../external_pipeline_validation.md | 4 + doc/administration/instance_limits.md | 26 ++ doc/api/graphql/reference/index.md | 6 + doc/development/usage_ping/dictionary.md | 262 ++++++++------- doc/user/admin_area/diff_limits.md | 6 +- .../img/mr_review_second_comment.png | Bin 50468 -> 0 bytes .../img/mr_review_second_comment_added.png | Bin 46448 -> 0 bytes .../img/review_comment_quickactions.png | Bin 78891 -> 0 bytes .../discussions/img/review_preview_v13_11.png | Bin 28261 -> 0 bytes doc/user/discussions/index.md | 91 +----- doc/user/gitlab_com/index.md | 3 +- doc/user/project/merge_requests/changes.md | 151 +++++++++ .../project/merge_requests/getting_started.md | 2 +- .../{reviews => }/img/commit_nav_v13_11.png | Bin .../{reviews => }/img/file_by_file_v13_2.png | Bin ...tally_expand_merge_request_diffs_v12_2.png | Bin .../{reviews => }/img/merge_request_diff.png | Bin .../merge_request_diff_file_navigation.png | Bin .../img/merge_request_diff_v12_2.png | Bin doc/user/project/merge_requests/index.md | 28 +- .../img/group_merge_requests_list_view.png | Bin 89620 -> 0 bytes .../img/mr_review_new_comment_v13_11.png | Bin .../reviews}/img/mr_review_resolve.png | Bin .../reviews}/img/mr_review_resolve2.png | Bin .../reviews}/img/mr_review_start.png | Bin .../reviews}/img/mr_review_unresolve.png | Bin .../reviews}/img/pending_review_comment.png | Bin .../project/merge_requests/reviews/index.md | 308 +++++++----------- .../merge_requests/reviews/suggestions.md | 74 ++--- lib/api/project_import.rb | 90 +++-- lib/gitlab/import_export/file_importer.rb | 12 +- .../known_events/epic_events.yml | 8 + .../groups/runners_controller_spec.rb | 3 + spec/factories/ci/runner_namespaces.rb | 8 + .../vue_shared/security_reports/mock_data.js | 110 ++++++- .../vue_shared/security_reports/utils_spec.js | 25 +- spec/models/ci/runner_namespace_spec.rb | 9 + spec/models/ci/runner_project_spec.rb | 9 + .../api/ci/runner/runners_post_spec.rb | 30 ++ spec/requests/api/ci/runners_spec.rb | 13 + spec/requests/api/project_import_spec.rb | 76 +++++ ...e_project_from_remote_file_service_spec.rb | 182 +++++++++++ ...project_from_uploaded_file_service_spec.rb | 71 ++++ 113 files changed, 1635 insertions(+), 809 deletions(-) create mode 100644 app/assets/javascripts/vue_shared/security_reports/queries/security_report_mr_download_paths.query.graphql create mode 100644 app/assets/javascripts/vue_shared/security_reports/queries/security_report_pipeline_download_paths.query.graphql create mode 100644 app/services/import/gitlab_projects/create_project_from_remote_file_service.rb create mode 100644 app/services/import/gitlab_projects/create_project_from_uploaded_file_service.rb create mode 100644 changelogs/unreleased/329243-add-description-rollover-iteration-cadences.yml create mode 100644 changelogs/unreleased/kassio-import-from-external-object-storage.yml create mode 100644 changelogs/unreleased/pedropombeiro-321368-limit-number-of-runners.yml create mode 100644 changelogs/unreleased/sh-fix-commit-pipelines-table.yml create mode 100644 config/feature_flags/development/ci_runner_limits.yml create mode 100644 config/feature_flags/development/import_project_from_remote_file.yml delete mode 100644 config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml delete mode 100644 config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml delete mode 100644 config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml delete mode 100644 config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml create mode 100644 config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml create mode 100644 config/metrics/counts_7d/20210216182104_design_action_weekly.yml create mode 100644 config/metrics/counts_7d/20210216182107_project_action_weekly.yml rename config/metrics/{counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml => counts_7d/20210216184045_git_write_action_weekly.yml} (52%) delete mode 100644 config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml delete mode 100644 config/metrics/counts_all/20210216182001_protected_branches.yml delete mode 100644 config/metrics/counts_all/20210216182008_template_repositories.yml delete mode 100644 config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml delete mode 100644 config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml delete mode 100644 config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml delete mode 100644 config/metrics/counts_all/20210216182025_protected_branches.yml delete mode 100644 config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml delete mode 100644 config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml delete mode 100644 config/metrics/counts_all/20210216183344_users_using_path_locks.yml delete mode 100644 config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml create mode 100644 db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb create mode 100644 db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb create mode 100644 db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb create mode 100644 db/migrate/20210423164702_insert_runner_registration_plan_limits.rb create mode 100644 db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb create mode 100644 db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb create mode 100644 db/schema_migrations/20210419203017 create mode 100644 db/schema_migrations/20210419203018 create mode 100644 db/schema_migrations/20210423155059 create mode 100644 db/schema_migrations/20210423164702 create mode 100644 db/schema_migrations/20210427194958 create mode 100644 db/schema_migrations/20210427200840 delete mode 100644 doc/user/discussions/img/mr_review_second_comment.png delete mode 100644 doc/user/discussions/img/mr_review_second_comment_added.png delete mode 100644 doc/user/discussions/img/review_comment_quickactions.png delete mode 100644 doc/user/discussions/img/review_preview_v13_11.png create mode 100644 doc/user/project/merge_requests/changes.md rename doc/user/project/merge_requests/{reviews => }/img/commit_nav_v13_11.png (100%) rename doc/user/project/merge_requests/{reviews => }/img/file_by_file_v13_2.png (100%) rename doc/user/project/merge_requests/{reviews => }/img/incrementally_expand_merge_request_diffs_v12_2.png (100%) rename doc/user/project/merge_requests/{reviews => }/img/merge_request_diff.png (100%) rename doc/user/project/merge_requests/{reviews => }/img/merge_request_diff_file_navigation.png (100%) rename doc/user/project/merge_requests/{reviews => }/img/merge_request_diff_v12_2.png (100%) delete mode 100644 doc/user/project/merge_requests/reviews/img/group_merge_requests_list_view.png rename doc/user/{discussions => project/merge_requests/reviews}/img/mr_review_new_comment_v13_11.png (100%) rename doc/user/{discussions => project/merge_requests/reviews}/img/mr_review_resolve.png (100%) rename doc/user/{discussions => project/merge_requests/reviews}/img/mr_review_resolve2.png (100%) rename doc/user/{discussions => project/merge_requests/reviews}/img/mr_review_start.png (100%) rename doc/user/{discussions => project/merge_requests/reviews}/img/mr_review_unresolve.png (100%) rename doc/user/{discussions => project/merge_requests/reviews}/img/pending_review_comment.png (100%) create mode 100644 spec/factories/ci/runner_namespaces.rb create mode 100644 spec/models/ci/runner_namespace_spec.rb create mode 100644 spec/models/ci/runner_project_spec.rb create mode 100644 spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb create mode 100644 spec/services/import/gitlab_projects/create_project_from_uploaded_file_service_spec.rb diff --git a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js index 6f496ffc6ae..29ad6cc4125 100644 --- a/app/assets/javascripts/commit/pipelines/pipelines_bundle.js +++ b/app/assets/javascripts/commit/pipelines/pipelines_bundle.js @@ -27,6 +27,10 @@ export default () => { if (pipelineTableViewEl.dataset.disableInitialization === undefined) { const table = new Vue({ + provide: { + artifactsEndpoint: pipelineTableViewEl.dataset.artifactsEndpoint, + artifactsEndpointPlaceholder: pipelineTableViewEl.dataset.artifactsEndpointPlaceholder, + }, render(createElement) { return createElement(CommitPipelinesTable, { props: { diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index 67b24793a65..d5db9f43d09 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -355,6 +355,8 @@ export default class MergeRequestTabs { this.commitPipelinesTable = new Vue({ provide: { + artifactsEndpoint: pipelineTableViewEl.dataset.artifactsEndpoint, + artifactsEndpointPlaceholder: pipelineTableViewEl.dataset.artifactsEndpointPlaceholder, targetProjectFullPath: mrWidgetData?.target_project_full_path || '', }, render(createElement) { diff --git a/app/assets/javascripts/vue_shared/security_reports/queries/security_report_mr_download_paths.query.graphql b/app/assets/javascripts/vue_shared/security_reports/queries/security_report_mr_download_paths.query.graphql new file mode 100644 index 00000000000..4ce13827da2 --- /dev/null +++ b/app/assets/javascripts/vue_shared/security_reports/queries/security_report_mr_download_paths.query.graphql @@ -0,0 +1,24 @@ +query securityReportDownloadPaths( + $projectPath: ID! + $iid: String! + $reportTypes: [SecurityReportTypeEnum!] +) { + project(fullPath: $projectPath) { + mergeRequest(iid: $iid) { + headPipeline { + id + jobs(securityReportTypes: $reportTypes) { + nodes { + name + artifacts { + nodes { + downloadPath + fileType + } + } + } + } + } + } + } +} diff --git a/app/assets/javascripts/vue_shared/security_reports/queries/security_report_pipeline_download_paths.query.graphql b/app/assets/javascripts/vue_shared/security_reports/queries/security_report_pipeline_download_paths.query.graphql new file mode 100644 index 00000000000..c7e9fa16418 --- /dev/null +++ b/app/assets/javascripts/vue_shared/security_reports/queries/security_report_pipeline_download_paths.query.graphql @@ -0,0 +1,18 @@ +query getCorpuses($projectPath: ID!, $iid: ID, $reportTypes: [SecurityReportTypeEnum!]) { + project(fullPath: $projectPath) { + pipeline(iid: $iid) { + id + jobs(securityReportTypes: $reportTypes) { + nodes { + name + artifacts { + nodes { + downloadPath + fileType + } + } + } + } + } + } +} diff --git a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue index 1151cffa76f..d10ddd13cad 100644 --- a/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue +++ b/app/assets/javascripts/vue_shared/security_reports/security_reports_app.vue @@ -16,7 +16,7 @@ import { import securityReportDownloadPathsQuery from './queries/security_report_download_paths.query.graphql'; import store from './store'; import { MODULE_SAST, MODULE_SECRET_DETECTION } from './store/constants'; -import { extractSecurityReportArtifacts } from './utils'; +import { extractSecurityReportArtifactsFromMergeRequest } from './utils'; export default { store, @@ -97,7 +97,7 @@ export default { }; }, update(data) { - return extractSecurityReportArtifacts(this.$options.reportTypes, data); + return extractSecurityReportArtifactsFromMergeRequest(this.$options.reportTypes, data); }, error(error) { this.showError(error); diff --git a/app/assets/javascripts/vue_shared/security_reports/utils.js b/app/assets/javascripts/vue_shared/security_reports/utils.js index ad819bf7081..c3f24a7e52f 100644 --- a/app/assets/javascripts/vue_shared/security_reports/utils.js +++ b/app/assets/javascripts/vue_shared/security_reports/utils.js @@ -14,9 +14,7 @@ const addReportTypeIfExists = (acc, reportTypes, reportType, getName, downloadPa } }; -export const extractSecurityReportArtifacts = (reportTypes, data) => { - const jobs = data.project?.mergeRequest?.headPipeline?.jobs?.nodes ?? []; - +const extractSecurityReportArtifacts = (reportTypes, jobs) => { return jobs.reduce((acc, job) => { const artifacts = job.artifacts?.nodes ?? []; @@ -41,3 +39,13 @@ export const extractSecurityReportArtifacts = (reportTypes, data) => { return acc; }, []); }; + +export const extractSecurityReportArtifactsFromPipeline = (reportTypes, data) => { + const jobs = data.project?.pipeline?.jobs?.nodes ?? []; + return extractSecurityReportArtifacts(reportTypes, jobs); +}; + +export const extractSecurityReportArtifactsFromMergeRequest = (reportTypes, data) => { + const jobs = data.project?.mergeRequest?.headPipeline?.jobs?.nodes ?? []; + return extractSecurityReportArtifacts(reportTypes, jobs); +}; diff --git a/app/models/ci/runner_namespace.rb b/app/models/ci/runner_namespace.rb index e6c1899c89d..f819dda207d 100644 --- a/app/models/ci/runner_namespace.rb +++ b/app/models/ci/runner_namespace.rb @@ -3,6 +3,11 @@ module Ci class RunnerNamespace < ApplicationRecord extend Gitlab::Ci::Model + include Limitable + + self.limit_name = 'ci_registered_group_runners' + self.limit_scope = :group + self.limit_feature_flag = :ci_runner_limits belongs_to :runner, inverse_of: :runner_namespaces belongs_to :namespace, inverse_of: :runner_namespaces, class_name: '::Namespace' diff --git a/app/models/ci/runner_project.rb b/app/models/ci/runner_project.rb index f5bd50dc5a3..c26b8183b52 100644 --- a/app/models/ci/runner_project.rb +++ b/app/models/ci/runner_project.rb @@ -3,6 +3,11 @@ module Ci class RunnerProject < ApplicationRecord extend Gitlab::Ci::Model + include Limitable + + self.limit_name = 'ci_registered_project_runners' + self.limit_scope = :project + self.limit_feature_flag = :ci_runner_limits belongs_to :runner, inverse_of: :runner_projects belongs_to :project, inverse_of: :runner_projects diff --git a/app/models/concerns/limitable.rb b/app/models/concerns/limitable.rb index 3cb0bd85936..672bcdbbb1b 100644 --- a/app/models/concerns/limitable.rb +++ b/app/models/concerns/limitable.rb @@ -7,6 +7,7 @@ module Limitable included do class_attribute :limit_scope class_attribute :limit_name + class_attribute :limit_feature_flag self.limit_name = self.name.demodulize.tableize validate :validate_plan_limit_not_exceeded, on: :create @@ -25,6 +26,7 @@ module Limitable def validate_scoped_plan_limit_not_exceeded scope_relation = self.public_send(limit_scope) # rubocop:disable GitlabSecurity/PublicSend return unless scope_relation + return if limit_feature_flag && ::Feature.disabled?(limit_feature_flag, scope_relation, default_enabled: :yaml) relation = self.class.where(limit_scope => scope_relation) limits = scope_relation.actual_limits diff --git a/app/models/members_preloader.rb b/app/models/members_preloader.rb index a079aec76f2..e9b867308e1 100644 --- a/app/models/members_preloader.rb +++ b/app/models/members_preloader.rb @@ -13,7 +13,7 @@ class MembersPreloader ActiveRecord::Associations::Preloader.new.preload(members, :created_by) ActiveRecord::Associations::Preloader.new.preload(members, user: :status) ActiveRecord::Associations::Preloader.new.preload(members, user: :u2f_registrations) - ActiveRecord::Associations::Preloader.new.preload(members, user: :webauthn_registrations) + ActiveRecord::Associations::Preloader.new.preload(members, user: :webauthn_registrations) if Feature.enabled?(:webauthn) end end diff --git a/app/services/import/gitlab_projects/create_project_from_remote_file_service.rb b/app/services/import/gitlab_projects/create_project_from_remote_file_service.rb new file mode 100644 index 00000000000..bbfdaf692f9 --- /dev/null +++ b/app/services/import/gitlab_projects/create_project_from_remote_file_service.rb @@ -0,0 +1,74 @@ +# frozen_string_literal: true + +module Import + module GitlabProjects + class CreateProjectFromRemoteFileService < CreateProjectFromUploadedFileService + FILE_SIZE_LIMIT = 10.gigabytes + ALLOWED_CONTENT_TYPES = ['application/gzip'].freeze + + validate :valid_remote_import_url? + validate :validate_file_size + validate :validate_content_type + + private + + def required_params + [:path, :namespace, :remote_import_url] + end + + def project_params + super + .except(:file) + .merge(import_export_upload: ::ImportExportUpload.new( + remote_import_url: params[:remote_import_url] + )) + end + + def valid_remote_import_url? + ::Gitlab::UrlBlocker.validate!( + params[:remote_import_url], + allow_localhost: allow_local_requests?, + allow_local_network: allow_local_requests?, + schemes: %w(http https) + ) + + true + rescue ::Gitlab::UrlBlocker::BlockedUrlError => e + errors.add(:base, e.message) + + false + end + + def allow_local_requests? + ::Gitlab::CurrentSettings.allow_local_requests_from_web_hooks_and_services? + end + + def validate_content_type + if headers['content-type'].blank? + errors.add(:base, "Missing 'ContentType' header") + elsif !ALLOWED_CONTENT_TYPES.include?(headers['content-type']) + errors.add(:base, "Remote file content type '%{content_type}' not allowed. (Allowed content types: %{allowed})" % { + content_type: headers['content-type'], + allowed: ALLOWED_CONTENT_TYPES.join(',') + }) + end + end + + def validate_file_size + if headers['content-length'].to_i == 0 + errors.add(:base, "Missing 'ContentLength' header") + elsif headers['content-length'].to_i > FILE_SIZE_LIMIT + errors.add(:base, 'Remote file larger than limit. (limit %{limit})' % { + limit: ActiveSupport::NumberHelper.number_to_human_size(FILE_SIZE_LIMIT) + }) + end + end + + def headers + return {} if params[:remote_import_url].blank? || !valid_remote_import_url? + + @headers ||= Gitlab::HTTP.head(params[:remote_import_url]).headers + end + end + end +end diff --git a/app/services/import/gitlab_projects/create_project_from_uploaded_file_service.rb b/app/services/import/gitlab_projects/create_project_from_uploaded_file_service.rb new file mode 100644 index 00000000000..35d52a11288 --- /dev/null +++ b/app/services/import/gitlab_projects/create_project_from_uploaded_file_service.rb @@ -0,0 +1,65 @@ +# frozen_string_literal: true + +module Import + module GitlabProjects + class CreateProjectFromUploadedFileService + include ActiveModel::Validations + include ::Services::ReturnServiceResponses + + validate :required_params_presence + + def initialize(current_user, params = {}) + @current_user = current_user + @params = params.dup + end + + def execute + return error(errors.full_messages.first) unless valid? + return error(project.errors.full_messages&.first) unless project.saved? + + success(project) + rescue StandardError => e + error(e.message) + end + + private + + attr_reader :current_user, :params + + def error(message) + super(message, :bad_request) + end + + def project + @project ||= ::Projects::GitlabProjectsImportService.new( + current_user, + project_params, + params[:override] + ).execute + end + + def project_params + { + name: params[:name], + path: params[:path], + namespace_id: params[:namespace].id, + file: params[:file], + overwrite: params[:overwrite], + import_type: 'gitlab_project' + } + end + + def required_params + [:path, :namespace, :file] + end + + def required_params_presence + required_params + .select { |key| params[key].blank? } + .each do |missing_parameter| + errors.add(:base, "Parameter '#{missing_parameter}' is required") + end + end + end + end +end diff --git a/app/views/projects/commit/_pipelines_list.haml b/app/views/projects/commit/_pipelines_list.haml index 7f52e6ed7eb..16df743475d 100644 --- a/app/views/projects/commit/_pipelines_list.haml +++ b/app/views/projects/commit/_pipelines_list.haml @@ -1,7 +1,11 @@ - disable_initialization = local_assigns.fetch(:disable_initialization, false) +- artifacts_endpoint_placeholder = ':pipeline_artifacts_id' + #commit-pipeline-table-view{ data: { disable_initialization: disable_initialization, endpoint: endpoint, "empty-state-svg-path" => image_path('illustrations/pipelines_empty.svg'), "error-state-svg-path" => image_path('illustrations/pipelines_failed.svg'), "project-id": @project.id, + "artifacts-endpoint" => downloadable_artifacts_project_pipeline_path(@project, artifacts_endpoint_placeholder, format: :json), + "artifacts-endpoint-placeholder" => artifacts_endpoint_placeholder, } } diff --git a/changelogs/unreleased/329243-add-description-rollover-iteration-cadences.yml b/changelogs/unreleased/329243-add-description-rollover-iteration-cadences.yml new file mode 100644 index 00000000000..b826fb333f9 --- /dev/null +++ b/changelogs/unreleased/329243-add-description-rollover-iteration-cadences.yml @@ -0,0 +1,5 @@ +--- +title: Add description and roll_over columns to iterations_cadences +merge_request: 60436 +author: +type: added diff --git a/changelogs/unreleased/kassio-import-from-external-object-storage.yml b/changelogs/unreleased/kassio-import-from-external-object-storage.yml new file mode 100644 index 00000000000..ed50ae6221f --- /dev/null +++ b/changelogs/unreleased/kassio-import-from-external-object-storage.yml @@ -0,0 +1,7 @@ +--- +title: > + Create "projects/import-remote" to import a project using a remote object storage to fetch + the exported project +merge_request: 59033 +author: +type: added diff --git a/changelogs/unreleased/pedropombeiro-321368-limit-number-of-runners.yml b/changelogs/unreleased/pedropombeiro-321368-limit-number-of-runners.yml new file mode 100644 index 00000000000..dbb8ba61c07 --- /dev/null +++ b/changelogs/unreleased/pedropombeiro-321368-limit-number-of-runners.yml @@ -0,0 +1,5 @@ +--- +title: Introduce limit to number of registered runners +merge_request: 60157 +author: +type: added diff --git a/changelogs/unreleased/sh-fix-commit-pipelines-table.yml b/changelogs/unreleased/sh-fix-commit-pipelines-table.yml new file mode 100644 index 00000000000..e0330b27b2f --- /dev/null +++ b/changelogs/unreleased/sh-fix-commit-pipelines-table.yml @@ -0,0 +1,5 @@ +--- +title: Fix artifacts dropdown for merge request and commits pipelines tables +merge_request: 61045 +author: +type: fixed diff --git a/config/feature_flags/development/ci_runner_limits.yml b/config/feature_flags/development/ci_runner_limits.yml new file mode 100644 index 00000000000..e7d30dd086c --- /dev/null +++ b/config/feature_flags/development/ci_runner_limits.yml @@ -0,0 +1,8 @@ +--- +name: ci_runner_limits +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/60157 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/329438 +milestone: '13.12' +type: development +group: group::runner +default_enabled: false diff --git a/config/feature_flags/development/import_project_from_remote_file.yml b/config/feature_flags/development/import_project_from_remote_file.yml new file mode 100644 index 00000000000..9a44491172c --- /dev/null +++ b/config/feature_flags/development/import_project_from_remote_file.yml @@ -0,0 +1,8 @@ +--- +name: import_project_from_remote_file +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/59033 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/330039 +milestone: '13.12' +type: development +group: group::import +default_enabled: false diff --git a/config/metrics/counts_28d/20210216182034_deploy_keys.yml b/config/metrics/counts_28d/20210216182034_deploy_keys.yml index 80f50c7d1a5..0f5a6b3c03d 100644 --- a/config/metrics/counts_28d/20210216182034_deploy_keys.yml +++ b/config/metrics/counts_28d/20210216182034_deploy_keys.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.deploy_keys -description: +description: Count of users creating deploy keys in last 28 days. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182036_keys.yml b/config/metrics/counts_28d/20210216182036_keys.yml index d1299065115..eb82cc1f0e6 100644 --- a/config/metrics/counts_28d/20210216182036_keys.yml +++ b/config/metrics/counts_28d/20210216182036_keys.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.keys -description: +description: Count of users creating regular keys in last 28 days. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml index 6b42f18e664..bb64dcb32ca 100644 --- a/config/metrics/counts_28d/20210216182038_remote_mirrors.yml +++ b/config/metrics/counts_28d/20210216182038_remote_mirrors.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.remote_mirrors -description: +description: Count of users creating projects with remote mirrors. Includes both push and pull mirrors. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml index c75efaf0a80..f1f00fe59e3 100644 --- a/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml +++ b/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo -description: +description: Count of monthly active users who have performed any Git operation (read/write/push) product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml index 25405624b03..de369a47ffb 100644 --- a/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml +++ b/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write -description: Aggregated value for wiki, design and project repo actions +description: Aggregated value for wiki, design, and project repo Git write actions product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml deleted file mode 100644 index dfacce63f05..00000000000 --- a/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: 28d -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml b/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml deleted file mode 100644 index d87b910d239..00000000000 --- a/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage_monthly.create.projects_with_repositories_enabled -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: 28d -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_28d/20210216182051_protected_branches.yml b/config/metrics/counts_28d/20210216182051_protected_branches.yml index 81d23653307..83c923c173e 100644 --- a/config/metrics/counts_28d/20210216182051_protected_branches.yml +++ b/config/metrics/counts_28d/20210216182051_protected_branches.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage_monthly.create.protected_branches -description: +description: Count of users creating projects with repositories making use of at least one protected branch in last 28 days. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: 28d -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml index af59d1a1235..527cc42df22 100644 --- a/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml +++ b/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml @@ -1,16 +1,18 @@ --- key_path: redis_hll_counters.source_code.wiki_action_monthly -description: +description: Count of unique actions done on a wiki (create, edit, delete) product_section: dev product_stage: create product_group: group::source code -product_category: +product_category: source_code_management value_type: number status: data_available time_frame: 28d data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml index 8feb369d0fa..971e3defe25 100644 --- a/config/metrics/counts_28d/20210216182106_design_action_monthly.yml +++ b/config/metrics/counts_28d/20210216182106_design_action_monthly.yml @@ -1,16 +1,18 @@ --- key_path: redis_hll_counters.source_code.design_action_monthly -description: +description: Count of total design actions (upload, delete, comment, reply) product_section: dev product_stage: create product_group: group::source code -product_category: +product_category: source_code_management value_type: number status: data_available time_frame: 28d data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml index 6047e6b6059..d60ec7f438b 100644 --- a/config/metrics/counts_28d/20210216182109_project_action_monthly.yml +++ b/config/metrics/counts_28d/20210216182109_project_action_monthly.yml @@ -1,16 +1,18 @@ --- key_path: redis_hll_counters.source_code.project_action_monthly -description: +description: Count of unique actions done on projects and related resources (create, edit, delete, comment) product_section: dev product_stage: create product_group: group::source code -product_category: +product_category: source_code_management value_type: number status: data_available time_frame: 28d data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml b/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml deleted file mode 100644 index e3980a944c6..00000000000 --- a/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage_monthly.create.total_number_of_path_locks -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' -value_type: number -status: data_available -time_frame: 28d -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml b/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml deleted file mode 100644 index 3808a2f2dcb..00000000000 --- a/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage_monthly.create.total_number_of_locked_files -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' -value_type: number -status: data_available -time_frame: 28d -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml index eb0ffa26d2a..e0c301b5c03 100644 --- a/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml +++ b/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml @@ -1,16 +1,18 @@ --- key_path: redis_hll_counters.source_code.git_write_action_monthly -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' +description: Count of unique Git write actions +product_section: dev +product_stage: create +product_group: group::source code +product_category: source_code_management value_type: number status: data_available time_frame: 28d data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml new file mode 100644 index 00000000000..e887858fe96 --- /dev/null +++ b/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml @@ -0,0 +1,18 @@ +--- +key_path: redis_hll_counters.source_code.wiki_action_weekly +description: Count of unique actions done on a wiki (create, edit, delete) +product_section: dev +product_stage: create +product_group: group::source code +product_category: source_code_management +value_type: number +status: data_available +time_frame: 7d +data_source: redis_hll +distribution: +- ee +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_7d/20210216182104_design_action_weekly.yml b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml new file mode 100644 index 00000000000..37744671757 --- /dev/null +++ b/config/metrics/counts_7d/20210216182104_design_action_weekly.yml @@ -0,0 +1,18 @@ +--- +key_path: redis_hll_counters.source_code.design_action_weekly +description: Count of total design actions (upload, delete, comment, reply) +product_section: dev +product_stage: create +product_group: group::source code +product_category: source_code_management +value_type: number +status: data_available +time_frame: 7d +data_source: redis_hll +distribution: +- ee +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_7d/20210216182107_project_action_weekly.yml b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml new file mode 100644 index 00000000000..6f6dc87783a --- /dev/null +++ b/config/metrics/counts_7d/20210216182107_project_action_weekly.yml @@ -0,0 +1,18 @@ +--- +key_path: redis_hll_counters.source_code.project_action_weekly +description: Count of unique actions done on projects and related resources (create, edit, delete, comment) +product_section: dev +product_stage: create +product_group: group::source code +product_category: source_code_management +value_type: number +status: data_available +time_frame: 7d +data_source: redis_hll +distribution: +- ce +- ee +tier: +- free +- premium +- ultimate diff --git a/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml similarity index 52% rename from config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml rename to config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml index c47fa49fe06..e14c0a39399 100644 --- a/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml +++ b/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml @@ -1,16 +1,18 @@ --- -key_path: usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval -description: +key_path: redis_hll_counters.source_code.git_write_action_weekly +description: Count of unique Git write actions product_section: dev product_stage: create product_group: group::source code product_category: source_code_management value_type: number status: data_available -time_frame: 28d -data_source: +time_frame: 7d +data_source: redis_hll distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml deleted file mode 100644 index 926ed501639..00000000000 --- a/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: counts.projects_with_repositories_enabled -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: -value_type: number -status: data_available -time_frame: all -data_source: database -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182001_protected_branches.yml b/config/metrics/counts_all/20210216182001_protected_branches.yml deleted file mode 100644 index cbd378bd93a..00000000000 --- a/config/metrics/counts_all/20210216182001_protected_branches.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: counts.protected_branches -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: database -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182002_remote_mirrors.yml b/config/metrics/counts_all/20210216182002_remote_mirrors.yml index f344a7c1640..c784bc57a00 100644 --- a/config/metrics/counts_all/20210216182002_remote_mirrors.yml +++ b/config/metrics/counts_all/20210216182002_remote_mirrors.yml @@ -1,6 +1,6 @@ --- key_path: counts.remote_mirrors -description: +description: Count of total remote mirrors. Includes both push and pull mirrors product_section: dev product_stage: create product_group: group::source code @@ -11,6 +11,8 @@ time_frame: all data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182004_commit_comment.yml b/config/metrics/counts_all/20210216182004_commit_comment.yml index 2e427d14acd..b7d7c08196a 100644 --- a/config/metrics/counts_all/20210216182004_commit_comment.yml +++ b/config/metrics/counts_all/20210216182004_commit_comment.yml @@ -1,16 +1,18 @@ --- key_path: counts.commit_comment -description: +description: Count of total unique commit comments. Does not include MR diff comments product_section: dev product_stage: create product_group: group::source code -product_category: code_review +product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: database +data_source: redis distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182006_source_code_pushes.yml b/config/metrics/counts_all/20210216182006_source_code_pushes.yml index 824761adaee..980314f6829 100644 --- a/config/metrics/counts_all/20210216182006_source_code_pushes.yml +++ b/config/metrics/counts_all/20210216182006_source_code_pushes.yml @@ -1,6 +1,6 @@ --- key_path: counts.source_code_pushes -description: +description: Count of total Git push operations product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: database +data_source: redis distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182008_template_repositories.yml b/config/metrics/counts_all/20210216182008_template_repositories.yml deleted file mode 100644 index 888f5d96ab6..00000000000 --- a/config/metrics/counts_all/20210216182008_template_repositories.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: counts.template_repositories -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: database -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182010_deploy_keys.yml b/config/metrics/counts_all/20210216182010_deploy_keys.yml index 2ddc48c2e0a..c7af2e13af2 100644 --- a/config/metrics/counts_all/20210216182010_deploy_keys.yml +++ b/config/metrics/counts_all/20210216182010_deploy_keys.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage.create.deploy_keys -description: +description: Count of users creating deploy keys. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182012_keys.yml b/config/metrics/counts_all/20210216182012_keys.yml index 1872abc6776..449b56b6994 100644 --- a/config/metrics/counts_all/20210216182012_keys.yml +++ b/config/metrics/counts_all/20210216182012_keys.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage.create.keys -description: +description: Count of users creating regular keys. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml index 62883077ad5..7ddcdde577c 100644 --- a/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml +++ b/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request -description: +description: Total count of projects that do not allow overriding approvers on discrete merge requests product_section: dev product_stage: create product_group: group::source code @@ -8,10 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: +data_source: database distribution: - ce - ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml index 8518e3700bb..78ba2fed801 100644 --- a/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml +++ b/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request -description: +description: Count of total projects that do not disable overriding approvers per discrete merge request product_section: dev product_stage: create product_group: group::source code @@ -8,10 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: +data_source: database distribution: - ce - ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182017_remote_mirrors.yml b/config/metrics/counts_all/20210216182017_remote_mirrors.yml index f9edec7260b..e3b25e3bd37 100644 --- a/config/metrics/counts_all/20210216182017_remote_mirrors.yml +++ b/config/metrics/counts_all/20210216182017_remote_mirrors.yml @@ -1,6 +1,6 @@ --- key_path: usage_activity_by_stage.create.remote_mirrors -description: +description: Count of users creating projects with remote mirrors. product_section: dev product_stage: create product_group: group::source code @@ -8,9 +8,11 @@ product_category: source_code_management value_type: number status: data_available time_frame: all -data_source: +data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml b/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml deleted file mode 100644 index 3ccbc99a4f1..00000000000 --- a/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.projects_enforcing_code_owner_approval -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml b/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml deleted file mode 100644 index fcba0993477..00000000000 --- a/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.projects_with_sectional_code_owner_rules -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml b/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml deleted file mode 100644 index a850295aea6..00000000000 --- a/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.projects_with_repositories_enabled -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182025_protected_branches.yml b/config/metrics/counts_all/20210216182025_protected_branches.yml deleted file mode 100644 index f914c5dae6c..00000000000 --- a/config/metrics/counts_all/20210216182025_protected_branches.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.protected_branches -description: -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml b/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml deleted file mode 100644 index 9ce0b935888..00000000000 --- a/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.total_number_of_path_locks -description: The total number of default branch locks done through the GitLab UI -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml b/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml deleted file mode 100644 index 136472a59e4..00000000000 --- a/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.total_number_of_locked_files -description: The total number of exclusive file locks (through the CLI) -product_section: dev -product_stage: create -product_group: group::source code -product_category: source_code_management -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml index 66f616f16ee..cae090955c1 100644 --- a/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml +++ b/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml @@ -1,16 +1,18 @@ --- key_path: counts.protected_branches_except_default -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' +description: Count of branches that have been protected and are not the default branch +product_section: dev +product_stage: create +product_group: group::source code +product_category: source_code_management value_type: number status: data_available time_frame: all data_source: database distribution: - ce +- ee tier: - free -skip_validation: true +- premium +- ultimate diff --git a/config/metrics/counts_all/20210216183344_users_using_path_locks.yml b/config/metrics/counts_all/20210216183344_users_using_path_locks.yml deleted file mode 100644 index f75db6ede2e..00000000000 --- a/config/metrics/counts_all/20210216183344_users_using_path_locks.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.users_using_path_locks -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml b/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml deleted file mode 100644 index b232c6bbb41..00000000000 --- a/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -key_path: usage_activity_by_stage.create.users_using_lfs_locks -description: '' -product_section: '' -product_stage: '' -product_group: '' -product_category: '' -value_type: number -status: data_available -time_frame: all -data_source: -distribution: -- ce -tier: -- free -skip_validation: true diff --git a/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb b/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb new file mode 100644 index 00000000000..00c5329406e --- /dev/null +++ b/db/migrate/20210419203017_add_remote_import_url_to_import_export_upload.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddRemoteImportUrlToImportExportUpload < ActiveRecord::Migration[6.0] + # limit is added in 20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb + def change + add_column :import_export_uploads, :remote_import_url, :text # rubocop:disable Migration/AddLimitToTextColumns + end +end diff --git a/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb b/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb new file mode 100644 index 00000000000..81b4e76b8d9 --- /dev/null +++ b/db/migrate/20210419203018_add_remote_text_limit_to_import_url_in_import_export_upload.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class AddRemoteTextLimitToImportUrlInImportExportUpload < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def up + add_text_limit :import_export_uploads, :remote_import_url, 512 + end + + def down + remove_text_limit :import_export_uploads, :remote_import_url + end +end diff --git a/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb b/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb new file mode 100644 index 00000000000..5382e596d8c --- /dev/null +++ b/db/migrate/20210423155059_add_runner_registration_to_plan_limits.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +class AddRunnerRegistrationToPlanLimits < ActiveRecord::Migration[6.0] + def change + add_column(:plan_limits, :ci_registered_group_runners, :integer, default: 1000, null: false) + add_column(:plan_limits, :ci_registered_project_runners, :integer, default: 1000, null: false) + end +end diff --git a/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb b/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb new file mode 100644 index 00000000000..36d13dfa120 --- /dev/null +++ b/db/migrate/20210423164702_insert_runner_registration_plan_limits.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +class InsertRunnerRegistrationPlanLimits < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + def up + create_or_update_plan_limit('ci_registered_group_runners', 'free', 50) + create_or_update_plan_limit('ci_registered_group_runners', 'bronze', 1000) + create_or_update_plan_limit('ci_registered_group_runners', 'silver', 1000) + create_or_update_plan_limit('ci_registered_group_runners', 'gold', 1000) + + create_or_update_plan_limit('ci_registered_project_runners', 'free', 50) + create_or_update_plan_limit('ci_registered_project_runners', 'bronze', 1000) + create_or_update_plan_limit('ci_registered_project_runners', 'silver', 1000) + create_or_update_plan_limit('ci_registered_project_runners', 'gold', 1000) + end + + def down + %w[group project].each do |scope| + create_or_update_plan_limit("ci_registered_#{scope}_runners", 'free', 1000) + create_or_update_plan_limit("ci_registered_#{scope}_runners", 'bronze', 1000) + create_or_update_plan_limit("ci_registered_#{scope}_runners", 'silver', 1000) + create_or_update_plan_limit("ci_registered_#{scope}_runners", 'gold', 1000) + end + end +end diff --git a/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb b/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb new file mode 100644 index 00000000000..fbae2a14d2d --- /dev/null +++ b/db/migrate/20210427194958_add_description_roll_over_to_iterations_cadences.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +class AddDescriptionRollOverToIterationsCadences < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + def up + with_lock_retries do + add_column :iterations_cadences, :roll_over, :boolean, null: false, default: false + add_column :iterations_cadences, :description, :text # rubocop:disable Migration/AddLimitToTextColumns + end + end + + def down + with_lock_retries do + remove_column :iterations_cadences, :roll_over + remove_column :iterations_cadences, :description + end + end +end diff --git a/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb b/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb new file mode 100644 index 00000000000..a146f295de3 --- /dev/null +++ b/db/migrate/20210427200840_add_text_limit_to_iterations_cadences_description.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class AddTextLimitToIterationsCadencesDescription < ActiveRecord::Migration[6.0] + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def up + add_text_limit :iterations_cadences, :description, 5000 + end + + def down + remove_text_limit :iterations_cadences, :description + end +end diff --git a/db/schema_migrations/20210419203017 b/db/schema_migrations/20210419203017 new file mode 100644 index 00000000000..8421fd7c6d9 --- /dev/null +++ b/db/schema_migrations/20210419203017 @@ -0,0 +1 @@ +1ca5f960c233be5d5a30632b8aaad9598c259154eee817f4d76e8f1bb3e95edb \ No newline at end of file diff --git a/db/schema_migrations/20210419203018 b/db/schema_migrations/20210419203018 new file mode 100644 index 00000000000..f28ebe78fc6 --- /dev/null +++ b/db/schema_migrations/20210419203018 @@ -0,0 +1 @@ +94404ed645a9c8a0ee462baff98cf2d0e50aecdb71bb1515fd3a82bf1a39dfda \ No newline at end of file diff --git a/db/schema_migrations/20210423155059 b/db/schema_migrations/20210423155059 new file mode 100644 index 00000000000..2ac51dcdd2b --- /dev/null +++ b/db/schema_migrations/20210423155059 @@ -0,0 +1 @@ +c582b7dda33492e122725001200aeb470cbf4458f247728a3b2102e325c97193 \ No newline at end of file diff --git a/db/schema_migrations/20210423164702 b/db/schema_migrations/20210423164702 new file mode 100644 index 00000000000..3f800be3749 --- /dev/null +++ b/db/schema_migrations/20210423164702 @@ -0,0 +1 @@ +b5e34f7827edcdf81c66250353cddc3481e39c693f983df610b8ed20c58cb65b \ No newline at end of file diff --git a/db/schema_migrations/20210427194958 b/db/schema_migrations/20210427194958 new file mode 100644 index 00000000000..a707b804ba9 --- /dev/null +++ b/db/schema_migrations/20210427194958 @@ -0,0 +1 @@ +0a7bf3fe10a5eca94392a599d0736c881065a0b2c33bb383c0b91eb5ac453db9 \ No newline at end of file diff --git a/db/schema_migrations/20210427200840 b/db/schema_migrations/20210427200840 new file mode 100644 index 00000000000..3e84d260952 --- /dev/null +++ b/db/schema_migrations/20210427200840 @@ -0,0 +1 @@ +7e90e64df39205c79a67acc311cd58dd9b55d2b3919d58749e3253854f99a44a \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 624e74bdd9a..2f833db4290 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -13565,7 +13565,9 @@ CREATE TABLE import_export_uploads ( project_id integer, import_file text, export_file text, - group_id bigint + group_id bigint, + remote_import_url text, + CONSTRAINT check_58f0d37481 CHECK ((char_length(remote_import_url) <= 512)) ); CREATE SEQUENCE import_export_uploads_id_seq @@ -13993,6 +13995,9 @@ CREATE TABLE iterations_cadences ( active boolean DEFAULT true NOT NULL, automatic boolean DEFAULT true NOT NULL, title text NOT NULL, + roll_over boolean DEFAULT false NOT NULL, + description text, + CONSTRAINT check_5c5d2b44bd CHECK ((char_length(description) <= 5000)), CONSTRAINT check_fedff82d3b CHECK ((char_length(title) <= 255)) ); @@ -16025,7 +16030,9 @@ CREATE TABLE plan_limits ( daily_invites integer DEFAULT 0 NOT NULL, rubygems_max_file_size bigint DEFAULT '3221225472'::bigint NOT NULL, terraform_module_max_file_size bigint DEFAULT 1073741824 NOT NULL, - helm_max_file_size bigint DEFAULT 5242880 NOT NULL + helm_max_file_size bigint DEFAULT 5242880 NOT NULL, + ci_registered_group_runners integer DEFAULT 1000 NOT NULL, + ci_registered_project_runners integer DEFAULT 1000 NOT NULL ); CREATE SEQUENCE plan_limits_id_seq diff --git a/doc/administration/external_pipeline_validation.md b/doc/administration/external_pipeline_validation.md index f8329b24d6c..ba5adecf7ed 100644 --- a/doc/administration/external_pipeline_validation.md +++ b/doc/administration/external_pipeline_validation.md @@ -25,6 +25,10 @@ Response codes: - `4XX`: Not accepted - All other codes: accepted and logged +### Service Result + +Pipelines not accepted by the external validation service aren't created or visible in pipeline lists, in either the GitLab user interface or API. Creating an unaccepted pipeline when using the GitLab user interface displays an error message that states: `Pipeline cannot be run. External validation failed` + ## Configuration To configure external pipeline validation, add the diff --git a/doc/administration/instance_limits.md b/doc/administration/instance_limits.md index fca38a627f6..044a7403e8b 100644 --- a/doc/administration/instance_limits.md +++ b/doc/administration/instance_limits.md @@ -435,6 +435,32 @@ installation, run the following in the [GitLab Rails console](operations/rails_c Plan.default.actual_limits.update!(ci_max_artifact_size_junit: 10) ``` +### Number of registered runners per scope + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/321368) in GitLab 13.12. + +The total number of registered runners is limited at the group and project +levels. Each time a new runner is registered, GitLab checks these limits. A +runner's registration fails if it exceeds the limit for the scope determined by +the runner registration token. + +- GitLab SaaS subscribers have different limits defined per plan, affecting all projects using that plan. +- Self-managed GitLab Premium and Ultimate limits are defined by a default plan that affects all projects: + + | Runner scope | Default value | + |---------------------------------------------|---------------| + | `ci_registered_group_runners` | 1000 | + | `ci_registered_project_runners` | 1000 | + + To update these limits, run the following in the + [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session): + + ```ruby + # Use ci_registered_group_runners or ci_registered_project_runners + # depending on desired scope + Plan.default.actual_limits.update!(ci_registered_project_runners: 100) + ``` + ## Instance monitoring and metrics ### Incident Management inbound alert limits diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 6651da9267c..b55a2000d69 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -2498,9 +2498,11 @@ Input type: `IterationCadenceCreateInput` | `active` | [`Boolean!`](#boolean) | Whether the iteration cadence is active. | | `automatic` | [`Boolean!`](#boolean) | Whether the iteration cadence should automatically generate future iterations. | | `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. | +| `description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. | | `durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. | | `groupPath` | [`ID!`](#id) | The group where the iteration cadence is created. | | `iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. | +| `rollOver` | [`Boolean`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. | | `startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. | | `title` | [`String`](#string) | Title of the iteration cadence. | @@ -2542,9 +2544,11 @@ Input type: `IterationCadenceUpdateInput` | `active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. | | `automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. | | `clientMutationId` | [`String`](#string) | A unique identifier for the client performing the mutation. | +| `description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. | | `durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. | | `id` | [`IterationsCadenceID!`](#iterationscadenceid) | Global ID of the iteration cadence. | | `iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. | +| `rollOver` | [`Boolean`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. | | `startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. | | `title` | [`String`](#string) | Title of the iteration cadence. | @@ -9431,9 +9435,11 @@ Represents an iteration cadence. | ---- | ---- | ----------- | | `active` | [`Boolean`](#boolean) | Whether the iteration cadence is active. | | `automatic` | [`Boolean`](#boolean) | Whether the iteration cadence should automatically generate future iterations. | +| `description` | [`String`](#string) | Description of the iteration cadence. Maximum length is 5000 characters. | | `durationInWeeks` | [`Int`](#int) | Duration in weeks of the iterations within this cadence. | | `id` | [`IterationsCadenceID!`](#iterationscadenceid) | Global ID of the iteration cadence. | | `iterationsInAdvance` | [`Int`](#int) | Future iterations to be created when iteration cadence is set to automatic. | +| `rollOver` | [`Boolean!`](#boolean) | Whether the iteration cadence should roll over issues to the next iteration or not. | | `startDate` | [`Time`](#time) | Timestamp of the iteration cadence start date. | | `title` | [`String!`](#string) | Title of the iteration cadence. | diff --git a/doc/development/usage_ping/dictionary.md b/doc/development/usage_ping/dictionary.md index def7ac9dee3..e0cfc3cba80 100644 --- a/doc/development/usage_ping/dictionary.md +++ b/doc/development/usage_ping/dictionary.md @@ -862,7 +862,7 @@ Tiers: `free`, `premium`, `ultimate` ### `counts.commit_comment` -Missing description +Count of total unique commit comments. Does not include MR diff comments [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182004_commit_comment.yml) @@ -870,7 +870,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `counts.confidential_epics` @@ -5170,15 +5170,15 @@ Tiers: `free` ### `counts.projects_with_repositories_enabled` -Missing description +Count of users creating projects that have a matching Git repository, result of a Git push action. -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216181959_projects_with_repositories_enabled.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `counts.projects_with_terraform_reports` @@ -5230,27 +5230,27 @@ Tiers: `free`, `premium`, `ultimate` ### `counts.protected_branches` -Missing description +Count of total protected branches -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182001_protected_branches.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182001_protected_branches.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `counts.protected_branches_except_default` -Missing description +Count of branches that have been protected and are not the default branch [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182454_protected_branches_except_default.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `counts.releases` @@ -5266,7 +5266,7 @@ Tiers: `free` ### `counts.remote_mirrors` -Missing description +Count of total remote mirrors. Includes both push and pull mirrors [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182002_remote_mirrors.yml) @@ -5274,7 +5274,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `counts.requirement_test_reports_ci` @@ -5422,7 +5422,7 @@ Tiers: `free`, `premium`, `ultimate` ### `counts.source_code_pushes` -Missing description +Count of total Git push operations [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182006_source_code_pushes.yml) @@ -5430,7 +5430,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `counts.static_site_editor_commits` @@ -5542,15 +5542,15 @@ Tiers: `free`, `premium`, `ultimate` ### `counts.template_repositories` -Missing description +Count of total repo templates used to aggregate all file templates -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182008_template_repositories.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182008_template_repositories.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `counts.templates_asana_active` @@ -10724,6 +10724,30 @@ Status: `implemented` Tiers: `premium`, `ultimate` +### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_parent_monthly` + +Counts of MAU updating parent on epic + +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210423011841_g_project_management_users_updating_epic_parent_monthly.yml) + +Group: `group::product planning` + +Status: `implemented` + +Tiers: `premium`, `ultimate` + +### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_parent_weekly` + +Counts of WAU updating parent on epic + +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210423012053_g_project_management_users_updating_epic_parent_weekly.yml) + +Group: `group::product planning` + +Status: `implemented` + +Tiers: `premium`, `ultimate` + ### `redis_hll_counters.epics_usage.g_project_management_users_updating_epic_titles_monthly` Counts of MAU changing epic titles @@ -13966,7 +13990,7 @@ Tiers: ### `redis_hll_counters.source_code.design_action_monthly` -Missing description +Count of total design actions (upload, delete, comment, reply) [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182106_design_action_monthly.yml) @@ -13974,43 +13998,43 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.design_action_weekly` -Missing description +Count of total design actions (upload, delete, comment, reply) -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182104_design_action_weekly.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182104_design_action_weekly.yml) Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.git_write_action_monthly` -Missing description +Count of unique Git write actions [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216184047_git_write_action_monthly.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.git_write_action_weekly` -Missing description +Count of unique Git write actions -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216184045_git_write_action_weekly.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.i_source_code_code_intelligence_monthly` @@ -14062,7 +14086,7 @@ Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.project_action_monthly` -Missing description +Count of unique actions done on projects and related resources (create, edit, delete, comment) [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182109_project_action_monthly.yml) @@ -14070,23 +14094,23 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.project_action_weekly` -Missing description +Count of unique actions done on projects and related resources (create, edit, delete, comment) -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182107_project_action_weekly.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182107_project_action_weekly.yml) Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.wiki_action_monthly` -Missing description +Count of unique actions done on a wiki (create, edit, delete) [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182102_wiki_action_monthly.yml) @@ -14094,19 +14118,19 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.source_code.wiki_action_weekly` -Missing description +Count of unique actions done on a wiki (create, edit, delete) -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_7d/20210216182100_wiki_action_weekly.yml) Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `free`, `premium`, `ultimate` ### `redis_hll_counters.terraform.p_terraform_state_api_unique_users_monthly` @@ -15096,7 +15120,7 @@ Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.approval_project_rules` -Number of project approval rules +Total number of project approval rules [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182030_approval_project_rules.yml) @@ -15104,7 +15128,7 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.approval_project_rules_with_exact_required_approvers` @@ -15144,7 +15168,7 @@ Tiers: `free` ### `usage_activity_by_stage.create.approval_project_rules_with_target_branch` -Number of project approval rules with not default target branch +Number of project approval rules scoped to a specific repo branch. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182032_approval_project_rules_with_target_branch.yml) @@ -15152,11 +15176,11 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.deploy_keys` -Missing description +Count of users creating deploy keys. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182010_deploy_keys.yml) @@ -15164,11 +15188,11 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.keys` -Missing description +Count of users creating regular keys. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182012_keys.yml) @@ -15176,7 +15200,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.merge_requests` @@ -15240,15 +15264,15 @@ Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.projects_enforcing_code_owner_approval` -Missing description +Count of users creating projects that require approval by code owners for code changes. -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182019_projects_enforcing_code_owner_approval.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.projects_imported_from_github` @@ -15264,7 +15288,7 @@ Tiers: `free` ### `usage_activity_by_stage.create.projects_with_disable_overriding_approvers_per_merge_request` -Missing description +Total count of projects that do not allow overriding approvers on discrete merge requests [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182014_projects_with_disable_overriding_approvers_per_merge_request.yml) @@ -15272,35 +15296,35 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.projects_with_repositories_enabled` -Missing description +Count of projects that have a matching Git repository, result of a Git push action -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182023_projects_with_repositories_enabled.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.projects_with_sectional_code_owner_rules` -Missing description +Count of projects using code owners with code owners section feature -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182021_projects_with_sectional_code_owner_rules.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.projects_without_disable_overriding_approvers_per_merge_request` -Missing description +Count of total projects that do not disable overriding approvers per discrete merge request [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182015_projects_without_disable_overriding_approvers_per_merge_request.yml) @@ -15308,23 +15332,23 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.protected_branches` -Missing description +Count of users creating projects with repositories making use of at least one protected branch. -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182025_protected_branches.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182025_protected_branches.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.remote_mirrors` -Missing description +Count of users creating projects with remote mirrors. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182017_remote_mirrors.yml) @@ -15332,7 +15356,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.snippets` @@ -15360,51 +15384,51 @@ Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage.create.total_number_of_locked_files` -The total number of exclusive file locks (through the CLI) +The total number of files which have been locked via the GitLab UI -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182028_total_number_of_locked_files.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.total_number_of_path_locks` -The total number of default branch locks done through the GitLab UI +Number of paths/directories manually locked through the UI -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216182027_total_number_of_path_locks.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.users_using_lfs_locks` -Missing description +Number of unique users who have locked files or directories using LFS via the command line -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183346_users_using_lfs_locks.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.create.users_using_path_locks` -Missing description +Number of users who have manually locked paths/directories through the UI -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_all/20210216183344_users_using_path_locks.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_all/20210216183344_users_using_path_locks.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage.enablement.counts.geo_node_usage.git_fetch_event_count_weekly` @@ -16946,7 +16970,7 @@ Tiers: `free` ### `usage_activity_by_stage_monthly.create.action_monthly_active_users_git_write` -Aggregated value for wiki, design and project repo actions +Aggregated value for wiki, design, and project repo Git write actions [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182041_action_monthly_active_users_git_write.yml) @@ -16954,7 +16978,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.action_monthly_active_users_ide_edit` @@ -16970,7 +16994,7 @@ Tiers: `free` ### `usage_activity_by_stage_monthly.create.action_monthly_active_users_project_repo` -Missing description +Count of monthly active users who have performed any Git operation (read/write/push) [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182040_action_monthly_active_users_project_repo.yml) @@ -16978,7 +17002,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.action_monthly_active_users_sfe_edit` @@ -17042,7 +17066,7 @@ Tiers: `free` ### `usage_activity_by_stage_monthly.create.approval_project_rules` -Number of project approval rules +Total number of project approval rules [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182056_approval_project_rules.yml) @@ -17050,7 +17074,7 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.approval_project_rules_with_exact_required_approvers` @@ -17090,7 +17114,7 @@ Tiers: `free` ### `usage_activity_by_stage_monthly.create.approval_project_rules_with_target_branch` -Number of project approval rules with not default target branch +Number of project approval rules scoped to a specific repo branch. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182058_approval_project_rules_with_target_branch.yml) @@ -17098,11 +17122,11 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.deploy_keys` -Missing description +Count of users creating deploy keys in last 28 days. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182034_deploy_keys.yml) @@ -17110,11 +17134,11 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.keys` -Missing description +Count of users creating regular keys in last 28 days. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182036_keys.yml) @@ -17122,7 +17146,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.merge_requests` @@ -17174,7 +17198,7 @@ Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.merge_requests_with_overridden_project_rules` -Number of merge requests that have local rules that have overwritten a project rule +Number of merge requests which have overriden rules created at the project level [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182047_merge_requests_with_overridden_project_rules.yml) @@ -17182,7 +17206,7 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.merge_requests_with_required_codeowners` @@ -17198,15 +17222,15 @@ Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.projects_enforcing_code_owner_approval` -Missing description +Count of total projects that require approval by code owners for code changes -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182043_projects_enforcing_code_owner_approval.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.projects_imported_from_github` @@ -17234,27 +17258,27 @@ Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.projects_with_repositories_enabled` -Missing description +Count of users creating projects that have a matching Git repository, result of a Git push action, for last 28 days. -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182049_projects_with_repositories_enabled.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.projects_with_sectional_code_owner_rules` -Missing description +Count of projects using code owners with code owners section feature -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182045_projects_with_sectional_code_owner_rules.yml) Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.projects_without_disable_overriding_approvers_per_merge_request` @@ -17270,7 +17294,7 @@ Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.protected_branches` -Missing description +Count of users creating projects with repositories making use of at least one protected branch in last 28 days. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182051_protected_branches.yml) @@ -17278,11 +17302,11 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.remote_mirrors` -Missing description +Count of users creating projects with remote mirrors. Includes both push and pull mirrors. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216182038_remote_mirrors.yml) @@ -17290,7 +17314,7 @@ Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.snippets` @@ -17318,31 +17342,31 @@ Tiers: `free`, `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.total_number_of_locked_files` -Missing description +The total number of files which have been locked via the GitLab UI -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183614_total_number_of_locked_files.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.total_number_of_path_locks` -Missing description +Number of paths/directories manually locked through the UI -[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml) +[YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216183613_total_number_of_path_locks.yml) -Group: `` +Group: `group::source code` Status: `data_available` -Tiers: `free` +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.users_using_lfs_locks` -Number of users that have used default branch locks through the UI +Number of unique users who have locked files or directories using LFS via the command line [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182054_users_using_lfs_locks.yml) @@ -17350,11 +17374,11 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.create.users_using_path_locks` -Number of users that have used exclusive file locks through the CLI +Number of users creating path_locks in last 28 days. [YAML definition](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/config/metrics/counts_28d/20210216182053_users_using_path_locks.yml) @@ -17362,7 +17386,7 @@ Group: `group::source code` Status: `data_available` -Tiers: +Tiers: `premium`, `ultimate` ### `usage_activity_by_stage_monthly.manage.bulk_imports.gitlab` diff --git a/doc/user/admin_area/diff_limits.md b/doc/user/admin_area/diff_limits.md index 4e2037fe31d..32756ab4780 100644 --- a/doc/user/admin_area/diff_limits.md +++ b/doc/user/admin_area/diff_limits.md @@ -9,7 +9,7 @@ type: reference You can set a maximum size for display of diff files (patches). -For details about diff files, [View changes between files](../project/merge_requests/reviews/index.md#view-changes-between-file-versions). +For details about diff files, [view changes between files](../project/merge_requests/changes.md). ## Maximum diff patch size @@ -23,10 +23,10 @@ This affects merge requests and branch comparison views. To set the maximum diff patch size: -1. Go to **Admin Area > Settings > General**. +1. Go to the Admin Area (**{admin}**) and select **Settings > General**. 1. Expand **Diff limits**. 1. Enter a value for **Maximum diff patch size**, measured in bytes. -1. Click on **Save changes**. +1. Select **Save changes**. WARNING: This setting is experimental. An increased maximum increases resource diff --git a/doc/user/discussions/img/mr_review_second_comment.png b/doc/user/discussions/img/mr_review_second_comment.png deleted file mode 100644 index f345c52e941941041b11b105afa4efe60c0f81c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50468 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 diff --git a/doc/user/discussions/img/mr_review_second_comment_added.png b/doc/user/discussions/img/mr_review_second_comment_added.png deleted file mode 100644 index 61b45431c9ea808f5ee2c13620ee480a46c4f5dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46448 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

M0v#Dg6nd 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 Lnu_J}kf8qsOVE~D diff --git a/doc/user/discussions/img/review_comment_quickactions.png b/doc/user/discussions/img/review_comment_quickactions.png deleted file mode 100644 index 276def6381f2bdfa169f432af949a96d05029d86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78891 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 WYzl1~6;JKI)k<<|?MM&G!yzM1OPO|A-o$v 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 - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213) in GitLab Premium 11.4. -> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/28154) to GitLab Free in 13.1. - -When looking at a merge request diff, you are able to start a review. -This allows you to create comments inside a merge request that are **only visible to you** until published, -in order to allow you to submit them all as a single action. - -### Starting a review - -To start a review, write a comment on a diff as normal under the **Changes** tab -in a merge request, and then select **Start a review**. - -![Starting a review](img/mr_review_start.png) - -After a review is started, any comments that are part of this review are marked `Pending`. -All comments that are part of a review show two buttons: - -- **Finish review**: Submits all comments that are part of the review, making them visible to other users. -- **Add comment now**: Submits the specific comment as a regular comment instead of as part of the review. - -![A comment that is part of a review](img/pending_review_comment.png) - -You can use [quick actions](../project/quick_actions.md) inside review comments. The comment shows the actions to perform after publication. - -![A review comment with quick actions](img/review_comment_quickactions.png) - -To add more comments to a review, start writing a comment as normal and click the **Add to review** button. - -![Adding a second comment to a review](img/mr_review_second_comment.png) - -This adds the comment to the review. - -![Second review comment](img/mr_review_second_comment_added.png) - -### Resolving/Unresolving threads - -Review comments can also resolve/unresolve [resolvable threads](#resolvable-comments-and-threads). -When replying to a comment, a checkbox is displayed that you can click to resolve or unresolve -the thread after publication. - -![Resolve checkbox](img/mr_review_resolve.png) - -If a particular pending comment resolves or unresolves the thread, this is shown on the pending -comment itself. - -![Resolve status](img/mr_review_resolve2.png) - -![Unresolve status](img/mr_review_unresolve.png) - -### Adding a new comment - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8225) in GitLab 13.10. - -If you have a review in progress, you will be presented with the option to **Add to review**: - -![New thread](img/mr_review_new_comment_v13_11.png) - -### Submitting a review - -If you have any comments that have not been submitted, a bar displays at the -bottom of the screen with two buttons: - -- **Pending comments**: Opens a list of comments ready to be submitted for review. -- **Submit review**: Publishes all comments. Any quick actions submitted are performed at this time. - -Alternatively, to finish the entire review from a pending comment: - -- Click the **Submit review** button on the comment. -- Use the `/submit_review` [quick action](../project/quick_actions.md) in the text of non-review comment. - -![Review submission](img/review_preview_v13_11.png) - -Submitting the review sends a single email to every notifiable user of the -merge request with all the comments associated to it. - -Replying to this email will, consequentially, create a new comment on the associated merge request. - ## Filtering notes > - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/26723) in GitLab 11.5. @@ -392,7 +313,7 @@ To reply to a standard (non-thread) comment, you can use the **Reply to comment* The **Reply to comment** button is only displayed if you have permissions to reply to an existing thread, or start a thread from a standard comment. -Clicking on the **Reply to comment** button brings the reply area into focus and you can type your reply. +Selecting the **Reply to comment** button brings the reply area into focus and you can type your reply. ![Reply to comment feature](img/reply_to_comment.gif) @@ -409,9 +330,9 @@ not supported yet. You can assign an issue to a user who made a comment. -In the comment, click the **More Actions** menu and click **Assign to commenting user**. +In the comment, select the **More Actions** menu, and then select **Assign to commenting user**. - Click the button again to unassign the commenter. +Select the button again to unassign the commenter. ![Assign to commenting user](img/quickly_assign_commenter_v13_1.png) diff --git a/doc/user/gitlab_com/index.md b/doc/user/gitlab_com/index.md index 8019e99a919..cdb4ca52c9c 100644 --- a/doc/user/gitlab_com/index.md +++ b/doc/user/gitlab_com/index.md @@ -98,11 +98,12 @@ Any settings or feature limits not listed here are using the defaults listed in | Artifacts maximum size (compressed) | 1G | 100M | | Artifacts [expiry time](../../ci/yaml/README.md#artifactsexpire_in) | From June 22, 2020, deleted after 30 days unless otherwise specified (artifacts created before that date have no expiry). | deleted after 30 days unless otherwise specified | | Scheduled Pipeline Cron | `*/5 * * * *` | `3-59/10 * * * *` | -| [Max jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines) | `500` for Free tier, unlimited otherwise | Unlimited +| [Max jobs in active pipelines](../../administration/instance_limits.md#number-of-jobs-in-active-pipelines) | `500` for Free tier, unlimited otherwise | Unlimited | | [Max CI/CD subscriptions to a project](../../administration/instance_limits.md#number-of-cicd-subscriptions-to-a-project) | `2` | Unlimited | | [Max pipeline schedules in projects](../../administration/instance_limits.md#number-of-pipeline-schedules) | `10` for Free tier, `50` for all paid tiers | Unlimited | | [Scheduled Job Archival](../../user/admin_area/settings/continuous_integration.md#archive-jobs) | 3 months | Never | | Max test cases per [unit test report](../../ci/unit_test_reports.md) | `500_000` | Unlimited | +| [Max registered runners](../../administration/instance_limits.md#number-of-registered-runners-per-scope) | `50` per-project and per-group for Free tier,
`1_000` per-group for all paid tiers / `1_000` per-project for all paid tiers | `1_000` per-group / `1_000` per-project | ## Account and limit settings diff --git a/doc/user/project/merge_requests/changes.md b/doc/user/project/merge_requests/changes.md new file mode 100644 index 00000000000..adcf4518209 --- /dev/null +++ b/doc/user/project/merge_requests/changes.md @@ -0,0 +1,151 @@ +--- +stage: Create +group: Code Review +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments +type: index, reference +--- + +# Changes tab in merge requests + +The **Changes** tab on a [merge request](index.md), below the main merge request details and next to the discussion tab, +shows the changes to files between branches or commits. This view of changes to a +file is also known as a **diff**. By default, the diff view compares the file in the +merge request branch and the file in the target branch. + +The diff view includes the following: + +- The file's name and path. +- The number of lines added and deleted. +- Buttons for the following options: + - Toggle comments for this file; useful for inline reviews. + - Edit the file in the merge request's branch. + - Show full file, in case you want to look at the changes in context with the rest of the file. + - View file at the current commit. + - Preview the changes with [Review Apps](../../../ci/review_apps/index.md). +- The changed lines, with the specific changes highlighted. + +![Example screenshot of a source code diff](img/merge_request_diff_v12_2.png) + +## Merge request diff file navigation + +When reviewing changes in the **Changes** tab, the diff can be navigated using +the file tree or file list. As you scroll through large diffs with many +changes, you can quickly jump to any changed file using the file tree or file +list. + +![Merge request diff file navigation](img/merge_request_diff_file_navigation.png) + +## Collapsed files in the Changes view + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232820) in GitLab 13.4. + +When you review changes in the **Changes** tab, files with a large number of changes are collapsed +to improve performance. When files are collapsed, a warning appears at the top of the changes. +Select **Expand file** on any file to view the changes for that file. + +## File-by-file diff navigation + +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/222790) in GitLab 13.2. +> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/229848) in GitLab 13.7. + +For larger merge requests, consider reviewing one file at a time. To enable this feature: + +1. In the top-right corner, select your avatar. +1. Select **Preferences**. +1. Scroll to the **Behavior** section and select **Show one file at a time on merge request's Changes tab**. +1. Select **Save changes**. + +After you enable this setting, GitLab displays only one file at a time in the **Changes** tab when you review merge requests. You can select **Prev** and **Next** to view other changed files. + +![File-by-file diff navigation](img/file_by_file_v13_2.png) + +In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/233898) and later, if you want to change +this behavior, you can do so from your **User preferences** (as explained above) or directly in a +merge request: + +1. Go to the merge request's **Changes** tab. +1. Select the cog icon (**{settings}**) to reveal the merge request's settings dropdown. +1. Select or clear the checkbox **Show one file at a time** to change the setting accordingly. + +This change overrides the choice you made in your user preferences and persists until you clear your +browser's cookies or change this behavior again. + +## Merge requests commit navigation + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18140) in GitLab 13.0. + +To seamlessly navigate among commits in a merge request: + +1. Select the **Commits** tab. +1. Select a commit to open it in the single-commit view. +1. Navigate through the commits by either: + + - Selecting **Prev** and **Next** buttons below the tab buttons. + - Using the X and C keyboard shortcuts. + +![Merge requests commit navigation](img/commit_nav_v13_11.png) + +## Incrementally expand merge request diffs + +By default, the diff shows only the parts of a file which are changed. +To view more unchanged lines above or below a change select the +**Expand up** or **Expand down** icons. You can also select **Show unchanged lines** +to expand the entire file. + +![Incrementally expand merge request diffs](img/incrementally_expand_merge_request_diffs_v12_2.png) + +In GitLab [versions 13.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/205401), when viewing a +merge request's **Changes** tab, if a certain file was only renamed, you can expand it to see the +entire content by selecting **Show file contents**. + +## Ignore whitespace changes in Merge Request diff view + +If you select the **Hide whitespace changes** button, you can see the diff +without whitespace changes (if there are any). This is also working when on a +specific commit page. + +![MR diff](img/merge_request_diff.png) + +NOTE: +You can append `?w=1` while on the diffs page of a merge request to ignore any +whitespace changes. + +## Mark files as viewed + +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51513) in GitLab 13.9. +> - Deployed behind a feature flag, enabled by default. +> - Enabled on GitLab.com. +> - Recommended for production use. +> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-file-views). **(FREE SELF)** + +When reviewing a merge request with many files multiple times, it may be useful to the reviewer +to focus on new changes and ignore the files that they have already reviewed and don't want to +see anymore unless they are changed again. + +To mark a file as viewed: + +1. Go to the merge request's **Diffs** tab. +1. On the right-top of the file, locate the **Viewed** checkbox. +1. Select it to mark the file as viewed. + +Once checked, the file remains marked for that reviewer unless there are newly introduced +changes to its content or the checkbox is unchecked. + +### Enable or disable file views **(FREE SELF)** + +The file view feature is under development but ready for production use. +It is deployed behind a feature flag that is **enabled by default**. +[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) +can opt to enable it for your instance. + +To enable it: + +```ruby +Feature.enable(:local_file_reviews) +``` + +To disable it: + +```ruby +Feature.disable(:local_file_reviews) +``` diff --git a/doc/user/project/merge_requests/getting_started.md b/doc/user/project/merge_requests/getting_started.md index d4a4132dab6..220d8daf69e 100644 --- a/doc/user/project/merge_requests/getting_started.md +++ b/doc/user/project/merge_requests/getting_started.md @@ -70,7 +70,7 @@ After you have created the merge request, you can also: - Preview continuous integration [pipelines on the merge request widget](reviews/index.md#pipeline-status-in-merge-requests-widgets). - Preview how your changes look directly on your deployed application with [Review Apps](reviews/index.md#live-preview-with-review-apps). - [Allow collaboration on merge requests across forks](allow_collaboration.md). -- Perform a [Review](../../discussions/index.md#merge-request-reviews) to create multiple comments on a diff and publish them when you're ready. +- Perform a [Review](reviews/index.md) to create multiple comments on a diff and publish them when you're ready. - Add [code suggestions](reviews/suggestions.md) to change the content of merge requests directly into merge request threads, and easily apply them to the codebase directly from the UI. - Add a time estimation and the time spent with that merge request with [Time Tracking](../time_tracking.md#time-tracking). diff --git a/doc/user/project/merge_requests/reviews/img/commit_nav_v13_11.png b/doc/user/project/merge_requests/img/commit_nav_v13_11.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/commit_nav_v13_11.png rename to doc/user/project/merge_requests/img/commit_nav_v13_11.png diff --git a/doc/user/project/merge_requests/reviews/img/file_by_file_v13_2.png b/doc/user/project/merge_requests/img/file_by_file_v13_2.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/file_by_file_v13_2.png rename to doc/user/project/merge_requests/img/file_by_file_v13_2.png diff --git a/doc/user/project/merge_requests/reviews/img/incrementally_expand_merge_request_diffs_v12_2.png b/doc/user/project/merge_requests/img/incrementally_expand_merge_request_diffs_v12_2.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/incrementally_expand_merge_request_diffs_v12_2.png rename to doc/user/project/merge_requests/img/incrementally_expand_merge_request_diffs_v12_2.png diff --git a/doc/user/project/merge_requests/reviews/img/merge_request_diff.png b/doc/user/project/merge_requests/img/merge_request_diff.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/merge_request_diff.png rename to doc/user/project/merge_requests/img/merge_request_diff.png diff --git a/doc/user/project/merge_requests/reviews/img/merge_request_diff_file_navigation.png b/doc/user/project/merge_requests/img/merge_request_diff_file_navigation.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/merge_request_diff_file_navigation.png rename to doc/user/project/merge_requests/img/merge_request_diff_file_navigation.png diff --git a/doc/user/project/merge_requests/reviews/img/merge_request_diff_v12_2.png b/doc/user/project/merge_requests/img/merge_request_diff_v12_2.png similarity index 100% rename from doc/user/project/merge_requests/reviews/img/merge_request_diff_v12_2.png rename to doc/user/project/merge_requests/img/merge_request_diff_v12_2.png diff --git a/doc/user/project/merge_requests/index.md b/doc/user/project/merge_requests/index.md index 893a34219a2..f587ab34d11 100644 --- a/doc/user/project/merge_requests/index.md +++ b/doc/user/project/merge_requests/index.md @@ -8,7 +8,6 @@ type: index, reference # Merge requests **(FREE)** Merge requests (MRs) are the way you check source code changes into a branch. - When you open a merge request, you can visualize and collaborate on the code changes before merge. Merge requests include: @@ -18,6 +17,11 @@ Merge requests include: - A comment section for discussion threads. - The list of commits. +Merge requests contain tabs at the top of the page to help you navigate to +important parts of the merge request: **Overview**, **Commits**, **Pipelines**, and **Changes**. + +![Merge request tab positions](img/merge_request_tab_position_v13_11.png) + To get started, read the [introduction to merge requests](getting_started.md). ## Merge request workflows @@ -47,28 +51,6 @@ For a web developer writing a webpage for your company's website: 1. Once approved, your merge request is [squashed and merged](squash_and_merge.md), and [deployed to staging with GitLab Pages](https://about.gitlab.com/blog/2021/02/05/ci-deployment-and-environments/). 1. Your production team [cherry picks](cherry_pick_changes.md) the merge commit into production. -## Merge request navigation tabs at the top - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/33813) in GitLab 12.6. This positioning is experimental. - -In GitLab 12.5 and earlier, navigation tabs in merge requests (**Discussion**, -**Commits**, **Pipelines**, and **Changes**) were located after the merge request -widget. - -To facilitate navigation without scrolling, and based on user feedback, the tabs are -now located at the top of the merge request tab. A new **Overview** tab was added, -and next to **Overview** are **Commits**, **Pipelines**, and **Changes**. - -![Merge request tab positions](img/merge_request_tab_position_v13_11.png) - -This change is behind a feature flag that is enabled by default. For -self-managed instances, it can be disabled through the Rails console by a GitLab -administrator with the following command: - -```ruby -Feature.disable(:mr_tabs_position) -``` - ## Related topics - [Create a merge request](creating_merge_requests.md) diff --git a/doc/user/project/merge_requests/reviews/img/group_merge_requests_list_view.png b/doc/user/project/merge_requests/reviews/img/group_merge_requests_list_view.png deleted file mode 100644 index 7d0756505db59f1efc8b8473a1952670d358b6e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89620 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

|7qEVsoW7f{w_4OQ|t zYhu@W{p;uS6rBX@S_}>%9Dt3_y#Ic6Uj0;5#V{zh*DwlN3M`HbgATz{NTz6L$^P9u zg%WRKHSSUb3N5F}{R{8t9n0?Omvd-RU|@GiD=g+AI?oaO5502YQo`JPZ*ApiubTS` z6|XmYmQ@)nPp1x#isjA@eMptUGV1^4H*4_Uh%FKUcX?!Ztry2o z_c7(TegGCi&tKGCgnyX5{~&d1{-W#tfB*77NZEYnH@NtAW8EX$tOc@nVZ<(I!+B9b+guZ z-^H(3s!LWqmxHK`wrt8-zw+|3M@B}n5#Hk(E_|}`Jn@%+$oJ&tRXh3&(fmLbzq;c@ zqffR~nAq%m(<#_@w%Z(6H||oFFvS7H){!EK6yGY9fV>R9zDkP`4cyU$gLA@wTr>7R+i^w?{ue<<0uQ82@j_n-EO zUt^E5`WLM+-cK?p{c8=-gdG}oID2eTEW$IFxw2e9q0= z?Ts&eD=qh$UiVp7`oyCHCaVJ;Ka!jcv2I}QYb zKwMlvAKB`0(m|#1xo_sbO&^4Ec&p140OdnYw(lt9y0b8xhWDSIig||d2)1+f`R!JM zSeY%n{nUoz7JUIaBcD}mqrG-!WLS=BBRGVp$^oW#lcl-3!q5Cz%X9TpNfiJ(ypn z@moRvX8!1CR~3ll)izl0FqqgM$xZNEKy94>*Sh5t8V4N1bVVdO0Zw13@m3bnn?!as zCH>so>Rl_=92^~!FYI`Ec{`SiC*^S3JJ0Ryjwkw9Fxx5`8x7hF!^nQ2SB^Wyx(vz3 z^nB@F@f1u5XQ5JXAE43vWw|PRC>;F-Nm$INv7y70Pok{hr^;qWERZkMas6YMgNR`P z+@+lw{8}NEdu=N>iu1wr4Q6y?tS}Wd9zOAL(&jwtZY~4xHJ84!zBYk&UE9_;a}im! zVm%3Eu}C5_8QINKN(+98 z)9*PM#W%t~9<@3GzMxvnnQr%ERc!Xr`tt&d(MLnt$~Z|mSMA{Y0Dz#v#;BH;SNU_? zas^1QV&4Ia4@xOInqQxGPJyi~C(!JEM4%C_2!45|U08%|H!d^wi=Fa3mj*@dPe4Ll zYq~VSl@uw;W$sUvi}CU+loxZMX}T%h$UN-nCat@j2t&)CM@Ta(AT=(Aq-9iZPj*F= zWK%5FW~NMeUh@%RwmnCE9d}If%9ENi9JM<=5tp0xD{n{3jB9MuY)g#2X^7J8zV7KP zc>ySpC9)17L-EkSp&!#S=~28c^*l7e5XeKGX3ASDes_oUMHo?w{z=0;A&m;ra>i%} z<3k50EwHV#5lldt)711eFHTve$3WeNOzYUb%t;Fm815oaoM(cQVY|>?+H63+0v`3N zZ9o1xY4P)Vee~pTe&!qUDx>L*^tNDkczI{S5Qi$y=<_oUr{AT5by0k7V;OPD1C?St z=&giHHuoegk?TsVf{4V0t!bBfEf3$kDJb*AkLp}9aZq)|xnZv$H=!k}BhPgMIugK3 z?^%9RPmbTK`!k-T%3|5Gu;E@%B0I&3XXBgoryoL|ia`F}PqOMEKY5(td+kG)oHRrX zfjopwdynsu*z`d|osXOLa_tw&*8K3Z%mC+dj(GRhL~^?FT;0g!3ldveIqaF9fi{}a zom_Gtu|tvNFd5i9z|P_)@#zWe>HCN+6IZi&9Y4w4>P-yjVVJkxEdSruSsJ^A7gW@^RJ z@{+#k`Xy;FI?pVf=u8fbl06c4o|TS6V@d2K%35n>S22rllJJ?PKZ0S$LaAUL!1om2 zrdr=aVfW1D_T1J+ir!i!Dl<1+9tWt{hGM}B+!q|4{GpKkN~%}DcyzNiWl=k1T0^Cum-M6@Ob!vXv~f+CGGQ!TS0Ps6ny>mxgMXPaw+O^bRphkqh?mhbflLg zqyk@}yvoIsKRIBz#4#4N&E^@uAWwrwF7sj@2>}Cu80}R37MF4Bb+Pp%KWl}O_CHUm z@dJpETD2b`tG087_mR;f&G^Sy~ zizWNAO0__7*p6Vl{x4JtMkfha07J1P>5t2Nb_kFTG^I>uX-n?~i{cXPl(Uaqa|Xwh z6KnojIKU@pOU{FrRoKX2YGZ}$xQ02?R=UzwvQp;14z;#>?aGu9P$mUB!3VhZTt<|R zpqhfDSJ>%CBO0FBde!nXVp(_{pl@P#V!g=_p7RJ?3Ady1{Msmv7WelsUcv@n;KUZy zb?ATN{r;tXw;LJz1>lA*W&7x}>qo~IoZOO+C9YrIB3i~sCORg}U$PIl1?E4ayLz}; zb+$_b@iv8k7quIbQj{Bc2`>QaUp+7u;=Z}Di%ntu`Xow)P`hgX%hA@+Khq% z^vkfl;7V+_aG81QJuUNk$LH$PK#wR15Q!vW{Wy?XDjD|>^7QAJ-i4h)<7Zp!YER_w zG)HB1AX>;a!;Ok^mE9H4{r4~RcYOz_K-1IFZ>IQi7d|`h$OB~MeL{4KOyN4t53b|d zIITISDMNL30x*VVIJb(Vzf9|@i&<(@)fLk*sk3-}fXKKZFqg_8_T+KIubD0q%9keW zd_DnzK2SzD^}JgiJ};C0CzhP3+V!a^$e1WB;Y3U?8q4h3LN|OYSfg=3{H+s4a~6LL z`71mM#U+OKm`HJ~QgNcC1QLs-Kx>34h3laijA@ocuyC_=;)0QM0H6B80n!7=V9$}k z1ECtDSxuj?bQ7+{-cH5tP*9K1k^e^Oqme$Ei=p_^ogar+ygD6s91yfUv@&0cK?UlN z*JQ4@m_&OLdJoz?>ekf&+x4ZivtMG-gMtv-yP`hfgm@B6#rlkqv63?xe7ZlTy*7?;NU3h3MfyjnZN{QKDjp8T({5GKtG(XN`^u_ZL>{Q*)QWsV9 z!TXVV`^W`skNg$=JT1R?`UvdNL2T6EWii+r_kI zY(;mvm?ZMBD`}I`PU%l8i6TX?XJct@m@K5Vb%ZynnU$f zwlkJ?TWDf+6wM~ThBQnr%>|V#CjNc@mI8ePN9V2^kd}e-fMBYuwZQ(b^&X`LxZvP< zd|VG|Uicheuw}iD`z7!>mxf`8;D`};ggDS|sh#W;^tmfwDzMAXx|HT!fIcqlSt4nAw4Yhc|P(c$rm1DhJLv~rM9VaY!aYwIu_t1$-Bal znvDo_AS3t6q4f|#W?+o-Meh#`l~>UX68j7l-Q4}lH)J{~;w>_H>soeT zF}@=8hukbqYEYrt#CymfM3GYWI;QV6lbkrslrs3WG>jYsLTM>`?k>b8ho8~%$xs~( zvumh85}z}!1DuCiMSm^Oik{$L?~x+eAE7baMnk{zvu%8;2hc-c0ylZ@fZ>vqhHwZG zY5?_>7^Fkmd`4o;U7-sLbtXB_`1D&N=ay}g`_s5yp+^jX`3w9c7vb(EOE4qw0HH z!)-D%Zl}Gn5B_xS^kAOeeCH`?A6DRA>8VY5CNw-FBi;P9J`k8wiDa8&}2ZfnwA)WjeC@WcVx9djp!B}^K z)BEE|AQBmS5^gAAK}PSrOw7L!!@Er|54lL*AtQwpBtTV`QdLL?Bq}`fy9{Q{#EUq# z!cbv~5VaG9VfCFP+V2DeN#1|O3>>*_u$2!r7L$g@d;YE^{%yAki=-KxuT&=AyRioX zyZFdg1QLb%u|R^~LtHt~4!FN05tDdmGhakT+~eT$OZvU+6X+97mxuVx{L*iiy3qHu zj&yhYD&J7!)9>5GHM~5?=wX@tW16-FkVQty+@)gfX2gdWpp*{ow-Zq;SAP|?9Sj`x zsfWrr)DGnGBr2ni(KVN8w%3F{nZ#Jj)bfM1RGj(tC1L2Q^YTg}NY=-DlAf{8`GOqZ zn~fsK2Ss%he~dSN9^|{2?T(Lhhjggz)WA1115>OpkhjK^je6Or@Tc43)!z&Hd zY9ak+2jc}uyHy(Ri5k~LL4@|g44WQ3$a=*B> zeYz5UuwH}*V#GG5&ZQ2UL?<|AXQq@DL?0b)F+x$fyPvjW;pZmEOpWw4<@k%Lzs|?p zh*One(dpCpU=M+yhPJHxX)bZ)%~quegQW}cMk**lZpZBuIN-LI$GOr9-)OMy&_@>w z@mV+bF2|zkaW~_`u z2-k9*Q9iWEka+$acKdB9>A^FNY3zQ;&s!M#@}dku>O76XR{&y=%1MxOd%n$uxWMNN zlSU-sp1xWsPVJHHIa2tLjQ-s80M}W8`iY|fUH2~mt$TdgS*@F&nk%t!C3ceVa znI^G<(EN{M-RT@OWw^SaOtxcxCZyT|bfO!}yKP9iArin}L_Y2h9_aX;ih`$0od5;q z*ex<;zrl%`o)}LGqe_lh!U6bBxKU|rsYD=L#Q#YOo~hFXH|iOJD9%Ky1k56#re=`G zV7dzSTKexrBCO?Cm;RC(&3>azhzZ$wGH%N`RYt$#0igcJt^KiD2N6)m4c=Cs?Tyka z&W7@DWIunISg?E>d^~xY-;R~dAEHSPm5pdB!n&f;L=~y$GIUXvKPR{riWBY2;hnJ* zWT`5(8-jK?WqKxebC{u~@M~yj1a}ie5o>BRPJ2KMypP^E4(i0cwf0{ij;?-AGW?0v z_v~pWGq$zYdoDuuH+WoC>5HGyG_jjhI?8y0z<06XQN15_bjU0hH}^@=l5{hbrJ^uV z!!yiiS(Wr`eWie=P(T@>ne;sasNy3Y|4A~L>AjH-Z2b)5`->&5x`3jJ?)y9o3v~7% z7fDh=)gKj8$}}KO-n=}ivAH%6YS@$dI3xMaG_o~k4-Qg|*|!WuDTq&$`cKJ!j9y7X zkCrtM&&+s3AoP~nC8t{66`z2-o{Z^7*mo%yHA3v!_)c7*1&!PQK9(!_ukmz&ap8HJO>@5CKXqWL~7?iu40OdV(B$PlUoj=Z?D|4g@S0Sb_yA4*% z{mioY|1kCzP;o?Ew;=9~2WcFFyGxKj1HnDGyGw8j-gtoE9w4||aCaxTySuwg=lkEA z_x^cnW=*YLO;=0Ry+`)BMV+(H22wrOK5xU|6!=?ddTj4UKcC3-Sr!UB%OZV?mxOn2 znH-!N8HV!T0wpvU=Vgd-Od)F@u0@l+-j--EiJ0kwA(t3jP<7?63gyp(e3_%gP>5%zh6?#w1E?((DKhkm}OsS@vWFqUcZMb&Q>U}kf|M-l;K?96A3lco2mKiMLhXuJi%%g4Ux5xMA# zljqax-pgWaH;af941{Y{PT`M1X%YsC!FRHwB?*|o?~m#DI6qGqpx}&FeHFSBoD&W2 zL&~9Eta0@{J(w#wHqZHd%(`=pI`OWiO0I0oEJYc+br8CMKU*+|MU5VrZ$dS; z4=atI6_STu>=%hsKJ(}4$<8fFqQ50L+Tv;WV~Qbp2q+7jobneDL!yYwA^i~Aw|Psl5lr#4 zRjyoCfMb45H_< zyNuSH6M#AyVhf8z5&Tkxi1?2j0P6EwW%RF-|F(6L68~#F2?h1o!4vr3KKXy{bla0m zL+)R)K`jUPjjc$L+kD0S&kz6ClRq{rR3{Ptzlwa#|Ml+w$18s`40H%d66B~a21KF| zEd77qLNXyaGV~E!52-lQl;$Z>uEwayqL}qA%AblwnW+)XPO2ruPK`BmPCruqL6E== zxBG}K+q)DC#$?CpC4EAC=)*W`J2zcxT_fxvALYw7uy1oeYuop6i2v?<-ePQ2yQo6) zL+vjVgk=@-xE3*S4({5!K(uu6P(AdJ($6T@X{exB3dqfTrt*?Yx(pBg6Ie2b9fqhE z>Rc!(@(udm?>>H;ST&*D!Q z)`(!Ns?krIfIp?q=2k9J0a_vz*MiDqV0$}(M#!>vi0=bl)nf1-z0t=_UC^F>y zQr>~V4x~t6s$5zUN;VGae7ui>uE*pGF3>ZeUIY=+ccRDIr6WeE`u_OP3Q*yXuttgs z>u6dGJ;Z%Uab02!VK1e zVJ1dDL>_^`q(il7KL(U8{q5D~URviJZ4VCYi-jBgES+uP@O2pu%5CD_KC;=ackUwj zvFE>rn;2Tr(@826v2vO4S?iwyMhz&x@`FYyaz0*Ua_;gcvt`ISe>S0|Y|nyn+yNTj zAxU|pm4EKtr-pKL6`?!}IzTH9;#&rUkBe9V-i!XI*${gk2=wZ~nEl20*FR|Q+|U{B z3NTzYR#oJ#oMd8_^yTTAXW5Lnm!=O->bxSSXW*?!0WMRvZH=<&)}>o#1L#rIx?;c% z4OMWfODX1SGz>54~ zlcmM(ZsBiLrG*E)5&B`CJgyoeAc-NXufM znDggWZoy5^u^zefG5fmC4tht|vFAMghxuKR@Dmqu)1A!aA`hd+kSmjGhhkcfFsyLb3- zH?Px@&Uo0F5X{=6?CC#d&T6)Y2xon5h z@x!8N3_0u1XNGe;6m@7oyYHjU7;uVdM^Jylk12F%3KOkvh<^O~sG5Ty@-~c4$V8_n zlcCk{5Vj=X*UT5yBd-GMjg{?kjPL5_^-DuFrt7!d1tr^)c(U2I)a&xT7ryIX6ML12 zEQHzHA4CiA(#$eAEXcmNQ`;2n5->vWL$x78sHF5hBF;c_Ub5D7b>Lb-OP$8TsDNoV zx6QG(fO=QiE9B+(i)f-aD@*&6+}_tDLxoS&Be}Ir2}748Y!J`^y;R79nmw?g{67~d zV^I0oH6l?}Bk^dp^NlWo=9Ngv=M-O#o2NuD@fqiu7?+b*JfX%zUG{9-EI!9Q2*Mf` zagoJG^(-?Vn(h>s79+Srf4;Vyn{0}clNsk8Npv{g!M&$MC6~94Vji5N%)O1W0_Z5g zjBAx31gf~F7u%%%P>tqdM;@i-J|`!j>$|i#mx?JE2IeI6rYo z+s0PnB!|*10@DVwH;FP>JW$*C(a?a3LM*uVj`v{;mUDlmX?tba8`R;!-yu%we4hF^ z#?R_0!s$GY1P8+?^vIr6>bcK1-m*?s5JydqCx78N96#QUbtlZ^=auC96 zPL%nAmXpB14-@d2{G!x~@2~spq{Ww}UI)-(2H#8c0!GNe)jR$-_Qu?-j}bP5T@3SWDt@ z8eO^(SPZHHejDjXOiooX6BAG!c8RMXO8m<9;Ne3O^s3A1=wb%R^cYpvhSdZa&hV?s zTxq(l89CEx%K^bR%!4AhDkOS5qlDzIOP@cbH~IMldOC{y0tkK9EU-am^l#wWY44@g z1^y&GYnN!y^eL+>-A2!s0zqVs=^+K`Y;ljxK_i<)n2I&>-=Yhi+dTvP!E4^pmP>Xj zbyPvDzUp$cESvki>Gf0m!ul7NE}lAYtz5`zp|&_b2{S{$Lg1vJq@RT693b>Dtr;TY!_n$3Y&LuH%`c7Y?vxrJ+gS5$h!I;;XJ4ld$@DG;9v86&)r-WPVnI z5%Z2#1iDvVE(O$pPd%5+(SpvCEFo-CHa$G=3;;zynPmQ(`yBz3p0PB@hS~lt);d!D zG7U~2epM|+$7X8s_jHLfC>edU0ixlvK9@O2__TP6yx3o9%ikRAxF}a0&d)hTKdcDo6!wf&F}7JlI6otQMA4f#`w1xAOUSg{NX4rxby?$OSUT(17fzckf0>dnffsWyHY3zk$f6RANXyalG>O(-qJ?u}>kn3Ie* z7zPy++Wb?dBdOELJn5d0z<_k+>Rpr~8^#%;d)X!KMtOb+5rbYq{*tPb6zDPmJetfc z1H!$_`y8+j>PER*JoyPGkdX#qLF6jRoS$>y+9RM$3rL{I&vEfLV0h?K3|Y^n6xiZr zVDtcaIs>LKg~>Br$Cev(Xw%0V8o-pXDaGnwYCIH*+5@^t)+S$(zK5%^@TB-jPS-3 zCO4|S>m1g-7}kY#s0fiHL7#f8+3hG|C^eh-UCPDO~G zo1jBI?;?^( z^xdQy&7xQ@?J7a4)~l7W7ze8hz6{b+i1sZ|KF`;bTNo3QZZn3-ED|07;i6Enx|G95 zgoZkJl`ant}-k%$m*d&iC41{H_8z z&^7B`1GFiK_pmYCS5(uKw(Wuo9|*ByNK#qDzi<+NN>Us^Kp7ly3%`qzUm4Y+6OCJU z{g13W%|IPn+!`kmpdSZw42-g={uWu7WU9G)u4S#EFoHr3-#hPn0_s%qQI-s0&(yLW za#5)=KZLUUa^uRa@8 z^1d)%zNL-Gy1`0Y(vIsnXvbiQw^fi$_adj*++7Q!XMf@k9TVtmP@BIP=3Y>&r|r)S z(3WY7dB;lDF+a+tIll}44Md% zR)GsYd`3Xi^eV1N5|CA-A)4&q%>A3>bibq^$swebonx z5y~%i!7)V`ssfj4Y$dz@%(G~58!x>E#Wt**E%|yjC81C&WM4tnU-|RN!>>i*L{DI$ zs_6wl=nu;{O}o2PV3sE-{p``++@eUADY95a2C?Vs4f)#FiU6HLG({tyyZ9(FwDHP^dA6yT~UVNJKH4)KZ6TnP-WIJgeT%uSx4S^6R7gk?)BA z^ML>DFO{j#r;_yr|3{_~NLn`_Mc@ag&a2HyM?C>POnCHadf|_5Qy$WG>RBvEYqO!r z45_P4-*@&tJ6F7kl4VLLHok(S?NMDRdD7i_;IS+sCcvBK`r)dyijQRJr?o)_Zutu> zVMe>gSJzj}HzV?-G)edPCE9P*OU)=_&6;-UNJeJ1wmdGg-}N;-@%>g3{V?tuakdAX zNd@fM&ulwR*F*JduE>9@>?4*7{^l8JV>Mfi%xV{M)x_0+HdJzv_8^kIWtCPIg2>TLcAs7ZHl0qOqLy#Aq{kny?|IqQ~{^VE5=qhjL+Yx;BY0szD z^gHLZxln4gj8q>~2>7lsz`#dwj&OGREFiC-ijiLScl3E5opC|>1cgPwP+`&g zjC9mD=J}NgFoJw$jhc`Q85vpjI|?a@t*BbW0Nd@TCX@j{D4Yp97w&_Xlr>VEs&hDI zq|xw*RkU-Smxg_mq>I~Ca6{SKc*W+Hw#L)GbYnfm!T>Ld3k8MCzqG->|e)#rGM?Nyx6em}oKQs^DTsuh~}}%j|#PeWl{oePS)yl*{5g z{LfgTBq>o*C*1Un50Q?qYc);nRaN&T(YScm7CrfhoBkdeE|WzMeBwRQw-LLvNHji` z{GfroLUdl{{R$rwhD75(%5Z}8Wv_pm=ufffeK&M#DNX#Uqq<6Ci2P-94=jqI*PeMQ zS3>8f9<7+UJ_8Y1jkR$jE?5*Hac;peEs$EzF}!XB6OKAMJ)x-egGdIqT=RS7IIuqi zliAX$kNHYa_~7@ZM{Jd;v(~vB<@mnOvG|^-%}6VYG9AW|HgMwLkTkG0zvgHp#{;C^ zqh&I%w2o{5@b&ST8h2H$rt&BPl}R!x+8<6-uCK{-dv5A(wIXhT6Q>OF?p7+}8l<^1&4mIi$wjiwS(_o8#04YUU z%J0%IUd9dcf1GsIV5(lzN+{aoXW4%K8nmx>U+?g#YuSKZbWy2=d8B)V)F zcF`WxEOkKyElKr_rwDFVDVr=x;7?-V?xo7+uTKjqf)2H_j@gbLbJUcEw1&k-BC9Zs ziPA|(q4iAy#47Ac0Qml!QMPZoP#ttO)y@PTSSJ#M(P@0d8%D5ZYaTM9zG0dqX`Fja zH+s6l*H$4yRTqZrZRy&?51r}a`REe3ZE%zl+n8!pC18RI^KiXSL=lmDIC!d$GRFT& zG%VrtKE=El(`H0y_F~dOH@;Q{)f4dkVV?5#u|R}>{u7BYnbVlNr*=MC$5vdcmk-K3 zF`Z&D*lj!oWo_Uks{D1FYni{J+$UDL$4YM6w9YOqm8Z8T{&~cuV{Mh_+YBaceZ{9Q zioou=P1P)~8R}k5n&J=P0;xp1nXEGi$)RVCJIsww(kzR53Nx{5S=C3@6pF`{cw2CC zU1VPAr8nx$`3hEH>M}L*5)lf5RwwvdTK1VNNw$e1Y{-$ZZc2Z z!#c+tJ$IGuGxk-$r)ouUtI6nTVoshXFc)BvoWR*~m#yWo$hxt{UXH#ZnAs8~AH$FY zIWD$s(-d6`C#gZ@foUhuPoj(`q&c{{+}bz_w1^atiBft73z-=FWnMQ}o&I%$yebLX zf>-3ufM)y|HfA9q0A|4FG)*74^83iojj!LBlVsX?Y@YT|9SLZ7JodO z=Mtg4b!fGp)kAVMcIc6S*Jw9Wb>oJrVXNgw6I4Lkv&ydcLb!dVNmi=-g`%a5Xya} zV)I+mYp`~c>Mwo)U7j%iQ36y5`1Nf_E_&({B76;`kov5iwZk@rY)vcT48zA?$Hc%@ zlw&uFDSu;bDoEQ|h80zoopeBguZf@dSB?SEz(_QITSwD5Nzk{N-?=FtOdUG2l06)) zl^`6!*!4f88Y|k(7A;>jZbh0tiI-Z9(*DR^oabCrXhfSm?QL$jk1w+?ICBxV*4>jc z*mHHT$VsFze?USsmP+QN|C8U1htw*af6__vngbnS@3n$rh)^})8TN{?5#RjExZ(Oq zG4+#42M$OhXDm@Y=;pzY~&^}GK3ay6N$vu{`I_K)#2urmTbADrTE${4DRffv};6= zc2()8{c`2&pU%YI%R=WiEQE?EpoPUW%knsAwM_=yKwi1cmutYa!fUTz{(nG+Pz^8} zD%tk2fOQ>S^@|%KQPXG{E1rMqhnr{3Lk7j$&Q399gD^;I#?VWM=U8Y4L|d}Ul~GZWvK+pJ-A{>`2tF?r3Mdf7}zNk@wD|& zVE`W`R(=Lp7Xdr4X|GQ{_MszSf@t$_IqnG9qzEdik!Sc{O>mYdBR4t*T?QAv0)oh9 z74^_+Lv?7IOE()RGDmUsv(I0uWZRE<5^~cT(1SO-eg6ROKHysmdYYKTCAEhx^(SjM-Pw5<`}ds&`K? zxa>9VV66&xu1NTl3%=pOgG)&9D;sVUKg5^L{Osntj#zI{VpDg%W4p>@Ff?F&G;|)9 z{pB-2+6XBw@V^NDW8dHBo#Zgoga-Axc4a#!=6^ZYgvs z60Jw!0{WVns!kP%Tt$5nPq7`T;Hb8>_pm)bn#6rw^bwpQi}--gbKZul2GA%Ljl=Do z9HI+}5<)=32HV)eaLd0h1ph&zqew_7p;-OOHuM$XFx=y+o8jgBdXsOg4t**iJ!1+}c?6`T@)g-@}``-Q`g=3^})|Pu$U~kw_gC&t3o*Q;x8*LO0nXsV-cC(s%jk?=i(*;Jfbvz4 zkwT%B0nE&o!xvth4Z$qZ-v~CD0*4tJq;tTQqkB#YGS;4WI@4bZ4~HQEQs$!>-$fG^Wnfgo8CQ~%siVHP;_f;xKda<^ z`^&U|K1Ry>LcNC*$T>g?iECUI5T>5*)yumPHBW4mhvncWRjfkm!8xMx%$Vu4YLN=B zTV|F+R2*)#TSa~w%?y8H%oN99AyzYuVU#21x3-t}zxD6j;}f(Hzcvxwc-(gxUe#Kpf(~H-z9x+q8T?EFt%lcW|##H-xlSfhk1?N**#?#W!pX0afgQuJ|7|+Gb+u znp;b}k&p;gJ_SR+=oigkc}g$VZEZxruUR)vT@q1+KX^^Q*`fUcD@fAA_LJIn@)|Yv z(_pgy$0s4B-YgmD)7@F05=49wZB}NLmf_^kC>nxwXW1H`3h8x4XD*&gXvQ|#EF&^G zzk<@%ecEoCGHnS9P=|kkzupCMjKVPFp{(VsSAo#^9WIo)>*hqmfeMkwe~ygd>W&u7 z_y1DrIEMp&E^A^Uh5LL~=?H*rd<+tvj#L7ej5PKwOM+2zf;V+u(_~gE1+w zQBkods;jGAM?`*HcCcHs?HRCfHjIy&v^$>(-GdDv3EzbBk8I6*PPwMzBEniMZuT5G zn^Ek@8cqyI%J9$z=BucWvEO-t--4o#s6MriuHlIVfT60OxNfjHE4ID_Kx$v0 z`FycyTegG2dvPVrmO5tGI09Pq1`DLYV81~g(Jlk~^a~>PuqgD09ExuJ4l)33zC_R7 zAjopih;D|%2(5m;BAik@`tvIZc4*FLY%mO9+P8QvSW-IFNc@8b+)FP(87olx_BR18 zE{P`U{dw+Ysjzy(`790BZ&R_JX5U{pAByi#2}>h6%uzpsPB0&2xNk#HJt_nW$GOPX z)EPuXs*rLhZeJ^mLFH$9lw47`^f%os_<@i_cfagUK7UraW*8m>Pn!EA+Ds7!z>F;a zHTSRO#{%qBDeK|jm0xnw&ZB$XS$JZY;6P7%QP|<&gQF79YZ$sF4lP#~RM>O$UTh_W z7Hs>Nffhm8If6`?0(GNy6TlH+IC5rL0;?^CWRHkR`mYVv2Kk5R1p~)62AxZ9`B3m& zo9ew`kGTngEy`z5ANDc!?yn5=yqsIz)$|lwJVt3tsmOT`ZF8=jyPL#jy%MwmKI_RX z?pP*$s%Ta>mPs|fSrWODgk6j{Uu7uZolK5boDy{rFvd-7#hrtkmJ`TxTbYUL4~}+u zxaY&s>(vJxp@mPz*6go2sW6)rk(maA<0wP)yu>twN8y~Q5*Py+NB>Tard;O7Y>0O~ zl|JD*T0u{~65mPv2v-#iV?cV~IJTz!1!}kCTfzr4bus8{)+?`DW^P$gz(H7Vzh{0D zJd6Pc9{}^4eI$*)8_^wJ+7C+Wfqw#K8ZGHStxS|IH7bL54_nC>g|;}l54(SmJFwE* zTd~$yozrAt;v+otbj%=z#FzbLf#M62Q3?tsvKYu=Bnmu}Mq!Zc26f$s%bePl_0Z1C^9s^UKf1w1RUvQT{4M_R~sXzTL1tyV2d37CS z5pCEYO2*a_Kd{aBu*0|lzR@qk-M@_3;doI&osJ~~*fz5n9bohR)g9Hp9iffHbQH}d#M6)O$pO{D=7$!N?Z5LbiC}01M3EXN|FNjpy8?Wls zIZP+fIU@J|kGXs`hu;n=2DE%!`D|d>xS6~9jLHZ-vF?P;nZGnUUs!y2J4P>j7)?8_ zVT2m*T4h}e@KUYX)y2$337o8ID*lsmXe4p>K^pO4WE2n>kZ@G0Izz`C++}4sN%f9* z`|A5sYf=dlXerfOR$*+>XjON`i=xBVRn|SHb8BP2^XNo^iMtyh1416N=pkT2y2fC!KCLjlrc?q01K}RG$#e$?@L(nfb_p zT}Y$|ESylv;1MoS4DjE(z(qMilKY2CH)ek}VZTi(P{AMykn8=kyAFiXUnYIL2duRX zA$~$geYs&%$Ma8$q99SrUq)WWYd(@WLd-UFA*a)V-)Q((&mNS`YO=oY77QpXz&h6( z{XI-M3*O}=AR8N&pJ3`8G8VI7?6dL4%zLF+7C(E`Sf+WAbirxlXD$3NY+G;Wt{XJ9 z2+CBL6J-lSR&3-oIQ_XP3i5g5tjJowFvSrHK-<4BxJjg{^&8q#0IZq6;BnpjVS-3@ znG^Y!xL>Lss?J`uaBtF+DGeYvS1kCof;9WUNyUNIXW(JK4r|gMtP2(q>4~d}q z_>$i$#XE>0?L%tT6gfHH6OvKfiEa+Ry7HW#A&fV1maR35_b6OzLr6I1O)Y2&Pn@Ne%=hUcHJ9(Wh>=128e6$ZwnvKvB_4j2f0$8i3s zWNfByTYU8BC@zm>^qPwbH;Kf*`uYo%Vk3uos}`-LC9hck4c~W4h!R3Dpt=bw#4b98nOcd zBv_d8Fdkz2r(FG#Up;9zoA~xki@Sc2XCaOkyQ!c~cuUSSd{51s-JZKZ-852*Lyau1 z{BFb}wRcjJFit!~dYVH_uM#%Pj5l%&;2q4QPLgO>KH@sxFO+E69pW4(`jUc5;rqe3 znrYD&^&5PbSiNWMuSm)xNL8cgubetey!x!SlfKc*QcR0#j9+NMa~DDa3cY1g-Yy7< zphGOcvy4%~^q@le9 zmh?UAW!N7bUVmI_=FV?s30PH!UNIU)xou#%d>j)s%~_#4tm5xmXGWY%@-r9h4U&~l zDLsdCm4SeC2GSXa)&}IhimBP(#H3Zo85!P6B(5DT7A==_D}-)18K39rpKX0r&F@dS z7O5m6aK9xYb>&Wc$A;sBs*EB{N3GtNqYO4TPLlQH=o3sXVv7nFbh4t6WlGw<&g82} z>);rwM-lot_A{ho0KxE|O-*Ij$U9DSEbwgd!q`)TqcM8olgF(x#CRa z#9u=)qN>T^<1kVbvJAQ!c1WvCQuzV0v^pXZsNNg}bDs5##?A(Sxs;Oc{mM;8M%$9i z$FE#VOSNh;ib3C(i%t1oW~3A3fUz<>L^y>@ep0JHhs?9qmCjBGart1@U<7a$?pI*b zsN?xFrQ#@GL!U4v9kbm)yN(fOZASfjVudpCdh2S4oCVL740R%X+12t(vlt-ER|~9< zj}KW@qe2!6(tI7NgaSh8sgB+GE9I0O`oE>(z9%s(1}+|Oj^g2wyn zbJ(}q=FA`GJ^a=P?c)d{6JL%hAnfnzyhDF4NcV>?c!BybZwHp)W~7*vw8;KzL=M9x zWyHibtyXJ2TyZMiCR>>nr*r~unUxW=fK0bmop{TMFgy-3; zo=peAGncH2ekt$LH{}?`D?vY;YA42t>`HN1AlkwA7Jb$?9&6T)c@18kO8fbqQiAK| zcHeUq;$*eCrCxbU1~2vEIWE5=$(Yoz9Y z_0jU@t>LMuF^K=OT6T^JGzYFq%$8uLTfT57-g zR|tuIYq*}SeYK~(+EJR6_>5F}IbOb{UIbnprgBjJSp>E_baqQ4MTAbBlYvr@FwT5) z?`}{;e~9G`mP(!^ZuHXmclQ1!i#3t8O&5I!8-1(vYuTB*wN&Tv49{=xqnZ4Q$_ZGs z`X5I>JT;dy{lb(5po0yfIrk>GTUar7L#nBu6 zo(XVuOf0x1%Ghdf6+t7$#^&;&TxW2kmD9Xz@aN7Ok`1a9sFAdt%jNY; zh!l}$<+rm9$FR~$2EYdiWy!RXqLvQBe2PjS-j&7+HQv>~_!sAc<_}}-~*ef=b z?=$i@H_z(i<9X~8De>Shg?1bRK!c3@&A_)^cxf^!j;=m|67i*^D~9(_!jNoc31wVr zX_{et6wl#m@;aMPb<#VtlNjHxUA1)cK&T3mgW}r8B;I=Fh-?ItESIUOy=weiw_wz-)&Z$o}B1%(DC4h&X) zugyPFQpPp=7=Ds#lr=cqbtYCJMW)jE1qv3+lBnzRiR_$*7b!&TT_47OP+-d?Nk4w zvcMJAwx+8GWr`J9-f5aSO!%8VF+tx_2U_j(iSdCuo`c-lG8-dCGITSZjd>regl0x? z-#hN3t|MHz9so25LSK3i{mo4 z?B4TUBnJ%infGu_T@2#E3hc$T0Ajg_HK|t+vjxapTf&`Lj1a?4Sxf@1mWsQaskH^Q z(``BCKil$j5oKDUrL2o16$l$`8^H{{eJ8GPOwpvl@*T1I`%`usRCP zKjz{ndPsI$R2T`YU|hQ|%K^W)Z(^N6mB+6^!%AFDe^_5oH{bnjQYpZdWK^la)G_U# ze80^LI8%$YGj5cg&)j!^wPhm0Xxn4k2e{e^JNV6)f9iT}^SP}l?O+>P&71i6^z8Im zx-4QK`N4?8J_Vnrjvt@$b6v_?xO_4zKtv?5Tz8Ray3hG$IzpAy!RYirnj&idq$lv2 zlD4-=!Op$%*dwLz?L-#DFW@Nf{C+xvM>`cP9aU!fy-{%>CXqr0eCONhhTQXo|U~*t|A-o)HY=o9th7z9)dWYdsRjn18Kk zx9ai69P}nVj4e`#KYK8e`*du7vw3FxCx^KJ4T>Ew-~RbEjxH%^6K|bNlFJUSw4{?A z7m2X!$*HlW>seTWmAm@0P(0Mr2w%oe&2-moPBQI#e45{zFP?YZ24$RP{uL52tgNvW zx2?8xQ+-n>Cws>E{TN8Zp_dn(!bszhDGNV0TL1V;SzlsTC12}k$ImPlg@ zkAuGsVpHdFBBNXHycj7D-zUPcU}AU%2S0L{I_8JKSglPM^fM)~P1$jDG$TIx%%C?2dSs58N!2zSto;#obF>F5zZ z7UoiI%2oQ^$5jVLfk5;J$&e@N*nd=HrJ?)TFZFvE7x6Z2JBz%rY0e9I6zz6h1Iw09 z4g@hvN0l{!GNDmyB~$;FvCd>Ce@x{nyDy z0xqoLY8hq`EykeWSd!20)y6cGjg+okCmnPRqe%Hqf9i#g{n~c`GtHr#CQcskLXOrc zDb~YSsgX)W59mQBoG6k3Nhl{UOW=Meos0eQ@^)c!3g z$N|oH^nmRM9wFs~=AB#V=q#?4n0rnmJ3aEoR60gb7t>~KrwIh zy-shC$LJ_!gDGMHIM&!1an)u}nG4x!a3F6C^;Bat<3lW%@`uV4=4JM{hPXepl_h?P z;a*EwHcJAWU#en#4bdnu%C^(rtiF0sBG~HmD#Wuf_JCC~IVFh<+a!SoD{M4|bt)?p zSsn5J9P%QzIM#eI7HdLNE}&!{DQS>(_)~W;lhld5cS==|rLJ0K>c}@Zj8^CbqSB1e zS|6DmKdBxX%L!ccSeuVTQdVI=ifO$3MVm0yymP(3p4UglK@XjSH;VbLWqU(>ki=$E zx*swtFr2#L!IZBle7b(wm8kJZ zA2Y~o0rHpx`kwy-5eZ=Po=ArO;Y1SMH&<(voj8b;W5GdXMCxj){q#Nka$-?(G-dEn zkq*P3RzI^hm5^gZBChKSUaS$Hm28&f{waDVz?1ppcrxQpy##B}Zqno2XV2?tAQ73x zoBKmr6L{rU5%r;~?&0C0)i@}KNR!qvM}`9Mc*wFvM-Ldo(8BfS*M=iV07p9EF8R<+ zbMM#5D(G~nU>)e@RjL@yyN;)xZZkuUrOT>~Oy(qP=z9 zyIP$FHuC|;C>qQ_-xnq2O-J1_;Fa@KS<~+C+IDXC{Rl*Zm*1Hkv3GtJjoyG&-XI|@ z-{F=jr6uUb5zSi0np?$=2?wZ5Nv&B`PkMes52E>NBL-%GMMLlE_1|ef!iul^zzbEM zQ{-L+azKvUm~7(m2w(TqQTFhEpuv*j6Tuv|QO8+NU&AHV z|G%SLuhPXLgZ7fU;EaG0#C=Xpb4fJ{`)MKb*B!EvHcd3tpbeN~IpO=D3H$-QEqs6T$*TA0Vs4iE4)jhyYs2}Pkj z|8dLT>`hdvCn*>ei@e!BY4?zB?OKm{$VHT~o1sX{p%bGXHvU`+yfLMF=VlLzqm!kU~!DUM<0t`lR0iO(w6YqI0RpST3p5eUsIQ(HJ^f$HhjzUcA}Cc7YN}L&{zX{G>Dt7V z+gmoQ|8uqy6|VV9&{3n89`&=qG4M$-mBTxuG_W0 zPuO@5@*+c#7SV3oE@aH6Q6B=J{OP~`G&7iIFKP3WE`f$(D;@4*gM<3ND0}OuwxZ^3 z6e&({DZ!;!DHI6q?ykk1;O=fg3Y6kj+>5(Y2=49__ZF9;z3Kbjd%y2n>-WdKXJuub zB**rinLU%eXPzhBNb9yphva`tzy4qIJ17F4*Q=5^FfzE`^@ubRtF={{F8caCCQ2W) z8qtf_K7X&1CCzU_Ym-$In|{Qd7>Lmg8*ba3Ei4b z{f7pn7A3RULzIXW604ubbaX1n|Lb1=$6j9a&2jVvzTJ;mkEDM;=SM_n!zb zO7irgzbIRUj7r^9^*?t_jL2)g@F3=H9Xyvq|9UTA(Q_n@G9*3B%Z9_jZT&Uyfs6w{OltenURlT>&(g}%IkFrpm&ir_RGMNNxA``*486iXbT_3d7qC`+ z+XnQ^Ahi%&bd-^c9+H@AfSQdsYa4sG)fl7CycUX%`TPA<&Gy#Mqw@46MN0RyR$ToU zP_3VrN$RnIgaB9O2>P}8zBGo%wQdd*jwDj$a-mlf<@l(7l4$9fP^aI4qg6AsYq}z*MsK5$H-I&9JzB&u zs8VzP>w~(&$nD0DC;^ZxHKWQUk5<{tcLdP}b-K=<@FapKL;xRHhPeEqR7NbXc;sh@ zppS=Nc&lVKY6o9NJ(pnxmpo{%uv`bUUIV*hX&u&Y+xaE+G?weUw=evKC%4{$MYwFZ zB|DeNX}B_sKfIa#1}qjC)8le>+s&#e@yjt+%Q9Fc8O_OQ@Wr>(ocpT&4QY;;-4SjIDr*D8vS7ekZ?J;Os@L&r)ktqSDg z`tm`NE?)_lBqiXMiz;n8;^d{xIjxS{QYx7qqH}4@G?eMDXBz2ww+#aicr&u))Q#<3 zbk`>c59J3tlcIz4RFy3{McdT;1{+JrtgBTGJb&7GTX@k6FUh}?X3@@@+424!g!ohE zxX2*WD~|>2Ls}^JX-+3U!zCPx7_j7TH$3BPPo>Ffmj~AUs}G$7bZ~)QK6uDc=*Wl| zMGQe_lEkCzF+`dz_RZB9Qc5`<0jah*GmSFc{eSvc&W>|RHW(s4?D+DFyeGxoR@Ljr z0l;su`5gjDwQwQZP`T2LG6x5u^Qu7wP;*2HQjO`I?MV|rYx9zQ9aC)a}ZijNBfmyX^z9c{zkPUf;FftXJB=vrvdX%>Sr@VFuwq|AD4i@n#Tb2m?|v406g`~4mX$RD zXHn(1z8)9GaC~$EN_u;~^EXsGa@%A7%tm5x(m<<}ug=*5ludQlahfOLoWX^%Gz?-e z&*(bO#)q4&=j2Ef8U&^|669$xuulzdDP)i>x_p5c85uDt`6z;BR5zX2kQ~TW7(HV` zqb}qjXT;0kRwc17@d>!~7*xHK?YP8g(zu4`dKpt(+S8M!U|DhH((OI1k)~F^SIOp+@eA24fNkPwTR5i@`Z>w|2|{z%Qj@ ze35wgk^iJfBnR1eq6ZJ~Wi|;C{rBR=+G}#as;r;G)#-Zur5J+O5veNn;Jl=s zK&R1;&7-_Sch%k(fgG&D(=XoS0hdeXdOLZxo42oa;%wdqDuq9LQu~xeRQ}3D!>7g2zSgl&n4gxm#5k>5e(6Oq z+iLK)i*8ax;-ql5{#@jpnD=K!;SL+@fx|sv?efPpPPeeUeD!ktwFb7eVpL>F>0#y{ z($G~U{&e0#!^7P_$i+96;~W*!MiuM>)fqP@}S1(jI82$ROftCAvXX7E9t$(h*2FCVU;1S5Ze6jJ%8=g2Wn)Rqh@^(aK}4whodg+o zLo>VVdTe!85fPUo!*AI$?*DQYn7jS9a-gDW5eS_jKBP) zu&!4SZeh#x(-$fDZ?h{Dv{BwChpSDIAV(4iMCRmA?;Q&e%^gbuDuZ2WVu*EkO7Kqx ztw>KxR%(;Nk@-iI+a`I`d=tmZz55g<$`fOy{p)T!e$d83uYi+bxW z6fD#x;aPa%d9yIK84a~^#2{dTevt-J<-{)yRQP1)Fc-ZfRDC`xhryJ0$wp&S1DbFH zbw8Jxr9ykUEq7|<^VoceVB&+B##(^j1RE$BZ$3-hDu>i4SQEpY^~B?358j+KCK`f6 zI3@lDq0Gdyc%|-}OFZQkoSD$tr+D07-eG?_>_L@GRk1M)VbR<`>m*NwTf9IEU-w3F7RzmNpI%Z=p(b`O9%okvlv+D9ICxirH|)#@K+?mPBUKKg5A8W-WJ zrg2=Oi%WbpFn_;qdksF?-{%6t<^q=^ZUj6yK2kq2z1b$Tu-@~W{xBS?-KJeV7Nx1e zPD86e00+Fn z6293R34O5amQ=(|OTyU z&)}>}*E;|Dq!`L0r6U_$#9c~N#k+Jtl$Yx)%|yob92}m+fJ=gA3UOX^24xR$Mpr() zMa#&C3o2?E*3UE5M+c{S&@NUY0o8ww+^D5bMmaeUs@kbtEg_aPu8jaOqpWt;>fbZA zz01b09ur}(9i9V^-F_I9;hykWOvXOtOPf}u3sU<_!od08QA$+81iFWsQINZ!{N&v? z)(m=|7zdFW)hr!GT|q)E6SXxUfY-PP%X$O&z~Vx35@WhBx&3j_GQWlt;9zzz$UAoQ zkY_J7#iBlS$ql@-v<8#cEAfbI$E^0aXOIFY`xTd&SsDs*?yi`y->Lq#`4t|_Sp55+ z)9yrOOt2KaZyvNfv~rZH<)ugpJr!_$F5|pqp(%U_ zJ|VUic>(3rC4s%?#b!SG`EuTMqv{o+>FiXSs{&^z=hZwsR8*#(M4@H2otxqKh{iK9 zEpByc8)J9bRggwkbe>hU)u`!&l9%r3zi<6=mLsruCce=9IKX)MBz5(9E8we)1RGn; zOaXP^CRl5Urc(=D9s*&Aip4>fB>}XBmZ^?{k2w0LYSv8c74m8jVf|L3n!~l5>@&kB zeWYknG7IsXVKhUS$wafJY$e(|k568Z!h~Uplh)YyM_aAG(9GBcMuxS8NA2&gnsr1eI=KcICh;lptsRsFqAeYzAj3eSYun-!d5Q!-43Se{ih(x_xq@|GE$n^JQXIA(|d& zR)LoI-+t()HPMw-AOVm=2-+x4hoI!MCZsW<#wftmezJ&yLw29cZ@rme<#cL(~Z}|*>__W zYbUNKa%p)I4^T|0a$7Z60ZxS4QMq^n&doA>7spZhuVZxi2I8|wRhRYzlAAKE2aYDA zAz;bI>g_8&2g$aqSu{}REW2Hldnz4Jj~C1Bu#!3vn_q129@G;QHANG;U{Ghf$*uU|8jZegNh@ap*f%P%@;`)E5|Ko-P5* z%a7=G1QGPdDiNf!d76+D(tE71j?xyMdfi|RCQSfG^Ced(>?JaI8^73OGOoVTpxV&~ zy7i!XV@gXg<>i;@oPdx14cTOk3I3(MgX=i&$B5^0oQX^K*G-kNGZdXeLLiv9+0!Qh8&J~4nh?h5q}m@ZjR_yDRFo9}I8evWN)as-7(qOW;lbI+a4 z`;1Iq4EDh#HcI=%DJ`TYNg=Y09||Xc(_yn7g)$Ot`X~oipCs1x^ZYTaul~6>4^(mgagG2 z#G4*MQB~nXAj;7CqjM#o9v0&}^1;_r)qgSLsMpJCzhZu-WP($doo5?{KXI40nPGy4 zf%n^P*>=@yc(K5sC8Q&Avf~{bz`Lspc-!*T8)5_q-xymcxf4#1I}$R;T80=VtOBF> z{Aff#F)Ru^h9hLkKGT4HDpOiCsJR<71V;%0I*-sm{)DJVp#HDH=^}QSulCstnPpVn zI|V_#C%<~9Re1{u`Y}W*#$L1F9OR6W57FVi2Hc^2c$s ztzI`*4#6L=`1%Q+6lQaN&B4C^EHDw>!G~Q z_gjq8Umho0A_I6Uc?|W(?V*)nGvtv z&+aiXF724rlg0PG(<|OEz5N}lj>Gnxp6~soL7!v-7d;;OyOl!foR7PB$wiIwDt(BI zLV8Vq^e1L+mJHXHimU07KNDpL>ZU;U?B0e(-irooX+?*ff+ZIXB z3Tg!WbCDgCT3%cpGYI3NJGBz0bQv{-$G=u>kZ>6tvSH*5++pi7PFs08?&;v+A&irv zs`uU020PKE55}H{07I#xyLEgwFRgG`*Z((IW2E(5Yu74k^gaDkQmtb{h+F{g9`b|p z_oco4^^++`N!q1_A>ral;PZXNjU!HEz3+PwEw`kCd{#>hd-i8h>!^4^4scezq=X>K z}5UM6>iLrG2gz?~Dm-8&^(%kWNOE&ZEZB<7`1DhRMYJ3F}8E zfKuAZ_Xh5ys7X00xGTJJi4^>ns;gTC0p6;&NmtN;J3GALEp7VcJZ4JFtz>y`FsMW6 zaTZnD1p)BeS5AMWT6Xt8qiY_`H$+N!{D`$Ok9Q@}h z8}4vOlDl}rLoh_U+fB(W!~Y8Rm3$O7rxhd~SGT-0~sAFEaB%eMY?`2l9ozirV7-u};Amb4J& zGygsgqS+hHS7q8|mgl+KT+Kn%g@`QEYz z2yKHGa&YIw=bBOfyQ?!xvB+(nWiRv&a4r{%;6|i1ot)&-bepew+V#xc$%vh5oc>qD zUlyAX-8xzPvJYFKvMf#`Vq#RaVV!=~sxv%;Sxku?=dk#qeBJ1KdUE%u3Ua<%DD!^Q zUdqn7NKQCU)pAz&$}XzwncZA|ayIF2@k-j$yX^iC&VbPJ2gWv#fRH$J<*~B}h1c{Y z?q&)ba|$DB4ljSPi$E!rRBk=Y`~3GIFGFN5rOsy;ELv)eYga z4pn1TI)*E!nRLQK+Y8<*eZParQ zetxeT7%0y!IXUr|9F9M+<;B?E6!+LDL&?X_)ccMx6R5tjTYn?Y@iY8G;^`N!{uY^i z=+fE^t*dgom48eRS}BE1jTd1CEp!oRfBmSUu{@^ieqz?M6-ntcXhxh3_V=VmgY#bVO!4{?l&Y0dzZ``UdsfvZwEH*)QuvFq zv#6F$7GFvR#%b5q(j&EebGGAV$5nBhjbgx)P>uW ztKF$ghPhu^v`02mhk4#vM!dC?D?-W1_by#B~9{;}#Vtz1r6 z5v5i6`P*a*1ySh_1{IPgqa{Z_S%Q51%65B{oelJ5yUsT6U*(U57(|R-bU%QVoIK%z zFUm~P6@hegc-(!a@I$0mf(*G_*d*pUx3($PMg_1+2sjk4Oa*@ zvg``R@+~#nBTihyP9MAPwdBu8ygLJZoAR1ESK#6LEUrD*#=JSO1OFUM$kX$+9QQQc zR&q})UQd++B^~Po1NIsmtI9TuXgV!tXK@O*X$F@QX$~zvX%h;$eQFJ^Gbe;`SEL|q zW`(74<&IkRteWl{$#zwr`*Fc*F|}D=T>44`h`|_-D|uC(^E{_GEjY$Yx)ixLCi#>` zUB_!qWtM`t$Umd&1t#wQ@)6Ubs!!bigqJ|hM(9>z*rUCFhCHjN0a`aUoHDR5(lvll zPhZl>S#7Vn3ZJhtwP!Dr^@&%sJ8h~civDYud*@HpIB6J{Gb+-dH2>3xLaES{hH<@( z->g0Fng#y&idaS%R~*MS-h{s|=of8IbCv%2yc&)WBFk^8+~X*S)_tT0vJCV}_}t&Q zw@t=WS|VW64qr6|&kvcrhDY+>g}+V!m>Vs<%4KE}Z>s_+vSP|0<&!-1@Cza6ArTtFIZeQf=C`hAC|B^IKfGaZf+ zHu(TvOVS)AKYuoSYfy4xNL#1--M{hDk@sNnerbmCGS!iO(!Fb6$=#=h7Ltf_?2;{T zBBFo-oVX-yTyjBn+i1@Lb(}5#vCG8qA}cip5btu2Ir*Zjv+FdDe}R1OZ^cUdxnJ#| z^o7MeZXSF7uPvF+`jsJOfQP%Wb-s3Fq=va;*K2*5plquClh@zZXU%2`^{S?+ZUxnv zJQ%4eyNuj9u+z7@X;!7^FrxjBta;_-E`1PU)0-WnID?i21g#UWVH1u47p(o?5$lV3VF^;h6Hz%@ueYeseNmp+PpnSa=A>RI$vDtMU z?^aV6d7#tjb(oXEdAMHqkRfm==q(q!U7Mh4sd4w~*!pLkujCwry!B^|@rH{B2idx# z#^c+|rr+FW8Sw4z_(HvF<-axeBs8K&Nc3FV_$$nOchE1T*PAMRI6SV)ETN8gTE z0&cl3^eQT@gyEPQZca|XAGnQhGpmMfV<1<0%3`=-)84uYXo&b-4E_ViJM+#rE^|K% zdsI!@&mF%ffy_4C;I-3E-~`f`gKw2O{ENtm@I}H(UivN4!}B2iMl37@Kj_whR5Mwu z#C;00j}{mq+up5H*6GKqoKV1^4AyH@s`}UKbXdo*|EFW#s>vd>ejt0SQkjGP+q!K2 zj3)G|IBj;l+>H9;sCA~v4>*yQ*dpU`X)sfY*n-QqgItzz<`Z0uKPymE?*9H-N>opq zKCC*JaFyY|W;4R7rCK0jdrVaoaRnCr?-8q$N-K*GCxa*h0s{a@S#i{@&T`NDTm zXy{s!gJ$vC+zl10b9^Dn+7&VmK5mlA()hnMIme&846=T8PZ&Q)SX%JO`Jyh!Rw9h!) zM&esBLEU2ISVlVdbt0^ngVN*ef7`einlZJAY+BVwUu3x{eviX4C`v*jCBU^r)3_lR zf8&7-tHH)mofO831JOCF9;zQJ-_F6;O&U+5z%3{Hc}~J5SS8R!Q7WLjUpDshk($e( z+#@#2lgosG`~1if$9S^BmbOVZ3x7+Zdck#SN?S15$zAU}22a ze|@7cH9gUl6H*e=B9!6$nV%JEX8>$SJL9Xv!ZbrZN)1QF>t*&R=t+2{wqh0a4;t62dZMaNlFa)q0b*X5HF~NB<;bLLuIY)d1NL8GCFDE>vf|Wd;!*JS~GWzTbf!e9hS9*#e-akx$zZoYq z!Ae*ER3xgQ1<9rtNGsQ%3P)V2#XKTJj6O}fkgTsoI#5pi*!OJNwC!5!vZ3Qpm?46P zmpwA z0w>Xp>#(-wo#k7BQ}9_d+O$_6kv5nxx*_%5QWMzvW7+1a;)TBMfiH{BhK=8JyMHX{ zj1kQU9M9dwYf51}ojpHFqgkraq%fN(^Cd1=(EUthV?e*(_h8{-;nu`1QrG@I<~OV3 zPc`|IHG;+35I#TnP2(5*bqNBD^W!R1lc&V7?dE+dSyT*HGIna}-t<_ILCK*jS_?95 zT|7z#In;r=vpXLyK4cmW)iK=X;du~7+xi%a5dk0nPY>J+dXn8?c!+a1^V6_VVK?h1 zL!m8TlS>kiwahabkZ8nsiXWM(5P%vy8l)l@Z!8I5IG9>?JRMGDTr)}^#`F#3 zmzEq0j6Mrv206Hj8zY*iE~io7Nix?3&WVnEw`>e@Lm|WRDympKh&yX#-#OMARm-=` zwb8>bcifzCrzg4^Xi7(z%&qeF|Jb4~ZdZR_RI?}Q%nA-Zc_aRVaQVc~)v+~FZS)iF zkDolOo3ljn~9EOx8(NjP}%k`=i~aq#ty^HlHv=C1b{CT ziA~=ny^fZ>kl)zwL*3IX@ZLG{d!HPe$)j*;ey1?4C0qsVg`HdvhbtD=#yDG(_^1+K zKs2-~q|Obgxg(qO>|GMtdK%I+j0(6ps)U(NHyss<#6^JT2zU$BNLlRou=h3mZ&mGv zt8$ebT|AIpCIM4BAOEFz4_g&V^WO$N!@(K^WY)Rn#-J=SEj*V8VbQgxFOHy3S4J?; z?iT}TF&0Fy#e4%1xdfTZOyffRFRf)>Z5LqdAh^3G_VPr3PHfu}+_=}H)fTYYsFo`c zglp~99kUv>l*JsrQ@~-Ih@E~>l@LyFXYCg2bt-|l-QWO#R)0igYd_*bFl-rNK8cqr z`9IGJgX8LVDuRsQ(uHXqNd_?;m*+=DMh;QJ4R3~dovSv{KgyQ-Sv%ja$s2i9kCd4X zP=SNc4kx1r%7Vys%V1Bqrw=-{$8uFm!Y2D=!*E#scaAb`-4|X*55kXF6WWbFrkmke2^eN-nbH9{vomSgtSv;>iTBHgphy6 zSl-w62UQ?GlTS8n4_1Rl+#S)Ba|6FRe;mWgE~|LLX*OLU z9wASLgoc?dHsqL6hzcgI4Q~@(ZMD1rX{UvE4m*-~-=&$RHo7~BG>(@2?9boDRNvZ8HPQR2JjP%rO9CPg z-v3y?Hk`+qlNg*H@9-kNFGaQw)GEw~XQldQAYN;4fTFUzT&T8;m0tSGDF*85UZRU~ zx6V&Jqag!cUNjOu?yu8!*7+$Us=Vx>7O)WUi0xgEG@$3yCN-VUb3I5^W$fR;$3tzM zGlpHJI$;TuXo#a=><$+KpDiA?zZ&NYgI^Yz{OvI@czK7b%7dAuS>!d%5PJ7zO>uEq z>zPB>)8y=`=Qf3?vywd(h~ zeDd+`li%;+FIc@iu|K1EWHNW7+)!)3BAjB~Z~W%pP1JQkSj9P@ywTQq4U9wZx0Sw= zCy??MjJ8N~(c+bVb}eFGT1{|)V?`pKzU>U9|H7PL>-TJ4-1mCf2=1F!#BnP*#D4^i zG|_*_dHda4O0Fbd6$h<$`$23D=WeJRzgHCVC^9`1QQ3+isX$9TlntM+!JTtr#a;n1 zT(Sb$23XHO>xUW?A}65t%P`86zM=Xhevz-j%ucm7-KXwdM|-g9*>6dd)pylYZLlaU znK+TD#8ko>pV0k#WGxyj^|=RWD0TDcHBx2Dtk;gL^p~+S(_T}5VBMS2FP{?;OCu>F zf1!SeI0Sh9@LUYEkT|>PsRNc!UtgA1vOX2k3C?;0f9zu|lCO9LOBI zf8>EHk&>;oq!Eb6l6o&CTVyMH!=-pmy%u|LEfB*}Wd`q180uPgiPflJAm&;p|E)|- zwj><_$elP?LnzdS9Ox}m!*JR(jS$PM!e2pVc!WomC`~~tHsY#Gs zz|s0P{d7aIGmF2Y)k-&n8J|2Z-U}a@aG6b%b@b!U9w8m^_xb26al9>d%4x_HJ;_%K z{r4~_%B?}F+hEJ!-WNdrW`mt92%giEl&3r&0+t#z+v(OWU~}!QI9s0?14s28N*2wW z*~9Nzu9;`*7t~;Xo?rSCXqdgPpZfw**6V1);yVT2I%MCp%X==z2x;;~3GT3*?DifURdJ2^E2#8Z%hBgrnMiB_n1em ztH<3t-jPFnHtSZx<#W@o8yy2jkGNJ5sXs)J0B70ITxZSLkrO+F@B-&eaeC-DnqL+M z3;Q%>sHxMUzjFHhQYv{{ML_+v8a^zt+hVc2Km`lxX_Q&_vc091r9)0|7g^Yr<# z(}b-!=_;bBRlpB1-&8Ske2ZxTAc)gO7+s@z2_7A_+ihFFloxu z#CL5)<|YIXtJ!t?>)Z|L4S~{K2=66GgFMazTAVaE3yXf3McNl#&>?xB>ENeBe7PG= zK8lE_h5`RoJVZEGnLGB#U}jO-DjmN#JkCDTDmtutrK<(PXTRs|ve~rc-3t;^g06}x z{i|;%4y;|g#H~Kye)YdFw2Qk!385vvUa#SHcq+4bt7Zqu%KTT4JW2^&#mE(Y!)_m1 z#uYE3{Q=qorwph~LSEn!`kZm-;Y@!-X`y#O6CWH5oX`7L)Jk1VuFtB0N$SeS(y`bs z{Xjade|@ttH#fE*p#ig2wd9^i^C}N{3z7r*V)?#*XTV;6-^T;gps>PA*n{o&9CG@3 zio!Sse^6mQr3s(c72{M2Cn~)C59{FnIL8S4^5fkkS91(a%r3M9gGZJPL~Oi_fgV%$ z!9lNLK2?~pN%j3ag1D0gl9aqukzfUq_+?00lit_JEqzT;=vxZm;6G89Bx(g;-{Kca z#^EVF?-2LA-JM+d%X)v~-r=xMRQ9AY-_hZAFh1`1Z8Li%13@o5RDM4_xB>w?SM z{ZdTmc-AVZR@NZtonsbS+TGBcWJ*0q>O3)ort^jno|DcyMO?%y3 z>6LRdAhu8RLx=+!n|%~&B2KeDK~C4AA(JLP?zM#tGyA!jIV4D^)6*I=NF^D^RPJmu zID@Z1^UT|*`MQqFP@Cxe^BPVhzzlaOCV*}4#nC2%-MR=H=xV1kx9a;Da_G@=TFt-K zS|zjLAFUMLL`c}gO`BR)eIp*C^#%9x7CWfuyJy?$l2(q@zLlYe!uabagTt>!j$z^L zkHYRfWXi)5X{d+YU&i>X!(IcDB6~oM-Y0HIKn}N0p4)<=P|*-&4WIn&@_1l8RslrV zp4a`Y#8FNGHRqiSR87zp)%RowEbHL*n3rFH`9TA=B2{Xo`}imaoi&V>hPn+lGYk;t14>^@=hw7t*tYz(S^Y% zw3B4iNfj*M=#OtfR|e}An`PAFmMdXprg@^JnlleJ(Cj5KAg#Ngq?Dc2I9RX7V1a;# z>-T5L8aMvsh^)__vleB3=?n|M=UA#7^0VA7{hY;o*K=elYesV6l>?-m$=uoT_|3mo zdW=F)RabAwL&v)DOfo?D#7`9LJG-L2$QaTB9i1Q?c#6!sVi3GJC)Nv|?vjM&NCNnP zX8dhj9h(K)$Anx2S5gvh=9<%}Yg3QPOtC4#=*XGuDf05*C-_6tiv&RfeIn+ENtgh) zN;ehB#=|DV1gBvGy`|NH!;T3vEo&=A`aO#-^^DS>XY84eKy<*h+$7ZhIiw6Tf~HGK zf)^WRyOb5oYwK?*&qqeNIo)!(nws-?CLR;8BAxW@y=pPMGVY?=Zb}440w?}{vrlTw z=ah)D{E=_==LzNL8Ox(InzG1?m0ON&pYJ$gA3I zus+S+HjY(Kx8svN`d%l;OIv8Db#f|!C%~QmydyZ#d`7EoZ2|Jl&rh*=5cK|J*wJWX zWN_Y5>uvK}y|k&w<4jLTKL+yb3#&AyzB|u!wbs?nX^yodpJa4G0or~(_#>d!(dfDH z`R*L_J}lyUT6eZiMswGXR-fF3+3m(g=~9Q$xoIQyiA+pFCL(hN6Fn@A_dV47bbM7G ze5qkM)qvf6&2bd35YKm_llfL{=pGd5mB7sq+oT8dE3t)zuustV3&ST6>m*HPI3jh= zX{(-49>$?uSkg{q;lkKWPhzJ@+{q%6551O*q-zKyM_ybl-RGV(KCz+ijbADf`kQb4 zQ8EW;prYMxD_9OQe@(ulW;xR@RQWZ7^jg|&&M$4r;c-gA zkXyh7ftngd^QK0T`l;N+DV&$tOqC8WjcbK}NBMW9v>^is$r-^GG_DW``PEVJ1jGF+*0dPJx z{$aSr|Gp)Xaqu+^m%ky#YOCd7rLxIp$?oyuwx;Zu)bS%M-|kC#iBC;@fr^N0(F9iR zrU2i9V{b0jVbEPeb1h|kmlNr#Nkn2_E=kkcqK_x5-IbO>GxI6qMs4n}fLr{Un5B^7 zL}K8c(Oe9+)ARV_(ifj^1>1(X$2VWbJ&d(k>l+1jnjtnV?^a&4~@iNy2yytL#sAc2p;L zLzQYi(Iu!vE*nS7I4Q4Y`LUFCt`M8gHpP3>E|7aa=N6dPC(9#~*F2}W@N|x=uF6;% zi9gC6%7aN!`o-(}9|RbKG#87H2KQ|?1s2mvst(HdV){Sxob=zf%2LJUdQP95PQd51 z3T{AZPykiF`D=QVpl>0re`Np~w}1h-{&4&~i2^8v+O-?Jhdnz|b}~5;Y;53+v3fBu#4gLcKYY>M;&pY3@_fC-}+r zY!vr!VNW49(74Nz)?xg8AWH3KOtVSij!jSLV?aSp#Dh?({i z9L4lYRR^QZ;bO8KD1%KH8kqldRSv2ie$uqn8AVPi=8WU>+o`t`HLGDdXLp(Ws$kGu zjO5sXeyCdz$F*v)hkk$n$d7K=ISr&VVLP<7nn+ZDfj51dTD;1uT{lQJpX#7Fq`Xk!6cC{bq`8DT+fYn0<_npOnjmr5G>Zhmaov zvqMuWM_Kt*N7s7o*q*}A9u>VKURHLTqn3x?nJZm7l_n@`$Y0t_vUC&8j54!_HY=@SPbtjXa1R+lV~o4FV&Dbysac&bQEMf6^P zyJ>F1x;LUr1E;Ue&R!M0Yz5~ZvKYV65n;H%!jQ9U2I2@bm@A~2!4Ya-z_p$|euqka ziN)=UhV*rvHK=jS{FB$wdn1S-;v#2D-7Q9=THPekhROT~Rr(Sphek5;NC?VCa$zSK zjfD58W*;=8S{=VB7l9t72p%SAgqf-asxQYYz>^FU%-77*qD+PNg3>$m=TXKGgc`Vv zX8e}u23_hv+CxGM=Wh|dxc>&+0jhkJL3+`}IOPH9cdqt{%9kqhV1*dzaqe|fP%#fs zno=50!4Ny}3B20xYY=pVj(u7;k5-!2^&tP|*)>g60=<7D9pwNHNaOAG8S7`l`T32@ zJbxgwnWgAZ5i|MR8`|~km|6;Sss(ftL?8ljucLEoBD(TB6ENc!EBU|#@LP@vqA!1S z%#Z-yp7GtKpUzi5rfED?6bR^Ub*_NBu6R))SoF=5B|BavI zIU4nEZr|J2nSf)h=-^zr9}g5G9NbdQPt>OA;-F_j}Vjzt?&% z*d_`6gMxCub?2}5QPN}Upy1bfo8lP}{l5S)FFb!cRS<{VW7@ndNJ{0%y>@1=DF50e ziq*I$w5dc$?t5Z2szj7E)lxG=ELK-X&+;5I6v07~pNCpTLYo*nvW*3*_zq@(^~^n_ z;NEFxkc33Yk?Fk_cY&|8%f|z^48S7WnEd!?{7z2-sf4HIe)RqH*38zIwG&OZf(EPUp#&Hz&mJt)1(8ycOW@_^MNKuK=M~$}v zVBRXD70#>+0JfH0l`(%9A1xmj9GZB!r78aLF*o2GMayHwbKZ=O*yLLn%UaJ4XNCRP6pb%N2d^GJY6Nz&}&ml56UT9;lsX=&_XRj(fQIAzNatcGhqRA4)Yy1+3KlWH|6q>RfWex_~9B_iC>j?2W~k z3c;q0XrlyP?OjHoO@CCSS|A2T`EbN!f9!+qC{lvR-eFRI4PgTo1T(5mO{?-t28~T8 z`0&p0h)*jDf9C2$0dkm?G&KIgWzx7oHy!q2P3U-knp|R2^=<6X0|G$}&vzj4oI_^B zu6GT)!EryePu`IiMhoEP-iD=`*P*et)b(*qN2`+)-HAy6eA0@YSy!I6?T|-E0Yj_W z+gc*TROONq-)=Qv+5O(@$sN;wc|p-3P|Q9wYdp$k$HlrBh- z8bS{>NE9g|O#-1L6sgjyU_{YNl_uq&5S2vf9V9fVQ9z2^c-Fdq-n;M3&sj6`W6xf* z_w1SP`>K%R)oOyjOEgR7Q)f`29q^v!7eT@O3|CIFOLZR#0OJ)El2?dAAsK@fRcEvX z@J4h=@l5Oeq3s-qe`K)wY&Z$`oLGJp&K`lqPMi;yv%2egIKjid0|ImZEj0CuBu@?+ zDD%mA8&0EITiW8V%WpyMmMT%oy;%kQQX0_xo3J9S4#hKq%=Ed8sZ(Evsv8ZTdV7UgnI=x56HQ&jaUfN@%lclv~+$bZQgL0lA1&r_A-Isi# zq4Z_^Lk*inMy9__zkuJuENCDaYq5J*#YN{z6LI`nP2B}QGlzzI8Fs{vZ>PW}bKdRX zN|w>H>^wTE>8RXSbU%7C9(cmYPu0RN4|B4IJ;=X?P;i%%Mi-psUKXTkRb}4hS_}G8 zu{)G&PTnS;EmBdB`_&N^nP2XSKpB>Hyah?p#@m<|o{r9C_2GD`w6H$LG3Wm!?p28? z9poEus0Th~izKJnRwydWb{Z$g&rk8QgT!gBwqMhoA6yFDd7Ag~QFf!eQ%wa8^A-;4 z>l>VS^K3qGhHhN~R`08#MF|{-STTP0+M=X1kF~DEgadT)+wymKwvYcr1E#V_~K6ch*CJ0Z&jPTc2~#_A6c3fmgaNr!vXjgU>Rva3RAH z0dpJl>rJ-3z7`t;PhM9#c`4@>M=->WPPX3AINi*7&scqxn|&v)vy;E6 zR{MN%fRVPI?N&Xj7aluA+j3LyDqK9#B6<{U7Y|u<_(^3l03v5qj<-64GTnBJsjv;vK0rWpY;nyE6MdZcn=(JMwy2D2?tXJQBiS25Bje;tU=t9YVqM+ zRS^Qw~gAsH$3yyzn z%CY~A>>j`S>lyw3KKKDYdmP^YJy6~lyD>H)_tTzEf*x7sK|7PFsra3-ZF5yS)XFzJ z{W{Un8J>`M-aODDr|dORgv!74)F%qz!-8Ww9tr|_I_gW1zSUnu0LGyv2}n^B1A|1j zzK9i0Jy@#nkD8W&a!DAB4nwivf~uTLpOk5#sim-*Z`-<7dX7@BCb#lf!m3#@_={@q zmz`nX+OEY0oP+jB88n~2r7x0drYsT z&`Q&c;l|*nbady7EZSi`GNckKn;Ifoz`0axiY9x;iA;NI9YX_ilDK>D;HVe_Vcr9>O2vmnvd}h13q+*eAz@XHF>d=WIa<$pfC=k z@nf;-Q95bcqklm;1Rh@VsndI5Fq;o;#bLW%;9TPMZ*9paZj!Gz5X2p-Oh45RABYC?ICaxeEck3Rq9!WJfDMK1%XB3{3G<`5;*IP^+dc zu>FxN{aq6&4>4EIq3_+CpH$4*LVwSVi~bX~Yecy7)lC5_KZb45)b7P zZNPAz=x;@n)r9Vo6@^QCMnRK7ZX@0gHiMCfO+B{70|kH;BEF6Ri*k@<%hyAMo{1OP<(~{0E>#*)b!|Xa&WU&8d|9R$IO6|>NfVd1 zT7;n&c3av=v%Rx=Q|BwXxIOl-?x>t@2 z2`ziV^OeU~W6#j1DaoS`Xf#X%qvSsp+%!&A48t?Hv;%%<_6b$MtYNm9eN7q^L}6Cg z`%uZNnOS+5YDawU0Fe2wrGAX#g8MLsr|Pe-l972c(@%)4`fQ+q5%JPHSj2ji!r-3I zEOjgh=l5*DDI~+Vehi%OsIc!x-}CNxoAu=nevj~L`_D1eOc6!5lIk5kE)h@6cLaYm zQv*_>s%Lb{gkJ_GS2E{M+IWt7)U`M{g8}NYa_7~5%Pk$7K@!*bXB;|@Pwt&CoR+@-u?0mm#!r?$WE%U9<4FdHoSA^(=zMG zLVp?_b-B{i-4VT3Uwog*@VTS5UAcM8EKqLw?(!!$SkdCJ=jWRjWb>P>#$!Jf3WnzN zLlY zISa3FMZjzU8%7xYC4I$B1*Uc1T=={ca@Ab2nTDFT#*1A@eEcJg zYRBiYM>4_{XbME-o#Y|$V@S$!Ag8JwEwMj(Z*kR-|8|XjYY!};FH636jb)%GVAcqG zKUoR>hL;(zN1pJCL4!sv-3sy;5mM&82FtEG=Iyw0=VVxR5R1hgNg_tO1)%K!-2Fr)Z4}Mz99ML|qke3&Z4^GzjnE?ZsCD@M!iBl0M zV$6o3Y-am)3#p=wLQNx*-gU65eXm?o^LaZ38S0rm@JriwT@87rv>;pl{xag|j@S(L z$5ES^kfGg4Hvn*)V@D!Hi4?x}WosLvO4&ymH4L`4^THx|IM_whtbXDy3{Yw`G%Zjl zTu&K3_xg;kR#1M5y3ZB+PGl^7zR-nt9{zHTd&umrf|Q?T-E~gUB(b~bg?{*5f{H*6 zCjJJC?=8iqP!;Xt#`F{;+5X*CGK4BcS9$n9+p#+*2VGtP0Ej+zf#})%f6cWC??Xqv zfTK6MI=uqf(zqP>nEuzgc2)pDLAoCM8G!JAhtd3x8Pmc-+<&@Q4o@c_|Bc9R44B=s Uz&|I>7x8D9k%2k9P9GWjZ}U$pKL7v# diff --git a/doc/user/discussions/img/mr_review_new_comment_v13_11.png b/doc/user/project/merge_requests/reviews/img/mr_review_new_comment_v13_11.png similarity index 100% rename from doc/user/discussions/img/mr_review_new_comment_v13_11.png rename to doc/user/project/merge_requests/reviews/img/mr_review_new_comment_v13_11.png diff --git a/doc/user/discussions/img/mr_review_resolve.png b/doc/user/project/merge_requests/reviews/img/mr_review_resolve.png similarity index 100% rename from doc/user/discussions/img/mr_review_resolve.png rename to doc/user/project/merge_requests/reviews/img/mr_review_resolve.png diff --git a/doc/user/discussions/img/mr_review_resolve2.png b/doc/user/project/merge_requests/reviews/img/mr_review_resolve2.png similarity index 100% rename from doc/user/discussions/img/mr_review_resolve2.png rename to doc/user/project/merge_requests/reviews/img/mr_review_resolve2.png diff --git a/doc/user/discussions/img/mr_review_start.png b/doc/user/project/merge_requests/reviews/img/mr_review_start.png similarity index 100% rename from doc/user/discussions/img/mr_review_start.png rename to doc/user/project/merge_requests/reviews/img/mr_review_start.png diff --git a/doc/user/discussions/img/mr_review_unresolve.png b/doc/user/project/merge_requests/reviews/img/mr_review_unresolve.png similarity index 100% rename from doc/user/discussions/img/mr_review_unresolve.png rename to doc/user/project/merge_requests/reviews/img/mr_review_unresolve.png diff --git a/doc/user/discussions/img/pending_review_comment.png b/doc/user/project/merge_requests/reviews/img/pending_review_comment.png similarity index 100% rename from doc/user/discussions/img/pending_review_comment.png rename to doc/user/project/merge_requests/reviews/img/pending_review_comment.png diff --git a/doc/user/project/merge_requests/reviews/index.md b/doc/user/project/merge_requests/reviews/index.md index 3b6d3163ba7..5aca6e1e5a6 100644 --- a/doc/user/project/merge_requests/reviews/index.md +++ b/doc/user/project/merge_requests/reviews/index.md @@ -5,61 +5,95 @@ info: To determine the technical writer assigned to the Stage/Group associated w type: index, reference --- -# Reviewing and managing merge requests **(FREE)** +# Review and manage merge requests **(FREE)** -Merge requests are the primary method of making changes to files in a GitLab project. -Changes are proposed by [creating and submitting a merge request](../creating_merge_requests.md), -which is then reviewed, and accepted (or rejected). +[Merge requests](../index.md) are the primary method of making changes to files in a +GitLab project. [Create and submit a merge request](../creating_merge_requests.md) +to propose changes. Your team makes [suggestions](suggestions.md) and leaves +[comments](../../../discussions/index.md). When your work is reviewed, your team +members can choose to accept or reject it. -## View project merge requests +## View merge requests -View all the merge requests in a project by navigating to **Project > Merge Requests**. +You can view merge requests for a specific project, or for all projects in a group: -When you access your project's merge requests, GitLab displays them in a list. -Use the tabs to quickly filter by open and closed. You can also [search and filter the results](../../../search/index.md#filtering-issue-and-merge-request-lists). +- **Specific project**: Go to your project and select **Merge Requests**. +- **All projects in a group**: Go to your group and select **Merge Requests**. + If your group contains subgroups, this view also displays merge requests from the subgroup projects. + GitLab displays a count of open merge requests in the left sidebar, but + [caches the value](#cached-merge-request-count) for groups with a large number of + open merge requests. + +GitLab displays open merge requests, with tabs to filter the list by open and closed status: ![Project merge requests list view](img/project_merge_requests_list_view_v13_5.png) -## View merge requests for all projects in a group +You can [search and filter](../../../search/index.md#filtering-issue-and-merge-request-lists), +the results, or select a merge request to begin a review. -View merge requests in all projects in the group, including all projects of all descendant subgroups of the group. Navigate to **Group > Merge Requests** to view these merge requests. This view also has the open and closed merge requests tabs. +## Review a merge request -You can [search and filter the results](../../../search/index.md#filtering-issue-and-merge-request-lists) from here. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/4213) in GitLab Premium 11.4. +> - [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/28154) to GitLab Free in 13.1. -![Group Issues list view](img/group_merge_requests_list_view.png) +When you review a merge request, you can create comments that are visible only +to you. When you're ready, you can publish them together in a single action. +To start your review: -## Cached merge request count +1. Go to the merge request you want to review, and select the **Changes** tab. + To learn more about navigating the diffs displayed in this tab, read + [Changes tab in merge requests](../changes.md). +1. Select a line of code. In GitLab version 13.2 and later, you can [highlight a set of lines](#comment-on-multiple-lines). +1. Write your first comment, and select **Start a review** below your comment: + ![Starting a review](img/mr_review_start.png) +1. Continue adding comments to lines of code, and select the appropriate button after + you write a comment: + - **Add to review**: Keep this comment private and add to the current review. + These review comments are marked **Pending** and are visible only to you. + - **Add comment now**: Submits the specific comment as a regular comment instead of as part of the review. +1. (Optional) You can use [quick actions](../../quick_actions.md) inside review comments. + The comment shows the actions to perform after publication, but does not perform them + until you submit your review. +1. When your review is complete, you can [submit the review](#submit-a-review). Your comments + are now visible, and any quick actions included your comments are performed. -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299542) in GitLab 13.11. -> - It's [deployed behind a feature flag](../../../feature_flags.md), enabled by default. -> - It's enabled on GitLab.com. -> - It's recommended for production use. -> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-cached-merge-request-count). +### Submit a review -WARNING: -This feature might not be available to you. Check the **version history** note above for details. +You can submit your completed review in multiple ways: -In a group, the sidebar displays the total count of open merge requests and this value is cached if higher -than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours. +- Use the `/submit_review` [quick action](../../quick_actions.md) in the text of a non-review comment. +- When creating a review comment, select **Submit review**. +- Scroll to the bottom of the screen and select **Submit review**. -### Enable or disable cached merge request count **(FREE SELF)** +When you submit your review, GitLab: -Cached merge request count in the left sidebar is under development but ready for production use. It is -deployed behind a feature flag that is **enabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md) -can disable it. +- Publishes the comments in your review. +- Sends a single email to every notifiable user of the merge request, with your + review comments attached. Replying to this email creates a new comment on the merge request. +- Perform any quick actions you added to your review comments. -To disable it: +### Resolving/Unresolving threads -```ruby -Feature.disable(:cached_sidebar_merge_requests_count) -``` +Review comments can also resolve or unresolve [resolvable threads](../../../discussions/index.md#resolvable-comments-and-threads). +When replying to a comment, a checkbox is displayed to resolve or unresolve +the thread after publication. -To enable it: +![Resolve checkbox](img/mr_review_resolve.png) -```ruby -Feature.enable(:cached_sidebar_merge_requests_count) -``` +If a particular pending comment resolves or unresolves the thread, this is shown on the pending +comment itself. + +![Resolve status](img/mr_review_resolve2.png) + +![Unresolve status](img/mr_review_unresolve.png) + +### Adding a new comment + +> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/8225) in GitLab 13.10. + +If you have a review in progress, you will be presented with the option to **Add to review**: + +![New thread](img/mr_review_new_comment_v13_11.png) ## Semi-linear history merge requests @@ -70,151 +104,6 @@ succeeded, the target branch build also succeeds after the merge. Navigate to a project's settings, select the **Merge commit with semi-linear history** option under **Merge Requests: Merge method** and save your changes. -## View changes between file versions - -The **Changes** tab, below the main merge request details and next to the discussion tab, -shows the changes to files between branches or commits. This view of changes to a -file is also known as a **diff**. By default, the diff view compares the file in the -merge request branch and the file in the target branch. - -The diff view includes the following: - -- The file's name and path. -- The number of lines added and deleted. -- Buttons for the following options: - - Toggle comments for this file; useful for inline reviews. - - Edit the file in the merge request's branch. - - Show full file, in case you want to look at the changes in context with the rest of the file. - - View file at the current commit. - - Preview the changes with [Review Apps](../../../../ci/review_apps/index.md). -- The changed lines, with the specific changes highlighted. - -![Example screenshot of a source code diff](img/merge_request_diff_v12_2.png) - -### Merge request diff file navigation - -When reviewing changes in the **Changes** tab the diff can be navigated using -the file tree or file list. As you scroll through large diffs with many -changes, you can quickly jump to any changed file using the file tree or file -list. - -![Merge request diff file navigation](img/merge_request_diff_file_navigation.png) - -### Collapsed files in the Changes view - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232820) in GitLab 13.4. - -When you review changes in the **Changes** tab, files with a large number of changes are collapsed -to improve performance. When files are collapsed, a warning appears at the top of the changes. -Click **Expand file** on any file to view the changes for that file. - -### File-by-file diff navigation - -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/222790) in GitLab 13.2. -> - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/229848) in GitLab 13.7. - -For larger merge requests, consider reviewing one file at a time. To enable this feature: - -1. In the top-right corner, select your avatar. -1. Select **Preferences**. -1. Scroll to the **Behavior** section and select **Show one file at a time on merge request's Changes tab**. -1. Select **Save changes**. - -After you enable this setting, GitLab displays only one file at a time in the **Changes** tab when you review merge requests. You can click **Prev** and **Next** to view other changed files. - -![File-by-file diff navigation](img/file_by_file_v13_2.png) - -In [GitLab 13.7](https://gitlab.com/gitlab-org/gitlab/-/issues/233898) and later, if you want to change -this behavior, you can do so from your **User preferences** (as explained above) or directly in a -merge request: - -1. Go to the merge request's **Changes** tab. -1. Select the cog icon (**{settings}**) to reveal the merge request's settings dropdown. -1. Select or deselect the checkbox **Show one file at a time** to change the setting accordingly. - -This change overrides the choice you made in your user preferences and persists until you clear your -browser's cookies or change this behavior again. - -### Merge requests commit navigation - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18140) in GitLab 13.0. - -To seamlessly navigate among commits in a merge request: - -1. Select the **Commits** tab. -1. Select a commit to open it in the single-commit view. -1. Navigate through the commits by either: - - - Selecting **Prev** and **Next** buttons below the tab buttons. - - Using the X and C keyboard shortcuts. - -![Merge requests commit navigation](img/commit_nav_v13_11.png) - -### Incrementally expand merge request diffs - -By default, the diff shows only the parts of a file which are changed. -To view more unchanged lines above or below a change click on the -**Expand up** or **Expand down** icons. You can also click on **Show unchanged lines** -to expand the entire file. - -![Incrementally expand merge request diffs](img/incrementally_expand_merge_request_diffs_v12_2.png) - -In GitLab [versions 13.1 and later](https://gitlab.com/gitlab-org/gitlab/-/issues/205401), when viewing a -merge request's **Changes** tab, if a certain file was only renamed, you can expand it to see the -entire content by clicking **Show file contents**. - -### Ignore whitespace changes in Merge Request diff view - -If you click the **Hide whitespace changes** button, you can see the diff -without whitespace changes (if there are any). This is also working when on a -specific commit page. - -![MR diff](img/merge_request_diff.png) - -NOTE: -You can append `?w=1` while on the diffs page of a merge request to ignore any -whitespace changes. - -## Mark files as viewed - -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/51513) in GitLab 13.9. -> - It's deployed behind a feature flag, enabled by default. -> - It's enabled on GitLab.com. -> - It's recommended for production use. -> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-file-views). **(FREE SELF)** - -When reviewing a merge request with many files multiple times, it may be useful to the reviewer -to focus on new changes and ignore the files that they have already reviewed and don't want to -see anymore unless they are changed again. - -To mark a file as viewed: - -1. Go to the merge request's **Diffs** tab. -1. On the right-top of the file, locate the **Viewed** checkbox. -1. Check it to mark the file as viewed. - -Once checked, the file remains marked for that reviewer unless there are newly introduced -changes to its content or the checkbox is unchecked. - -### Enable or disable file views **(FREE SELF)** - -The file view feature is under development but ready for production use. -It is deployed behind a feature flag that is **enabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md) -can opt to enable it for your instance. - -To enable it: - -```ruby -Feature.enable(:local_file_reviews) -``` - -To disable it: - -```ruby -Feature.disable(:local_file_reviews) -``` - ## Perform inline code reviews > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/13950) in GitLab 11.5. @@ -222,11 +111,11 @@ Feature.disable(:local_file_reviews) In a merge request, you can leave comments in any part of the file being changed. In the Merge Request Diff UI, you can: -- **Comment on a single line**: Click the **{comment}** **comment** icon in the +- **Comment on a single line**: Select the **{comment}** **comment** icon in the gutter to expand the diff lines and display a comment box. -- [**Comment on multiple lines**](#commenting-on-multiple-lines). +- [**Comment on multiple lines**](#comment-on-multiple-lines). -### Commenting on multiple lines +### Comment on multiple lines > - [Introduced](https://gitlab.com/gitlab-org/ux-research/-/issues/870) in GitLab 13.2. > - [Added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49875) click-and-drag features in GitLab 13.8. @@ -237,9 +126,9 @@ to by either: ![Comment on any diff file line](img/comment-on-any-diff-line_v13_10.png) -- Clicking and dragging the **{comment}** **comment** icon in the gutter to highlight +- Dragging the **{comment}** **comment** icon in the gutter to highlight lines in the diff. GitLab expands the diff lines and displays a comment box. -- After starting a comment by clicking the **{comment}** **comment** icon in the +- After starting a comment by selecting the **{comment}** **comment** icon in the gutter, select the first line number your comment refers to in the **Commenting on lines** select box. New comments default to single-line comments, unless you select a different starting line. @@ -305,7 +194,7 @@ These features are associated with merge requests: - [Bulk editing merge requests](../../../project/bulk_editing.md): Update the attributes of multiple merge requests simultaneously. - [Cherry-pick changes](../cherry_pick_changes.md): - Cherry-pick any commit in the UI by clicking the **Cherry-pick** button in a merged merge requests or a commit. + Cherry-pick any commit in the UI by selecting the **Cherry-pick** button in a merged merge requests or a commit. - [Fast-forward merge requests](../fast_forward_merge.md): For a linear Git history and a way to accept merge requests without creating merge commits - [Find the merge request that introduced a change](../versions.md): @@ -355,27 +244,27 @@ the command line. The merge request sidebar contains the branch reference for the source branch used to contribute changes for this merge request. -To copy the branch reference into your clipboard, click the **Copy branch name** button +To copy the branch reference into your clipboard, select the **Copy branch name** button (**{copy-to-clipboard}**) in the right sidebar. Use it to checkout the branch locally -via command line by running `git checkout `. +from the command line by running `git checkout `. ### Checkout merge requests locally through the `head` ref A merge request contains all the history from a repository, plus the additional commits added to the branch associated with the merge request. Here's a few -ways to checkout a merge request locally. +ways to check out a merge request locally. -You can checkout a merge request locally even if the source +You can check out a merge request locally even if the source project is a fork (even a private fork) of the target project. This relies on the merge request `head` ref (`refs/merge-requests/:iid/head`) that is available for each merge request. It allows checking out a merge -request via its ID instead of its branch. +request by using its ID instead of its branch. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223156) in GitLab 13.4, 14 days after a merge request gets closed or merged, the merge request -`head` ref is deleted. This means that the merge request is not available -for local checkout via the merge request `head` ref anymore. The merge request +`head` ref is deleted. This means that the merge request isn't available +for local checkout from the merge request `head` ref anymore. The merge request can still be re-opened. If the merge request's branch exists, you can still check out the branch, as it isn't affected. @@ -450,3 +339,36 @@ git checkout origin/merge-requests/1 ``` All the above can be done with the [`git-mr`](https://gitlab.com/glensc/git-mr) script. + +## Cached merge request count + +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/299542) in GitLab 13.11. +> - It's [deployed behind a feature flag](../../../feature_flags.md), enabled by default. +> - It's enabled on GitLab.com. +> - It's recommended for production use. +> - For GitLab self-managed instances, GitLab administrators can opt to [disable it](#enable-or-disable-cached-merge-request-count). + +WARNING: +This feature might not be available to you. Refer to the previous **version history** note for details. + +In a group, the sidebar displays the total count of open merge requests. This value is cached if it's greater than +than 1000. The cached value is rounded to thousands (or millions) and updated every 24 hours. + +### Enable or disable cached merge request count **(FREE SELF)** + +Cached merge request count in the left sidebar is under development but ready for production use. It is +deployed behind a feature flag that is **enabled by default**. +[GitLab administrators with access to the GitLab Rails console](../../../../administration/feature_flags.md) +can disable it. + +To disable it: + +```ruby +Feature.disable(:cached_sidebar_merge_requests_count) +``` + +To enable it: + +```ruby +Feature.enable(:cached_sidebar_merge_requests_count) +``` diff --git a/doc/user/project/merge_requests/reviews/suggestions.md b/doc/user/project/merge_requests/reviews/suggestions.md index 74be5b542c1..0c8dd384b88 100644 --- a/doc/user/project/merge_requests/reviews/suggestions.md +++ b/doc/user/project/merge_requests/reviews/suggestions.md @@ -5,21 +5,19 @@ info: To determine the technical writer assigned to the Stage/Group associated w type: index, reference --- -# Suggest Changes +# Suggest changes **(FREE)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/18008) in GitLab 11.6. > - Custom commit messages for suggestions was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25381) in GitLab 13.9 behind a [feature flag](../../../feature_flags.md), disabled by default. > - [Feature flag removed](https://gitlab.com/gitlab-org/gitlab/-/issues/297404) in GitLab 13.10. -As a reviewer, you're able to suggest code changes with a -Markdown syntax in merge request diff threads. Then, the -merge request author (or other users with appropriate -[permission](../../../permissions.md)) is able to apply these -Suggestions with a click, which generates a commit in -the merge request authored by the user that applied them. +As a reviewer, you're able to suggest code changes with a Markdown syntax in merge request +diff threads. Then, the merge request author (or other users with appropriate +[permission](../../../permissions.md)) is able to apply these suggestions with a click, +which generates a commit in the merge request authored by the user that applied them. -1. Choose a line of code to be changed, add a new comment, then click - on the **Insert suggestion** icon in the toolbar: +1. Choose a line of code to be changed, add a new comment, then select + the **Insert suggestion** icon in the toolbar: ![Add a new comment](img/suggestion_button_v13_9.png) @@ -27,9 +25,10 @@ the merge request authored by the user that applied them. ![Add a suggestion into a code block tagged properly](img/make_suggestion_v13_9.png) -1. Click either **Start a review** or **Add to review** to add your comment to a [review](index.md), or **Add comment now** to add the comment to the thread immediately. +1. Select either **Start a review** or **Add to review** to add your comment to a + [review](index.md), or **Add comment now** to add the comment to the thread immediately. - The Suggestion in the comment can be applied by the merge request author + The suggestion in the comment can be applied by the merge request author directly from the merge request: ![Apply suggestions](img/apply_suggestion_v13_9.png) @@ -40,34 +39,34 @@ the merge request authored by the user that applied them. ![Custom commit](img/custom_commit_v13_9.png) -After the author applies a Suggestion, it is marked with the **Applied** label, +After the author applies a suggestion, it's marked with the **Applied** label, the thread is automatically resolved, and GitLab creates a new commit -and push the suggested change directly into the codebase in the merge request's +and pushes the suggested change directly into the codebase in the merge request's branch. [Developer permission](../../../permissions.md) is required to do so. -## Multi-line Suggestions +## Multi-line suggestions > - [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/issues/53310) in GitLab 11.10. -Reviewers can also suggest changes to multiple lines with a single Suggestion +Reviewers can also suggest changes to multiple lines with a single suggestion within merge request diff threads by adjusting the range offsets. The offsets are relative to the position of the diff thread, and specify the range to be replaced by the suggestion when it is applied. ![Multi-line suggestion syntax](img/multi-line-suggestion-syntax.png) -In the example above, the Suggestion covers three lines above and four lines +In the previous example, the suggestion covers three lines above and four lines below the commented line. When applied, it would replace from 3 lines _above_ to 4 lines _below_ the commented line, with the suggested change. ![Multi-line suggestion preview](img/multi-line-suggestion-preview.png) NOTE: -Suggestions covering multiple lines are limited to 100 lines _above_ and 100 -lines _below_ the commented diff line, allowing up to 200 changed lines per +Suggestions for multiple lines are limited to 100 lines _above_ and 100 +lines _below_ the commented diff line. This allows for up to 200 changed lines per suggestion. -## Code block nested in Suggestions +## Code block nested in suggestions If you need to make a suggestion that involves a [fenced code block](../../../markdown.md#code-spans-and-blocks), wrap your suggestion in four backticks @@ -77,43 +76,44 @@ instead of the usual three. ![Output of a comment with a suggestion with a fenced code block](img/suggestion_code_block_output_v12_8.png) -## Configure the commit message for applied Suggestions +## Configure the commit message for applied suggestions > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/13086) in GitLab 12.7. GitLab uses a default commit message -when applying Suggestions: `Apply %{suggestions_count} suggestion(s) to %{files_count} file(s)` +when applying suggestions: `Apply %{suggestions_count} suggestion(s) to %{files_count} file(s)` -For example, consider that a user applied 3 suggestions to 2 different files, the default commit message is: **Apply 3 suggestion(s) to 2 file(s)** +For example, consider that a user applied 3 suggestions to 2 different files, the +default commit message is: **Apply 3 suggestion(s) to 2 file(s)** -These commit messages can be customized to follow any guidelines you might have. To do so, expand the **Merge requests** -tab within your project's **General** settings and change the -**Merge suggestions** text: +These commit messages can be customized to follow any guidelines you might have. +To do so, expand the **Merge requests** tab within your project's **General** +settings and change the **Merge suggestions** text: -![Custom commit message for applied Suggestions](img/suggestions_custom_commit_messages_v13_1.jpg) +![Custom commit message for applied suggestions](img/suggestions_custom_commit_messages_v13_1.jpg) You can also use following variables besides static text: | Variable | Description | Output example | |------------------------|-------------|----------------| -| `%{branch_name}` | The name of the branch the Suggestion(s) was(were) applied to. | `my-feature-branch` | -| `%{files_count}` | The number of file(s) to which Suggestion(s) was(were) applied.| **2** | -| `%{file_paths}` | The path(s) of the file(s) Suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` | +| `%{branch_name}` | The name of the branch the suggestion(s) was(were) applied to. | `my-feature-branch` | +| `%{files_count}` | The number of file(s) to which suggestion(s) was(were) applied.| **2** | +| `%{file_paths}` | The path(s) of the file(s) suggestion(s) was(were) applied to. Paths are separated by commas.| `docs/index.md, docs/about.md` | | `%{project_path}` | The project path. | `my-group/my-project` | | `%{project_name}` | The human-readable name of the project. | **My Project** | -| `%{suggestions_count}` | The number of Suggestions applied.| **3** | -| `%{username}` | The username of the user applying Suggestion(s). | `user_1` | -| `%{user_full_name}` | The full name of the user applying Suggestion(s). | **User 1** | +| `%{suggestions_count}` | The number of suggestions applied.| **3** | +| `%{username}` | The username of the user applying suggestion(s). | `user_1` | +| `%{user_full_name}` | The full name of the user applying suggestion(s). | **User 1** | For example, to customize the commit message to output **Addresses user_1's review**, set the custom text to `Addresses %{username}'s review`. NOTE: -Custom commit messages for each applied Suggestion is +Custom commit messages for each applied suggestion is introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381). -## Batch Suggestions +## Batch suggestions > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/25486) in GitLab 13.1 as an [alpha feature](https://about.gitlab.com/handbook/product/gitlab-the-product/#alpha) behind a feature flag, disabled by default. > - [Enabled by default](https://gitlab.com/gitlab-org/gitlab/-/issues/227799) in GitLab 13.2. @@ -122,7 +122,7 @@ introduced by [#25381](https://gitlab.com/gitlab-org/gitlab/-/issues/25381). You can apply multiple suggestions at once to reduce the number of commits added to your branch to address your reviewers' requests. -1. To start a batch of suggestions to apply with a single commit, click **Add suggestion to batch**: +1. To start a batch of suggestions to apply with a single commit, select **Add suggestion to batch**: ![A code change suggestion displayed, with the button to add the suggestion to a batch highlighted.](img/add_first_suggestion_to_batch_v13_1.jpg "Add a suggestion to a batch") @@ -130,11 +130,11 @@ to your branch to address your reviewers' requests. ![A code change suggestion displayed, with the button to add an additional suggestion to a batch highlighted.](img/add_another_suggestion_to_batch_v13_1.jpg "Add another suggestion to a batch") -1. To remove suggestions, click **Remove from batch**: +1. To remove suggestions, select **Remove from batch**: ![A code change suggestion displayed, with the button to remove that suggestion from its batch highlighted.](img/remove_suggestion_from_batch_v13_1.jpg "Remove a suggestion from a batch") -1. Having added all the suggestions to your liking, when ready, click **Apply suggestions**: +1. Having added all the suggestions to your liking, when ready, select **Apply suggestions**: ![A code change suggestion displayed, with the button to apply the batch of suggestions highlighted.](img/apply_batch_of_suggestions_v13_1.jpg "Apply a batch of suggestions") diff --git a/lib/api/project_import.rb b/lib/api/project_import.rb index 5f3a574eeee..039f7b4be41 100644 --- a/lib/api/project_import.rb +++ b/lib/api/project_import.rb @@ -14,6 +14,21 @@ module API def import_params declared_params(include_missing: false) end + + def namespace_from(params, current_user) + if params[:namespace] + find_namespace!(params[:namespace]) + else + current_user.namespace + end + end + + def filtered_override_params(params) + override_params = params.delete(:override_params) + filter_attributes_using_license!(override_params) if override_params + + override_params + end end before do @@ -67,34 +82,25 @@ module API check_rate_limit! :project_import, [current_user, :project_import] - Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20823') + Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/21041') validate_file! - namespace = if import_params[:namespace] - find_namespace!(import_params[:namespace]) - else - current_user.namespace - end - - project_params = { - path: import_params[:path], - namespace_id: namespace.id, - name: import_params[:name], - file: import_params[:file], - overwrite: import_params[:overwrite] - } - - override_params = import_params.delete(:override_params) - filter_attributes_using_license!(override_params) if override_params - - project = ::Projects::GitlabProjectsImportService.new( - current_user, project_params, override_params + response = ::Import::GitlabProjects::CreateProjectFromUploadedFileService.new( + current_user, + path: import_params[:path], + namespace: namespace_from(import_params, current_user), + name: import_params[:name], + file: import_params[:file], + overwrite: import_params[:overwrite], + override: filtered_override_params(import_params) ).execute - render_api_error!(project.errors.full_messages&.first, 400) unless project.saved? - - present project, with: Entities::ProjectImportStatus + if response.success? + present(response.payload, with: Entities::ProjectImportStatus) + else + render_api_error!(response.message, response.http_status) + end end params do @@ -107,6 +113,44 @@ module API get ':id/import' do present user_project, with: Entities::ProjectImportStatus end + + params do + requires :url, type: String, desc: 'The URL for the file.' + requires :path, type: String, desc: 'The new project path and name' + optional :name, type: String, desc: 'The name of the project to be imported. Defaults to the path of the project if not provided.' + optional :namespace, type: String, desc: "The ID or name of the namespace that the project will be imported into. Defaults to the current user's namespace." + optional :overwrite, type: Boolean, default: false, desc: 'If there is a project in the same namespace and with the same name overwrite it' + optional :override_params, + type: Hash, + desc: 'New project params to override values in the export' do + use :optional_project_params + end + end + desc 'Create a new project import using a remote object storage path' do + detail 'This feature was introduced in GitLab 13.2.' + success Entities::ProjectImportStatus + end + post 'remote-import' do + not_found! unless ::Feature.enabled?(:import_project_from_remote_file) + + check_rate_limit! :project_import, [current_user, :project_import] + + response = ::Import::GitlabProjects::CreateProjectFromRemoteFileService.new( + current_user, + path: import_params[:path], + namespace: namespace_from(import_params, current_user), + name: import_params[:name], + remote_import_url: import_params[:url], + overwrite: import_params[:overwrite], + override: filtered_override_params(import_params) + ).execute + + if response.success? + present(response.payload, with: Entities::ProjectImportStatus) + else + render_api_error!(response.message, response.http_status) + end + end end end end diff --git a/lib/gitlab/import_export/file_importer.rb b/lib/gitlab/import_export/file_importer.rb index af195fd4d11..6f8cfec6425 100644 --- a/lib/gitlab/import_export/file_importer.rb +++ b/lib/gitlab/import_export/file_importer.rb @@ -67,7 +67,17 @@ module Gitlab @archive_file = File.join(@shared.archive_path, Gitlab::ImportExport.export_filename(exportable: @importable)) - download_or_copy_upload(@importable.import_export_upload.import_file, @archive_file) + remote_download_or_download_or_copy_upload + end + + def remote_download_or_download_or_copy_upload + import_export_upload = @importable.import_export_upload + + if import_export_upload.remote_import_url.present? + download(remote_import_url, @archive_file) + else + download_or_copy_upload(import_export_upload.import_file, @archive_file) + end end def remove_symlinks diff --git a/lib/gitlab/usage_data_counters/known_events/epic_events.yml b/lib/gitlab/usage_data_counters/known_events/epic_events.yml index 4d0ea0a5de7..4d77bd01878 100644 --- a/lib/gitlab/usage_data_counters/known_events/epic_events.yml +++ b/lib/gitlab/usage_data_counters/known_events/epic_events.yml @@ -103,6 +103,8 @@ aggregation: daily feature_flag: track_epics_activity +# relationships + - name: g_project_management_epic_issue_added category: epics_usage redis_slot: project_management @@ -121,6 +123,12 @@ aggregation: daily feature_flag: track_epics_activity +- name: g_project_management_users_updating_epic_parent + category: epics_usage + redis_slot: project_management + aggregation: daily + feature_flag: track_epics_activity + - name: g_project_management_epic_closed category: epics_usage redis_slot: project_management diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb index d6da9a4e8d0..2f1c6c813cf 100644 --- a/spec/controllers/groups/runners_controller_spec.rb +++ b/spec/controllers/groups/runners_controller_spec.rb @@ -302,6 +302,9 @@ RSpec.describe Groups::RunnersController do context 'when user is not an owner' do before do + # Disable limit checking + allow(runner).to receive(:runner_scope).and_return(nil) + group.add_maintainer(user) end diff --git a/spec/factories/ci/runner_namespaces.rb b/spec/factories/ci/runner_namespaces.rb new file mode 100644 index 00000000000..a5060d196ca --- /dev/null +++ b/spec/factories/ci/runner_namespaces.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :ci_runner_namespace, class: 'Ci::RunnerNamespace' do + runner factory: [:ci_runner, :group] + group + end +end diff --git a/spec/frontend/vue_shared/security_reports/mock_data.js b/spec/frontend/vue_shared/security_reports/mock_data.js index 7918f70d702..58fd2df5a49 100644 --- a/spec/frontend/vue_shared/security_reports/mock_data.js +++ b/spec/frontend/vue_shared/security_reports/mock_data.js @@ -339,7 +339,7 @@ export const securityReportDownloadPathsQueryNoArtifactsResponse = { }, }; -export const securityReportDownloadPathsQueryResponse = { +export const securityReportMergeRequestDownloadPathsQueryResponse = { project: { mergeRequest: { headPipeline: { @@ -447,6 +447,114 @@ export const securityReportDownloadPathsQueryResponse = { }, }; +export const securityReportDownloadPathsQueryResponse = securityReportMergeRequestDownloadPathsQueryResponse; + +export const securityReportPipelineDownloadPathsQueryResponse = { + project: { + pipeline: { + id: 'gid://gitlab/Ci::Pipeline/176', + jobs: { + nodes: [ + { + name: 'secret_detection', + artifacts: { + nodes: [ + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1399/artifacts/download?file_type=trace', + fileType: 'TRACE', + __typename: 'CiJobArtifact', + }, + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1399/artifacts/download?file_type=secret_detection', + fileType: 'SECRET_DETECTION', + __typename: 'CiJobArtifact', + }, + ], + __typename: 'CiJobArtifactConnection', + }, + __typename: 'CiJob', + }, + { + name: 'bandit-sast', + artifacts: { + nodes: [ + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1400/artifacts/download?file_type=trace', + fileType: 'TRACE', + __typename: 'CiJobArtifact', + }, + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1400/artifacts/download?file_type=sast', + fileType: 'SAST', + __typename: 'CiJobArtifact', + }, + ], + __typename: 'CiJobArtifactConnection', + }, + __typename: 'CiJob', + }, + { + name: 'eslint-sast', + artifacts: { + nodes: [ + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1401/artifacts/download?file_type=trace', + fileType: 'TRACE', + __typename: 'CiJobArtifact', + }, + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1401/artifacts/download?file_type=sast', + fileType: 'SAST', + __typename: 'CiJobArtifact', + }, + ], + __typename: 'CiJobArtifactConnection', + }, + __typename: 'CiJob', + }, + { + name: 'all_artifacts', + artifacts: { + nodes: [ + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=archive', + fileType: 'ARCHIVE', + __typename: 'CiJobArtifact', + }, + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=trace', + fileType: 'TRACE', + __typename: 'CiJobArtifact', + }, + { + downloadPath: + '/gitlab-org/secrets-detection-test/-/jobs/1402/artifacts/download?file_type=metadata', + fileType: 'METADATA', + __typename: 'CiJobArtifact', + }, + ], + __typename: 'CiJobArtifactConnection', + }, + __typename: 'CiJob', + }, + ], + __typename: 'CiJobConnection', + }, + __typename: 'Pipeline', + }, + __typename: 'MergeRequest', + }, + __typename: 'Project', +}; + /** * These correspond to SAST jobs in the securityReportDownloadPathsQueryResponse above. */ diff --git a/spec/frontend/vue_shared/security_reports/utils_spec.js b/spec/frontend/vue_shared/security_reports/utils_spec.js index aa9e54fa10c..b7129ece698 100644 --- a/spec/frontend/vue_shared/security_reports/utils_spec.js +++ b/spec/frontend/vue_shared/security_reports/utils_spec.js @@ -3,9 +3,13 @@ import { REPORT_TYPE_SECRET_DETECTION, REPORT_FILE_TYPES, } from '~/vue_shared/security_reports/constants'; -import { extractSecurityReportArtifacts } from '~/vue_shared/security_reports/utils'; import { - securityReportDownloadPathsQueryResponse, + extractSecurityReportArtifactsFromMergeRequest, + extractSecurityReportArtifactsFromPipeline, +} from '~/vue_shared/security_reports/utils'; +import { + securityReportMergeRequestDownloadPathsQueryResponse, + securityReportPipelineDownloadPathsQueryResponse, sastArtifacts, secretDetectionArtifacts, archiveArtifacts, @@ -13,7 +17,18 @@ import { metadataArtifacts, } from './mock_data'; -describe('extractSecurityReportArtifacts', () => { +describe.each([ + [ + 'extractSecurityReportArtifactsFromMergeRequest', + extractSecurityReportArtifactsFromMergeRequest, + securityReportMergeRequestDownloadPathsQueryResponse, + ], + [ + 'extractSecurityReportArtifactsFromPipelines', + extractSecurityReportArtifactsFromPipeline, + securityReportPipelineDownloadPathsQueryResponse, + ], +])('%s', (funcName, extractFunc, response) => { it.each` reportTypes | expectedArtifacts ${[]} | ${[]} @@ -27,9 +42,7 @@ describe('extractSecurityReportArtifacts', () => { `( 'returns the expected artifacts given report types $reportTypes', ({ reportTypes, expectedArtifacts }) => { - expect( - extractSecurityReportArtifacts(reportTypes, securityReportDownloadPathsQueryResponse), - ).toEqual(expectedArtifacts); + expect(extractFunc(reportTypes, response)).toEqual(expectedArtifacts); }, ); }); diff --git a/spec/models/ci/runner_namespace_spec.rb b/spec/models/ci/runner_namespace_spec.rb new file mode 100644 index 00000000000..41d805adb9f --- /dev/null +++ b/spec/models/ci/runner_namespace_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::RunnerNamespace do + it_behaves_like 'includes Limitable concern' do + subject { build(:ci_runner_namespace, group: create(:group, :nested), runner: create(:ci_runner, :group)) } + end +end diff --git a/spec/models/ci/runner_project_spec.rb b/spec/models/ci/runner_project_spec.rb new file mode 100644 index 00000000000..13369dba2cf --- /dev/null +++ b/spec/models/ci/runner_project_spec.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Ci::RunnerProject do + it_behaves_like 'includes Limitable concern' do + subject { build(:ci_runner_project, project: create(:project), runner: create(:ci_runner, :project)) } + end +end diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb index 7984b1d4ca8..74619cfebea 100644 --- a/spec/requests/api/ci/runner/runners_post_spec.rb +++ b/spec/requests/api/ci/runner/runners_post_spec.rb @@ -91,6 +91,21 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do it_behaves_like 'not executing any extra queries for the application context' do let(:subject_proc) { proc { request } } end + + context 'when it exceeds the application limits' do + before do + create(:ci_runner, runner_type: :project_type, projects: [project]) + create(:plan_limits, :default_plan, ci_registered_project_runners: 1) + end + + it 'does not create runner' do + request + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to include('runner_projects' => ['is invalid']) + expect(project.runners.reload.size).to eq(1) + end + end end context 'when group token is used' do @@ -117,6 +132,21 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do it_behaves_like 'not executing any extra queries for the application context' do let(:subject_proc) { proc { request } } end + + context 'when it exceeds the application limits' do + before do + create(:ci_runner, runner_type: :group_type, groups: [group]) + create(:plan_limits, :default_plan, ci_registered_group_runners: 1) + end + + it 'does not create runner' do + request + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['message']).to include('runner_namespaces' => ['is invalid']) + expect(group.runners.reload.size).to eq(1) + end + end end end diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb index 670456e5dba..1727bc830fc 100644 --- a/spec/requests/api/ci/runners_spec.rb +++ b/spec/requests/api/ci/runners_spec.rb @@ -999,6 +999,19 @@ RSpec.describe API::Ci::Runners do end.to change { project.runners.count }.by(+1) expect(response).to have_gitlab_http_status(:created) end + + context 'when it exceeds the application limits' do + before do + create(:plan_limits, :default_plan, ci_registered_project_runners: 1) + end + + it 'does not enable specific runner' do + expect do + post api("/projects/#{project.id}/runners", admin), params: { runner_id: new_project_runner.id } + end.not_to change { project.runners.count } + expect(response).to have_gitlab_http_status(:bad_request) + end + end end it 'enables a instance type runner' do diff --git a/spec/requests/api/project_import_spec.rb b/spec/requests/api/project_import_spec.rb index f6cdf370e5c..d3b24eb3832 100644 --- a/spec/requests/api/project_import_spec.rb +++ b/spec/requests/api/project_import_spec.rb @@ -4,6 +4,7 @@ require 'spec_helper' RSpec.describe API::ProjectImport do include WorkhorseHelpers + include AfterNextHelpers include_context 'workhorse headers' @@ -31,6 +32,12 @@ RSpec.describe API::ProjectImport do allow(ImportExportUploader).to receive(:workhorse_upload_path).and_return('/') end + it 'executes a limited number of queries' do + control_count = ActiveRecord::QueryRecorder.new { subject }.count + + expect(control_count).to be <= 100 + end + it 'schedules an import using a namespace' do stub_import(namespace) params[:namespace] = namespace.id @@ -273,6 +280,75 @@ RSpec.describe API::ProjectImport do end end + describe 'POST /projects/remote-import' do + let(:params) do + { + path: 'test-import', + url: 'http://some.s3.url/file' + } + end + + it 'returns NOT FOUND when the feature is disabled' do + stub_feature_flags(import_project_from_remote_file: false) + + post api('/projects/remote-import', user), params: params + + expect(response).to have_gitlab_http_status(:not_found) + end + + context 'when the feature flag is enabled' do + before do + stub_feature_flags(import_project_from_remote_file: true) + end + + context 'when the response is successful' do + it 'schedules the import successfully' do + project = create( + :project, + namespace: user.namespace, + name: 'test-import', + path: 'test-import' + ) + + service_response = ServiceResponse.success(payload: project) + expect_next(::Import::GitlabProjects::CreateProjectFromRemoteFileService) + .to receive(:execute) + .and_return(service_response) + + post api('/projects/remote-import', user), params: params + + expect(response).to have_gitlab_http_status(:created) + expect(json_response).to include({ + 'id' => project.id, + 'name' => 'test-import', + 'name_with_namespace' => "#{user.namespace.name} / test-import", + 'path' => 'test-import', + 'path_with_namespace' => "#{user.namespace.path}/test-import" + }) + end + end + + context 'when the service returns an error' do + it 'fails to schedule the import' do + service_response = ServiceResponse.error( + message: 'Failed to import', + http_status: :bad_request + ) + expect_next(::Import::GitlabProjects::CreateProjectFromRemoteFileService) + .to receive(:execute) + .and_return(service_response) + + post api('/projects/remote-import', user), params: params + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response).to eq({ + 'message' => 'Failed to import' + }) + end + end + end + end + describe 'GET /projects/:id/import' do it 'returns the import status' do project = create(:project, :import_started) diff --git a/spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb b/spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb new file mode 100644 index 00000000000..3c461c91ff0 --- /dev/null +++ b/spec/services/import/gitlab_projects/create_project_from_remote_file_service_spec.rb @@ -0,0 +1,182 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Import::GitlabProjects::CreateProjectFromRemoteFileService do + let(:remote_url) { 'https://external.file.path/file' } + + let(:params) do + { + path: 'path', + namespace: user.namespace, + name: 'name', + remote_import_url: remote_url + } + end + + let_it_be(:user) { create(:user) } + + subject { described_class.new(user, params) } + + it 'creates a project and returns a successful response' do + stub_headers_for(remote_url, { + 'content-type' => 'application/gzip', + 'content-length' => '10' + }) + + response = nil + expect { response = subject.execute } + .to change(Project, :count).by(1) + + expect(response).to be_success + expect(response.http_status).to eq(:ok) + expect(response.payload).to be_instance_of(Project) + expect(response.payload.name).to eq('name') + expect(response.payload.path).to eq('path') + expect(response.payload.namespace).to eq(user.namespace) + end + + context 'when the file url is invalid' do + it 'returns an erred response with the reason of the failure' do + stub_application_setting(allow_local_requests_from_web_hooks_and_services: false) + + params[:remote_import_url] = 'https://localhost/file' + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message).to eq('Requests to localhost are not allowed') + end + end + + context 'validate file type' do + it 'returns erred response when the file type is not informed' do + stub_headers_for(remote_url, { 'content-length' => '10' }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message) + .to eq("Missing 'ContentType' header") + end + + it 'returns erred response when the file type is not allowed' do + stub_headers_for(remote_url, { + 'content-type' => 'application/js', + 'content-length' => '10' + }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message) + .to eq("Remote file content type 'application/js' not allowed. (Allowed content types: application/gzip)") + end + end + + context 'validate content type' do + it 'returns erred response when the file size is not informed' do + stub_headers_for(remote_url, { 'content-type' => 'application/gzip' }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message) + .to eq("Missing 'ContentLength' header") + end + + it 'returns error response when the file size is a text' do + stub_headers_for(remote_url, { + 'content-type' => 'application/gzip', + 'content-length' => 'some text' + }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message) + .to eq("Missing 'ContentLength' header") + end + + it 'returns erred response when the file is larger then allowed' do + stub_headers_for(remote_url, { + 'content-type' => 'application/gzip', + 'content-length' => 11.gigabytes.to_s + }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message) + .to eq('Remote file larger than limit. (limit 10 GB)') + end + end + + context 'when required parameters are not provided' do + let(:params) { {} } + + it 'returns an erred response with the reason of the failure' do + stub_application_setting(allow_local_requests_from_web_hooks_and_services: false) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message).to eq("Parameter 'path' is required") + + expect(subject.errors.full_messages).to match_array([ + "Missing 'ContentLength' header", + "Missing 'ContentType' header", + "Parameter 'namespace' is required", + "Parameter 'path' is required", + "Parameter 'remote_import_url' is required" + ]) + end + end + + context 'when the project is invalid' do + it 'returns an erred response with the reason of the failure' do + create(:project, namespace: user.namespace, path: 'path') + + stub_headers_for(remote_url, { + 'content-type' => 'application/gzip', + 'content-length' => '10' + }) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message).to eq('Path has already been taken') + end + end + + def stub_headers_for(url, headers = {}) + allow(Gitlab::HTTP) + .to receive(:head) + .with(url) + .and_return(double(headers: headers)) + end +end diff --git a/spec/services/import/gitlab_projects/create_project_from_uploaded_file_service_spec.rb b/spec/services/import/gitlab_projects/create_project_from_uploaded_file_service_spec.rb new file mode 100644 index 00000000000..a0e04a9a696 --- /dev/null +++ b/spec/services/import/gitlab_projects/create_project_from_uploaded_file_service_spec.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ::Import::GitlabProjects::CreateProjectFromUploadedFileService do + let(:file_upload) do + fixture_file_upload('spec/features/projects/import_export/test_project_export.tar.gz') + end + + let(:params) do + { + path: 'path', + namespace: user.namespace, + name: 'name', + file: file_upload + } + end + + let_it_be(:user) { create(:user) } + + subject { described_class.new(user, params) } + + it 'creates a project and returns a successful response' do + response = nil + expect { response = subject.execute } + .to change(Project, :count).by(1) + + expect(response).to be_success + expect(response.http_status).to eq(:ok) + expect(response.payload).to be_instance_of(Project) + expect(response.payload.name).to eq('name') + expect(response.payload.path).to eq('path') + expect(response.payload.namespace).to eq(user.namespace) + end + + context 'when required parameters are not provided' do + let(:params) { {} } + + it 'returns an erred response with the reason of the failure' do + stub_application_setting(allow_local_requests_from_web_hooks_and_services: false) + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message).to eq("Parameter 'path' is required") + + expect(subject.errors.full_messages).to match_array([ + "Parameter 'namespace' is required", + "Parameter 'path' is required", + "Parameter 'file' is required" + ]) + end + end + + context 'when the project is invalid' do + it 'returns an erred response with the reason of the failure' do + create(:project, namespace: user.namespace, path: 'path') + + response = nil + expect { response = subject.execute } + .not_to change(Project, :count) + + expect(response).not_to be_success + expect(response.http_status).to eq(:bad_request) + expect(response.message).to eq('Path has already been taken') + end + end +end