summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitlab/CODEOWNERS10
-rw-r--r--.rubocop_manual_todo.yml42
-rw-r--r--.rubocop_todo.yml327
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.lock32
-rw-r--r--app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue43
-rw-r--r--app/assets/javascripts/sidebar/mount_sidebar.js17
-rw-r--r--app/assets/stylesheets/framework/sidebar.scss13
-rw-r--r--app/finders/autocomplete/group_finder.rb3
-rw-r--r--app/finders/autocomplete/project_finder.rb3
-rw-r--r--app/finders/concerns/finder_methods.rb2
-rw-r--r--app/models/concerns/bulk_insert_safe.rb4
-rw-r--r--app/services/jira_connect_subscriptions/create_service.rb2
-rw-r--r--app/views/shared/issuable/_sidebar.html.haml4
-rw-r--r--changelogs/unreleased/281912_remove_jira_connect_full_namespace_sync_feature_flag.yml6
-rw-r--r--changelogs/unreleased/ss-copy-clipboard-email.yml5
-rw-r--r--config/feature_flags/development/jira_connect_full_namespace_sync.yml7
-rw-r--r--danger/product_intelligence/Dangerfile4
-rw-r--r--doc/administration/audit_events.md2
-rw-r--r--doc/api/graphql/reference/gitlab_schema.graphql256
-rw-r--r--doc/api/graphql/reference/gitlab_schema.json256
-rw-r--r--doc/api/graphql/reference/index.md60
-rw-r--r--doc/ci/variables/where_variables_can_be_used.md1
-rw-r--r--doc/ci/yaml/README.md44
-rw-r--r--doc/development/code_review.md6
-rw-r--r--doc/integration/jira_development_panel.md2
-rw-r--r--doc/user/application_security/sast/index.md22
-rw-r--r--doc/user/project/issues/issue_data_and_actions.md7
-rw-r--r--locale/gitlab.pot6
-rw-r--r--rubocop/cop/rspec/expect_gitlab_tracking.rb2
-rw-r--r--spec/features/issues/issue_sidebar_spec.rb358
-rw-r--r--spec/frontend/sidebar/components/copy_email_to_clipboard_spec.js22
-rw-r--r--spec/frontend/vue_shared/components/clipboard_button_spec.js22
-rw-r--r--spec/services/jira_connect_subscriptions/create_service_spec.rb12
34 files changed, 959 insertions, 645 deletions
diff --git a/.gitlab/CODEOWNERS b/.gitlab/CODEOWNERS
index 03f56d32df5..df81d05eec1 100644
--- a/.gitlab/CODEOWNERS
+++ b/.gitlab/CODEOWNERS
@@ -251,9 +251,9 @@ Dangerfile @gl-quality/eng-prod
/doc/user/project/code_owners.md @reprazent @kerrizor @garyh
[Product Intelligence]
-/ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product_intelligence/engineers
-/ee/lib/ee/gitlab/usage_data.rb @gitlab-org/growth/product_intelligence/engineers
-/lib/gitlab/grafana_embed_usage_data.rb @gitlab-org/growth/product_intelligence/engineers
+/ee/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
+/ee/lib/ee/gitlab/usage_data.rb @gitlab-org/growth/product-intelligence/engineers
+/lib/gitlab/grafana_embed_usage_data.rb @gitlab-org/growth/product-intelligence/engineers
/lib/gitlab/usage_data.rb @gitlab-org/growth/product_intelligence/engineers
-/lib/gitlab/cycle_analytics/usage_data.rb @gitlab-org/growth/product_intelligence/engineers
-/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product_intelligence/engineers
+/lib/gitlab/cycle_analytics/usage_data.rb @gitlab-org/growth/product-intelligence/engineers
+/lib/gitlab/usage_data_counters/ @gitlab-org/growth/product-intelligence/engineers
diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml
index c2568187bea..a5620fd0ef7 100644
--- a/.rubocop_manual_todo.yml
+++ b/.rubocop_manual_todo.yml
@@ -881,10 +881,6 @@ Graphql/Descriptions:
- 'app/graphql/types/tree/tree_type.rb'
- 'app/graphql/types/user_status_type.rb'
- 'app/graphql/types/user_type.rb'
- - 'ee/app/graphql/ee/mutations/boards/issues/issue_move_list.rb'
- - 'ee/app/graphql/ee/mutations/boards/lists/create.rb'
- - 'ee/app/graphql/ee/mutations/issues/create.rb'
- - 'ee/app/graphql/ee/mutations/issues/update.rb'
- 'ee/app/graphql/ee/resolvers/issues_resolver.rb'
- 'ee/app/graphql/ee/resolvers/namespace_projects_resolver.rb'
- 'ee/app/graphql/ee/types/board_list_type.rb'
@@ -898,44 +894,6 @@ Graphql/Descriptions:
- 'ee/app/graphql/ee/types/namespace_type.rb'
- 'ee/app/graphql/ee/types/project_type.rb'
- 'ee/app/graphql/ee/types/query_type.rb'
- - 'ee/app/graphql/mutations/admin/analytics/devops_adoption/segments/delete.rb'
- - 'ee/app/graphql/mutations/admin/analytics/devops_adoption/segments/mixins.rb'
- - 'ee/app/graphql/mutations/admin/analytics/devops_adoption/segments/update.rb'
- - 'ee/app/graphql/mutations/boards/lists/update_limit_metrics.rb'
- - 'ee/app/graphql/mutations/boards/update.rb'
- - 'ee/app/graphql/mutations/boards/update_epic_user_preferences.rb'
- - 'ee/app/graphql/mutations/compliance_management/frameworks/destroy.rb'
- - 'ee/app/graphql/mutations/compliance_management/frameworks/update.rb'
- - 'ee/app/graphql/mutations/clusters/agent_tokens/create.rb'
- - 'ee/app/graphql/mutations/clusters/agent_tokens/delete.rb'
- - 'ee/app/graphql/mutations/clusters/agents/create.rb'
- - 'ee/app/graphql/mutations/clusters/agents/delete.rb'
- - 'ee/app/graphql/mutations/concerns/mutations/shared_epic_arguments.rb'
- - 'ee/app/graphql/mutations/epic_tree/reorder.rb'
- - 'ee/app/graphql/mutations/epics/add_issue.rb'
- - 'ee/app/graphql/mutations/epics/base.rb'
- - 'ee/app/graphql/mutations/epics/create.rb'
- - 'ee/app/graphql/mutations/epics/set_subscription.rb'
- - 'ee/app/graphql/mutations/epics/update.rb'
- - 'ee/app/graphql/mutations/incident_management/oncall_schedule/create.rb'
- - 'ee/app/graphql/mutations/incident_management/oncall_schedule/destroy.rb'
- - 'ee/app/graphql/mutations/incident_management/oncall_schedule/oncall_schedule_base.rb'
- - 'ee/app/graphql/mutations/incident_management/oncall_schedule/update.rb'
- - 'ee/app/graphql/mutations/instance_security_dashboard/add_project.rb'
- - 'ee/app/graphql/mutations/instance_security_dashboard/remove_project.rb'
- - 'ee/app/graphql/mutations/issues/common_ee_mutation_arguments.rb'
- - 'ee/app/graphql/mutations/issues/promote_to_epic.rb'
- - 'ee/app/graphql/mutations/issues/set_weight.rb'
- - 'ee/app/graphql/mutations/iterations/create.rb'
- - 'ee/app/graphql/mutations/namespaces/base.rb'
- - 'ee/app/graphql/mutations/quality_management/test_cases/create.rb'
- - 'ee/app/graphql/mutations/requirements_management/base_requirement.rb'
- - 'ee/app/graphql/mutations/requirements_management/update_requirement.rb'
- - 'ee/app/graphql/mutations/security/ci_configuration/configure_sast.rb'
- - 'ee/app/graphql/mutations/vulnerabilities/confirm.rb'
- - 'ee/app/graphql/mutations/vulnerabilities/dismiss.rb'
- - 'ee/app/graphql/mutations/vulnerabilities/resolve.rb'
- - 'ee/app/graphql/mutations/vulnerabilities/revert_to_detected.rb'
- 'ee/app/graphql/resolvers/board_groupings/epics_resolver.rb'
- 'ee/app/graphql/resolvers/boards/epic_boards_resolver.rb'
- 'ee/app/graphql/resolvers/ci/code_coverage_activities_resolver.rb'
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 1ba05e770c5..d60ab9b2fcc 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -1,6 +1,6 @@
# This configuration was generated by
# `rubocop --auto-gen-config`
-# on 2020-12-14 18:35:57 UTC using RuboCop version 0.89.1.
+# on 2021-01-11 15:49:32 UTC using RuboCop version 0.91.1.
# The point is for the user to remove these configuration records
# one by one as the offenses are removed from the code base.
# Note that changes in the inspected code, or installation of new
@@ -11,7 +11,7 @@
Capybara/CurrentPathExpectation:
Enabled: false
-# Offense count: 216
+# Offense count: 218
Capybara/VisibilityMatcher:
Enabled: false
@@ -25,44 +25,53 @@ Graphql/IDType:
Exclude:
- 'app/graphql/mutations/boards/issues/issue_move_list.rb'
-# Offense count: 5
-Graphql/ResolverType:
- Exclude:
- - 'app/graphql/resolvers/base_resolver.rb'
- - 'app/graphql/resolvers/ci/jobs_resolver.rb'
- - 'app/graphql/resolvers/ci/pipeline_stages_resolver.rb'
- - 'app/graphql/resolvers/users/group_count_resolver.rb'
- - 'ee/app/graphql/resolvers/vulnerabilities_base_resolver.rb'
-
-# Offense count: 2002
+# Offense count: 2054
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: with_first_argument, with_fixed_indentation
Layout/ArgumentAlignment:
Enabled: false
-# Offense count: 50
+# Offense count: 11
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyleAlignWith, Severity.
+# SupportedStylesAlignWith: start_of_line, begin
+Layout/BeginEndAlignment:
+ Exclude:
+ - 'app/controllers/groups/shared_projects_controller.rb'
+ - 'app/workers/concerns/reactive_cacheable_worker.rb'
+ - 'ee/app/services/security/token_revocation_service.rb'
+ - 'ee/lib/gitlab/analytics/cycle_analytics/summary/group/deploy.rb'
+ - 'ee/lib/gitlab/ci/config/entry/vault/secret.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/atlassian/jira_connect/serializers/build_entity.rb'
+ - 'lib/gitlab/ci/jwt.rb'
+ - 'lib/gitlab/external_authorization/client.rb'
+ - 'lib/gitlab/phabricator_import/project_creator.rb'
+ - 'scripts/gitaly_test.rb'
+
+# Offense count: 52
# Cop supports --auto-correct.
# Configuration parameters: AllowAliasSyntax, AllowedMethods.
# AllowedMethods: alias_method, public, protected, private
Layout/EmptyLinesAroundAttributeAccessor:
Enabled: false
-# Offense count: 694
+# Offense count: 721
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_brackets
Layout/FirstArrayElementIndentation:
Enabled: false
-# Offense count: 1621
+# Offense count: 1592
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: special_inside_parentheses, consistent, align_braces
Layout/FirstHashElementIndentation:
Enabled: false
-# Offense count: 2979
+# Offense count: 3019
# Cop supports --auto-correct.
# Configuration parameters: AllowMultipleStyles, EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
# SupportedHashRocketStyles: key, separator, table
@@ -71,33 +80,47 @@ Layout/FirstHashElementIndentation:
Layout/HashAlignment:
Enabled: false
-# Offense count: 72
+# Offense count: 73
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
# URISchemes: http, https
Layout/LineLength:
Max: 1313
-# Offense count: 162
+# Offense count: 163
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, IndentationWidth.
# SupportedStyles: aligned, indented
Layout/MultilineOperationIndentation:
Enabled: false
-# Offense count: 52
+# Offense count: 11
+# Cop supports --auto-correct.
+Layout/RescueEnsureAlignment:
+ Exclude:
+ - 'app/models/blob_viewer/dependency_manager.rb'
+ - 'app/models/project.rb'
+ - 'app/services/prometheus/proxy_service.rb'
+ - 'app/workers/concerns/reactive_cacheable_worker.rb'
+ - 'app/workers/delete_stored_files_worker.rb'
+ - 'config/initializers/1_settings.rb'
+ - 'config/initializers/trusted_proxies.rb'
+ - 'lib/api/internal/base.rb'
+ - 'lib/gitlab/highlight.rb'
+
+# Offense count: 53
# Cop supports --auto-correct.
Layout/SpaceAroundMethodCallOperator:
Enabled: false
-# Offense count: 737
+# Offense count: 725
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: require_no_space, require_space
Layout/SpaceInLambdaLiteral:
Enabled: false
-# Offense count: 1160
+# Offense count: 218
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, EnforcedStyleForEmptyBraces, SpaceBeforeBlockParameters.
# SupportedStyles: space, no_space
@@ -105,17 +128,16 @@ Layout/SpaceInLambdaLiteral:
Layout/SpaceInsideBlockBraces:
Enabled: false
-# Offense count: 539
+# Offense count: 559
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: space, no_space
Layout/SpaceInsideParens:
Enabled: false
-# Offense count: 19
+# Offense count: 18
Lint/BinaryOperatorWithIdenticalOperands:
Exclude:
- - 'app/finders/concerns/time_frame_filter.rb'
- 'ee/spec/lib/ee/gitlab/application_context_spec.rb'
- 'spec/helpers/visibility_level_helper_spec.rb'
- 'spec/lib/gitlab/conan_token_spec.rb'
@@ -129,6 +151,10 @@ Lint/BinaryOperatorWithIdenticalOperands:
- 'spec/models/repository_spec.rb'
- 'spec/models/ssh_host_key_spec.rb'
+# Offense count: 83
+Lint/ConstantDefinitionInBlock:
+ Enabled: false
+
# Offense count: 9
# Cop supports --auto-correct.
Lint/DeprecatedOpenSSLConstant:
@@ -143,7 +169,26 @@ Lint/DeprecatedOpenSSLConstant:
- 'spec/support/helpers/smime_helper.rb'
- 'spec/support/shared_contexts/requests/api/conan_packages_shared_context.rb'
-# Offense count: 183
+# Offense count: 1
+Lint/DuplicateRequire:
+ Exclude:
+ - 'ee/spec/lib/gitlab/auth/group_saml/user_spec.rb'
+
+# Offense count: 2
+# Configuration parameters: AllowComments.
+Lint/EmptyFile:
+ Exclude:
+ - 'db/seeds.rb'
+ - 'ee/db/geo/seeds.rb'
+
+# Offense count: 8
+# Cop supports --auto-correct.
+Lint/IdentityComparison:
+ Exclude:
+ - 'spec/lib/gitlab/danger/weightage/maintainers_spec.rb'
+ - 'spec/lib/gitlab/danger/weightage/reviewers_spec.rb'
+
+# Offense count: 184
# Configuration parameters: MaximumRangeSize.
Lint/MissingCopEnableDirective:
Enabled: false
@@ -166,7 +211,7 @@ Lint/MixedRegexpCaptureTypes:
- 'lib/gitlab/slash_commands/issue_new.rb'
- 'lib/gitlab/slash_commands/run.rb'
-# Offense count: 135
+# Offense count: 141
# Cop supports --auto-correct.
Lint/RedundantCopDisableDirective:
Enabled: false
@@ -188,20 +233,63 @@ Lint/UnreachableLoop:
Exclude:
- 'qa/qa/runtime/feature.rb'
+# Offense count: 22
+# Cop supports --auto-correct.
+# Configuration parameters: AllowComments.
+Lint/UselessMethodDefinition:
+ Enabled: false
+
# Offense count: 7
-# Configuration parameters: IgnoredMethods.
+# Configuration parameters: IgnoredMethods, Max.
Metrics/AbcSize:
- Max: 59
+ Exclude:
+ - 'app/helpers/issuables_helper.rb'
+ - 'app/services/merge_requests/build_service.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'lib/api/helpers.rb'
+ - 'lib/gitlab/lograge/custom_options.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'qa/qa/resource/repository/push.rb'
# Offense count: 15
-# Configuration parameters: IgnoredMethods.
+# Configuration parameters: IgnoredMethods, Max.
Metrics/CyclomaticComplexity:
- Max: 25
+ Exclude:
+ - 'app/services/projects/create_service.rb'
+ - 'app/services/system_hooks_service.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/lib/security/ci_configuration/sast_build_actions.rb'
+ - 'lib/banzai/filter/abstract_reference_filter.rb'
+ - 'lib/declarative_policy/runner.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/danger/roulette.rb'
+ - 'lib/gitlab/diff/parser.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'lib/gitlab/sidekiq_cluster/cli.rb'
+ - 'lib/gitlab/utils/merge_hash.rb'
+ - 'lib/kramdown/parser/atlassian_document_format.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
-# Offense count: 14
-# Configuration parameters: IgnoredMethods.
+# Offense count: 15
+# Configuration parameters: IgnoredMethods, Max.
Metrics/PerceivedComplexity:
- Max: 25
+ Exclude:
+ - 'app/helpers/submodule_helper.rb'
+ - 'app/helpers/tab_helper.rb'
+ - 'app/services/projects/create_service.rb'
+ - 'ee/app/controllers/ee/groups_controller.rb'
+ - 'ee/app/helpers/ee/groups_helper.rb'
+ - 'ee/lib/security/ci_configuration/sast_build_actions.rb'
+ - 'lib/banzai/filter/abstract_reference_filter.rb'
+ - 'lib/banzai/renderer.rb'
+ - 'lib/declarative_policy/runner.rb'
+ - 'lib/gitlab/conflict/file.rb'
+ - 'lib/gitlab/danger/roulette.rb'
+ - 'lib/gitlab/rack_attack.rb'
+ - 'lib/gitlab/sidekiq_cluster/cli.rb'
+ - 'lib/gitlab/utils/merge_hash.rb'
+ - 'spec/support/cycle_analytics_helpers/test_generation.rb'
# Offense count: 1
# Cop supports --auto-correct.
@@ -209,7 +297,7 @@ Migration/DepartmentName:
Exclude:
- 'app/models/commit.rb'
-# Offense count: 181
+# Offense count: 184
# Configuration parameters: ExpectMatchingDefinition, CheckDefinitionPathHierarchy, Regex, IgnoreExecutableScripts, AllowedAcronyms.
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
Naming/FileName:
@@ -226,7 +314,7 @@ Naming/HeredocDelimiterCase:
- 'spec/support/helpers/repo_helpers.rb'
- 'spec/support/helpers/seed_repo.rb'
-# Offense count: 303
+# Offense count: 308
# Configuration parameters: ForbiddenDelimiters.
# ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
Naming/HeredocDelimiterNaming:
@@ -240,7 +328,7 @@ Naming/MethodParameterName:
- 'lib/gitlab/diff/inline_diff.rb'
- 'spec/support/helpers/key_generator_helper.rb'
-# Offense count: 203
+# Offense count: 206
# Cop supports --auto-correct.
# Configuration parameters: PreferredName.
Naming/RescuedExceptionsVariableName:
@@ -252,11 +340,21 @@ Performance/AncestorsInclude:
Exclude:
- 'lib/gitlab/ci/config/extendable/entry.rb'
+# Offense count: 39
+# Cop supports --auto-correct.
+Performance/BlockGivenWithExplicitBlock:
+ Enabled: false
+
# Offense count: 28
# Configuration parameters: MinSize.
Performance/CollectionLiteralInLoop:
Enabled: false
+# Offense count: 37
+# Cop supports --auto-correct.
+Performance/ConstantRegexp:
+ Enabled: false
+
# Offense count: 18
# Cop supports --auto-correct.
Performance/Count:
@@ -311,6 +409,10 @@ Performance/Detect:
- 'spec/lib/gitlab/import_export/project/tree_restorer_spec.rb'
- 'spec/models/event_spec.rb'
+# Offense count: 116
+Performance/MethodObjectAsBlock:
+ Enabled: false
+
# Offense count: 18
# Cop supports --auto-correct.
# Configuration parameters: AutoCorrect.
@@ -331,19 +433,27 @@ Performance/StringInclude:
- 'spec/spec_helper.rb'
- 'spec/support_specs/helpers/active_record/query_recorder_spec.rb'
-# Offense count: 9
+# Offense count: 18
# Cop supports --auto-correct.
Performance/Sum:
Exclude:
+ - 'app/controllers/projects/pipelines/tests_controller.rb'
- 'app/models/application_setting_implementation.rb'
- 'app/models/ci/pipeline.rb'
+ - 'app/services/issues/export_csv_service.rb'
- 'ee/spec/lib/gitlab/elastic/bulk_indexer_spec.rb'
+ - 'lib/api/entities/issuable_time_stats.rb'
+ - 'lib/container_registry/tag.rb'
- 'lib/declarative_policy/rule.rb'
- 'lib/declarative_policy/runner.rb'
+ - 'lib/gitlab/ci/reports/test_suite_comparer.rb'
+ - 'lib/gitlab/diff/file.rb'
- 'lib/gitlab/sherlock/transaction.rb'
- 'lib/gitlab/usage_data.rb'
+ - 'lib/peek/views/detailed_view.rb'
+ - 'spec/models/namespace/root_storage_statistics_spec.rb'
-# Offense count: 14469
+# Offense count: 14717
# Configuration parameters: Prefixes.
# Prefixes: when, with, without
RSpec/ContextWording:
@@ -356,23 +466,23 @@ RSpec/EmptyExampleGroup:
- 'ee/spec/services/personal_access_tokens/revoke_invalid_tokens_spec.rb'
- 'spec/services/projects/prometheus/alerts/notify_service_spec.rb'
-# Offense count: 1355
+# Offense count: 1365
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: method_call, block
RSpec/ExpectChange:
Enabled: false
-# Offense count: 903
+# Offense count: 889
RSpec/ExpectInHook:
Enabled: false
-# Offense count: 16472
+# Offense count: 16403
# Configuration parameters: AllowSubject.
RSpec/MultipleMemoizedHelpers:
Max: 40
-# Offense count: 2344
+# Offense count: 2352
# Cop supports --auto-correct.
# Configuration parameters: Strict, EnforcedStyle, AllowedExplicitMatchers.
# SupportedStyles: inflected, explicit
@@ -394,7 +504,7 @@ RSpec/RepeatedExampleGroupDescription:
RSpec/ReturnFromStub:
Enabled: false
-# Offense count: 587
+# Offense count: 596
# Cop supports --auto-correct.
RSpec/ScatteredLet:
Enabled: false
@@ -453,7 +563,7 @@ Rails/BelongsTo:
- 'app/models/deployment.rb'
- 'app/models/environment.rb'
-# Offense count: 88
+# Offense count: 90
# Configuration parameters: Database, Include.
# SupportedDatabases: mysql, postgresql
# Include: db/migrate/*.rb
@@ -465,13 +575,13 @@ Rails/BulkChangeTable:
Rails/ContentTag:
Enabled: false
-# Offense count: 292
+# Offense count: 300
# Configuration parameters: Include.
# Include: db/migrate/*.rb
Rails/CreateTableWithTimestamps:
Enabled: false
-# Offense count: 343
+# Offense count: 347
# Configuration parameters: EnforcedStyle.
# SupportedStyles: slashes, arguments
Rails/FilePath:
@@ -493,13 +603,13 @@ Rails/FindById:
- 'spec/finders/concerns/finder_methods_spec.rb'
- 'spec/finders/concerns/finder_with_cross_project_access_spec.rb'
-# Offense count: 343
+# Offense count: 346
# Configuration parameters: Include.
# Include: app/models/**/*.rb
Rails/HasManyOrHasOneDependent:
Enabled: false
-# Offense count: 538
+# Offense count: 539
# Configuration parameters: Include.
# Include: app/helpers/**/*.rb
Rails/HelperInstanceVariable:
@@ -561,17 +671,17 @@ Rails/MailerName:
Exclude:
- 'app/mailers/notify.rb'
-# Offense count: 49
+# Offense count: 51
# Cop supports --auto-correct.
Rails/NegateInclude:
Enabled: false
-# Offense count: 42
+# Offense count: 44
# Cop supports --auto-correct.
Rails/Pick:
Enabled: false
-# Offense count: 119
+# Offense count: 110
# Cop supports --auto-correct.
Rails/Pluck:
Enabled: false
@@ -583,7 +693,7 @@ Rails/Pluck:
Rails/RakeEnvironment:
Enabled: false
-# Offense count: 56
+# Offense count: 58
# Cop supports --auto-correct.
Rails/RedundantForeignKey:
Enabled: false
@@ -603,18 +713,23 @@ Rails/ShortI18n:
- 'app/uploaders/content_type_whitelist.rb'
- 'spec/views/shared/runners/show.html.haml_spec.rb'
-# Offense count: 1064
+# Offense count: 1080
# Configuration parameters: ForbiddenMethods, AllowedMethods.
# ForbiddenMethods: decrement!, decrement_counter, increment!, increment_counter, insert, insert!, insert_all, insert_all!, toggle!, touch, touch_all, update_all, update_attribute, update_column, update_columns, update_counters, upsert, upsert_all
Rails/SkipsModelValidations:
Enabled: false
-# Offense count: 245
+# Offense count: 251
# Cop supports --auto-correct.
Rails/SquishedSQLHeredocs:
Enabled: false
-# Offense count: 38
+# Offense count: 45
+# Cop supports --auto-correct.
+Rails/WhereEquals:
+ Enabled: false
+
+# Offense count: 40
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: exists, where
@@ -636,20 +751,19 @@ Security/YAMLLoad:
- 'spec/initializers/secret_token_spec.rb'
- 'spec/lib/gitlab/prometheus/additional_metrics_parser_spec.rb'
-# Offense count: 247
+# Offense count: 240
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: separated, grouped
Style/AccessorGrouping:
Enabled: false
-# Offense count: 13
+# Offense count: 12
# Cop supports --auto-correct.
Style/ArrayCoercion:
Exclude:
- 'app/controllers/admin/ci/variables_controller.rb'
- 'app/controllers/groups/variables_controller.rb'
- - 'app/controllers/import/bulk_imports_controller.rb'
- 'app/controllers/projects/variables_controller.rb'
- 'db/migrate/20190620105427_change_null_private_profile_to_false.rb'
- 'db/post_migrate/20190812070645_migrate_private_profile_nulls.rb'
@@ -661,7 +775,7 @@ Style/ArrayCoercion:
- 'ee/lib/ee/banzai/pipeline/gfm_pipeline.rb'
- 'spec/support/helpers/lfs_http_helpers.rb'
-# Offense count: 184
+# Offense count: 183
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: percent_q, bare_percent
@@ -680,6 +794,22 @@ Style/BisectedAttrAccessor:
Style/CaseLikeIf:
Enabled: false
+# Offense count: 15
+Style/CombinableLoops:
+ Exclude:
+ - 'app/models/application_setting.rb'
+ - 'ee/db/fixtures/development/30_customizable_cycle_analytics.rb'
+ - 'ee/lib/gitlab/audit/events/preloader.rb'
+ - 'ee/spec/finders/snippets_finder_spec.rb'
+ - 'ee/spec/lib/ee/gitlab/background_migration/remove_duplicate_cs_findings_spec.rb'
+ - 'rubocop/code_reuse_helpers.rb'
+ - 'spec/features/merge_request/user_suggests_changes_on_diff_spec.rb'
+ - 'spec/finders/packages/group_packages_finder_spec.rb'
+ - 'spec/migrations/cleanup_optimistic_locking_nulls_pt2_fixed_spec.rb'
+ - 'spec/migrations/cleanup_optimistic_locking_nulls_spec.rb'
+ - 'spec/requests/api/members_spec.rb'
+ - 'spec/support/shared_examples/features/protected_branches_access_control_ce_shared_examples.rb'
+
# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, SingleLineConditionsOnly, IncludeTernaryExpressions.
@@ -698,14 +828,14 @@ Style/EachWithObject:
- 'lib/gitlab/i18n/po_linter.rb'
- 'lib/gitlab/import_export/members_mapper.rb'
-# Offense count: 54
+# Offense count: 53
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: empty, nil, both
Style/EmptyElse:
Enabled: false
-# Offense count: 198
+# Offense count: 197
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: compact, expanded
@@ -719,62 +849,67 @@ Style/ExpandPathArguments:
- 'cable/config.ru'
- 'config.ru'
-# Offense count: 114
+# Offense count: 116
# Cop supports --auto-correct.
Style/ExplicitBlockArgument:
Enabled: false
-# Offense count: 542
+# Offense count: 555
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: format, sprintf, percent
Style/FormatString:
Enabled: false
-# Offense count: 59
+# Offense count: 61
# Cop supports --auto-correct.
Style/GlobalStdStream:
Enabled: false
-# Offense count: 857
+# Offense count: 879
# Configuration parameters: MinBodyLength.
Style/GuardClause:
Enabled: false
-# Offense count: 92
+# Offense count: 56
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: braces, no_braces
Style/HashAsLastArrayItem:
Enabled: false
-# Offense count: 60
+# Offense count: 66
# Cop supports --auto-correct.
Style/HashEachMethods:
Enabled: false
-# Offense count: 34
+# Offense count: 33
# Configuration parameters: AllowIfModifier.
Style/IfInsideElse:
Enabled: false
-# Offense count: 1856
+# Offense count: 1888
# Cop supports --auto-correct.
Style/IfUnlessModifier:
Enabled: false
-# Offense count: 439
+# Offense count: 68
+# Cop supports --auto-correct.
+Style/KeywordParametersOrder:
+ Enabled: false
+
+# Offense count: 431
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: line_count_dependent, lambda, literal
Style/Lambda:
Enabled: false
-# Offense count: 18
+# Offense count: 20
Style/MissingRespondToMissing:
Enabled: false
-# Offense count: 36
+# Offense count: 35
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, MinBodyLength.
# SupportedStyles: skip_modifier_ifs, always
@@ -788,25 +923,25 @@ Style/Next:
Style/NumericLiteralPrefix:
Enabled: false
-# Offense count: 136
+# Offense count: 135
# Cop supports --auto-correct.
Style/ParallelAssignment:
Enabled: false
-# Offense count: 2557
+# Offense count: 2601
# Cop supports --auto-correct.
# Configuration parameters: PreferredDelimiters.
Style/PercentLiteralDelimiters:
Enabled: false
-# Offense count: 251
+# Offense count: 1
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: compact, exploded
Style/RaiseArgs:
Enabled: false
-# Offense count: 68
+# Offense count: 65
# Cop supports --auto-correct.
Style/RedundantAssignment:
Enabled: false
@@ -828,24 +963,23 @@ Style/RedundantFetchBlock:
Style/RedundantFileExtensionInRequire:
Enabled: false
-# Offense count: 272
+# Offense count: 220
# Cop supports --auto-correct.
Style/RedundantFreeze:
Enabled: false
-# Offense count: 179
+# Offense count: 182
# Cop supports --auto-correct.
Style/RedundantInterpolation:
Enabled: false
-# Offense count: 9
+# Offense count: 8
# Cop supports --auto-correct.
Style/RedundantRegexpCharacterClass:
Exclude:
- 'app/models/concerns/taskable.rb'
- 'lib/gitlab/authorized_keys.rb'
- 'lib/gitlab/fogbugz_import/repository.rb'
- - 'lib/gitlab/prometheus/internal.rb'
- 'lib/gitlab/quick_actions/substitution_definition.rb'
- 'lib/gitlab/regex.rb'
- 'spec/features/merge_request/user_views_open_merge_request_spec.rb'
@@ -856,62 +990,75 @@ Style/RedundantRegexpCharacterClass:
Style/RedundantRegexpEscape:
Enabled: false
-# Offense count: 914
+# Offense count: 920
# Cop supports --auto-correct.
Style/RedundantSelf:
Enabled: false
-# Offense count: 190
+# Offense count: 2
+# Cop supports --auto-correct.
+Style/RedundantSelfAssignment:
+ Exclude:
+ - 'app/models/concerns/issuable.rb'
+ - 'spec/db/schema_spec.rb'
+
+# Offense count: 196
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
# SupportedStyles: slashes, percent_r, mixed
Style/RegexpLiteral:
Enabled: false
-# Offense count: 49
+# Offense count: 50
# Cop supports --auto-correct.
Style/RescueModifier:
Enabled: false
-# Offense count: 338
+# Offense count: 346
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: implicit, explicit
Style/RescueStandardError:
Enabled: false
-# Offense count: 110
+# Offense count: 115
# Cop supports --auto-correct.
Style/SingleArgumentDig:
Enabled: false
-# Offense count: 46
+# Offense count: 45
# Cop supports --auto-correct.
Style/SlicingWithRange:
Enabled: false
-# Offense count: 120
+# Offense count: 61
+# Configuration parameters: AllowModifier.
+Style/SoleNestedConditional:
+ Enabled: false
+
+# Offense count: 121
# Cop supports --auto-correct.
# Configuration parameters: .
# SupportedStyles: use_perl_names, use_english_names
Style/SpecialGlobalVars:
EnforcedStyle: use_perl_names
-# Offense count: 532
+# Offense count: 545
# Cop supports --auto-correct.
Style/StringConcatenation:
Enabled: false
-# Offense count: 104
+# Offense count: 108
# Cop supports --auto-correct.
# Configuration parameters: EnforcedStyle.
# SupportedStyles: single_quotes, double_quotes
Style/StringLiteralsInInterpolation:
Enabled: false
-# Offense count: 296
+# Offense count: 292
# Cop supports --auto-correct.
# Configuration parameters: IgnoredMethods.
# IgnoredMethods: respond_to, define_method
Style/SymbolProc:
Enabled: false
+
diff --git a/Gemfile b/Gemfile
index 721d92ba51b..ef98260d997 100644
--- a/Gemfile
+++ b/Gemfile
@@ -370,7 +370,7 @@ group :development, :test do
gem 'spring', '~> 2.1.0'
gem 'spring-commands-rspec', '~> 1.0.4'
- gem 'gitlab-styles', '~> 5.4.0', require: false
+ gem 'gitlab-styles', '~> 6.0.0', require: false
gem 'scss_lint', '~> 0.59.0', require: false
gem 'haml_lint', '~> 0.36.0', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index 3f69b6bceeb..a3c7616f1a6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -447,11 +447,11 @@ GEM
gitlab-pg_query (1.3.1)
gitlab-sidekiq-fetcher (0.5.2)
sidekiq (~> 5)
- gitlab-styles (5.4.0)
- rubocop (~> 0.89.1)
- rubocop-gitlab-security (~> 0.1.0)
- rubocop-performance (~> 1.8.1)
- rubocop-rails (~> 2.8)
+ gitlab-styles (6.0.0)
+ rubocop (~> 0.91.1)
+ rubocop-gitlab-security (~> 0.1.1)
+ rubocop-performance (~> 1.9.2)
+ rubocop-rails (~> 2.9)
rubocop-rspec (~> 1.44)
gitlab_chronic_duration (0.10.6.2)
numerizer (~> 0.2)
@@ -591,7 +591,7 @@ GEM
mime-types (~> 3.0)
multi_xml (>= 0.5.2)
httpclient (2.8.3)
- i18n (1.8.5)
+ i18n (1.8.7)
concurrent-ruby (~> 1.0)
i18n_data (0.8.0)
icalendar (2.4.1)
@@ -836,8 +836,8 @@ GEM
rubypants (~> 0.2)
orm_adapter (0.5.0)
os (1.1.1)
- parallel (1.19.2)
- parser (2.7.2.0)
+ parallel (1.20.1)
+ parser (3.0.0.0)
ast (~> 2.4.1)
parslet (1.8.2)
peek (1.1.0)
@@ -1028,26 +1028,26 @@ GEM
pg
rails
sqlite3
- rubocop (0.89.1)
+ rubocop (0.91.1)
parallel (~> 1.10)
parser (>= 2.7.1.1)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 1.7)
rexml
- rubocop-ast (>= 0.3.0, < 1.0)
+ rubocop-ast (>= 0.4.0, < 1.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 2.0)
rubocop-ast (0.8.0)
parser (>= 2.7.1.5)
rubocop-gitlab-security (0.1.1)
rubocop (>= 0.51)
- rubocop-performance (1.8.1)
- rubocop (>= 0.87.0)
+ rubocop-performance (1.9.2)
+ rubocop (>= 0.90.0, < 2.0)
rubocop-ast (>= 0.4.0)
- rubocop-rails (2.8.1)
+ rubocop-rails (2.9.1)
activesupport (>= 4.2.0)
rack (>= 1.1)
- rubocop (>= 0.87.0)
+ rubocop (>= 0.90.0, < 2.0)
rubocop-rspec (1.44.1)
rubocop (~> 0.87)
rubocop-ast (>= 0.7.1)
@@ -1056,7 +1056,7 @@ GEM
ruby-fogbugz (0.2.1)
crack (~> 0.4)
ruby-prof (1.3.1)
- ruby-progressbar (1.10.1)
+ ruby-progressbar (1.11.0)
ruby-saml (1.7.2)
nokogiri (>= 1.5.10)
ruby-statistics (2.1.2)
@@ -1364,7 +1364,7 @@ DEPENDENCIES
gitlab-markup (~> 1.7.1)
gitlab-net-dns (~> 0.9.1)
gitlab-sidekiq-fetcher (= 0.5.2)
- gitlab-styles (~> 5.4.0)
+ gitlab-styles (~> 6.0.0)
gitlab_chronic_duration (~> 0.10.6.2)
gitlab_omniauth-ldap (~> 2.1.1)
gon (~> 6.2)
diff --git a/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue b/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue
new file mode 100644
index 00000000000..8c8241cf6a4
--- /dev/null
+++ b/app/assets/javascripts/sidebar/components/copy_email_to_clipboard.vue
@@ -0,0 +1,43 @@
+<script>
+import { s__, __, sprintf } from '~/locale';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+
+export default {
+ i18n: {
+ copyEmail: __('Copy email address'),
+ },
+ components: {
+ ClipboardButton,
+ },
+ props: {
+ copyText: {
+ type: String,
+ required: true,
+ },
+ },
+ computed: {
+ emailText() {
+ return sprintf(s__('RightSidebar|Issue email: %{copyText}'), { copyText: this.copyText });
+ },
+ },
+};
+</script>
+
+<template>
+ <div
+ data-qa-selector="copy-forward-email"
+ class="copy-email-address gl-display-flex gl-align-items-center gl-justify-content-space-between"
+ >
+ <span
+ class="gl-overflow-hidden gl-text-overflow-ellipsis gl-white-space-nowrap hide-collapsed gl-w-85p"
+ >{{ emailText }}</span
+ >
+ <clipboard-button
+ class="copy-email-button gl-bg-none!"
+ category="tertiary"
+ :title="$options.i18n.copyEmail"
+ :text="copyText"
+ tooltip-placement="left"
+ />
+ </div>
+</template>
diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js
index 3e8ccc6e177..2760bf431ea 100644
--- a/app/assets/javascripts/sidebar/mount_sidebar.js
+++ b/app/assets/javascripts/sidebar/mount_sidebar.js
@@ -12,6 +12,7 @@ import sidebarParticipants from './components/participants/sidebar_participants.
import sidebarSubscriptions from './components/subscriptions/sidebar_subscriptions.vue';
import SidebarSeverity from './components/severity/sidebar_severity.vue';
import Translate from '../vue_shared/translate';
+import CopyEmailToClipboard from './components/copy_email_to_clipboard.vue';
import createDefaultClient from '~/lib/graphql';
import { isInIssuePage, isInIncidentPage, parseBoolean } from '~/lib/utils/common_utils';
import createFlash from '~/flash';
@@ -272,6 +273,21 @@ function mountSeverityComponent() {
});
}
+function mountCopyEmailComponent() {
+ const el = document.getElementById('issuable-copy-email');
+
+ if (!el) return;
+
+ const { createNoteEmail } = getSidebarOptions();
+
+ // eslint-disable-next-line no-new
+ new Vue({
+ el,
+ render: (createElement) =>
+ createElement(CopyEmailToClipboard, { props: { copyText: createNoteEmail } }),
+ });
+}
+
export function mountSidebar(mediator) {
mountAssigneesComponent(mediator);
mountReviewersComponent(mediator);
@@ -279,6 +295,7 @@ export function mountSidebar(mediator) {
mountLockComponent();
mountParticipantsComponent(mediator);
mountSubscriptionsComponent(mediator);
+ mountCopyEmailComponent();
new SidebarMoveIssue(
mediator,
diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss
index d867cc96dbc..bef33bd2ef0 100644
--- a/app/assets/stylesheets/framework/sidebar.scss
+++ b/app/assets/stylesheets/framework/sidebar.scss
@@ -58,6 +58,19 @@
height: $gl-padding;
}
}
+
+ .copy-email-button { // TODO: replace with utility
+ @include gl-w-full;
+ @include gl-h-full;
+ }
+
+ .copy-email-address {
+ height: 60px;
+
+ &:hover {
+ background: $gray-100;
+ }
+ }
}
.right-sidebar-expanded {
diff --git a/app/finders/autocomplete/group_finder.rb b/app/finders/autocomplete/group_finder.rb
index dd97ac4c817..90fa48c2dc9 100644
--- a/app/finders/autocomplete/group_finder.rb
+++ b/app/finders/autocomplete/group_finder.rb
@@ -27,8 +27,7 @@ module Autocomplete
# This removes the need for using `return render_404` and similar patterns
# in controllers that use this finder.
unless Ability.allowed?(current_user, :read_group, group)
- raise ActiveRecord::RecordNotFound
- .new("Could not find a Group with ID #{group_id}")
+ raise ActiveRecord::RecordNotFound, "Could not find a Group with ID #{group_id}"
end
group
diff --git a/app/finders/autocomplete/project_finder.rb b/app/finders/autocomplete/project_finder.rb
index 3a4696f4c2e..6e51ae4c70d 100644
--- a/app/finders/autocomplete/project_finder.rb
+++ b/app/finders/autocomplete/project_finder.rb
@@ -25,8 +25,7 @@ module Autocomplete
# This removes the need for using `return render_404` and similar patterns
# in controllers that use this finder.
unless Ability.allowed?(current_user, :read_project, project)
- raise ActiveRecord::RecordNotFound
- .new("Could not find a Project with ID #{project_id}")
+ raise ActiveRecord::RecordNotFound, "Could not find a Project with ID #{project_id}"
end
project
diff --git a/app/finders/concerns/finder_methods.rb b/app/finders/concerns/finder_methods.rb
index 622cbcf4928..193b52b1694 100644
--- a/app/finders/concerns/finder_methods.rb
+++ b/app/finders/concerns/finder_methods.rb
@@ -22,7 +22,7 @@ module FinderMethods
def raise_not_found_unless_authorized(result)
result = if_authorized(result)
- raise ActiveRecord::RecordNotFound.new("Couldn't find #{model}") unless result
+ raise(ActiveRecord::RecordNotFound, "Couldn't find #{model}") unless result
result
end
diff --git a/app/models/concerns/bulk_insert_safe.rb b/app/models/concerns/bulk_insert_safe.rb
index f9eb3fb875e..3748e77e933 100644
--- a/app/models/concerns/bulk_insert_safe.rb
+++ b/app/models/concerns/bulk_insert_safe.rb
@@ -53,9 +53,9 @@ module BulkInsertSafe
class_methods do
def set_callback(name, *args)
unless _bulk_insert_callback_allowed?(name, args)
- raise MethodNotAllowedError.new(
+ raise MethodNotAllowedError,
"Not allowed to call `set_callback(#{name}, #{args})` when model extends `BulkInsertSafe`." \
- "Callbacks that fire per each record being inserted do not work with bulk-inserts.")
+ "Callbacks that fire per each record being inserted do not work with bulk-inserts."
end
super
diff --git a/app/services/jira_connect_subscriptions/create_service.rb b/app/services/jira_connect_subscriptions/create_service.rb
index b169d97615d..38e5fe7e690 100644
--- a/app/services/jira_connect_subscriptions/create_service.rb
+++ b/app/services/jira_connect_subscriptions/create_service.rb
@@ -35,8 +35,6 @@ module JiraConnectSubscriptions
end
def schedule_sync_project_jobs
- return unless Feature.enabled?(:jira_connect_full_namespace_sync)
-
namespace.all_projects.each_batch(of: MERGE_REQUEST_SYNC_BATCH_SIZE) do |projects, index|
JiraConnect::SyncProjectWorker.bulk_perform_in_with_contexts(
index * MERGE_REQUEST_SYNC_BATCH_DELAY,
diff --git a/app/views/shared/issuable/_sidebar.html.haml b/app/views/shared/issuable/_sidebar.html.haml
index cd265c10451..8fe278a9695 100644
--- a/app/views/shared/issuable/_sidebar.html.haml
+++ b/app/views/shared/issuable/_sidebar.html.haml
@@ -2,6 +2,7 @@
This should be removed when this sidebar is converted to Vue since assignee data is also available in the `issuable_sidebar` hash
- issuable_type = issuable_sidebar[:type]
+- show_forwarding_email = !issuable_sidebar[:create_note_email].nil?
- signed_in = !!issuable_sidebar.dig(:current_user, :id)
- can_edit_issuable = issuable_sidebar.dig(:current_user, :can_edit)
- add_page_startup_api_call "#{issuable_sidebar[:issuable_json_path]}?serializer=sidebar_extras"
@@ -145,6 +146,9 @@
= _('Source branch: %{source_branch_open}%{source_branch}%{source_branch_close}').html_safe % { source_branch_open: "<cite class='ref-name' title='#{source_branch}'>".html_safe, source_branch_close: "</cite>".html_safe, source_branch: source_branch }
= clipboard_button(text: source_branch, title: _('Copy branch name'), placement: "left", boundary: 'viewport')
+ - if show_forwarding_email
+ .block
+ #issuable-copy-email
- if issuable_sidebar.dig(:current_user, :can_move)
.block.js-sidebar-move-issue-block
.sidebar-collapsed-icon{ data: { toggle: 'tooltip', placement: 'left', container: 'body', boundary: 'viewport' }, title: _('Move issue') }
diff --git a/changelogs/unreleased/281912_remove_jira_connect_full_namespace_sync_feature_flag.yml b/changelogs/unreleased/281912_remove_jira_connect_full_namespace_sync_feature_flag.yml
new file mode 100644
index 00000000000..26f02d08f47
--- /dev/null
+++ b/changelogs/unreleased/281912_remove_jira_connect_full_namespace_sync_feature_flag.yml
@@ -0,0 +1,6 @@
+---
+title: Initially sync Merge Requests with Jira when a namespace is added through the
+ GitLab for Jira app
+merge_request: 51341
+author:
+type: added
diff --git a/changelogs/unreleased/ss-copy-clipboard-email.yml b/changelogs/unreleased/ss-copy-clipboard-email.yml
new file mode 100644
index 00000000000..d366f716d40
--- /dev/null
+++ b/changelogs/unreleased/ss-copy-clipboard-email.yml
@@ -0,0 +1,5 @@
+---
+title: Add copy email to issue sidebar
+merge_request: 50127
+author:
+type: added
diff --git a/config/feature_flags/development/jira_connect_full_namespace_sync.yml b/config/feature_flags/development/jira_connect_full_namespace_sync.yml
deleted file mode 100644
index 90fe97be409..00000000000
--- a/config/feature_flags/development/jira_connect_full_namespace_sync.yml
+++ /dev/null
@@ -1,7 +0,0 @@
----
-name: jira_connect_full_namespace_sync
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/43880
-rollout_issue_url:
-type: development
-group: group::ecosystem
-default_enabled: false
diff --git a/danger/product_intelligence/Dangerfile b/danger/product_intelligence/Dangerfile
index 53948f4931d..ec432544977 100644
--- a/danger/product_intelligence/Dangerfile
+++ b/danger/product_intelligence/Dangerfile
@@ -1,7 +1,7 @@
# frozen_string_literal: true
CHANGED_FILES_MESSAGE = <<~MSG
-For the following files, a review from the [Data team and Product Intelligence team](https://gitlab.com/groups/gitlab-org/growth/product_intelligence/engineers/-/group_members?with_inherited_permissions=exclude) is recommended
+For the following files, a review from the [Data team and Product Intelligence team](https://gitlab.com/groups/gitlab-org/growth/product-intelligence/engineers/-/group_members?with_inherited_permissions=exclude) is recommended
Please check the ~"product intelligence" [guide](https://docs.gitlab.com/ee/development/product_analytics/usage_ping.html) and reach out to %<engineers_group>s group for a review.
@@ -14,7 +14,7 @@ UPDATE_METRICS_DEFINITIONS_MESSAGE = <<~MSG
MSG
-ENGINEERS_GROUP = '@gitlab-org/growth/product_intelligence/engineers'
+ENGINEERS_GROUP = '@gitlab-org/growth/product-intelligence/engineers'
tracking_files = [
'lib/gitlab/tracking.rb',
diff --git a/doc/administration/audit_events.md b/doc/administration/audit_events.md
index 7436661920a..27f6bbcd028 100644
--- a/doc/administration/audit_events.md
+++ b/doc/administration/audit_events.md
@@ -103,6 +103,8 @@ From there, you can see the following actions:
Project events can also be accessed via the [Project Audit Events API](../api/audit_events.md#project-audit-events).
+Project event queries are limited to a maximum of 30 days.
+
### Instance events **(PREMIUM ONLY)**
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/2336) in [GitLab Premium](https://about.gitlab.com/pricing/) 9.3.
diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql
index d055f98d197..584f2061666 100644
--- a/doc/api/graphql/reference/gitlab_schema.graphql
+++ b/doc/api/graphql/reference/gitlab_schema.graphql
@@ -75,7 +75,7 @@ input AddProjectToSecurityDashboardInput {
clientMutationId: String
"""
- ID of the project to be added to Instance Security Dashboard
+ ID of the project to be added to Instance Security Dashboard.
"""
id: ProjectID!
}
@@ -95,7 +95,7 @@ type AddProjectToSecurityDashboardPayload {
errors: [String!]!
"""
- Project that was added to the Instance Security Dashboard
+ Project that was added to the Instance Security Dashboard.
"""
project: Project
}
@@ -2131,7 +2131,7 @@ Autogenerated input type of BoardListCreate
"""
input BoardListCreateInput {
"""
- Global ID of an existing user
+ Global ID of an existing user.
"""
assigneeId: UserID
@@ -2151,7 +2151,7 @@ input BoardListCreateInput {
clientMutationId: String
"""
- Global ID of an existing iteration
+ Global ID of an existing iteration.
"""
iterationId: IterationID
@@ -2161,7 +2161,7 @@ input BoardListCreateInput {
labelId: LabelID
"""
- Global ID of an existing milestone
+ Global ID of an existing milestone.
"""
milestoneId: MilestoneID
}
@@ -2246,7 +2246,7 @@ type BoardListUpdateLimitMetricsPayload {
errors: [String!]!
"""
- The updated list
+ The updated list.
"""
list: BoardList
}
@@ -3090,7 +3090,7 @@ input ClusterAgentDeleteInput {
clientMutationId: String
"""
- Global ID of the cluster agent that will be deleted
+ Global ID of the cluster agent that will be deleted.
"""
id: ClustersAgentID!
}
@@ -3177,7 +3177,7 @@ input ClusterAgentTokenCreateInput {
clientMutationId: String
"""
- Global ID of the cluster agent that will be associated with the new token
+ Global ID of the cluster agent that will be associated with the new token.
"""
clusterAgentId: ClustersAgentID!
}
@@ -3197,12 +3197,12 @@ type ClusterAgentTokenCreatePayload {
errors: [String!]!
"""
- Token secret value. Make sure you save it - you won't be able to access it again
+ Token secret value. Make sure you save it - you won't be able to access it again.
"""
secret: String
"""
- Token created after mutation
+ Token created after mutation.
"""
token: ClusterAgentToken
}
@@ -3217,7 +3217,7 @@ input ClusterAgentTokenDeleteInput {
clientMutationId: String
"""
- Global ID of the cluster agent token that will be deleted
+ Global ID of the cluster agent token that will be deleted.
"""
id: ClustersAgentTokenID!
}
@@ -3725,12 +3725,12 @@ input ConfigureSastInput {
clientMutationId: String
"""
- SAST CI configuration for the project
+ SAST CI configuration for the project.
"""
configuration: SastCiConfigurationInput!
"""
- Full path of the project
+ Full path of the project.
"""
projectPath: ID!
}
@@ -3750,12 +3750,12 @@ type ConfigureSastPayload {
errors: [String!]!
"""
- Status of creating the commit for the supplied SAST CI configuration
+ Status of creating the commit for the supplied SAST CI configuration.
"""
status: String!
"""
- Redirect path to use when the response is successful
+ Redirect path to use when the response is successful.
"""
successPath: String
}
@@ -4461,12 +4461,12 @@ input CreateClusterAgentInput {
clientMutationId: String
"""
- Name of the cluster agent
+ Name of the cluster agent.
"""
name: String!
"""
- Full path of the associated project for this cluster agent
+ Full path of the associated project for this cluster agent.
"""
projectPath: ID!
}
@@ -4481,7 +4481,7 @@ type CreateClusterAgentPayload {
clientMutationId: String
"""
- Cluster agent created after mutation
+ Cluster agent created after mutation.
"""
clusterAgent: ClusterAgent
@@ -4586,12 +4586,12 @@ input CreateDevopsAdoptionSegmentInput {
clientMutationId: String
"""
- The array of group IDs to set for the segment
+ The array of group IDs to set for the segment.
"""
groupIds: [GroupID!]
"""
- Name of the segment
+ Name of the segment.
"""
name: String!
}
@@ -4611,7 +4611,7 @@ type CreateDevopsAdoptionSegmentPayload {
errors: [String!]!
"""
- The segment after mutation
+ The segment after mutation.
"""
segment: DevopsAdoptionSegment
}
@@ -4681,27 +4681,27 @@ input CreateEpicInput {
clientMutationId: String
"""
- Indicates if the epic is confidential
+ Indicates if the epic is confidential.
"""
confidential: Boolean
"""
- The description of the epic
+ The description of the epic.
"""
description: String
"""
- The end date of the epic
+ The end date of the epic.
"""
dueDateFixed: String
"""
- Indicates end date should be sourced from due_date_fixed field not the issue milestones
+ Indicates end date should be sourced from due_date_fixed field not the issue milestones.
"""
dueDateIsFixed: Boolean
"""
- The group the epic to mutate is in
+ The group the epic to mutate is in.
"""
groupPath: ID!
@@ -4711,17 +4711,17 @@ input CreateEpicInput {
removeLabelIds: [ID!]
"""
- The start date of the epic
+ The start date of the epic.
"""
startDateFixed: String
"""
- Indicates start date should be sourced from start_date_fixed field not the issue milestones
+ Indicates start date should be sourced from start_date_fixed field not the issue milestones.
"""
startDateIsFixed: Boolean
"""
- The title of the epic
+ The title of the epic.
"""
title: String
}
@@ -4736,7 +4736,7 @@ type CreateEpicPayload {
clientMutationId: String
"""
- The created epic
+ The created epic.
"""
epic: Epic
@@ -4836,12 +4836,12 @@ input CreateIssueInput {
dueDate: ISO8601Date
"""
- The ID of an epic to associate the issue with
+ The ID of an epic to associate the issue with.
"""
epicId: EpicID
"""
- The desired health status
+ The desired health status.
"""
healthStatus: HealthStatus
@@ -4886,7 +4886,7 @@ input CreateIssueInput {
title: String!
"""
- The weight of the issue
+ The weight of the issue.
"""
weight: Int
}
@@ -4921,32 +4921,32 @@ input CreateIterationInput {
clientMutationId: String
"""
- The description of the iteration
+ The description of the iteration.
"""
description: String
"""
- The end date of the iteration
+ The end date of the iteration.
"""
dueDate: String
"""
- The target group for the iteration
+ The target group for the iteration.
"""
groupPath: ID
"""
- The target project for the iteration
+ The target project for the iteration.
"""
projectPath: ID
"""
- The start date of the iteration
+ The start date of the iteration.
"""
startDate: String
"""
- The title of the iteration
+ The title of the iteration.
"""
title: String
}
@@ -4966,7 +4966,7 @@ type CreateIterationPayload {
errors: [String!]!
"""
- The created iteration
+ The created iteration.
"""
iteration: Iteration
}
@@ -5031,17 +5031,17 @@ input CreateRequirementInput {
clientMutationId: String
"""
- Description of the requirement
+ Description of the requirement.
"""
description: String
"""
- Full project path the requirement is associated with
+ Full project path the requirement is associated with.
"""
projectPath: ID!
"""
- Title of the requirement
+ Title of the requirement.
"""
title: String
}
@@ -5061,7 +5061,7 @@ type CreateRequirementPayload {
errors: [String!]!
"""
- Requirement after mutation
+ Requirement after mutation.
"""
requirement: Requirement
}
@@ -5141,7 +5141,7 @@ input CreateTestCaseInput {
clientMutationId: String
"""
- The test case description
+ The test case description.
"""
description: String
@@ -5151,12 +5151,12 @@ input CreateTestCaseInput {
labelIds: [ID!]
"""
- The project full path to create the test case
+ The project full path to create the test case.
"""
projectPath: ID!
"""
- The test case title
+ The test case title.
"""
title: String!
}
@@ -5176,7 +5176,7 @@ type CreateTestCasePayload {
errors: [String!]!
"""
- The test case created
+ The test case created.
"""
testCase: Issue
}
@@ -6170,7 +6170,7 @@ input DeleteDevopsAdoptionSegmentInput {
clientMutationId: String
"""
- ID of the segment
+ ID of the segment.
"""
id: AnalyticsDevopsAdoptionSegmentID!
}
@@ -7135,7 +7135,7 @@ input DestroyComplianceFrameworkInput {
clientMutationId: String
"""
- The global ID of the compliance framework to destroy
+ The global ID of the compliance framework to destroy.
"""
id: ComplianceManagementFrameworkID!
}
@@ -7834,17 +7834,17 @@ input DismissVulnerabilityInput {
clientMutationId: String
"""
- Comment why vulnerability should be dismissed
+ Comment why vulnerability should be dismissed.
"""
comment: String
"""
- Reason why vulnerability should be dismissed
+ Reason why vulnerability should be dismissed.
"""
dismissalReason: VulnerabilityDismissalReason
"""
- ID of the vulnerability to be dismissed
+ ID of the vulnerability to be dismissed.
"""
id: VulnerabilityID!
}
@@ -7864,7 +7864,7 @@ type DismissVulnerabilityPayload {
errors: [String!]!
"""
- The vulnerability after dismissal
+ The vulnerability after dismissal.
"""
vulnerability: Vulnerability
}
@@ -8483,22 +8483,22 @@ input EpicAddIssueInput {
clientMutationId: String
"""
- The group the epic to mutate belongs to
+ The group the epic to mutate belongs to.
"""
groupPath: ID!
"""
- The IID of the epic to mutate
+ The IID of the epic to mutate.
"""
iid: ID!
"""
- The IID of the issue to be added
+ The IID of the issue to be added.
"""
issueIid: String!
"""
- The full path of the project the issue belongs to
+ The full path of the project the issue belongs to.
"""
projectPath: ID!
}
@@ -8513,12 +8513,12 @@ type EpicAddIssuePayload {
clientMutationId: String
"""
- The epic after mutation
+ The epic after mutation.
"""
epic: Epic
"""
- The epic-issue relation
+ The epic-issue relation.
"""
epicIssue: EpicIssue
@@ -9313,17 +9313,17 @@ input EpicSetSubscriptionInput {
clientMutationId: String
"""
- The group the epic to mutate belongs to
+ The group the epic to mutate belongs to.
"""
groupPath: ID!
"""
- The IID of the epic to mutate
+ The IID of the epic to mutate.
"""
iid: ID!
"""
- The desired state of the subscription
+ The desired state of the subscription.
"""
subscribedState: Boolean!
}
@@ -9338,7 +9338,7 @@ type EpicSetSubscriptionPayload {
clientMutationId: String
"""
- The epic after mutation
+ The epic after mutation.
"""
epic: Epic
@@ -9427,7 +9427,7 @@ Autogenerated input type of EpicTreeReorder
"""
input EpicTreeReorderInput {
"""
- The ID of the base epic of the tree
+ The ID of the base epic of the tree.
"""
baseEpicId: EpicID!
@@ -9437,7 +9437,7 @@ input EpicTreeReorderInput {
clientMutationId: String
"""
- Parameters for updating the tree positions
+ Parameters for updating the tree positions.
"""
moved: EpicTreeNodeFieldsInputType!
}
@@ -12269,7 +12269,7 @@ input IssueMoveListInput {
clientMutationId: String
"""
- The ID of the parent epic. NULL when removing the association
+ The ID of the parent epic. NULL when removing the association.
"""
epicId: EpicID
@@ -12774,7 +12774,7 @@ input IssueSetWeightInput {
projectPath: ID!
"""
- The desired weight for the issue
+ The desired weight for the issue.
"""
weight: Int!
}
@@ -15830,7 +15830,7 @@ input NamespaceIncreaseStorageTemporarilyInput {
clientMutationId: String
"""
- The global ID of the namespace to mutate
+ The global ID of the namespace to mutate.
"""
id: NamespaceID!
}
@@ -15850,7 +15850,7 @@ type NamespaceIncreaseStorageTemporarilyPayload {
errors: [String!]!
"""
- The namespace after mutation
+ The namespace after mutation.
"""
namespace: Namespace
}
@@ -16313,22 +16313,22 @@ input OncallScheduleCreateInput {
clientMutationId: String
"""
- The description of the on-call schedule
+ The description of the on-call schedule.
"""
description: String
"""
- The name of the on-call schedule
+ The name of the on-call schedule.
"""
name: String!
"""
- The project to create the on-call schedule in
+ The project to create the on-call schedule in.
"""
projectPath: ID!
"""
- The timezone of the on-call schedule
+ The timezone of the on-call schedule.
"""
timezone: String!
}
@@ -16348,7 +16348,7 @@ type OncallScheduleCreatePayload {
errors: [String!]!
"""
- The on-call schedule
+ The on-call schedule.
"""
oncallSchedule: IncidentManagementOncallSchedule
}
@@ -16363,12 +16363,12 @@ input OncallScheduleDestroyInput {
clientMutationId: String
"""
- The on-call schedule internal ID to remove
+ The on-call schedule internal ID to remove.
"""
iid: String!
"""
- The project to remove the on-call schedule from
+ The project to remove the on-call schedule from.
"""
projectPath: ID!
}
@@ -16388,7 +16388,7 @@ type OncallScheduleDestroyPayload {
errors: [String!]!
"""
- The on-call schedule
+ The on-call schedule.
"""
oncallSchedule: IncidentManagementOncallSchedule
}
@@ -16403,27 +16403,27 @@ input OncallScheduleUpdateInput {
clientMutationId: String
"""
- The description of the on-call schedule
+ The description of the on-call schedule.
"""
description: String
"""
- The on-call schedule internal ID to update
+ The on-call schedule internal ID to update.
"""
iid: String!
"""
- The name of the on-call schedule
+ The name of the on-call schedule.
"""
name: String
"""
- The project to update the on-call schedule in
+ The project to update the on-call schedule in.
"""
projectPath: ID!
"""
- The timezone of the on-call schedule
+ The timezone of the on-call schedule.
"""
timezone: String
}
@@ -16443,7 +16443,7 @@ type OncallScheduleUpdatePayload {
errors: [String!]!
"""
- The on-call schedule
+ The on-call schedule.
"""
oncallSchedule: IncidentManagementOncallSchedule
}
@@ -19589,7 +19589,7 @@ input PromoteToEpicInput {
clientMutationId: String
"""
- The group the promoted epic will belong to
+ The group the promoted epic will belong to.
"""
groupPath: ID
@@ -19614,7 +19614,7 @@ type PromoteToEpicPayload {
clientMutationId: String
"""
- The epic after issue promotion
+ The epic after issue promotion.
"""
epic: Epic
@@ -20945,7 +20945,7 @@ input RemoveProjectFromSecurityDashboardInput {
clientMutationId: String
"""
- ID of the project to remove from the Instance Security Dashboard
+ ID of the project to remove from the Instance Security Dashboard.
"""
id: ProjectID!
}
@@ -21267,7 +21267,7 @@ input RevertVulnerabilityToDetectedInput {
clientMutationId: String
"""
- ID of the vulnerability to be reverted
+ ID of the vulnerability to be reverted.
"""
id: VulnerabilityID!
}
@@ -21287,7 +21287,7 @@ type RevertVulnerabilityToDetectedPayload {
errors: [String!]!
"""
- The vulnerability after revert
+ The vulnerability after revert.
"""
vulnerability: Vulnerability
}
@@ -24399,7 +24399,7 @@ Autogenerated input type of UpdateBoardEpicUserPreferences
"""
input UpdateBoardEpicUserPreferencesInput {
"""
- The board global ID
+ The board global ID.
"""
boardId: BoardID!
@@ -24409,12 +24409,12 @@ input UpdateBoardEpicUserPreferencesInput {
clientMutationId: String
"""
- Whether the epic should be collapsed in the board
+ Whether the epic should be collapsed in the board.
"""
collapsed: Boolean!
"""
- ID of an epic to set preferences for
+ ID of an epic to set preferences for.
"""
epicId: EpicID!
}
@@ -24429,7 +24429,7 @@ type UpdateBoardEpicUserPreferencesPayload {
clientMutationId: String
"""
- User preferences for the epic in the board after mutation
+ User preferences for the epic in the board after mutation.
"""
epicUserPreferences: BoardEpicUserPreferences
@@ -24679,17 +24679,17 @@ input UpdateDevopsAdoptionSegmentInput {
clientMutationId: String
"""
- The array of group IDs to set for the segment
+ The array of group IDs to set for the segment.
"""
groupIds: [GroupID!]
"""
- ID of the segment
+ ID of the segment.
"""
id: AnalyticsDevopsAdoptionSegmentID!
"""
- Name of the segment
+ Name of the segment.
"""
name: String!
}
@@ -24709,7 +24709,7 @@ type UpdateDevopsAdoptionSegmentPayload {
errors: [String!]!
"""
- The segment after mutation
+ The segment after mutation.
"""
segment: DevopsAdoptionSegment
}
@@ -24751,32 +24751,32 @@ input UpdateEpicInput {
clientMutationId: String
"""
- Indicates if the epic is confidential
+ Indicates if the epic is confidential.
"""
confidential: Boolean
"""
- The description of the epic
+ The description of the epic.
"""
description: String
"""
- The end date of the epic
+ The end date of the epic.
"""
dueDateFixed: String
"""
- Indicates end date should be sourced from due_date_fixed field not the issue milestones
+ Indicates end date should be sourced from due_date_fixed field not the issue milestones.
"""
dueDateIsFixed: Boolean
"""
- The group the epic to mutate is in
+ The group the epic to mutate is in.
"""
groupPath: ID!
"""
- The IID of the epic to mutate
+ The IID of the epic to mutate.
"""
iid: ID!
@@ -24786,22 +24786,22 @@ input UpdateEpicInput {
removeLabelIds: [ID!]
"""
- The start date of the epic
+ The start date of the epic.
"""
startDateFixed: String
"""
- Indicates start date should be sourced from start_date_fixed field not the issue milestones
+ Indicates start date should be sourced from start_date_fixed field not the issue milestones.
"""
startDateIsFixed: Boolean
"""
- State event for the epic
+ State event for the epic.
"""
stateEvent: EpicStateEvent
"""
- The title of the epic
+ The title of the epic.
"""
title: String
}
@@ -24816,7 +24816,7 @@ type UpdateEpicPayload {
clientMutationId: String
"""
- The epic after mutation
+ The epic after mutation.
"""
epic: Epic
@@ -24901,12 +24901,12 @@ input UpdateIssueInput {
dueDate: ISO8601Date
"""
- The ID of the parent epic. NULL when removing the association
+ The ID of the parent epic. NULL when removing the association.
"""
epicId: EpicID
"""
- The desired health status
+ The desired health status.
"""
healthStatus: HealthStatus
@@ -24946,7 +24946,7 @@ input UpdateIssueInput {
title: String
"""
- The weight of the issue
+ The weight of the issue.
"""
weight: Int
}
@@ -25132,32 +25132,32 @@ input UpdateRequirementInput {
clientMutationId: String
"""
- Description of the requirement
+ Description of the requirement.
"""
description: String
"""
- The IID of the requirement to update
+ The IID of the requirement to update.
"""
iid: String!
"""
- Creates a test report for the requirement with the given state
+ Creates a test report for the requirement with the given state.
"""
lastTestReportState: TestReportState
"""
- Full project path the requirement is associated with
+ Full project path the requirement is associated with.
"""
projectPath: ID!
"""
- State of the requirement
+ State of the requirement.
"""
state: RequirementState
"""
- Title of the requirement
+ Title of the requirement.
"""
title: String
}
@@ -25177,7 +25177,7 @@ type UpdateRequirementPayload {
errors: [String!]!
"""
- Requirement after mutation
+ Requirement after mutation.
"""
requirement: Requirement
}
@@ -26239,7 +26239,7 @@ input VulnerabilityConfirmInput {
clientMutationId: String
"""
- ID of the vulnerability to be confirmed
+ ID of the vulnerability to be confirmed.
"""
id: VulnerabilityID!
}
@@ -26259,7 +26259,7 @@ type VulnerabilityConfirmPayload {
errors: [String!]!
"""
- The vulnerability after state change
+ The vulnerability after state change.
"""
vulnerability: Vulnerability
}
@@ -26294,17 +26294,17 @@ input VulnerabilityDismissInput {
clientMutationId: String
"""
- Comment why vulnerability should be dismissed
+ Comment why vulnerability should be dismissed.
"""
comment: String
"""
- Reason why vulnerability should be dismissed
+ Reason why vulnerability should be dismissed.
"""
dismissalReason: VulnerabilityDismissalReason
"""
- ID of the vulnerability to be dismissed
+ ID of the vulnerability to be dismissed.
"""
id: VulnerabilityID!
}
@@ -26324,7 +26324,7 @@ type VulnerabilityDismissPayload {
errors: [String!]!
"""
- The vulnerability after dismissal
+ The vulnerability after dismissal.
"""
vulnerability: Vulnerability
}
@@ -26856,7 +26856,7 @@ input VulnerabilityResolveInput {
clientMutationId: String
"""
- ID of the vulnerability to be resolved
+ ID of the vulnerability to be resolved.
"""
id: VulnerabilityID!
}
@@ -26876,7 +26876,7 @@ type VulnerabilityResolvePayload {
errors: [String!]!
"""
- The vulnerability after state change
+ The vulnerability after state change.
"""
vulnerability: Vulnerability
}
@@ -26891,7 +26891,7 @@ input VulnerabilityRevertToDetectedInput {
clientMutationId: String
"""
- ID of the vulnerability to be reverted
+ ID of the vulnerability to be reverted.
"""
id: VulnerabilityID!
}
@@ -26911,7 +26911,7 @@ type VulnerabilityRevertToDetectedPayload {
errors: [String!]!
"""
- The vulnerability after revert
+ The vulnerability after revert.
"""
vulnerability: Vulnerability
}
diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json
index ffbe36204ee..ea5cbb888a3 100644
--- a/doc/api/graphql/reference/gitlab_schema.json
+++ b/doc/api/graphql/reference/gitlab_schema.json
@@ -221,7 +221,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the project to be added to Instance Security Dashboard",
+ "description": "ID of the project to be added to Instance Security Dashboard.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -295,7 +295,7 @@
},
{
"name": "project",
- "description": "Project that was added to the Instance Security Dashboard",
+ "description": "Project that was added to the Instance Security Dashboard.",
"args": [
],
@@ -5682,7 +5682,7 @@
},
{
"name": "milestoneId",
- "description": "Global ID of an existing milestone",
+ "description": "Global ID of an existing milestone.",
"type": {
"kind": "SCALAR",
"name": "MilestoneID",
@@ -5692,7 +5692,7 @@
},
{
"name": "iterationId",
- "description": "Global ID of an existing iteration",
+ "description": "Global ID of an existing iteration.",
"type": {
"kind": "SCALAR",
"name": "IterationID",
@@ -5702,7 +5702,7 @@
},
{
"name": "assigneeId",
- "description": "Global ID of an existing user",
+ "description": "Global ID of an existing user.",
"type": {
"kind": "SCALAR",
"name": "UserID",
@@ -5949,7 +5949,7 @@
},
{
"name": "list",
- "description": "The updated list",
+ "description": "The updated list.",
"args": [
],
@@ -8389,7 +8389,7 @@
"inputFields": [
{
"name": "id",
- "description": "Global ID of the cluster agent that will be deleted",
+ "description": "Global ID of the cluster agent that will be deleted.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -8666,7 +8666,7 @@
"inputFields": [
{
"name": "clusterAgentId",
- "description": "Global ID of the cluster agent that will be associated with the new token",
+ "description": "Global ID of the cluster agent that will be associated with the new token.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -8740,7 +8740,7 @@
},
{
"name": "secret",
- "description": "Token secret value. Make sure you save it - you won't be able to access it again",
+ "description": "Token secret value. Make sure you save it - you won't be able to access it again.",
"args": [
],
@@ -8754,7 +8754,7 @@
},
{
"name": "token",
- "description": "Token created after mutation",
+ "description": "Token created after mutation.",
"args": [
],
@@ -8782,7 +8782,7 @@
"inputFields": [
{
"name": "id",
- "description": "Global ID of the cluster agent token that will be deleted",
+ "description": "Global ID of the cluster agent token that will be deleted.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -10186,7 +10186,7 @@
"inputFields": [
{
"name": "projectPath",
- "description": "Full path of the project",
+ "description": "Full path of the project.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -10200,7 +10200,7 @@
},
{
"name": "configuration",
- "description": "SAST CI configuration for the project",
+ "description": "SAST CI configuration for the project.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -10274,7 +10274,7 @@
},
{
"name": "status",
- "description": "Status of creating the commit for the supplied SAST CI configuration",
+ "description": "Status of creating the commit for the supplied SAST CI configuration.",
"args": [
],
@@ -10292,7 +10292,7 @@
},
{
"name": "successPath",
- "description": "Redirect path to use when the response is successful",
+ "description": "Redirect path to use when the response is successful.",
"args": [
],
@@ -12180,7 +12180,7 @@
"inputFields": [
{
"name": "projectPath",
- "description": "Full path of the associated project for this cluster agent",
+ "description": "Full path of the associated project for this cluster agent.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -12194,7 +12194,7 @@
},
{
"name": "name",
- "description": "Name of the cluster agent",
+ "description": "Name of the cluster agent.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -12242,7 +12242,7 @@
},
{
"name": "clusterAgent",
- "description": "Cluster agent created after mutation",
+ "description": "Cluster agent created after mutation.",
"args": [
],
@@ -12542,7 +12542,7 @@
"inputFields": [
{
"name": "name",
- "description": "Name of the segment",
+ "description": "Name of the segment.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -12556,7 +12556,7 @@
},
{
"name": "groupIds",
- "description": "The array of group IDs to set for the segment",
+ "description": "The array of group IDs to set for the segment.",
"type": {
"kind": "LIST",
"name": null,
@@ -12634,7 +12634,7 @@
},
{
"name": "segment",
- "description": "The segment after mutation",
+ "description": "The segment after mutation.",
"args": [
],
@@ -12802,7 +12802,7 @@
"inputFields": [
{
"name": "groupPath",
- "description": "The group the epic to mutate is in",
+ "description": "The group the epic to mutate is in.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -12816,7 +12816,7 @@
},
{
"name": "title",
- "description": "The title of the epic",
+ "description": "The title of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -12826,7 +12826,7 @@
},
{
"name": "description",
- "description": "The description of the epic",
+ "description": "The description of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -12836,7 +12836,7 @@
},
{
"name": "confidential",
- "description": "Indicates if the epic is confidential",
+ "description": "Indicates if the epic is confidential.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -12846,7 +12846,7 @@
},
{
"name": "startDateFixed",
- "description": "The start date of the epic",
+ "description": "The start date of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -12856,7 +12856,7 @@
},
{
"name": "dueDateFixed",
- "description": "The end date of the epic",
+ "description": "The end date of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -12866,7 +12866,7 @@
},
{
"name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones",
+ "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -12876,7 +12876,7 @@
},
{
"name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones",
+ "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -12956,7 +12956,7 @@
},
{
"name": "epic",
- "description": "The created epic",
+ "description": "The created epic.",
"args": [
],
@@ -13322,7 +13322,7 @@
},
{
"name": "healthStatus",
- "description": "The desired health status",
+ "description": "The desired health status.",
"type": {
"kind": "ENUM",
"name": "HealthStatus",
@@ -13332,7 +13332,7 @@
},
{
"name": "weight",
- "description": "The weight of the issue",
+ "description": "The weight of the issue.",
"type": {
"kind": "SCALAR",
"name": "Int",
@@ -13342,7 +13342,7 @@
},
{
"name": "epicId",
- "description": "The ID of an epic to associate the issue with",
+ "description": "The ID of an epic to associate the issue with.",
"type": {
"kind": "SCALAR",
"name": "EpicID",
@@ -13440,7 +13440,7 @@
"inputFields": [
{
"name": "groupPath",
- "description": "The target group for the iteration",
+ "description": "The target group for the iteration.",
"type": {
"kind": "SCALAR",
"name": "ID",
@@ -13450,7 +13450,7 @@
},
{
"name": "projectPath",
- "description": "The target project for the iteration",
+ "description": "The target project for the iteration.",
"type": {
"kind": "SCALAR",
"name": "ID",
@@ -13460,7 +13460,7 @@
},
{
"name": "title",
- "description": "The title of the iteration",
+ "description": "The title of the iteration.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13470,7 +13470,7 @@
},
{
"name": "description",
- "description": "The description of the iteration",
+ "description": "The description of the iteration.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13480,7 +13480,7 @@
},
{
"name": "startDate",
- "description": "The start date of the iteration",
+ "description": "The start date of the iteration.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13490,7 +13490,7 @@
},
{
"name": "dueDate",
- "description": "The end date of the iteration",
+ "description": "The end date of the iteration.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13560,7 +13560,7 @@
},
{
"name": "iteration",
- "description": "The created iteration",
+ "description": "The created iteration.",
"args": [
],
@@ -13724,7 +13724,7 @@
"inputFields": [
{
"name": "title",
- "description": "Title of the requirement",
+ "description": "Title of the requirement.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13734,7 +13734,7 @@
},
{
"name": "description",
- "description": "Description of the requirement",
+ "description": "Description of the requirement.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -13744,7 +13744,7 @@
},
{
"name": "projectPath",
- "description": "Full project path the requirement is associated with",
+ "description": "Full project path the requirement is associated with.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -13818,7 +13818,7 @@
},
{
"name": "requirement",
- "description": "Requirement after mutation",
+ "description": "Requirement after mutation.",
"args": [
],
@@ -14032,7 +14032,7 @@
"inputFields": [
{
"name": "title",
- "description": "The test case title",
+ "description": "The test case title.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -14046,7 +14046,7 @@
},
{
"name": "description",
- "description": "The test case description",
+ "description": "The test case description.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -14074,7 +14074,7 @@
},
{
"name": "projectPath",
- "description": "The project full path to create the test case",
+ "description": "The project full path to create the test case.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -14148,7 +14148,7 @@
},
{
"name": "testCase",
- "description": "The test case created",
+ "description": "The test case created.",
"args": [
],
@@ -16797,7 +16797,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the segment",
+ "description": "ID of the segment.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -19547,7 +19547,7 @@
"inputFields": [
{
"name": "id",
- "description": "The global ID of the compliance framework to destroy",
+ "description": "The global ID of the compliance framework to destroy.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -21704,7 +21704,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be dismissed",
+ "description": "ID of the vulnerability to be dismissed.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -21718,7 +21718,7 @@
},
{
"name": "comment",
- "description": "Comment why vulnerability should be dismissed",
+ "description": "Comment why vulnerability should be dismissed.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -21728,7 +21728,7 @@
},
{
"name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed",
+ "description": "Reason why vulnerability should be dismissed.",
"type": {
"kind": "ENUM",
"name": "VulnerabilityDismissalReason",
@@ -21798,7 +21798,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after dismissal",
+ "description": "The vulnerability after dismissal.",
"args": [
],
@@ -23506,7 +23506,7 @@
"inputFields": [
{
"name": "iid",
- "description": "The IID of the epic to mutate",
+ "description": "The IID of the epic to mutate.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -23520,7 +23520,7 @@
},
{
"name": "groupPath",
- "description": "The group the epic to mutate belongs to",
+ "description": "The group the epic to mutate belongs to.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -23534,7 +23534,7 @@
},
{
"name": "projectPath",
- "description": "The full path of the project the issue belongs to",
+ "description": "The full path of the project the issue belongs to.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -23548,7 +23548,7 @@
},
{
"name": "issueIid",
- "description": "The IID of the issue to be added",
+ "description": "The IID of the issue to be added.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -23596,7 +23596,7 @@
},
{
"name": "epic",
- "description": "The epic after mutation",
+ "description": "The epic after mutation.",
"args": [
],
@@ -23610,7 +23610,7 @@
},
{
"name": "epicIssue",
- "description": "The epic-issue relation",
+ "description": "The epic-issue relation.",
"args": [
],
@@ -25907,7 +25907,7 @@
"inputFields": [
{
"name": "iid",
- "description": "The IID of the epic to mutate",
+ "description": "The IID of the epic to mutate.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -25921,7 +25921,7 @@
},
{
"name": "groupPath",
- "description": "The group the epic to mutate belongs to",
+ "description": "The group the epic to mutate belongs to.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -25935,7 +25935,7 @@
},
{
"name": "subscribedState",
- "description": "The desired state of the subscription",
+ "description": "The desired state of the subscription.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -25983,7 +25983,7 @@
},
{
"name": "epic",
- "description": "The epic after mutation",
+ "description": "The epic after mutation.",
"args": [
],
@@ -26179,7 +26179,7 @@
"inputFields": [
{
"name": "baseEpicId",
- "description": "The ID of the base epic of the tree",
+ "description": "The ID of the base epic of the tree.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -26193,7 +26193,7 @@
},
{
"name": "moved",
- "description": "Parameters for updating the tree positions",
+ "description": "Parameters for updating the tree positions.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -33685,7 +33685,7 @@
},
{
"name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association",
+ "description": "The ID of the parent epic. NULL when removing the association.",
"type": {
"kind": "SCALAR",
"name": "EpicID",
@@ -35085,7 +35085,7 @@
},
{
"name": "weight",
- "description": "The desired weight for the issue",
+ "description": "The desired weight for the issue.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -46861,7 +46861,7 @@
"inputFields": [
{
"name": "id",
- "description": "The global ID of the namespace to mutate",
+ "description": "The global ID of the namespace to mutate.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -46935,7 +46935,7 @@
},
{
"name": "namespace",
- "description": "The namespace after mutation",
+ "description": "The namespace after mutation.",
"args": [
],
@@ -48286,7 +48286,7 @@
"inputFields": [
{
"name": "projectPath",
- "description": "The project to create the on-call schedule in",
+ "description": "The project to create the on-call schedule in.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48300,7 +48300,7 @@
},
{
"name": "name",
- "description": "The name of the on-call schedule",
+ "description": "The name of the on-call schedule.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48314,7 +48314,7 @@
},
{
"name": "description",
- "description": "The description of the on-call schedule",
+ "description": "The description of the on-call schedule.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -48324,7 +48324,7 @@
},
{
"name": "timezone",
- "description": "The timezone of the on-call schedule",
+ "description": "The timezone of the on-call schedule.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48398,7 +48398,7 @@
},
{
"name": "oncallSchedule",
- "description": "The on-call schedule",
+ "description": "The on-call schedule.",
"args": [
],
@@ -48426,7 +48426,7 @@
"inputFields": [
{
"name": "projectPath",
- "description": "The project to remove the on-call schedule from",
+ "description": "The project to remove the on-call schedule from.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48440,7 +48440,7 @@
},
{
"name": "iid",
- "description": "The on-call schedule internal ID to remove",
+ "description": "The on-call schedule internal ID to remove.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48514,7 +48514,7 @@
},
{
"name": "oncallSchedule",
- "description": "The on-call schedule",
+ "description": "The on-call schedule.",
"args": [
],
@@ -48542,7 +48542,7 @@
"inputFields": [
{
"name": "projectPath",
- "description": "The project to update the on-call schedule in",
+ "description": "The project to update the on-call schedule in.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48556,7 +48556,7 @@
},
{
"name": "iid",
- "description": "The on-call schedule internal ID to update",
+ "description": "The on-call schedule internal ID to update.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -48570,7 +48570,7 @@
},
{
"name": "name",
- "description": "The name of the on-call schedule",
+ "description": "The name of the on-call schedule.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -48580,7 +48580,7 @@
},
{
"name": "description",
- "description": "The description of the on-call schedule",
+ "description": "The description of the on-call schedule.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -48590,7 +48590,7 @@
},
{
"name": "timezone",
- "description": "The timezone of the on-call schedule",
+ "description": "The timezone of the on-call schedule.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -48660,7 +48660,7 @@
},
{
"name": "oncallSchedule",
- "description": "The on-call schedule",
+ "description": "The on-call schedule.",
"args": [
],
@@ -57168,7 +57168,7 @@
},
{
"name": "groupPath",
- "description": "The group the promoted epic will belong to",
+ "description": "The group the promoted epic will belong to.",
"type": {
"kind": "SCALAR",
"name": "ID",
@@ -57212,7 +57212,7 @@
},
{
"name": "epic",
- "description": "The epic after issue promotion",
+ "description": "The epic after issue promotion.",
"args": [
],
@@ -60612,7 +60612,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the project to remove from the Instance Security Dashboard",
+ "description": "ID of the project to remove from the Instance Security Dashboard.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -61591,7 +61591,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be reverted",
+ "description": "ID of the vulnerability to be reverted.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -61665,7 +61665,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after revert",
+ "description": "The vulnerability after revert.",
"args": [
],
@@ -71149,7 +71149,7 @@
"inputFields": [
{
"name": "boardId",
- "description": "The board global ID",
+ "description": "The board global ID.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -71163,7 +71163,7 @@
},
{
"name": "epicId",
- "description": "ID of an epic to set preferences for",
+ "description": "ID of an epic to set preferences for.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -71177,7 +71177,7 @@
},
{
"name": "collapsed",
- "description": "Whether the epic should be collapsed in the board",
+ "description": "Whether the epic should be collapsed in the board.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -71225,7 +71225,7 @@
},
{
"name": "epicUserPreferences",
- "description": "User preferences for the epic in the board after mutation",
+ "description": "User preferences for the epic in the board after mutation.",
"args": [
],
@@ -71887,7 +71887,7 @@
"inputFields": [
{
"name": "name",
- "description": "Name of the segment",
+ "description": "Name of the segment.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -71901,7 +71901,7 @@
},
{
"name": "groupIds",
- "description": "The array of group IDs to set for the segment",
+ "description": "The array of group IDs to set for the segment.",
"type": {
"kind": "LIST",
"name": null,
@@ -71919,7 +71919,7 @@
},
{
"name": "id",
- "description": "ID of the segment",
+ "description": "ID of the segment.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -71993,7 +71993,7 @@
},
{
"name": "segment",
- "description": "The segment after mutation",
+ "description": "The segment after mutation.",
"args": [
],
@@ -72072,7 +72072,7 @@
"inputFields": [
{
"name": "iid",
- "description": "The IID of the epic to mutate",
+ "description": "The IID of the epic to mutate.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -72086,7 +72086,7 @@
},
{
"name": "groupPath",
- "description": "The group the epic to mutate is in",
+ "description": "The group the epic to mutate is in.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -72100,7 +72100,7 @@
},
{
"name": "title",
- "description": "The title of the epic",
+ "description": "The title of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -72110,7 +72110,7 @@
},
{
"name": "description",
- "description": "The description of the epic",
+ "description": "The description of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -72120,7 +72120,7 @@
},
{
"name": "confidential",
- "description": "Indicates if the epic is confidential",
+ "description": "Indicates if the epic is confidential.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -72130,7 +72130,7 @@
},
{
"name": "startDateFixed",
- "description": "The start date of the epic",
+ "description": "The start date of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -72140,7 +72140,7 @@
},
{
"name": "dueDateFixed",
- "description": "The end date of the epic",
+ "description": "The end date of the epic.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -72150,7 +72150,7 @@
},
{
"name": "startDateIsFixed",
- "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones",
+ "description": "Indicates start date should be sourced from start_date_fixed field not the issue milestones.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -72160,7 +72160,7 @@
},
{
"name": "dueDateIsFixed",
- "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones",
+ "description": "Indicates end date should be sourced from due_date_fixed field not the issue milestones.",
"type": {
"kind": "SCALAR",
"name": "Boolean",
@@ -72206,7 +72206,7 @@
},
{
"name": "stateEvent",
- "description": "State event for the epic",
+ "description": "State event for the epic.",
"type": {
"kind": "ENUM",
"name": "EpicStateEvent",
@@ -72250,7 +72250,7 @@
},
{
"name": "epic",
- "description": "The epic after mutation",
+ "description": "The epic after mutation.",
"args": [
],
@@ -72560,7 +72560,7 @@
},
{
"name": "healthStatus",
- "description": "The desired health status",
+ "description": "The desired health status.",
"type": {
"kind": "ENUM",
"name": "HealthStatus",
@@ -72570,7 +72570,7 @@
},
{
"name": "weight",
- "description": "The weight of the issue",
+ "description": "The weight of the issue.",
"type": {
"kind": "SCALAR",
"name": "Int",
@@ -72580,7 +72580,7 @@
},
{
"name": "epicId",
- "description": "The ID of the parent epic. NULL when removing the association",
+ "description": "The ID of the parent epic. NULL when removing the association.",
"type": {
"kind": "SCALAR",
"name": "EpicID",
@@ -73078,7 +73078,7 @@
"inputFields": [
{
"name": "title",
- "description": "Title of the requirement",
+ "description": "Title of the requirement.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -73088,7 +73088,7 @@
},
{
"name": "description",
- "description": "Description of the requirement",
+ "description": "Description of the requirement.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -73098,7 +73098,7 @@
},
{
"name": "projectPath",
- "description": "Full project path the requirement is associated with",
+ "description": "Full project path the requirement is associated with.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -73112,7 +73112,7 @@
},
{
"name": "state",
- "description": "State of the requirement",
+ "description": "State of the requirement.",
"type": {
"kind": "ENUM",
"name": "RequirementState",
@@ -73122,7 +73122,7 @@
},
{
"name": "iid",
- "description": "The IID of the requirement to update",
+ "description": "The IID of the requirement to update.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -73136,7 +73136,7 @@
},
{
"name": "lastTestReportState",
- "description": "Creates a test report for the requirement with the given state",
+ "description": "Creates a test report for the requirement with the given state.",
"type": {
"kind": "ENUM",
"name": "TestReportState",
@@ -73206,7 +73206,7 @@
},
{
"name": "requirement",
- "description": "Requirement after mutation",
+ "description": "Requirement after mutation.",
"args": [
],
@@ -76083,7 +76083,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be confirmed",
+ "description": "ID of the vulnerability to be confirmed.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -76157,7 +76157,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after state change",
+ "description": "The vulnerability after state change.",
"args": [
],
@@ -76252,7 +76252,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be dismissed",
+ "description": "ID of the vulnerability to be dismissed.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -76266,7 +76266,7 @@
},
{
"name": "comment",
- "description": "Comment why vulnerability should be dismissed",
+ "description": "Comment why vulnerability should be dismissed.",
"type": {
"kind": "SCALAR",
"name": "String",
@@ -76276,7 +76276,7 @@
},
{
"name": "dismissalReason",
- "description": "Reason why vulnerability should be dismissed",
+ "description": "Reason why vulnerability should be dismissed.",
"type": {
"kind": "ENUM",
"name": "VulnerabilityDismissalReason",
@@ -76346,7 +76346,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after dismissal",
+ "description": "The vulnerability after dismissal.",
"args": [
],
@@ -77892,7 +77892,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be resolved",
+ "description": "ID of the vulnerability to be resolved.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -77966,7 +77966,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after state change",
+ "description": "The vulnerability after state change.",
"args": [
],
@@ -77994,7 +77994,7 @@
"inputFields": [
{
"name": "id",
- "description": "ID of the vulnerability to be reverted",
+ "description": "ID of the vulnerability to be reverted.",
"type": {
"kind": "NON_NULL",
"name": null,
@@ -78068,7 +78068,7 @@
},
{
"name": "vulnerability",
- "description": "The vulnerability after revert",
+ "description": "The vulnerability after revert.",
"args": [
],
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 1dd7df20658..9a6a515b764 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -62,7 +62,7 @@ Autogenerated return type of AddProjectToSecurityDashboard.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `project` | Project | Project that was added to the Instance Security Dashboard |
+| `project` | Project | Project that was added to the Instance Security Dashboard. |
### AdminSidekiqQueuesDeleteJobsPayload
@@ -356,7 +356,7 @@ Autogenerated return type of BoardListUpdateLimitMetrics.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `list` | BoardList | The updated list |
+| `list` | BoardList | The updated list. |
### Branch
@@ -502,8 +502,8 @@ Autogenerated return type of ClusterAgentTokenCreate.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `secret` | String | Token secret value. Make sure you save it - you won't be able to access it again |
-| `token` | ClusterAgentToken | Token created after mutation |
+| `secret` | String | Token secret value. Make sure you save it - you won't be able to access it again. |
+| `token` | ClusterAgentToken | Token created after mutation. |
### ClusterAgentTokenDeletePayload
@@ -585,8 +585,8 @@ Autogenerated return type of ConfigureSast.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `status` | String! | Status of creating the commit for the supplied SAST CI configuration |
-| `successPath` | String | Redirect path to use when the response is successful |
+| `status` | String! | Status of creating the commit for the supplied SAST CI configuration. |
+| `successPath` | String | Redirect path to use when the response is successful. |
### ContainerExpirationPolicy
@@ -708,7 +708,7 @@ Autogenerated return type of CreateClusterAgent.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `clusterAgent` | ClusterAgent | Cluster agent created after mutation |
+| `clusterAgent` | ClusterAgent | Cluster agent created after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### CreateComplianceFrameworkPayload
@@ -739,7 +739,7 @@ Autogenerated return type of CreateDevopsAdoptionSegment.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `segment` | DevopsAdoptionSegment | The segment after mutation |
+| `segment` | DevopsAdoptionSegment | The segment after mutation. |
### CreateDiffNotePayload
@@ -758,7 +758,7 @@ Autogenerated return type of CreateEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The created epic |
+| `epic` | Epic | The created epic. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### CreateImageDiffNotePayload
@@ -789,7 +789,7 @@ Autogenerated return type of CreateIteration.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `iteration` | Iteration | The created iteration |
+| `iteration` | Iteration | The created iteration. |
### CreateNotePayload
@@ -809,7 +809,7 @@ Autogenerated return type of CreateRequirement.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `requirement` | Requirement | Requirement after mutation |
+| `requirement` | Requirement | Requirement after mutation. |
### CreateSnippetPayload
@@ -830,7 +830,7 @@ Autogenerated return type of CreateTestCase.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `testCase` | Issue | The test case created |
+| `testCase` | Issue | The test case created. |
### CustomEmoji
@@ -1303,7 +1303,7 @@ Autogenerated return type of DismissVulnerability.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after dismissal |
+| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
### Environment
@@ -1385,8 +1385,8 @@ Autogenerated return type of EpicAddIssue.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation |
-| `epicIssue` | EpicIssue | The epic-issue relation |
+| `epic` | Epic | The epic after mutation. |
+| `epicIssue` | EpicIssue | The epic-issue relation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### EpicBoard
@@ -1527,7 +1527,7 @@ Autogenerated return type of EpicSetSubscription.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation |
+| `epic` | Epic | The epic after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### EpicTreeReorderPayload
@@ -2393,7 +2393,7 @@ Autogenerated return type of NamespaceIncreaseStorageTemporarily.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `namespace` | Namespace | The namespace after mutation |
+| `namespace` | Namespace | The namespace after mutation. |
### Note
@@ -2457,7 +2457,7 @@ Autogenerated return type of OncallScheduleCreate.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule |
+| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
### OncallScheduleDestroyPayload
@@ -2467,7 +2467,7 @@ Autogenerated return type of OncallScheduleDestroy.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule |
+| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
### OncallScheduleUpdatePayload
@@ -2477,7 +2477,7 @@ Autogenerated return type of OncallScheduleUpdate.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule |
+| `oncallSchedule` | IncidentManagementOncallSchedule | The on-call schedule. |
### Package
@@ -2851,7 +2851,7 @@ Autogenerated return type of PromoteToEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after issue promotion |
+| `epic` | Epic | The epic after issue promotion. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
| `issue` | Issue | The issue after mutation. |
@@ -3050,7 +3050,7 @@ Autogenerated return type of RevertVulnerabilityToDetected.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after revert |
+| `vulnerability` | Vulnerability | The vulnerability after revert. |
### RootStorageStatistics
@@ -3659,7 +3659,7 @@ Autogenerated return type of UpdateBoardEpicUserPreferences.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epicUserPreferences` | BoardEpicUserPreferences | User preferences for the epic in the board after mutation |
+| `epicUserPreferences` | BoardEpicUserPreferences | User preferences for the epic in the board after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### UpdateBoardListPayload
@@ -3710,7 +3710,7 @@ Autogenerated return type of UpdateDevopsAdoptionSegment.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `segment` | DevopsAdoptionSegment | The segment after mutation |
+| `segment` | DevopsAdoptionSegment | The segment after mutation. |
### UpdateEpicPayload
@@ -3719,7 +3719,7 @@ Autogenerated return type of UpdateEpic.
| Field | Type | Description |
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
-| `epic` | Epic | The epic after mutation |
+| `epic` | Epic | The epic after mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
### UpdateImageDiffNotePayload
@@ -3780,7 +3780,7 @@ Autogenerated return type of UpdateRequirement.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `requirement` | Requirement | Requirement after mutation |
+| `requirement` | Requirement | Requirement after mutation. |
### UpdateSnippetPayload
@@ -3902,7 +3902,7 @@ Autogenerated return type of VulnerabilityConfirm.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after state change |
+| `vulnerability` | Vulnerability | The vulnerability after state change. |
### VulnerabilityDismissPayload
@@ -3912,7 +3912,7 @@ Autogenerated return type of VulnerabilityDismiss.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after dismissal |
+| `vulnerability` | Vulnerability | The vulnerability after dismissal. |
### VulnerabilityExternalIssueLink
@@ -4054,7 +4054,7 @@ Autogenerated return type of VulnerabilityResolve.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after state change |
+| `vulnerability` | Vulnerability | The vulnerability after state change. |
### VulnerabilityRevertToDetectedPayload
@@ -4064,7 +4064,7 @@ Autogenerated return type of VulnerabilityRevertToDetected.
| ----- | ---- | ----------- |
| `clientMutationId` | String | A unique identifier for the client performing the mutation. |
| `errors` | String! => Array | Errors encountered during execution of the mutation. |
-| `vulnerability` | Vulnerability | The vulnerability after revert |
+| `vulnerability` | Vulnerability | The vulnerability after revert. |
### VulnerabilityScanner
diff --git a/doc/ci/variables/where_variables_can_be_used.md b/doc/ci/variables/where_variables_can_be_used.md
index f2dc58bc144..e84714f2a46 100644
--- a/doc/ci/variables/where_variables_can_be_used.md
+++ b/doc/ci/variables/where_variables_can_be_used.md
@@ -27,6 +27,7 @@ There are two places defined variables can be used. On the:
| `environment:url` | yes | GitLab | The variable expansion is made by the [internal variable expansion mechanism](#gitlab-internal-variable-expansion-mechanism) in GitLab.<br/><br/>Supported are all variables defined for a job (project/group variables, variables from `.gitlab-ci.yml`, variables from triggers, variables from pipeline schedules).<br/><br/>Not supported are variables defined in the GitLab Runner `config.toml` and variables created in the job's `script`. |
| `environment:name` | yes | GitLab | Similar to `environment:url`, but the variables expansion doesn't support the following:<br/><br/>- Variables that are based on the environment's name (`CI_ENVIRONMENT_NAME`, `CI_ENVIRONMENT_SLUG`).<br/>- Any other variables related to environment (currently only `CI_ENVIRONMENT_URL`).<br/>- [Persisted variables](#persisted-variables). |
| `resource_group` | yes | GitLab | Similar to `environment:url`, but the variables expansion doesn't support the following:<br/><br/>- Variables that are based on the environment's name (`CI_ENVIRONMENT_NAME`, `CI_ENVIRONMENT_SLUG`).<br/>- Any other variables related to environment (currently only `CI_ENVIRONMENT_URL`).<br/>- [Persisted variables](#persisted-variables). |
+| `include` | yes | GitLab | The variable expansion is made by the [internal variable expansion mechanism](#gitlab-internal-variable-expansion-mechanism) in GitLab. <br/><br/>Predefined project variables are supported: `GITLAB_FEATURES`, `CI_DEFAULT_BRANCH`, and all variables that start with `CI_PROJECT_` (for example `CI_PROJECT_NAME`). |
| `variables` | yes | Runner | The variable expansion is made by GitLab Runner's [internal variable expansion mechanism](#gitlab-runner-internal-variable-expansion-mechanism) |
| `image` | yes | Runner | The variable expansion is made by GitLab Runner's [internal variable expansion mechanism](#gitlab-runner-internal-variable-expansion-mechanism) |
| `services:[]` | yes | Runner | The variable expansion is made by GitLab Runner's [internal variable expansion mechanism](#gitlab-runner-internal-variable-expansion-mechanism) |
diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md
index f47124d3c07..7381eba53ef 100644
--- a/doc/ci/yaml/README.md
+++ b/doc/ci/yaml/README.md
@@ -363,8 +363,6 @@ use the [`extends` keyword](#extends).
| [`remote`](#includeremote) | Include a file from a remote URL. Must be publicly accessible. |
| [`template`](#includetemplate) | Include templates that are provided by GitLab. |
-The `include` methods do not support [variable expansion](../variables/where_variables_can_be_used.md#variables-usage).
-
`.gitlab-ci.yml` configuration included by all methods is evaluated at pipeline creation.
The configuration is a snapshot in time and persisted in the database. Any changes to
referenced `.gitlab-ci.yml` configuration is not reflected in GitLab until the next pipeline is created.
@@ -379,6 +377,48 @@ NOTE:
Use merging to customize and override included CI/CD configurations with local
definitions. Local definitions in `.gitlab-ci.yml` override included definitions.
+#### Variables with `include`
+
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/284883) in GitLab 13.8.
+> - It's [deployed behind a feature flag](../../user/feature_flags.md), disabled by default.
+> - It's disabled on GitLab.com.
+> - It's not recommended for production use.
+> - To use it in GitLab self-managed instances, ask a GitLab administrator to [enable it](#enable-or-disable-includepredefined-project-variables). **(CORE ONLY)**
+
+WARNING:
+This feature might not be available to you. Check the **version history** note above for details.
+
+You can [use some predefined variables in `include` sections](../variables/where_variables_can_be_used.md#gitlab-ciyml-file)
+in your `.gitlab-ci.yml`:
+
+```yaml
+include:
+ project: '$CI_PROJECT_PATH'
+ file: '.compliance-gitlab-ci.yml'
+```
+
+For an example of how you can include these predefined variables, and their impact on CI jobs,
+see the following [CI variable demo](https://youtu.be/4XR8gw3Pkos).
+
+##### Enable or disable include:predefined-project-variables **(CORE ONLY)**
+
+Use of predefined project variables in `include` section of `.gitlab-ci.yml` is under development and not ready for production use. It is
+deployed behind a feature flag that is **disabled by default**.
+[GitLab administrators with access to the GitLab Rails console](../../administration/feature_flags.md)
+can enable it.
+
+To enable it:
+
+```ruby
+Feature.enable(:variables_in_include_section_ci)
+```
+
+To disable it:
+
+```ruby
+Feature.disable(:variables_in_include_section_ci)
+```
+
#### `include:local`
`include:local` includes a file from the same repository as `.gitlab-ci.yml`.
diff --git a/doc/development/code_review.md b/doc/development/code_review.md
index 1970d8c8b39..b270c7c9807 100644
--- a/doc/development/code_review.md
+++ b/doc/development/code_review.md
@@ -75,11 +75,11 @@ page, with these behaviors:
1. [Trainee maintainers](https://about.gitlab.com/handbook/engineering/workflow/code-review/#trainee-maintainer)
are three times as likely to be picked as other reviewers.
1. Team members whose Slack or [GitLab status](../user/profile/index.md#current-status) emoji
- is `:large_blue_circle:` are more likely to be picked. This applies to both reviewers and trainee maintainers.
+ is 🔵 `:large_blue_circle:` are more likely to be picked. This applies to both reviewers and trainee maintainers.
- Reviewers with `:large_blue_circle:` are two times as likely to be picked as other reviewers.
- Trainee maintainers with `:large_blue_circle:` are four times as likely to be picked as other reviewers.
1. People whose [GitLab status](../user/profile/index.md#current-status) emoji
- is `:large_orange_diamond:` are half as likely to be picked. This applies to both reviewers and trainee maintainers.
+ is 🔶 `:large_orange_diamond:` are half as likely to be picked. This applies to both reviewers and trainee maintainers.
1. It always picks the same reviewers and maintainers for the same
branch name (unless their OOO status changes, as in point 1). It
removes leading `ce-` and `ee-`, and trailing `-ce` and `-ee`, so
@@ -508,7 +508,7 @@ and get on with their work quickly.
If you think you are at capacity and are unable to accept any more reviews until
some have been completed, communicate this through your GitLab status by setting
-the `:red_circle:` emoji and mentioning that you are at capacity in the status
+the 🔴 `:red_circle:` emoji and mentioning that you are at capacity in the status
text. This guides contributors to pick a different reviewer, helping us to
meet the SLO.
diff --git a/doc/integration/jira_development_panel.md b/doc/integration/jira_development_panel.md
index 7488df3580e..9eef739c52b 100644
--- a/doc/integration/jira_development_panel.md
+++ b/doc/integration/jira_development_panel.md
@@ -272,7 +272,7 @@ The GitLab user only needs access when adding a new namespace. For syncing with
![Configure namespace on GitLab Jira App](img/jira_dev_panel_setup_com_3.png)
-After a namespace is added, all future commits, branches, and merge requests of all projects under that namespace are synced to Jira. Past data cannot be synced at the moment.
+After a namespace is added, all future commits, branches, and merge requests of all projects under that namespace are synced to Jira. Past Merge Request data is initially synced. Past branch and commit data cannot be synced at the moment.
For more information, see [Usage](#usage).
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 382f019e83a..49f04251c44 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -727,3 +727,25 @@ against the given glob pattern. If the number of matches exceeds the maximum, th
parameter returns `true`. Depending on the number of files in your repository, a SAST job might be
triggered even if the scanner doesn't support your project. For more details about this issue, see
the [`rules:exists` documentation](../../../ci/yaml/README.md#rulesexists).
+
+### SpotBugs UTF-8 unmappable character errors
+
+These errors occur when UTF-8 encoding isn't enabled on a SpotBugs build and there are UTF-8
+characters in the source code. To fix this error, enable UTF-8 for your project's build tool.
+
+For Gradle builds, add the following to your `build.gradle` file:
+
+```gradle
+compileJava.options.encoding = 'UTF-8'
+tasks.withType(JavaCompile) {
+ options.encoding = 'UTF-8'
+}
+```
+
+For Maven builds, add the following to your `pom.xml` file:
+
+```xml
+<properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+</properties>
+```
diff --git a/doc/user/project/issues/issue_data_and_actions.md b/doc/user/project/issues/issue_data_and_actions.md
index 2520a562f1e..875ea352f99 100644
--- a/doc/user/project/issues/issue_data_and_actions.md
+++ b/doc/user/project/issues/issue_data_and_actions.md
@@ -35,6 +35,7 @@ The numbers in the image correspond to the following features:
- **12.** [Participants](#participants)
- **13.** [Notifications](#notifications)
- **14.** [Reference](#reference)
+- [Issue email](#email)
- **15.** [Edit](#edit)
- **16.** [Description](#description)
- **17.** [Mentions](#mentions)
@@ -174,6 +175,12 @@ for the issue. Notifications are automatically enabled after you participate in
`foo/bar#xxx`, where `foo` is the `username` or `groupname`, `bar` is the
`project-name`, and `xxx` is the issue number.
+### Email
+
+> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/18816) in GitLab 13.8.
+
+Guest users can see a button to copy the email address for the issue. Sending an email to this address creates a comment containing the email body.
+
### Edit
Clicking this icon opens the issue for editing. All the fields which
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index e5cc0c8ed52..7885615e6d7 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -7899,6 +7899,9 @@ msgstr ""
msgid "Copy commit SHA"
msgstr ""
+msgid "Copy email address"
+msgstr ""
+
msgid "Copy environment"
msgstr ""
@@ -24309,6 +24312,9 @@ msgstr ""
msgid "Revoked project access token %{project_access_token_name}!"
msgstr ""
+msgid "RightSidebar|Issue email: %{copyText}"
+msgstr ""
+
msgid "RightSidebar|adding a"
msgstr ""
diff --git a/rubocop/cop/rspec/expect_gitlab_tracking.rb b/rubocop/cop/rspec/expect_gitlab_tracking.rb
index ba658558705..e3f790f851c 100644
--- a/rubocop/cop/rspec/expect_gitlab_tracking.rb
+++ b/rubocop/cop/rspec/expect_gitlab_tracking.rb
@@ -53,8 +53,6 @@ module RuboCop
)
PATTERN
- RESTRICT_ON_SEND = [:expect, :allow].freeze
-
def on_send(node)
return unless expect_gitlab_tracking?(node)
diff --git a/spec/features/issues/issue_sidebar_spec.rb b/spec/features/issues/issue_sidebar_spec.rb
index 94a1de06488..59fba5f65e0 100644
--- a/spec/features/issues/issue_sidebar_spec.rb
+++ b/spec/features/issues/issue_sidebar_spec.rb
@@ -13,256 +13,280 @@ RSpec.describe 'Issue Sidebar' do
let!(:xss_label) { create(:label, project: project, title: '&lt;script&gt;alert("xss");&lt;&#x2F;script&gt;') }
before do
- sign_in(user)
+ stub_incoming_email_setting(enabled: true, address: "p+%{key}@gl.ab")
end
- context 'when concerning the assignee', :js do
- let(:user2) { create(:user) }
- let(:issue2) { create(:issue, project: project, author: user2) }
-
- include_examples 'issuable invite members experiments' do
- let(:issuable_path) { project_issue_path(project, issue2) }
+ context 'when signed in' do
+ before do
+ sign_in(user)
end
- context 'when user is a developer' do
- before do
- project.add_developer(user)
- visit_issue(project, issue2)
-
- find('.block.assignee .edit-link').click
+ context 'when concerning the assignee', :js do
+ let(:user2) { create(:user) }
+ let(:issue2) { create(:issue, project: project, author: user2) }
- wait_for_requests
+ include_examples 'issuable invite members experiments' do
+ let(:issuable_path) { project_issue_path(project, issue2) }
end
- it 'shows author in assignee dropdown' do
- page.within '.dropdown-menu-user' do
- expect(page).to have_content(user2.name)
- end
- end
+ context 'when user is a developer' do
+ before do
+ project.add_developer(user)
+ visit_issue(project, issue2)
- it 'shows author when filtering assignee dropdown' do
- page.within '.dropdown-menu-user' do
- find('.dropdown-input-field').set(user2.name)
+ find('.block.assignee .edit-link').click
wait_for_requests
+ end
- expect(page).to have_content(user2.name)
+ it 'shows author in assignee dropdown' do
+ page.within '.dropdown-menu-user' do
+ expect(page).to have_content(user2.name)
+ end
end
- end
- it 'assigns yourself' do
- find('.block.assignee .dropdown-menu-toggle').click
+ it 'shows author when filtering assignee dropdown' do
+ page.within '.dropdown-menu-user' do
+ find('.dropdown-input-field').set(user2.name)
- click_button 'assign yourself'
+ wait_for_requests
- wait_for_requests
+ expect(page).to have_content(user2.name)
+ end
+ end
- find('.block.assignee .edit-link').click
+ it 'assigns yourself' do
+ find('.block.assignee .dropdown-menu-toggle').click
- page.within '.dropdown-menu-user' do
- expect(page.find('.dropdown-header')).to be_visible
- expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name)
- end
- end
+ click_button 'assign yourself'
- it 'keeps your filtered term after filtering and dismissing the dropdown' do
- find('.dropdown-input-field').set(user2.name)
+ wait_for_requests
- wait_for_requests
+ find('.block.assignee .edit-link').click
- page.within '.dropdown-menu-user' do
- expect(page).not_to have_content 'Unassigned'
- click_link user2.name
+ page.within '.dropdown-menu-user' do
+ expect(page.find('.dropdown-header')).to be_visible
+ expect(page.find('.dropdown-menu-user-link.is-active')).to have_content(user.name)
+ end
end
- find('.js-right-sidebar').click
- find('.block.assignee .edit-link').click
-
- expect(page.all('.dropdown-menu-user li').length).to eq(1)
- expect(find('.dropdown-input-field').value).to eq(user2.name)
- end
- end
+ it 'keeps your filtered term after filtering and dismissing the dropdown' do
+ find('.dropdown-input-field').set(user2.name)
- it 'shows label text as "Apply" when assignees are changed' do
- project.add_developer(user)
- visit_issue(project, issue2)
+ wait_for_requests
- find('.block.assignee .edit-link').click
- wait_for_requests
+ page.within '.dropdown-menu-user' do
+ expect(page).not_to have_content 'Unassigned'
+ click_link user2.name
+ end
- click_on 'Unassigned'
+ find('.js-right-sidebar').click
+ find('.block.assignee .edit-link').click
- expect(page).to have_link('Apply')
- end
- end
+ expect(page.all('.dropdown-menu-user li').length).to eq(1)
+ expect(find('.dropdown-input-field').value).to eq(user2.name)
+ end
+ end
- context 'as a allowed user' do
- before do
- project.add_developer(user)
- visit_issue(project, issue)
- end
+ it 'shows label text as "Apply" when assignees are changed' do
+ project.add_developer(user)
+ visit_issue(project, issue2)
- context 'sidebar', :js do
- it 'changes size when the screen size is smaller' do
- sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
- # Resize the window
- resize_screen_sm
- # Make sure the sidebar is collapsed
- find(sidebar_selector)
- expect(page).to have_css(sidebar_selector)
- # Once is collapsed let's open the sidebard and reload
- open_issue_sidebar
- refresh
- find(sidebar_selector)
- expect(page).to have_css(sidebar_selector)
- # Restore the window size as it was including the sidebar
- restore_window_size
- open_issue_sidebar
- end
+ find('.block.assignee .edit-link').click
+ wait_for_requests
- it 'escapes XSS when viewing issue labels' do
- page.within('.block.labels') do
- click_on 'Edit'
+ click_on 'Unassigned'
- expect(page).to have_content '<script>alert("xss");</script>'
- end
+ expect(page).to have_link('Apply')
end
end
- context 'editing issue labels', :js do
+ context 'as a allowed user' do
before do
- issue.update(labels: [label])
- page.within('.block.labels') do
- click_on 'Edit'
- end
+ project.add_developer(user)
+ visit_issue(project, issue)
end
- it 'shows the current set of labels' do
- page.within('.issuable-show-labels') do
- expect(page).to have_content label.title
+ context 'sidebar', :js do
+ it 'changes size when the screen size is smaller' do
+ sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
+ # Resize the window
+ resize_screen_sm
+ # Make sure the sidebar is collapsed
+ find(sidebar_selector)
+ expect(page).to have_css(sidebar_selector)
+ # Once is collapsed let's open the sidebard and reload
+ open_issue_sidebar
+ refresh
+ find(sidebar_selector)
+ expect(page).to have_css(sidebar_selector)
+ # Restore the window size as it was including the sidebar
+ restore_window_size
+ open_issue_sidebar
end
- end
- it 'shows option to create a project label' do
- page.within('.block.labels') do
- expect(page).to have_content 'Create project'
+ it 'escapes XSS when viewing issue labels' do
+ page.within('.block.labels') do
+ click_on 'Edit'
+
+ expect(page).to have_content '<script>alert("xss");</script>'
+ end
end
end
- context 'creating a project label', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27992' do
+ context 'editing issue labels', :js do
before do
+ issue.update(labels: [label])
page.within('.block.labels') do
- click_link 'Create project'
+ click_on 'Edit'
end
end
- it 'shows dropdown switches to "create label" section' do
- page.within('.block.labels') do
- expect(page).to have_content 'Create project label'
+ it 'shows the current set of labels' do
+ page.within('.issuable-show-labels') do
+ expect(page).to have_content label.title
end
end
- it 'adds new label' do
+ it 'shows option to create a project label' do
page.within('.block.labels') do
- fill_in 'new_label_name', with: 'wontfix'
- page.find('.suggest-colors a', match: :first).click
- page.find('button', text: 'Create').click
+ expect(page).to have_content 'Create project'
+ end
+ end
- page.within('.dropdown-page-one') do
- expect(page).to have_content 'wontfix'
+ context 'creating a project label', :js, quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/27992' do
+ before do
+ page.within('.block.labels') do
+ click_link 'Create project'
end
end
- end
- it 'shows error message if label title is taken' do
- page.within('.block.labels') do
- fill_in 'new_label_name', with: label.title
- page.find('.suggest-colors a', match: :first).click
- page.find('button', text: 'Create').click
+ it 'shows dropdown switches to "create label" section' do
+ page.within('.block.labels') do
+ expect(page).to have_content 'Create project label'
+ end
+ end
+
+ it 'adds new label' do
+ page.within('.block.labels') do
+ fill_in 'new_label_name', with: 'wontfix'
+ page.find('.suggest-colors a', match: :first).click
+ page.find('button', text: 'Create').click
+
+ page.within('.dropdown-page-one') do
+ expect(page).to have_content 'wontfix'
+ end
+ end
+ end
- page.within('.dropdown-page-two') do
- expect(page).to have_content 'Title has already been taken'
+ it 'shows error message if label title is taken' do
+ page.within('.block.labels') do
+ fill_in 'new_label_name', with: label.title
+ page.find('.suggest-colors a', match: :first).click
+ page.find('button', text: 'Create').click
+
+ page.within('.dropdown-page-two') do
+ expect(page).to have_content 'Title has already been taken'
+ end
end
end
end
end
- end
- context 'interacting with collapsed sidebar', :js do
- collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
- expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
- confidentiality_sidebar_block = '.block.confidentiality'
- lock_sidebar_block = '.block.lock'
- collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'
+ context 'interacting with collapsed sidebar', :js do
+ collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
+ expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
+ confidentiality_sidebar_block = '.block.confidentiality'
+ lock_sidebar_block = '.block.lock'
+ collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'
- before do
- resize_screen_sm
- end
+ before do
+ resize_screen_sm
+ end
- it 'confidentiality block expands then collapses sidebar' do
- expect(page).to have_css(collapsed_sidebar_selector)
+ it 'confidentiality block expands then collapses sidebar' do
+ expect(page).to have_css(collapsed_sidebar_selector)
- page.within(confidentiality_sidebar_block) do
- find(collapsed_sidebar_block_icon).click
+ page.within(confidentiality_sidebar_block) do
+ find(collapsed_sidebar_block_icon).click
+ end
+
+ expect(page).to have_css(expanded_sidebar_selector)
+
+ page.within(confidentiality_sidebar_block) do
+ page.find('button', text: 'Cancel').click
+ end
+
+ expect(page).to have_css(collapsed_sidebar_selector)
end
- expect(page).to have_css(expanded_sidebar_selector)
+ it 'lock block expands then collapses sidebar' do
+ expect(page).to have_css(collapsed_sidebar_selector)
+
+ page.within(lock_sidebar_block) do
+ find(collapsed_sidebar_block_icon).click
+ end
+
+ expect(page).to have_css(expanded_sidebar_selector)
+
+ page.within(lock_sidebar_block) do
+ page.find('button', text: 'Cancel').click
+ end
- page.within(confidentiality_sidebar_block) do
- page.find('button', text: 'Cancel').click
+ expect(page).to have_css(collapsed_sidebar_selector)
end
+ end
+ end
- expect(page).to have_css(collapsed_sidebar_selector)
+ context 'as a guest' do
+ before do
+ project.add_guest(user)
+ visit_issue(project, issue)
end
- it 'lock block expands then collapses sidebar' do
- expect(page).to have_css(collapsed_sidebar_selector)
+ it 'does not have a option to edit labels' do
+ expect(page).not_to have_selector('.block.labels .js-sidebar-dropdown-toggle')
+ end
- page.within(lock_sidebar_block) do
- find(collapsed_sidebar_block_icon).click
+ context 'sidebar', :js do
+ it 'finds issue copy forwarding email' do
+ expect(find('[data-qa-selector="copy-forward-email"]').text).to eq "Issue email: #{issue.creatable_note_email_address(user)}"
end
+ end
- expect(page).to have_css(expanded_sidebar_selector)
+ context 'interacting with collapsed sidebar', :js do
+ collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
+ expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
+ lock_sidebar_block = '.block.lock'
+ lock_button = '.block.lock .btn-close'
+ collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'
- page.within(lock_sidebar_block) do
- page.find('button', text: 'Cancel').click
+ before do
+ resize_screen_sm
end
- expect(page).to have_css(collapsed_sidebar_selector)
- end
- end
- end
+ it 'expands then does not show the lock dialog form' do
+ expect(page).to have_css(collapsed_sidebar_selector)
- context 'as a guest' do
- before do
- project.add_guest(user)
- visit_issue(project, issue)
- end
+ page.within(lock_sidebar_block) do
+ find(collapsed_sidebar_block_icon).click
+ end
- it 'does not have a option to edit labels' do
- expect(page).not_to have_selector('.block.labels .js-sidebar-dropdown-toggle')
+ expect(page).to have_css(expanded_sidebar_selector)
+ expect(page).not_to have_selector(lock_button)
+ end
+ end
end
+ end
- context 'interacting with collapsed sidebar', :js do
- collapsed_sidebar_selector = 'aside.right-sidebar.right-sidebar-collapsed'
- expanded_sidebar_selector = 'aside.right-sidebar.right-sidebar-expanded'
- lock_sidebar_block = '.block.lock'
- lock_button = '.block.lock .btn-close'
- collapsed_sidebar_block_icon = '.sidebar-collapsed-icon'
-
+ context 'when not signed in' do
+ context 'sidebar', :js do
before do
- resize_screen_sm
+ visit_issue(project, issue)
end
- it 'expands then does not show the lock dialog form' do
- expect(page).to have_css(collapsed_sidebar_selector)
-
- page.within(lock_sidebar_block) do
- find(collapsed_sidebar_block_icon).click
- end
-
- expect(page).to have_css(expanded_sidebar_selector)
- expect(page).not_to have_selector(lock_button)
+ it 'does not find issue email' do
+ expect(page).not_to have_selector('[data-qa-selector="copy-forward-email"]')
end
end
end
diff --git a/spec/frontend/sidebar/components/copy_email_to_clipboard_spec.js b/spec/frontend/sidebar/components/copy_email_to_clipboard_spec.js
new file mode 100644
index 00000000000..b9132fa4450
--- /dev/null
+++ b/spec/frontend/sidebar/components/copy_email_to_clipboard_spec.js
@@ -0,0 +1,22 @@
+import { mount } from '@vue/test-utils';
+import { getByText } from '@testing-library/dom';
+import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import CopyEmailToClipboard from '~/sidebar/components/copy_email_to_clipboard.vue';
+
+describe('CopyEmailToClipboard component', () => {
+ const sampleEmail = 'sample+email@test.com';
+
+ const wrapper = mount(CopyEmailToClipboard, {
+ propsData: {
+ copyText: sampleEmail,
+ },
+ });
+
+ it('renders the Issue email text with the forwardable email', () => {
+ expect(getByText(wrapper.element, `Issue email: ${sampleEmail}`)).not.toBeNull();
+ });
+
+ it('finds ClipboardButton with the correct props', () => {
+ expect(wrapper.find(ClipboardButton).props('text')).toBe(sampleEmail);
+ });
+});
diff --git a/spec/frontend/vue_shared/components/clipboard_button_spec.js b/spec/frontend/vue_shared/components/clipboard_button_spec.js
index ac0be1537b7..0d4266ce82f 100644
--- a/spec/frontend/vue_shared/components/clipboard_button_spec.js
+++ b/spec/frontend/vue_shared/components/clipboard_button_spec.js
@@ -1,6 +1,7 @@
import { mount } from '@vue/test-utils';
import { GlButton } from '@gitlab/ui';
import ClipboardButton from '~/vue_shared/components/clipboard_button.vue';
+import initCopyToClipboard from '~/behaviors/copy_to_clipboard';
describe('clipboard button', () => {
let wrapper;
@@ -87,4 +88,25 @@ describe('clipboard button', () => {
expect(onClick).toHaveBeenCalled();
});
+
+ describe('integration', () => {
+ it('actually copies to clipboard', () => {
+ initCopyToClipboard();
+
+ document.execCommand = () => {};
+ jest.spyOn(document, 'execCommand').mockImplementation(() => true);
+
+ createWrapper(
+ {
+ text: 'copy me',
+ title: 'Copy this value',
+ },
+ { attachTo: document.body },
+ );
+
+ findButton().trigger('click');
+
+ expect(document.execCommand).toHaveBeenCalledWith('copy');
+ });
+ });
});
diff --git a/spec/services/jira_connect_subscriptions/create_service_spec.rb b/spec/services/jira_connect_subscriptions/create_service_spec.rb
index 9750c671fa2..5f467a07a78 100644
--- a/spec/services/jira_connect_subscriptions/create_service_spec.rb
+++ b/spec/services/jira_connect_subscriptions/create_service_spec.rb
@@ -49,18 +49,6 @@ RSpec.describe JiraConnectSubscriptions::CreateService do
subject
end
-
- context 'when the jira_connect_full_namespace_sync feature flag is disabled' do
- before do
- stub_feature_flags(jira_connect_full_namespace_sync: false)
- end
-
- specify do
- expect(JiraConnect::SyncProjectWorker).not_to receive(:bulk_perform_in_with_contexts)
-
- subject
- end
- end
end
end