summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-01-27 00:07:50 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2023-01-27 00:07:50 +0000
commit431b84710e87a649de02d398568804f820e3b0fe (patch)
tree9cbc49a395615412c152d2bffa9255a3b37fafed
parente04b8c1e60649802ae4249dae7fa7aaf3f0a83c7 (diff)
downloadgitlab-ce-431b84710e87a649de02d398568804f820e3b0fe.tar.gz
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.rubocop_todo/rspec/context_wording.yml1
-rw-r--r--GITLAB_KAS_VERSION2
-rw-r--r--app/assets/javascripts/environments/components/new_environment_item.vue1
-rw-r--r--app/assets/javascripts/search/sidebar/constants/language_filter_data.js18
-rw-r--r--app/assets/javascripts/search/store/actions.js23
-rw-r--r--app/assets/javascripts/search/store/constants.js7
-rw-r--r--app/assets/javascripts/search/store/getters.js9
-rw-r--r--app/assets/javascripts/search/store/mutation_types.js4
-rw-r--r--app/assets/javascripts/search/store/mutations.js9
-rw-r--r--app/assets/javascripts/search/store/state.js6
-rw-r--r--app/assets/javascripts/terms/components/app.vue2
-rw-r--r--app/assets/stylesheets/page_bundles/terms.scss6
-rw-r--r--app/controllers/concerns/verifies_with_email.rb3
-rw-r--r--app/graphql/types/deployment_type.rb4
-rw-r--r--app/graphql/types/merge_request_type.rb4
-rw-r--r--app/helpers/registrations_helper.rb4
-rw-r--r--app/models/concerns/require_email_verification.rb7
-rw-r--r--app/models/todo.rb4
-rw-r--r--app/views/devise/shared/_signup_box.html.haml2
-rw-r--r--config/feature_flags/development/use_primary_and_secondary_stores_for_rate_limiting.yml8
-rw-r--r--config/feature_flags/development/use_primary_store_as_default_for_rate_limiting.yml8
-rw-r--r--config/feature_flags/ops/skip_require_email_verification.yml (renamed from config/feature_flags/development/arkose_labs_signup_challenge.yml)10
-rw-r--r--doc/administration/reference_architectures/10k_users.md34
-rw-r--r--doc/administration/reference_architectures/25k_users.md34
-rw-r--r--doc/administration/reference_architectures/2k_users.md15
-rw-r--r--doc/administration/reference_architectures/3k_users.md34
-rw-r--r--doc/administration/reference_architectures/50k_users.md30
-rw-r--r--doc/administration/reference_architectures/5k_users.md36
-rw-r--r--doc/api/graphql/reference/index.md6
-rw-r--r--doc/api/merge_requests.md6
-rw-r--r--doc/development/transient/prevention-patterns.md4
-rw-r--r--doc/operations/metrics/dashboards/default.md2
-rw-r--r--doc/user/application_security/dependency_scanning/index.md2
-rw-r--r--doc/user/application_security/iac_scanning/index.md7
-rw-r--r--doc/user/application_security/sast/index.md7
-rw-r--r--doc/user/application_security/secret_detection/index.md10
-rw-r--r--doc/user/group/compliance_frameworks.md2
-rw-r--r--doc/user/project/integrations/slack_slash_commands.md2
-rw-r--r--doc/user/project/settings/import_export_troubleshooting.md3
-rw-r--r--lib/api/entities/merge_request_basic.rb1
-rw-r--r--lib/gitlab/redis.rb1
-rw-r--r--lib/gitlab/redis/cluster_rate_limiting.rb11
-rw-r--r--lib/gitlab/redis/multi_store.rb22
-rw-r--r--lib/gitlab/redis/rate_limiting.rb23
-rw-r--r--lib/gitlab/slash_commands/application_help.rb2
-rw-r--r--lib/gitlab/slash_commands/presenters/help.rb6
-rw-r--r--locale/gitlab.pot3
-rw-r--r--qa/Gemfile2
-rw-r--r--qa/Gemfile.lock6
-rw-r--r--spec/features/users/email_verification_on_login_spec.rb1
-rw-r--r--spec/frontend/search/mock_data.js430
-rw-r--r--spec/frontend/search/store/actions_spec.js29
-rw-r--r--spec/frontend/search/store/getters_spec.js20
-rw-r--r--spec/frontend/search/store/mutations_spec.js14
-rw-r--r--spec/helpers/registrations_helper_spec.rb16
-rw-r--r--spec/lib/api/entities/merge_request_basic_spec.rb28
-rw-r--r--spec/lib/gitlab/auth/ip_rate_limiter_spec.rb2
-rw-r--r--spec/lib/gitlab/redis/cluster_rate_limiting_spec.rb7
-rw-r--r--spec/lib/gitlab/redis/multi_store_spec.rb4
-rw-r--r--spec/lib/gitlab/slash_commands/command_spec.rb4
-rw-r--r--spec/models/concerns/require_email_verification_spec.rb17
-rw-r--r--spec/requests/verifies_with_email_spec.rb9
-rw-r--r--spec/support/shared_examples/requests/rack_attack_shared_examples.rb2
-rw-r--r--workhorse/go.mod2
-rw-r--r--workhorse/go.sum4
65 files changed, 882 insertions, 160 deletions
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index 0780e011d65..b55e290f95a 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -1564,7 +1564,6 @@ RSpec/ContextWording:
- 'spec/lib/api/entities/application_setting_spec.rb'
- 'spec/lib/api/entities/basic_project_details_spec.rb'
- 'spec/lib/api/entities/clusters/agent_authorization_spec.rb'
- - 'spec/lib/api/entities/merge_request_basic_spec.rb'
- 'spec/lib/api/entities/nuget/dependency_group_spec.rb'
- 'spec/lib/api/entities/user_spec.rb'
- 'spec/lib/api/every_api_endpoint_spec.rb'
diff --git a/GITLAB_KAS_VERSION b/GITLAB_KAS_VERSION
index acabd5c1299..566299ecad4 100644
--- a/GITLAB_KAS_VERSION
+++ b/GITLAB_KAS_VERSION
@@ -1 +1 @@
-15.8.0
+15.9.0-rc1
diff --git a/app/assets/javascripts/environments/components/new_environment_item.vue b/app/assets/javascripts/environments/components/new_environment_item.vue
index 9a100e0199e..73dfd993c5b 100644
--- a/app/assets/javascripts/environments/components/new_environment_item.vue
+++ b/app/assets/javascripts/environments/components/new_environment_item.vue
@@ -323,6 +323,7 @@ export default {
>
<deployment
:deployment="upcomingDeployment"
+ :visible="visible"
:class="{ 'gl-ml-7': inFolder }"
class="gl-pl-4"
>
diff --git a/app/assets/javascripts/search/sidebar/constants/language_filter_data.js b/app/assets/javascripts/search/sidebar/constants/language_filter_data.js
new file mode 100644
index 00000000000..df44a58a14b
--- /dev/null
+++ b/app/assets/javascripts/search/sidebar/constants/language_filter_data.js
@@ -0,0 +1,18 @@
+import { s__ } from '~/locale';
+
+export const DEFAULT_ITEM_LENGTH = 10;
+export const MAX_ITEM_LENGTH = 100;
+
+const header = s__('GlobalSearch|Language');
+
+const scopes = {
+ BLOBS: 'blobs',
+};
+
+const filterParam = 'language';
+
+export const languageFilterData = {
+ header,
+ scopes,
+ filterParam,
+};
diff --git a/app/assets/javascripts/search/store/actions.js b/app/assets/javascripts/search/store/actions.js
index 2a1b744561d..fc0817be882 100644
--- a/app/assets/javascripts/search/store/actions.js
+++ b/app/assets/javascripts/search/store/actions.js
@@ -6,7 +6,13 @@ import { logError } from '~/lib/logger';
import { __ } from '~/locale';
import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY, SIDEBAR_PARAMS } from './constants';
import * as types from './mutation_types';
-import { loadDataFromLS, setFrequentItemToLS, mergeById, isSidebarDirty } from './utils';
+import {
+ loadDataFromLS,
+ setFrequentItemToLS,
+ mergeById,
+ isSidebarDirty,
+ getAggregationsUrl,
+} from './utils';
export const fetchGroups = ({ commit }, search) => {
commit(types.REQUEST_GROUPS);
@@ -95,7 +101,7 @@ export const setQuery = ({ state, commit }, { key, value }) => {
};
export const applyQuery = ({ state }) => {
- visitUrl(setUrlParams({ ...state.query, page: null }));
+ visitUrl(setUrlParams({ ...state.query, page: null }, window.location.href, false, true));
};
export const resetQuery = ({ state }) => {
@@ -117,3 +123,16 @@ export const fetchSidebarCount = ({ commit, state }) => {
});
return Promise.all(promises);
};
+
+export const fetchLanguageAggregation = ({ commit }) => {
+ commit(types.REQUEST_AGGREGATIONS);
+ return axios
+ .get(getAggregationsUrl())
+ .then(({ data }) => {
+ commit(types.RECEIVE_AGGREGATIONS_SUCCESS, data);
+ })
+ .catch((e) => {
+ logError(e);
+ commit(types.RECEIVE_AGGREGATIONS_ERROR);
+ });
+};
diff --git a/app/assets/javascripts/search/store/constants.js b/app/assets/javascripts/search/store/constants.js
index e4f67f624ca..ba4fe85db9d 100644
--- a/app/assets/javascripts/search/store/constants.js
+++ b/app/assets/javascripts/search/store/constants.js
@@ -1,5 +1,6 @@
import { stateFilterData } from '~/search/sidebar/constants/state_filter_data';
import { confidentialFilterData } from '~/search/sidebar/constants/confidential_filter_data';
+import { languageFilterData } from '~/search/sidebar/constants/language_filter_data';
export const MAX_FREQUENT_ITEMS = 5;
@@ -9,6 +10,10 @@ export const GROUPS_LOCAL_STORAGE_KEY = 'global-search-frequent-groups';
export const PROJECTS_LOCAL_STORAGE_KEY = 'global-search-frequent-projects';
-export const SIDEBAR_PARAMS = [stateFilterData.filterParam, confidentialFilterData.filterParam];
+export const SIDEBAR_PARAMS = [
+ stateFilterData.filterParam,
+ confidentialFilterData.filterParam,
+ languageFilterData.filterParam,
+];
export const NUMBER_FORMATING_OPTIONS = { notation: 'compact', compactDisplay: 'short' };
diff --git a/app/assets/javascripts/search/store/getters.js b/app/assets/javascripts/search/store/getters.js
index 650af5fa55a..0278239c144 100644
--- a/app/assets/javascripts/search/store/getters.js
+++ b/app/assets/javascripts/search/store/getters.js
@@ -1,3 +1,4 @@
+import { languageFilterData } from '~/search/sidebar/constants/language_filter_data';
import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from './constants';
export const frequentGroups = (state) => {
@@ -7,3 +8,11 @@ export const frequentGroups = (state) => {
export const frequentProjects = (state) => {
return state.frequentItems[PROJECTS_LOCAL_STORAGE_KEY];
};
+
+export const langugageAggregationBuckets = (state) => {
+ return (
+ state.aggregations.data.find(
+ (aggregation) => aggregation.name === languageFilterData.filterParam,
+ )?.buckets || []
+ );
+};
diff --git a/app/assets/javascripts/search/store/mutation_types.js b/app/assets/javascripts/search/store/mutation_types.js
index 511b93cad2b..4ffbadcd083 100644
--- a/app/assets/javascripts/search/store/mutation_types.js
+++ b/app/assets/javascripts/search/store/mutation_types.js
@@ -11,3 +11,7 @@ export const SET_SIDEBAR_DIRTY = 'SET_SIDEBAR_DIRTY';
export const LOAD_FREQUENT_ITEMS = 'LOAD_FREQUENT_ITEMS';
export const RECEIVE_NAVIGATION_COUNT = 'RECEIVE_NAVIGATION_COUNT';
+
+export const REQUEST_AGGREGATIONS = 'REQUEST_AGGREGATIONS';
+export const RECEIVE_AGGREGATIONS_SUCCESS = 'RECEIVE_AGGREGATIONS_SUCCESS';
+export const RECEIVE_AGGREGATIONS_ERROR = 'RECEIVE_AGGREGATIONS_ERROR';
diff --git a/app/assets/javascripts/search/store/mutations.js b/app/assets/javascripts/search/store/mutations.js
index c1339845272..f9fd69d2211 100644
--- a/app/assets/javascripts/search/store/mutations.js
+++ b/app/assets/javascripts/search/store/mutations.js
@@ -36,4 +36,13 @@ export default {
const item = { ...state.navigation[key], count };
state.navigation = { ...state.navigation, [key]: item };
},
+ [types.REQUEST_AGGREGATIONS](state) {
+ state.aggregations = { fetching: true, error: false, data: [] };
+ },
+ [types.RECEIVE_AGGREGATIONS_SUCCESS](state, data) {
+ state.aggregations = { fetching: false, error: false, data: [...data] };
+ },
+ [types.RECEIVE_AGGREGATIONS_ERROR](state) {
+ state.aggregations = { fetching: false, error: true, data: [] };
+ },
};
diff --git a/app/assets/javascripts/search/store/state.js b/app/assets/javascripts/search/store/state.js
index b64231a8688..d85a135bb4e 100644
--- a/app/assets/javascripts/search/store/state.js
+++ b/app/assets/javascripts/search/store/state.js
@@ -14,5 +14,11 @@ const createState = ({ query, navigation }) => ({
},
sidebarDirty: false,
navigation,
+ aggregations: {
+ error: false,
+ fetching: false,
+ data: [],
+ },
});
+
export default createState;
diff --git a/app/assets/javascripts/terms/components/app.vue b/app/assets/javascripts/terms/components/app.vue
index 58b8937d410..0ae97a47170 100644
--- a/app/assets/javascripts/terms/components/app.vue
+++ b/app/assets/javascripts/terms/components/app.vue
@@ -81,7 +81,7 @@ export default {
</gl-intersection-observer>
</div>
</div>
- <div v-if="isLoggedIn" class="gl-display-flex gl-justify-content-end">
+ <div v-if="isLoggedIn" class="gl-display-flex gl-justify-content-end gl-p-5">
<form v-if="permissions.canDecline" method="post" :action="paths.decline">
<gl-button type="submit">{{ $options.i18n.decline }}</gl-button>
<input :value="$options.csrf.token" type="hidden" name="authenticity_token" />
diff --git a/app/assets/stylesheets/page_bundles/terms.scss b/app/assets/stylesheets/page_bundles/terms.scss
index 9dff3e9c99c..139627072be 100644
--- a/app/assets/stylesheets/page_bundles/terms.scss
+++ b/app/assets/stylesheets/page_bundles/terms.scss
@@ -8,7 +8,11 @@
}
.terms-fade {
- background: linear-gradient(0deg, $white 0%, rgba($white, 0.5) 100%);
+ background: linear-gradient(rgba($white, 0), $white);
+
+ .gl-dark & {
+ background: linear-gradient(rgba($gray-900, 0), $gray-900);
+ }
}
.content {
diff --git a/app/controllers/concerns/verifies_with_email.rb b/app/controllers/concerns/verifies_with_email.rb
index 82388090350..fb48c0d8ba5 100644
--- a/app/controllers/concerns/verifies_with_email.rb
+++ b/app/controllers/concerns/verifies_with_email.rb
@@ -163,6 +163,7 @@ module VerifiesWithEmail
end
def require_email_verification_enabled?(user)
- Feature.enabled?(:require_email_verification, user)
+ Feature.enabled?(:require_email_verification, user) &&
+ Feature.disabled?(:skip_require_email_verification, user, type: :ops)
end
end
diff --git a/app/graphql/types/deployment_type.rb b/app/graphql/types/deployment_type.rb
index 1c23fd44ea1..6d895cc81cf 100644
--- a/app/graphql/types/deployment_type.rb
+++ b/app/graphql/types/deployment_type.rb
@@ -65,9 +65,9 @@ module Types
field :tags,
[Types::DeploymentTagType],
description: 'Git tags that contain this deployment. ' \
- 'This field can only be resolved for one deployment in any single request.',
+ 'This field can only be resolved for two deployments in any single request.',
calls_gitaly: true do
- extension ::Gitlab::Graphql::Limit::FieldCallCount, limit: 1
+ extension ::Gitlab::Graphql::Limit::FieldCallCount, limit: 2
end
end
end
diff --git a/app/graphql/types/merge_request_type.rb b/app/graphql/types/merge_request_type.rb
index abf7b3ad530..3c288c1d496 100644
--- a/app/graphql/types/merge_request_type.rb
+++ b/app/graphql/types/merge_request_type.rb
@@ -213,9 +213,9 @@ module Types
field :security_auto_fix, GraphQL::Types::Boolean, null: true,
description: 'Indicates if the merge request is created by @GitLab-Security-Bot.'
field :squash, GraphQL::Types::Boolean, null: false,
- description: 'Indicates if squash on merge is enabled.'
+ description: 'Indicates if the merge request is set to be squashed when merged. [Project settings](https://docs.gitlab.com/ee/user/project/merge_requests/squash_and_merge.html#configure-squash-options-for-a-project) may override this value. Use `squash_on_merge` instead to take project squash options into account.'
field :squash_on_merge, GraphQL::Types::Boolean, null: false, method: :squash_on_merge?,
- description: 'Indicates if squash on merge is enabled.'
+ description: 'Indicates if the merge request will be squashed when merged.'
field :timelogs, Types::TimelogType.connection_type, null: false,
description: 'Timelogs on the merge request.'
diff --git a/app/helpers/registrations_helper.rb b/app/helpers/registrations_helper.rb
index 91adc36749b..1724e11a6f1 100644
--- a/app/helpers/registrations_helper.rb
+++ b/app/helpers/registrations_helper.rb
@@ -10,6 +10,10 @@ module RegistrationsHelper
qa_selector: 'new_user_username_field'
}
end
+
+ def arkose_labs_challenge_enabled?
+ false
+ end
end
RegistrationsHelper.prepend_mod_with('RegistrationsHelper')
diff --git a/app/models/concerns/require_email_verification.rb b/app/models/concerns/require_email_verification.rb
index cf6a31e6ebd..5ff4f520d24 100644
--- a/app/models/concerns/require_email_verification.rb
+++ b/app/models/concerns/require_email_verification.rb
@@ -45,8 +45,9 @@ module RequireEmailVerification
private
def override_devise_lockable?
- strong_memoize(:override_devise_lockable) do
- Feature.enabled?(:require_email_verification, self) && !two_factor_enabled?
- end
+ Feature.enabled?(:require_email_verification, self) &&
+ !two_factor_enabled? &&
+ Feature.disabled?(:skip_require_email_verification, self, type: :ops)
end
+ strong_memoize_attr :override_devise_lockable?
end
diff --git a/app/models/todo.rb b/app/models/todo.rb
index 47dabc1533d..37f66916b85 100644
--- a/app/models/todo.rb
+++ b/app/models/todo.rb
@@ -72,7 +72,9 @@ class Todo < ApplicationRecord
scope :for_type, -> (type) { where(target_type: type) }
scope :for_target, -> (id) { where(target_id: id) }
scope :for_commit, -> (id) { where(commit_id: id) }
- scope :with_entity_associations, -> { preload(:target, :author, :note, group: :route, project: [:route, { namespace: [:route, :owner] }]) }
+ scope :with_entity_associations, -> do
+ preload(:target, :author, :note, group: :route, project: [:route, { namespace: [:route, :owner] }, :project_setting])
+ end
scope :joins_issue_and_assignees, -> { left_joins(issue: :assignees) }
scope :for_internal_notes, -> { joins(:note).where(note: { confidential: true }) }
diff --git a/app/views/devise/shared/_signup_box.html.haml b/app/views/devise/shared/_signup_box.html.haml
index b9fe61229bc..f4f3965bdc1 100644
--- a/app/views/devise/shared/_signup_box.html.haml
+++ b/app/views/devise/shared/_signup_box.html.haml
@@ -66,7 +66,7 @@
= render_if_exists 'devise/shared/phone_verification', form: f
%div
- - if Feature.enabled?(:arkose_labs_signup_challenge)
+ - if arkose_labs_challenge_enabled?
= render_if_exists 'devise/registrations/arkose_labs'
- elsif show_recaptcha_sign_up?
= recaptcha_tags nonce: content_security_policy_nonce
diff --git a/config/feature_flags/development/use_primary_and_secondary_stores_for_rate_limiting.yml b/config/feature_flags/development/use_primary_and_secondary_stores_for_rate_limiting.yml
new file mode 100644
index 00000000000..f6679a52ff2
--- /dev/null
+++ b/config/feature_flags/development/use_primary_and_secondary_stores_for_rate_limiting.yml
@@ -0,0 +1,8 @@
+---
+name: use_primary_and_secondary_stores_for_rate_limiting
+introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106123"
+rollout_issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/385681"
+milestone: '15.9'
+type: development
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/development/use_primary_store_as_default_for_rate_limiting.yml b/config/feature_flags/development/use_primary_store_as_default_for_rate_limiting.yml
new file mode 100644
index 00000000000..a958c1c3247
--- /dev/null
+++ b/config/feature_flags/development/use_primary_store_as_default_for_rate_limiting.yml
@@ -0,0 +1,8 @@
+---
+name: use_primary_store_as_default_for_rate_limiting
+introduced_by_url: "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/106123"
+rollout_issue_url: "https://gitlab.com/gitlab-org/gitlab/-/issues/385681"
+milestone: '15.9'
+type: development
+group: group::scalability
+default_enabled: false
diff --git a/config/feature_flags/development/arkose_labs_signup_challenge.yml b/config/feature_flags/ops/skip_require_email_verification.yml
index 8b40ce5d029..b1e6d9093c8 100644
--- a/config/feature_flags/development/arkose_labs_signup_challenge.yml
+++ b/config/feature_flags/ops/skip_require_email_verification.yml
@@ -1,8 +1,8 @@
---
-name: arkose_labs_signup_challenge
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/95560
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/370932
-milestone: '15.4'
-type: development
+name: skip_require_email_verification
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/110010
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/389235
+milestone: '15.9'
+type: ops
group: group::anti-abuse
default_enabled: false
diff --git a/doc/administration/reference_architectures/10k_users.md b/doc/administration/reference_architectures/10k_users.md
index bb50f66aff0..a5be29266d3 100644
--- a/doc/administration/reference_architectures/10k_users.md
+++ b/doc/administration/reference_architectures/10k_users.md
@@ -1217,6 +1217,9 @@ Gitaly Cluster provides the benefits of fault tolerance, but comes with addition
For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
NOTE:
+For guidance on how to migrate existing repositories from NFS to Gitaly Cluster, [follow the main documentation](../gitaly/index.md#migrate-to-gitaly-cluster).
+
+NOTE:
Gitaly has been designed and tested with repositories of varying sizes that follow best practices.
However, large repositories or monorepos not following these practices can significantly
impact Gitaly performance and requirements.
@@ -1756,7 +1759,10 @@ To configure Praefect with TLS:
Sidekiq requires connection to the [Redis](#configure-redis),
[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
- `10.6.0.101`: Sidekiq 1
@@ -1925,7 +1931,13 @@ run [multiple Sidekiq processes](../sidekiq/extra_sidekiq_processes.md).
## Configure GitLab Rails
This section describes how to configure the GitLab application (Rails) component.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+
+Rails requires connections to the [Redis](#configure-redis),
+[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
The following IPs will be used as an example:
@@ -2065,6 +2077,10 @@ On each node perform the following:
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
+1. Copy the SSH host keys (all in the name format `/etc/ssh/ssh_host_*_key*`) from the first Omnibus node you configured and
+ add or replace the files of the same name on this server. This ensures host mismatch errors aren't thrown
+ for your users as they hit the load balanced Rails nodes. If this is the first Omnibus node you are configuring,
+ then you can skip this step.
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
```shell
@@ -2200,16 +2216,10 @@ To configure the Monitoring node:
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/administration/reference_architectures/25k_users.md b/doc/administration/reference_architectures/25k_users.md
index 02739904f5e..3884b55b358 100644
--- a/doc/administration/reference_architectures/25k_users.md
+++ b/doc/administration/reference_architectures/25k_users.md
@@ -1237,6 +1237,9 @@ Gitaly Cluster provides the benefits of fault tolerance, but comes with addition
For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
NOTE:
+For guidance on how to migrate existing repositories from NFS to Gitaly Cluster, [follow the main documentation](../gitaly/index.md#migrate-to-gitaly-cluster).
+
+NOTE:
Gitaly has been designed and tested with repositories of varying sizes that follow best practices.
However, large repositories or monorepos not following these practices can significantly
impact Gitaly performance and requirements.
@@ -1774,7 +1777,10 @@ To configure Praefect with TLS:
Sidekiq requires connection to the [Redis](#configure-redis),
[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
- `10.6.0.101`: Sidekiq 1
@@ -1943,7 +1949,13 @@ run [multiple Sidekiq processes](../sidekiq/extra_sidekiq_processes.md).
## Configure GitLab Rails
This section describes how to configure the GitLab application (Rails) component.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+
+Rails requires connections to the [Redis](#configure-redis),
+[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
The following IPs will be used as an example:
@@ -2085,6 +2097,10 @@ On each node perform the following:
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
+1. Copy the SSH host keys (all in the name format `/etc/ssh/ssh_host_*_key*`) from the first Omnibus node you configured and
+ add or replace the files of the same name on this server. This ensures host mismatch errors aren't thrown
+ for your users as they hit the load balanced Rails nodes. If this is the first Omnibus node you are configuring,
+ then you can skip this step.
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
```shell
@@ -2219,16 +2235,10 @@ To configure the Monitoring node:
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/administration/reference_architectures/2k_users.md b/doc/administration/reference_architectures/2k_users.md
index f41c8e9cb24..3d9f91b22c3 100644
--- a/doc/administration/reference_architectures/2k_users.md
+++ b/doc/administration/reference_architectures/2k_users.md
@@ -924,17 +924,10 @@ running [Prometheus](../monitoring/prometheus/index.md) and
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- [Azure Blob storage](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/administration/reference_architectures/3k_users.md b/doc/administration/reference_architectures/3k_users.md
index 008b5ffcc0e..eef7a9d08ce 100644
--- a/doc/administration/reference_architectures/3k_users.md
+++ b/doc/administration/reference_architectures/3k_users.md
@@ -1172,6 +1172,9 @@ Gitaly Cluster provides the benefits of fault tolerance, but comes with addition
For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
NOTE:
+For guidance on how to migrate existing repositories from NFS to Gitaly Cluster, [follow the main documentation](../gitaly/index.md#migrate-to-gitaly-cluster).
+
+NOTE:
Gitaly has been designed and tested with repositories of varying sizes that follow best practices.
However, large repositories or monorepos not following these practices can significantly
impact Gitaly performance and requirements.
@@ -1708,7 +1711,10 @@ To configure Praefect with TLS:
Sidekiq requires connection to the [Redis](#configure-redis),
[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
The following IPs will be used as an example:
@@ -1876,7 +1882,13 @@ run [multiple Sidekiq processes](../sidekiq/extra_sidekiq_processes.md).
## Configure GitLab Rails
This section describes how to configure the GitLab application (Rails) component.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+
+Rails requires connections to the [Redis](#configure-redis),
+[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
On each node perform the following:
@@ -2016,6 +2028,10 @@ On each node perform the following:
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
+1. Copy the SSH host keys (all in the name format `/etc/ssh/ssh_host_*_key*`) from the first Omnibus node you configured and
+ add or replace the files of the same name on this server. This ensures host mismatch errors aren't thrown
+ for your users as they hit the load balanced Rails nodes. If this is the first Omnibus node you are configuring,
+ then you can skip this step.
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
```shell
@@ -2165,16 +2181,10 @@ running [Prometheus](../monitoring/prometheus/index.md) and
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/administration/reference_architectures/50k_users.md b/doc/administration/reference_architectures/50k_users.md
index 87d1408b568..acd5ff92da6 100644
--- a/doc/administration/reference_architectures/50k_users.md
+++ b/doc/administration/reference_architectures/50k_users.md
@@ -1230,6 +1230,9 @@ Gitaly Cluster provides the benefits of fault tolerance, but comes with addition
For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
NOTE:
+For guidance on how to migrate existing repositories from NFS to Gitaly Cluster, [follow the main documentation](../gitaly/index.md#migrate-to-gitaly-cluster).
+
+NOTE:
Gitaly has been designed and tested with repositories of varying sizes that follow best practices.
However, large repositories or monorepos not following these practices can significantly
impact Gitaly performance and requirements.
@@ -1769,7 +1772,10 @@ To configure Praefect with TLS:
Sidekiq requires connection to the [Redis](#configure-redis),
[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
- `10.6.0.101`: Sidekiq 1
@@ -1938,7 +1944,13 @@ run [multiple Sidekiq processes](../sidekiq/extra_sidekiq_processes.md).
## Configure GitLab Rails
This section describes how to configure the GitLab application (Rails) component.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+
+Rails requires connections to the [Redis](#configure-redis),
+[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
The following IPs will be used as an example:
@@ -2221,16 +2233,10 @@ To configure the Monitoring node:
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/administration/reference_architectures/5k_users.md b/doc/administration/reference_architectures/5k_users.md
index 182edb82b5f..2ddfb662be7 100644
--- a/doc/administration/reference_architectures/5k_users.md
+++ b/doc/administration/reference_architectures/5k_users.md
@@ -1168,6 +1168,9 @@ Gitaly Cluster provides the benefits of fault tolerance, but comes with addition
For implementations with sharded Gitaly, use the same Gitaly specs. Follow the [separate Gitaly documentation](../gitaly/configure_gitaly.md) instead of this section.
NOTE:
+For guidance on how to migrate existing repositories from NFS to Gitaly Cluster, [follow the main documentation](../gitaly/index.md#migrate-to-gitaly-cluster).
+
+NOTE:
Gitaly has been designed and tested with repositories of varying sizes that follow best practices.
However, large repositories or monorepos not following these practices can significantly
impact Gitaly performance and requirements.
@@ -1703,9 +1706,12 @@ To configure Praefect with TLS:
## Configure Sidekiq
-Sidekiq requires connection to the [Redis](#configure-redis),
+Sidekiq requires connections to the [Redis](#configure-redis),
[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
- `10.6.0.71`: Sidekiq 1
@@ -1872,7 +1878,13 @@ run [multiple Sidekiq processes](../sidekiq/extra_sidekiq_processes.md).
## Configure GitLab Rails
This section describes how to configure the GitLab application (Rails) component.
-Because you must use [Object storage](#configure-the-object-storage) instead of NFS for data objects, the following
+
+Rails requires connections to the [Redis](#configure-redis),
+[PostgreSQL](#configure-postgresql) and [Gitaly](#configure-gitaly) instances.
+It also requires a connection to [Object Storage](#configure-the-object-storage) as recommended.
+
+NOTE:
+[Because it's recommended to use Object storage](../object_storage.md) instead of NFS for data objects, the following
examples include the Object storage configuration.
On each node perform the following:
@@ -2015,6 +2027,10 @@ On each node perform the following:
1. Copy the `/etc/gitlab/gitlab-secrets.json` file from the first Omnibus node you configured and add or replace
the file of the same name on this server. If this is the first Omnibus node you are configuring then you can skip this step.
+1. Copy the SSH host keys (all in the name format `/etc/ssh/ssh_host_*_key*`) from the first Omnibus node you configured and
+ add or replace the files of the same name on this server. This ensures host mismatch errors aren't thrown
+ for your users as they hit the load balanced Rails nodes. If this is the first Omnibus node you are configuring,
+ then you can skip this step.
1. To ensure database migrations are only run during reconfigure and not automatically on upgrade, run:
```shell
@@ -2164,16 +2180,10 @@ running [Prometheus](../monitoring/prometheus/index.md) and
## Configure the object storage
-GitLab supports using an object storage service for holding numerous types of data.
-
-GitLab has been tested on a number of object storage providers:
-
-- [Amazon S3](https://aws.amazon.com/s3/)
-- [Google Cloud Storage](https://cloud.google.com/storage)
-- [Digital Ocean Spaces](https://www.digitalocean.com/products/spaces)
-- [Oracle Cloud Infrastructure](https://docs.oracle.com/en-us/iaas/Content/Object/Tasks/s3compatibleapi.htm)
-- [OpenStack Swift (S3 compatibility mode)](https://docs.openstack.org/swift/latest/s3_compat.html)
-- MinIO. We have [a guide to deploying this](https://docs.gitlab.com/charts/advanced/external-object-storage/minio.html) within our Helm Chart documentation.
+GitLab supports using an [object storage](../object_storage.md) service for holding numerous types of data.
+It's recommended over [NFS](../nfs.md) for data objects and in general it's better
+in larger setups as object storage is typically much more performant, reliable,
+and scalable.
There are two ways of specifying object storage configuration in GitLab:
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index be6a7e129eb..93237e1e71e 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -12266,7 +12266,7 @@ The deployment of an environment.
| <a id="deploymentsha"></a>`sha` | [`String`](#string) | Git-SHA that the deployment ran on. |
| <a id="deploymentstatus"></a>`status` | [`DeploymentStatus`](#deploymentstatus) | Status of the deployment. |
| <a id="deploymenttag"></a>`tag` | [`Boolean`](#boolean) | True or false if the deployment ran on a Git-tag. |
-| <a id="deploymenttags"></a>`tags` | [`[DeploymentTag!]`](#deploymenttag) | Git tags that contain this deployment. This field can only be resolved for one deployment in any single request. |
+| <a id="deploymenttags"></a>`tags` | [`[DeploymentTag!]`](#deploymenttag) | Git tags that contain this deployment. This field can only be resolved for two deployments in any single request. |
| <a id="deploymenttriggerer"></a>`triggerer` | [`UserCore`](#usercore) | User who executed the deployment. |
| <a id="deploymentupdatedat"></a>`updatedAt` | [`Time`](#time) | When the deployment record was updated. |
| <a id="deploymentuserpermissions"></a>`userPermissions` | [`DeploymentPermissions!`](#deploymentpermissions) | Permissions for the current user on the resource. |
@@ -15326,8 +15326,8 @@ Defines which user roles, users, or groups can merge into a protected branch.
| <a id="mergerequestsourcebranchprotected"></a>`sourceBranchProtected` | [`Boolean!`](#boolean) | Indicates if the source branch is protected. |
| <a id="mergerequestsourceproject"></a>`sourceProject` | [`Project`](#project) | Source project of the merge request. |
| <a id="mergerequestsourceprojectid"></a>`sourceProjectId` | [`Int`](#int) | ID of the merge request source project. |
-| <a id="mergerequestsquash"></a>`squash` | [`Boolean!`](#boolean) | Indicates if squash on merge is enabled. |
-| <a id="mergerequestsquashonmerge"></a>`squashOnMerge` | [`Boolean!`](#boolean) | Indicates if squash on merge is enabled. |
+| <a id="mergerequestsquash"></a>`squash` | [`Boolean!`](#boolean) | Indicates if the merge request is set to be squashed when merged. [Project settings](https://docs.gitlab.com/ee/user/project/merge_requests/squash_and_merge.html#configure-squash-options-for-a-project) may override this value. Use `squash_on_merge` instead to take project squash options into account. |
+| <a id="mergerequestsquashonmerge"></a>`squashOnMerge` | [`Boolean!`](#boolean) | Indicates if the merge request will be squashed when merged. |
| <a id="mergerequeststate"></a>`state` | [`MergeRequestState!`](#mergerequeststate) | State of the merge request. |
| <a id="mergerequestsubscribed"></a>`subscribed` | [`Boolean!`](#boolean) | Indicates if the currently logged in user is subscribed to this merge request. |
| <a id="mergerequestsuggestedreviewers"></a>`suggestedReviewers` **{warning-solid}** | [`SuggestedReviewersType`](#suggestedreviewerstype) | **Introduced** in 15.4. This feature is in Alpha. It can be changed or removed at any time. Suggested reviewers for merge request. Returns `null` if `suggested_reviewers` feature flag is disabled. This flag is disabled by default and only available on GitLab.com because the feature is experimental and is subject to change without notice. |
diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index 371f30cd90b..1a8b39db062 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -1284,7 +1284,8 @@ POST /projects/:id/merge_requests
| `milestone_id` | integer | **{dotted-circle}** No | The global ID of a milestone. |
| `remove_source_branch` | boolean | **{dotted-circle}** No | Flag indicating if a merge request should remove the source branch when merging. |
| `reviewer_ids` | integer array | **{dotted-circle}** No | The ID of the users added as a reviewer to the merge request. If set to `0` or left empty, no reviewers are added. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
-| `squash` | boolean | **{dotted-circle}** No | Squash commits into a single commit when merging. |
+| `squash` | boolean | no | Indicates if the merge request is set to be squashed when merged. [Project settings](../user/project/merge_requests/squash_and_merge.md#configure-squash-options-for-a-project) may override this value. Use `squash_on_merge` instead to take project squash options into account. |
+| `squash_on_merge` | boolean | no | Indicates if the merge request will be squashed when merged. |
| `target_project_id` | integer | **{dotted-circle}** No | Numeric ID of the target project. |
If `approvals_before_merge` is not provided, it inherits the value from the target project. If provided, the following conditions must hold for it to take effect:
@@ -1453,7 +1454,8 @@ PUT /projects/:id/merge_requests/:merge_request_iid
| `remove_labels` | string | **{dotted-circle}** No | Comma-separated label names to remove from a merge request. |
| `remove_source_branch` | boolean | **{dotted-circle}** No | Flag indicating if a merge request should remove the source branch when merging. |
| `reviewer_ids` | integer array | **{dotted-circle}** No | The ID of the users set as a reviewer to the merge request. Set the value to `0` or provide an empty value to unset all reviewers. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/49341) in GitLab 13.8. |
-| `squash` | boolean | **{dotted-circle}** No | Squash commits into a single commit when merging. |
+| `squash` | boolean | no | Indicates if the merge request is set to be squashed when merged. [Project settings](../user/project/merge_requests/squash_and_merge.md#configure-squash-options-for-a-project) may override this value. Use `squash_on_merge` instead to take project squash options into account. |
+| `squash_on_merge` | boolean | no | Indicates if the merge request will be squashed when merged. |
| `state_event` | string | **{dotted-circle}** No | New state (close/reopen). |
| `target_branch` | string | **{dotted-circle}** No | The target branch. |
| `title` | string | **{dotted-circle}** No | Title of MR. |
diff --git a/doc/development/transient/prevention-patterns.md b/doc/development/transient/prevention-patterns.md
index 98634df22e9..730cc757396 100644
--- a/doc/development/transient/prevention-patterns.md
+++ b/doc/development/transient/prevention-patterns.md
@@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w
# Preventing Transient Bugs
-This page will cover architectural patterns and tips for developers to follow to prevent [transient bugs.](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#transient-bugs)
+This page covers architectural patterns and tips for developers to follow to prevent [transient bugs.](https://about.gitlab.com/handbook/engineering/quality/issue-triage/#transient-bugs)
## Common root causes
@@ -21,7 +21,7 @@ We've noticed a few root causes that come up frequently when addressing transien
### Don't rely on response order
-When working with multiple requests, it's easy to assume the order of the responses will match the order in which they are triggered.
+When working with multiple requests, it's easy to assume the order of the responses matches the order in which they are triggered.
That's not always the case and can cause bugs that only happen if the order is switched.
diff --git a/doc/operations/metrics/dashboards/default.md b/doc/operations/metrics/dashboards/default.md
index 7a68e8bf3b3..e22b1096023 100644
--- a/doc/operations/metrics/dashboards/default.md
+++ b/doc/operations/metrics/dashboards/default.md
@@ -40,4 +40,4 @@ This dashboard displays CPU, memory, network and disk metrics for the pods in yo
[variable selector](templating_variables.md#metric_label_values-variable-type)
at the top of the dashboard to select which pod's metrics to display.
-![K8s pod health dashboard](img/k8s_pod_health_dashboard_v13_3.png)
+![Kubernetes pod health dashboard](img/k8s_pod_health_dashboard_v13_3.png)
diff --git a/doc/user/application_security/dependency_scanning/index.md b/doc/user/application_security/dependency_scanning/index.md
index 0b06da7e4a1..817ef4e969c 100644
--- a/doc/user/application_security/dependency_scanning/index.md
+++ b/doc/user/application_security/dependency_scanning/index.md
@@ -59,7 +59,7 @@ possible, we encourage you to use all of our security scanning tools:
Turning this variable on can result in some duplicate findings, as we do not yet
de-duplicate results between Container Scanning and Dependency Scanning. For more details,
efforts to de-duplicate these findings can be tracked in
- [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/348655).
+ [this epic](https://gitlab.com/groups/gitlab-org/-/epics/8026).
The following table summarizes which types of dependencies each scanning tool can detect:
diff --git a/doc/user/application_security/iac_scanning/index.md b/doc/user/application_security/iac_scanning/index.md
index 3aee1ae6d3b..9d464d40868 100644
--- a/doc/user/application_security/iac_scanning/index.md
+++ b/doc/user/application_security/iac_scanning/index.md
@@ -24,7 +24,7 @@ To run IaC Scanning jobs, by default, you need GitLab Runner with the
If you're using the shared runners on GitLab.com, this is enabled by default.
WARNING:
-Our IaC Scanning jobs require a Linux/amd64 container type. Windows containers are not supported.
+GitLab IaC Scanning analyzers don't support running on Windows or on any CPU architectures other than amd64.
WARNING:
If you use your own runners, make sure the Docker version installed
@@ -269,3 +269,8 @@ be ineffective or false positives, and the findings are marked as `No longer det
- In GitLab 15.3, [secret detection in the KICS SAST IaC scanner was disabled](https://gitlab.com/gitlab-org/gitlab/-/issues/346181),
so IaC findings in the "Passwords and Secrets" family show as `No longer detected`.
+
+### `exec /bin/sh: exec format error` message in job log
+
+The GitLab IaC Scanning analyzer [only supports](#requirements) running on the `amd64` CPU architecture.
+This message indicates that the job is being run on a different architecture, such as `arm`.
diff --git a/doc/user/application_security/sast/index.md b/doc/user/application_security/sast/index.md
index 1f089c6110f..6e1227302a6 100644
--- a/doc/user/application_security/sast/index.md
+++ b/doc/user/application_security/sast/index.md
@@ -62,7 +62,7 @@ To run SAST jobs, by default, you need GitLab Runner with the
If you're using the shared runners on GitLab.com, this is enabled by default.
WARNING:
-Our SAST jobs require a Linux/amd64 container type. Windows containers are not yet supported.
+GitLab SAST analyzers don't support running on Windows or on any CPU architectures other than amd64.
WARNING:
If you use your own runners, make sure the Docker version installed
@@ -788,6 +788,11 @@ If you're seeing a new error that doesn't appear to be related to [the GitLab-ma
Each [analyzer project](analyzers.md#sast-analyzers) has a `CHANGELOG.md` file listing the changes made in each available version.
+### `exec /bin/sh: exec format error` message in job log
+
+GitLab SAST analyzers [only support](#requirements) running on the `amd64` CPU architecture.
+This message indicates that the job is being run on a different architecture, such as `arm`.
+
### `Error response from daemon: error processing tar file: docker-tar: relocation error`
This error occurs when the Docker version that runs the SAST job is `19.03.0`.
diff --git a/doc/user/application_security/secret_detection/index.md b/doc/user/application_security/secret_detection/index.md
index c2fbc6ce996..016a5b42086 100644
--- a/doc/user/application_security/secret_detection/index.md
+++ b/doc/user/application_security/secret_detection/index.md
@@ -69,13 +69,14 @@ Different features are available in different [GitLab tiers](https://about.gitla
Prerequisites:
-- GitLab Runner with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
+- Linux-based GitLab Runner with the [`docker`](https://docs.gitlab.com/runner/executors/docker.html) or
[`kubernetes`](https://docs.gitlab.com/runner/install/kubernetes.html) executor. If you're using the
shared runners on GitLab.com, this is enabled by default.
+ - Windows Runners are not supported.
+ - CPU architectures other than amd64 are not supported.
- If you use your own runners, make sure the Docker version installed is **not** `19.03.0`. See
[troubleshooting information](../sast#error-response-from-daemon-error-processing-tar-file-docker-tar-relocation-error)
for details.
-- Linux/amd64 container type. Windows containers are not supported.
- GitLab CI/CD configuration (`.gitlab-ci.yml`) must include the `test` stage.
To enable Secret Detection, either:
@@ -531,3 +532,8 @@ repository's default branch is unrelated to the branch the job was triggered for
To resolve the issue, make sure to correctly [set your default branch](../../project/repository/branches/default.md#change-the-default-branch-name-for-a-project)
on your repository. You should set it to a branch that has related history with the branch you run
the `secret-detection` job on.
+
+### `exec /bin/sh: exec format error` message in job log
+
+The GitLab Secret Detection analyzer [only supports](#enable-secret-detection) running on the `amd64` CPU architecture.
+This message indicates that the job is being run on a different architecture, such as `arm`.
diff --git a/doc/user/group/compliance_frameworks.md b/doc/user/group/compliance_frameworks.md
index e082aed6d57..6f048ae25b0 100644
--- a/doc/user/group/compliance_frameworks.md
+++ b/doc/user/group/compliance_frameworks.md
@@ -200,7 +200,7 @@ include: # Execute individual project's configuration (if project contains .git
#### CF pipelines in Merge Requests originating in project forks
When an MR originates in a fork, the branch to be merged usually only exists in the fork.
-When creating such an MR against a project with CF pipelines, the above snippet will fail with a
+When creating such an MR against a project with CF pipelines, the above snippet fails with a
`Project <project-name> reference <branch-name> does not exist!` error message.
This is because in the context of the target project, `$CI_COMMIT_REF_NAME` evaluates to a non-existing branch name.
diff --git a/doc/user/project/integrations/slack_slash_commands.md b/doc/user/project/integrations/slack_slash_commands.md
index f4c789239f3..bfa0ae94341 100644
--- a/doc/user/project/integrations/slack_slash_commands.md
+++ b/doc/user/project/integrations/slack_slash_commands.md
@@ -14,7 +14,7 @@ GitLab can also send events (for example, `issue created`) to Slack as notificat
The [Slack notifications service](slack.md) is configured separately.
NOTE:
-For GitLab.com, use the [GitLab for Slack app](gitlab_slack_application.md) instead.
+The Slack slash commands are only configurable on self-managed GitLab instances. For GitLab.com, use the [GitLab for Slack app](gitlab_slack_application.md) instead.
## Configure GitLab and Slack
diff --git a/doc/user/project/settings/import_export_troubleshooting.md b/doc/user/project/settings/import_export_troubleshooting.md
index a78a9c84a74..00edeef5cfa 100644
--- a/doc/user/project/settings/import_export_troubleshooting.md
+++ b/doc/user/project/settings/import_export_troubleshooting.md
@@ -153,7 +153,8 @@ Rather than attempting to push all changes at once, this workaround:
You usually export a project through [the web interface](import_export.md#export-a-project-and-its-data) or through [the API](../../../api/project_import_export.md). Exporting using these
methods can sometimes fail without giving enough information to troubleshoot. In these cases,
-[open a rails console session](../../../administration/operations/rails_console.md#starting-a-rails-console-session)
+[open a rails console session](../../../administration/operations/rails_console.md#starting-a-rails-console-session) and loop through
+[all the defined exporters](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/services/projects/import_export/export_service.rb).
Execute each line individually, rather than pasting the entire block at once, so you can see any
errors each command returns.
diff --git a/lib/api/entities/merge_request_basic.rb b/lib/api/entities/merge_request_basic.rb
index 27f6e6ade06..16afc6c1f6a 100644
--- a/lib/api/entities/merge_request_basic.rb
+++ b/lib/api/entities/merge_request_basic.rb
@@ -91,6 +91,7 @@ module API
end
expose :squash
+ expose :squash_on_merge?, as: :squash_on_merge
expose :task_completion_status
expose :cannot_be_merged?, as: :has_conflicts
expose :mergeable_discussions_state?, as: :blocking_discussions_resolved
diff --git a/lib/gitlab/redis.rb b/lib/gitlab/redis.rb
index ed4f6015603..fff086c38a8 100644
--- a/lib/gitlab/redis.rb
+++ b/lib/gitlab/redis.rb
@@ -12,6 +12,7 @@ module Gitlab
Gitlab::Redis::Queues,
Gitlab::Redis::RateLimiting,
Gitlab::Redis::RepositoryCache,
+ Gitlab::Redis::ClusterRateLimiting,
Gitlab::Redis::Sessions,
Gitlab::Redis::SharedState,
Gitlab::Redis::TraceChunks
diff --git a/lib/gitlab/redis/cluster_rate_limiting.rb b/lib/gitlab/redis/cluster_rate_limiting.rb
new file mode 100644
index 00000000000..e9d1e4f0c3f
--- /dev/null
+++ b/lib/gitlab/redis/cluster_rate_limiting.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module Redis
+ class ClusterRateLimiting < ::Gitlab::Redis::Wrapper
+ def self.config_fallback
+ Cache
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/redis/multi_store.rb b/lib/gitlab/redis/multi_store.rb
index c0fab462786..46ffa8cbc1b 100644
--- a/lib/gitlab/redis/multi_store.rb
+++ b/lib/gitlab/redis/multi_store.rb
@@ -169,11 +169,15 @@ module Gitlab
end
def use_primary_and_secondary_stores?
- feature_enabled?("use_primary_and_secondary_stores_for")
+ Feature.feature_flags_available? &&
+ Feature.enabled?("use_primary_and_secondary_stores_for_#{instance_name.underscore}") && # rubocop:disable Cop/FeatureFlagUsage
+ !same_redis_store?
end
def use_primary_store_as_default?
- feature_enabled?("use_primary_store_as_default_for")
+ Feature.feature_flags_available? &&
+ Feature.enabled?("use_primary_store_as_default_for_#{instance_name.underscore}") && # rubocop:disable Cop/FeatureFlagUsage
+ !same_redis_store?
end
def increment_pipelined_command_error_count(command_name)
@@ -213,20 +217,6 @@ module Gitlab
private
- # @return [Boolean]
- def feature_enabled?(prefix)
- feature_table_exists? &&
- Feature.enabled?("#{prefix}_#{instance_name.underscore}") && # rubocop:disable Cop/FeatureFlagUsage
- !same_redis_store?
- end
-
- # @return [Boolean]
- def feature_table_exists?
- Feature::FlipperFeature.table_exists?
- rescue StandardError
- false
- end
-
def default_store
use_primary_store_as_default? ? primary_store : secondary_store
end
diff --git a/lib/gitlab/redis/rate_limiting.rb b/lib/gitlab/redis/rate_limiting.rb
index 4ae1d55e4ce..3a9fb63a495 100644
--- a/lib/gitlab/redis/rate_limiting.rb
+++ b/lib/gitlab/redis/rate_limiting.rb
@@ -3,13 +3,24 @@
module Gitlab
module Redis
class RateLimiting < ::Gitlab::Redis::Wrapper
- # The data we store on RateLimiting used to be stored on Cache.
- def self.config_fallback
- Cache
- end
+ class << self
+ # The data we store on RateLimiting used to be stored on Cache.
+ def config_fallback
+ Cache
+ end
+
+ def cache_store
+ @cache_store ||= ActiveSupport::Cache::RedisCacheStore.new(redis: pool, namespace: Cache::CACHE_NAMESPACE)
+ end
+
+ private
+
+ def redis
+ primary_store = ::Redis.new(::Gitlab::Redis::ClusterRateLimiting.params)
+ secondary_store = ::Redis.new(params)
- def self.cache_store
- @cache_store ||= ActiveSupport::Cache::RedisCacheStore.new(redis: pool, namespace: Cache::CACHE_NAMESPACE)
+ MultiStore.new(primary_store, secondary_store, name.demodulize)
+ end
end
end
end
diff --git a/lib/gitlab/slash_commands/application_help.rb b/lib/gitlab/slash_commands/application_help.rb
index 94abc8b4508..8d747cab2a1 100644
--- a/lib/gitlab/slash_commands/application_help.rb
+++ b/lib/gitlab/slash_commands/application_help.rb
@@ -17,7 +17,7 @@ module Gitlab
private
def trigger
- "#{params[:command]} [project name or alias]"
+ params[:command].to_s
end
def commands
diff --git a/lib/gitlab/slash_commands/presenters/help.rb b/lib/gitlab/slash_commands/presenters/help.rb
index 61b36308d20..395f7aab050 100644
--- a/lib/gitlab/slash_commands/presenters/help.rb
+++ b/lib/gitlab/slash_commands/presenters/help.rb
@@ -26,7 +26,7 @@ module Gitlab
MESSAGE
end
- if text.start_with?('help')
+ if text && text.start_with?('help')
<<~MESSAGE
#{full_commands_message(trigger)}
@@ -69,9 +69,9 @@ module Gitlab
list = @commands
.map do |command|
if command < Gitlab::SlashCommands::IncidentManagement::IncidentCommand
- "#{@params[:command]} #{command.help_message}"
- else
"#{trigger} #{command.help_message}"
+ else
+ "#{trigger} [project name or alias] #{command.help_message}"
end
end
.join("\n")
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5797566d555..40735f8d62a 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -19092,6 +19092,9 @@ msgstr ""
msgid "GlobalSearch|Issues assigned to me"
msgstr ""
+msgid "GlobalSearch|Language"
+msgstr ""
+
msgid "GlobalSearch|Merge requests I've created"
msgstr ""
diff --git a/qa/Gemfile b/qa/Gemfile
index 7105404915e..cdbffa060ef 100644
--- a/qa/Gemfile
+++ b/qa/Gemfile
@@ -9,7 +9,7 @@ gem 'capybara', '~> 3.38.0'
gem 'capybara-screenshot', '~> 1.0.26'
gem 'rake', '~> 13', '>= 13.0.6'
gem 'rspec', '~> 3.12'
-gem 'selenium-webdriver', '~> 4.7', '>= 4.7.1'
+gem 'selenium-webdriver', '~> 4.8'
gem 'airborne', '~> 0.3.7', require: false # airborne is messing with rspec sandboxed mode so not requiring by default
gem 'rest-client', '~> 2.1.0'
gem 'rspec-retry', '~> 0.6.2', require: 'rspec/retry'
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock
index 7bc2110c30b..ecd487e8bb3 100644
--- a/qa/Gemfile.lock
+++ b/qa/Gemfile.lock
@@ -259,7 +259,7 @@ GEM
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
- selenium-webdriver (4.7.1)
+ selenium-webdriver (4.8.0)
rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2, < 3.0)
websocket (~> 1.0)
@@ -334,7 +334,7 @@ DEPENDENCIES
rspec-retry (~> 0.6.2)
rspec_junit_formatter (~> 0.6.0)
ruby-debug-ide (~> 0.7.3)
- selenium-webdriver (~> 4.7, >= 4.7.1)
+ selenium-webdriver (~> 4.8)
slack-notifier (~> 2.4)
terminal-table (~> 3.0.2)
warning (~> 1.3)
@@ -342,4 +342,4 @@ DEPENDENCIES
zeitwerk (~> 2.6, >= 2.6.6)
BUNDLED WITH
- 2.3.26
+ 2.4.4
diff --git a/spec/features/users/email_verification_on_login_spec.rb b/spec/features/users/email_verification_on_login_spec.rb
index de52f0b517e..481ff52b800 100644
--- a/spec/features/users/email_verification_on_login_spec.rb
+++ b/spec/features/users/email_verification_on_login_spec.rb
@@ -11,6 +11,7 @@ RSpec.describe 'Email Verification On Login', :clean_gitlab_redis_rate_limiting,
before do
stub_feature_flags(require_email_verification: require_email_verification_enabled)
+ stub_feature_flags(skip_require_email_verification: false)
end
shared_examples 'email verification required' do
diff --git a/spec/frontend/search/mock_data.js b/spec/frontend/search/mock_data.js
index e02d3b0eab8..4ccfbe41836 100644
--- a/spec/frontend/search/mock_data.js
+++ b/spec/frontend/search/mock_data.js
@@ -192,3 +192,433 @@ export const MOCK_NAVIGATION_ACTION_MUTATION = {
type: types.RECEIVE_NAVIGATION_COUNT,
payload: { key: 'projects', count: '13' },
};
+
+export const MOCK_AGGREGATIONS = [
+ {
+ name: 'language',
+ buckets: [
+ { key: 'random-label-edumingos0', count: 1 },
+ { key: 'random-label-rbourgourd1', count: 2 },
+ { key: 'random-label-dfearnside2', count: 3 },
+ { key: 'random-label-gewins3', count: 4 },
+ { key: 'random-label-telverstone4', count: 5 },
+ { key: 'random-label-ygerriets5', count: 6 },
+ { key: 'random-label-lmoffet6', count: 7 },
+ { key: 'random-label-ehinnerk7', count: 8 },
+ { key: 'random-label-flanceley8', count: 9 },
+ { key: 'random-label-adoyle9', count: 10 },
+ { key: 'random-label-rmcgirla', count: 11 },
+ { key: 'random-label-dwhellansb', count: 12 },
+ { key: 'random-label-apitkethlyc', count: 13 },
+ { key: 'random-label-senevoldsend', count: 14 },
+ { key: 'random-label-tlardnare', count: 15 },
+ { key: 'random-label-fcoilsf', count: 16 },
+ { key: 'random-label-qgeckg', count: 17 },
+ { key: 'random-label-rgrabenh', count: 18 },
+ { key: 'random-label-lashardi', count: 19 },
+ { key: 'random-label-sadamovitchj', count: 20 },
+ { key: 'random-label-rlyddiardk', count: 21 },
+ { key: 'random-label-jpoell', count: 22 },
+ { key: 'random-label-kcharitym', count: 23 },
+ { key: 'random-label-cbertenshawn', count: 24 },
+ { key: 'random-label-jsturgeso', count: 25 },
+ { key: 'random-label-ohouldcroftp', count: 26 },
+ { key: 'random-label-rheijnenq', count: 27 },
+ { key: 'random-label-snortheyr', count: 28 },
+ { key: 'random-label-vpairpoints', count: 29 },
+ { key: 'random-label-odavidovicit', count: 30 },
+ { key: 'random-label-fmccartu', count: 31 },
+ { key: 'random-label-cwansburyv', count: 32 },
+ { key: 'random-label-bdimontw', count: 33 },
+ { key: 'random-label-adocketx', count: 34 },
+ { key: 'random-label-obavridgey', count: 35 },
+ { key: 'random-label-jperezz', count: 36 },
+ { key: 'random-label-gdeneve10', count: 37 },
+ { key: 'random-label-rmckeand11', count: 38 },
+ { key: 'random-label-kwestmerland12', count: 39 },
+ { key: 'random-label-mpryer13', count: 40 },
+ { key: 'random-label-rmcneil14', count: 41 },
+ { key: 'random-label-ablondel15', count: 42 },
+ { key: 'random-label-wbalducci16', count: 43 },
+ { key: 'random-label-swigley17', count: 44 },
+ { key: 'random-label-gferroni18', count: 45 },
+ { key: 'random-label-icollings19', count: 46 },
+ { key: 'random-label-wszymanski1a', count: 47 },
+ { key: 'random-label-jelson1b', count: 48 },
+ { key: 'random-label-fsambrook1c', count: 49 },
+ { key: 'random-label-kconey1d', count: 50 },
+ { key: 'random-label-agoodread1e', count: 51 },
+ { key: 'random-label-nmewton1f', count: 52 },
+ { key: 'random-label-gcodman1g', count: 53 },
+ { key: 'random-label-rpoplee1h', count: 54 },
+ { key: 'random-label-mhug1i', count: 55 },
+ { key: 'random-label-ggowrie1j', count: 56 },
+ { key: 'random-label-ctonepohl1k', count: 57 },
+ { key: 'random-label-cstillman1l', count: 58 },
+ { key: 'random-label-dcollyer1m', count: 59 },
+ { key: 'random-label-idimelow1n', count: 60 },
+ { key: 'random-label-djarley1o', count: 61 },
+ { key: 'random-label-omclleese1p', count: 62 },
+ { key: 'random-label-dstivers1q', count: 63 },
+ { key: 'random-label-svose1r', count: 64 },
+ { key: 'random-label-clanfare1s', count: 65 },
+ { key: 'random-label-aport1t', count: 66 },
+ { key: 'random-label-hcarlett1u', count: 67 },
+ { key: 'random-label-dstillmann1v', count: 68 },
+ { key: 'random-label-ncorpe1w', count: 69 },
+ { key: 'random-label-mjacobsohn1x', count: 70 },
+ { key: 'random-label-ycleiment1y', count: 71 },
+ { key: 'random-label-owherton1z', count: 72 },
+ { key: 'random-label-anowaczyk20', count: 73 },
+ { key: 'random-label-rmckennan21', count: 74 },
+ { key: 'random-label-cmoulding22', count: 75 },
+ { key: 'random-label-sswate23', count: 76 },
+ { key: 'random-label-cbarge24', count: 77 },
+ { key: 'random-label-agrainger25', count: 78 },
+ { key: 'random-label-ncosin26', count: 79 },
+ { key: 'random-label-pkears27', count: 80 },
+ { key: 'random-label-cmcarthur28', count: 81 },
+ { key: 'random-label-jmantripp29', count: 82 },
+ { key: 'random-label-cjekel2a', count: 83 },
+ { key: 'random-label-hdilleway2b', count: 84 },
+ { key: 'random-label-lbovaird2c', count: 85 },
+ { key: 'random-label-mweld2d', count: 86 },
+ { key: 'random-label-marnowitz2e', count: 87 },
+ { key: 'random-label-nbertomieu2f', count: 88 },
+ { key: 'random-label-mledward2g', count: 89 },
+ { key: 'random-label-mhince2h', count: 90 },
+ { key: 'random-label-baarons2i', count: 91 },
+ { key: 'random-label-kfrancie2j', count: 92 },
+ { key: 'random-label-ishooter2k', count: 93 },
+ { key: 'random-label-glowmass2l', count: 94 },
+ { key: 'random-label-rgeorgi2m', count: 95 },
+ { key: 'random-label-bproby2n', count: 96 },
+ { key: 'random-label-hsteffan2o', count: 97 },
+ { key: 'random-label-doruane2p', count: 98 },
+ { key: 'random-label-rlunny2q', count: 99 },
+ { key: 'random-label-geles2r', count: 100 },
+ { key: 'random-label-nmaggiore2s', count: 101 },
+ { key: 'random-label-aboocock2t', count: 102 },
+ { key: 'random-label-eguilbert2u', count: 103 },
+ { key: 'random-label-emccutcheon2v', count: 104 },
+ { key: 'random-label-hcowser2w', count: 105 },
+ { key: 'random-label-dspeeding2x', count: 106 },
+ { key: 'random-label-oseebright2y', count: 107 },
+ { key: 'random-label-hpresdee2z', count: 108 },
+ { key: 'random-label-pesseby30', count: 109 },
+ { key: 'random-label-hpusey31', count: 110 },
+ { key: 'random-label-dmanthorpe32', count: 111 },
+ { key: 'random-label-natley33', count: 112 },
+ { key: 'random-label-iferentz34', count: 113 },
+ { key: 'random-label-adyble35', count: 114 },
+ { key: 'random-label-dlockitt36', count: 115 },
+ { key: 'random-label-acoxwell37', count: 116 },
+ { key: 'random-label-amcgarvey38', count: 117 },
+ { key: 'random-label-rmcgougan39', count: 118 },
+ { key: 'random-label-mscole3a', count: 119 },
+ { key: 'random-label-lmalim3b', count: 120 },
+ { key: 'random-label-cends3c', count: 121 },
+ { key: 'random-label-dmannie3d', count: 122 },
+ { key: 'random-label-lgoodricke3e', count: 123 },
+ { key: 'random-label-rcaghy3f', count: 124 },
+ { key: 'random-label-mprozillo3g', count: 125 },
+ { key: 'random-label-mcardnell3h', count: 126 },
+ { key: 'random-label-gericssen3i', count: 127 },
+ { key: 'random-label-fspooner3j', count: 128 },
+ { key: 'random-label-achadney3k', count: 129 },
+ { key: 'random-label-corchard3l', count: 130 },
+ { key: 'random-label-lyerill3m', count: 131 },
+ { key: 'random-label-jrusk3n', count: 132 },
+ { key: 'random-label-lbonelle3o', count: 133 },
+ { key: 'random-label-eduny3p', count: 134 },
+ { key: 'random-label-mhutchence3q', count: 135 },
+ { key: 'random-label-rmargeram3r', count: 136 },
+ { key: 'random-label-smaudlin3s', count: 137 },
+ { key: 'random-label-sfarrance3t', count: 138 },
+ { key: 'random-label-eclendennen3u', count: 139 },
+ { key: 'random-label-cyabsley3v', count: 140 },
+ { key: 'random-label-ahensmans3w', count: 141 },
+ { key: 'random-label-tsenchenko3x', count: 142 },
+ { key: 'random-label-ryurchishin3y', count: 143 },
+ { key: 'random-label-teby3z', count: 144 },
+ { key: 'random-label-dvaillant40', count: 145 },
+ { key: 'random-label-kpetyakov41', count: 146 },
+ { key: 'random-label-cmorrison42', count: 147 },
+ { key: 'random-label-ltwiddy43', count: 148 },
+ { key: 'random-label-ineame44', count: 149 },
+ { key: 'random-label-blucock45', count: 150 },
+ { key: 'random-label-kdunsford46', count: 151 },
+ { key: 'random-label-dducham47', count: 152 },
+ { key: 'random-label-javramovitz48', count: 153 },
+ { key: 'random-label-mascraft49', count: 154 },
+ { key: 'random-label-bloughead4a', count: 155 },
+ { key: 'random-label-sduckit4b', count: 156 },
+ { key: 'random-label-hhardman4c', count: 157 },
+ { key: 'random-label-cstaniforth4d', count: 158 },
+ { key: 'random-label-jedney4e', count: 159 },
+ { key: 'random-label-bobbard4f', count: 160 },
+ { key: 'random-label-cgiraux4g', count: 161 },
+ { key: 'random-label-tkiln4h', count: 162 },
+ { key: 'random-label-jwansbury4i', count: 163 },
+ { key: 'random-label-dquinlan4j', count: 164 },
+ { key: 'random-label-hgindghill4k', count: 165 },
+ { key: 'random-label-jjowle4l', count: 166 },
+ { key: 'random-label-egambrell4m', count: 167 },
+ { key: 'random-label-jmcgloughlin4n', count: 168 },
+ { key: 'random-label-bbabb4o', count: 169 },
+ { key: 'random-label-achuck4p', count: 170 },
+ { key: 'random-label-tsyers4q', count: 171 },
+ { key: 'random-label-jlandon4r', count: 172 },
+ { key: 'random-label-wteather4s', count: 173 },
+ { key: 'random-label-dfoskin4t', count: 174 },
+ { key: 'random-label-gmorlon4u', count: 175 },
+ { key: 'random-label-jseely4v', count: 176 },
+ { key: 'random-label-cbrass4w', count: 177 },
+ { key: 'random-label-fmanilo4x', count: 178 },
+ { key: 'random-label-bfrangleton4y', count: 179 },
+ { key: 'random-label-vbartkiewicz4z', count: 180 },
+ { key: 'random-label-tclymer50', count: 181 },
+ { key: 'random-label-pqueen51', count: 182 },
+ { key: 'random-label-bpol52', count: 183 },
+ { key: 'random-label-jclaeskens53', count: 184 },
+ { key: 'random-label-cstranieri54', count: 185 },
+ { key: 'random-label-drumbelow55', count: 186 },
+ { key: 'random-label-wbrumham56', count: 187 },
+ { key: 'random-label-azeal57', count: 188 },
+ { key: 'random-label-msnooks58', count: 189 },
+ { key: 'random-label-blapre59', count: 190 },
+ { key: 'random-label-cduckers5a', count: 191 },
+ { key: 'random-label-mgumary5b', count: 192 },
+ { key: 'random-label-rtebbs5c', count: 193 },
+ { key: 'random-label-eroe5d', count: 194 },
+ { key: 'random-label-rconfait5e', count: 195 },
+ { key: 'random-label-fsinderland5f', count: 196 },
+ { key: 'random-label-tdallywater5g', count: 197 },
+ { key: 'random-label-glindenman5h', count: 198 },
+ { key: 'random-label-fbauser5i', count: 199 },
+ { key: 'random-label-bdownton5j', count: 200 },
+ ],
+ },
+];
+
+export const MOCK_LANGUAGE_AGGREGATIONS_BUCKETS = [
+ { key: 'random-label-edumingos0', count: 1 },
+ { key: 'random-label-rbourgourd1', count: 2 },
+ { key: 'random-label-dfearnside2', count: 3 },
+ { key: 'random-label-gewins3', count: 4 },
+ { key: 'random-label-telverstone4', count: 5 },
+ { key: 'random-label-ygerriets5', count: 6 },
+ { key: 'random-label-lmoffet6', count: 7 },
+ { key: 'random-label-ehinnerk7', count: 8 },
+ { key: 'random-label-flanceley8', count: 9 },
+ { key: 'random-label-adoyle9', count: 10 },
+ { key: 'random-label-rmcgirla', count: 11 },
+ { key: 'random-label-dwhellansb', count: 12 },
+ { key: 'random-label-apitkethlyc', count: 13 },
+ { key: 'random-label-senevoldsend', count: 14 },
+ { key: 'random-label-tlardnare', count: 15 },
+ { key: 'random-label-fcoilsf', count: 16 },
+ { key: 'random-label-qgeckg', count: 17 },
+ { key: 'random-label-rgrabenh', count: 18 },
+ { key: 'random-label-lashardi', count: 19 },
+ { key: 'random-label-sadamovitchj', count: 20 },
+ { key: 'random-label-rlyddiardk', count: 21 },
+ { key: 'random-label-jpoell', count: 22 },
+ { key: 'random-label-kcharitym', count: 23 },
+ { key: 'random-label-cbertenshawn', count: 24 },
+ { key: 'random-label-jsturgeso', count: 25 },
+ { key: 'random-label-ohouldcroftp', count: 26 },
+ { key: 'random-label-rheijnenq', count: 27 },
+ { key: 'random-label-snortheyr', count: 28 },
+ { key: 'random-label-vpairpoints', count: 29 },
+ { key: 'random-label-odavidovicit', count: 30 },
+ { key: 'random-label-fmccartu', count: 31 },
+ { key: 'random-label-cwansburyv', count: 32 },
+ { key: 'random-label-bdimontw', count: 33 },
+ { key: 'random-label-adocketx', count: 34 },
+ { key: 'random-label-obavridgey', count: 35 },
+ { key: 'random-label-jperezz', count: 36 },
+ { key: 'random-label-gdeneve10', count: 37 },
+ { key: 'random-label-rmckeand11', count: 38 },
+ { key: 'random-label-kwestmerland12', count: 39 },
+ { key: 'random-label-mpryer13', count: 40 },
+ { key: 'random-label-rmcneil14', count: 41 },
+ { key: 'random-label-ablondel15', count: 42 },
+ { key: 'random-label-wbalducci16', count: 43 },
+ { key: 'random-label-swigley17', count: 44 },
+ { key: 'random-label-gferroni18', count: 45 },
+ { key: 'random-label-icollings19', count: 46 },
+ { key: 'random-label-wszymanski1a', count: 47 },
+ { key: 'random-label-jelson1b', count: 48 },
+ { key: 'random-label-fsambrook1c', count: 49 },
+ { key: 'random-label-kconey1d', count: 50 },
+ { key: 'random-label-agoodread1e', count: 51 },
+ { key: 'random-label-nmewton1f', count: 52 },
+ { key: 'random-label-gcodman1g', count: 53 },
+ { key: 'random-label-rpoplee1h', count: 54 },
+ { key: 'random-label-mhug1i', count: 55 },
+ { key: 'random-label-ggowrie1j', count: 56 },
+ { key: 'random-label-ctonepohl1k', count: 57 },
+ { key: 'random-label-cstillman1l', count: 58 },
+ { key: 'random-label-dcollyer1m', count: 59 },
+ { key: 'random-label-idimelow1n', count: 60 },
+ { key: 'random-label-djarley1o', count: 61 },
+ { key: 'random-label-omclleese1p', count: 62 },
+ { key: 'random-label-dstivers1q', count: 63 },
+ { key: 'random-label-svose1r', count: 64 },
+ { key: 'random-label-clanfare1s', count: 65 },
+ { key: 'random-label-aport1t', count: 66 },
+ { key: 'random-label-hcarlett1u', count: 67 },
+ { key: 'random-label-dstillmann1v', count: 68 },
+ { key: 'random-label-ncorpe1w', count: 69 },
+ { key: 'random-label-mjacobsohn1x', count: 70 },
+ { key: 'random-label-ycleiment1y', count: 71 },
+ { key: 'random-label-owherton1z', count: 72 },
+ { key: 'random-label-anowaczyk20', count: 73 },
+ { key: 'random-label-rmckennan21', count: 74 },
+ { key: 'random-label-cmoulding22', count: 75 },
+ { key: 'random-label-sswate23', count: 76 },
+ { key: 'random-label-cbarge24', count: 77 },
+ { key: 'random-label-agrainger25', count: 78 },
+ { key: 'random-label-ncosin26', count: 79 },
+ { key: 'random-label-pkears27', count: 80 },
+ { key: 'random-label-cmcarthur28', count: 81 },
+ { key: 'random-label-jmantripp29', count: 82 },
+ { key: 'random-label-cjekel2a', count: 83 },
+ { key: 'random-label-hdilleway2b', count: 84 },
+ { key: 'random-label-lbovaird2c', count: 85 },
+ { key: 'random-label-mweld2d', count: 86 },
+ { key: 'random-label-marnowitz2e', count: 87 },
+ { key: 'random-label-nbertomieu2f', count: 88 },
+ { key: 'random-label-mledward2g', count: 89 },
+ { key: 'random-label-mhince2h', count: 90 },
+ { key: 'random-label-baarons2i', count: 91 },
+ { key: 'random-label-kfrancie2j', count: 92 },
+ { key: 'random-label-ishooter2k', count: 93 },
+ { key: 'random-label-glowmass2l', count: 94 },
+ { key: 'random-label-rgeorgi2m', count: 95 },
+ { key: 'random-label-bproby2n', count: 96 },
+ { key: 'random-label-hsteffan2o', count: 97 },
+ { key: 'random-label-doruane2p', count: 98 },
+ { key: 'random-label-rlunny2q', count: 99 },
+ { key: 'random-label-geles2r', count: 100 },
+ { key: 'random-label-nmaggiore2s', count: 101 },
+ { key: 'random-label-aboocock2t', count: 102 },
+ { key: 'random-label-eguilbert2u', count: 103 },
+ { key: 'random-label-emccutcheon2v', count: 104 },
+ { key: 'random-label-hcowser2w', count: 105 },
+ { key: 'random-label-dspeeding2x', count: 106 },
+ { key: 'random-label-oseebright2y', count: 107 },
+ { key: 'random-label-hpresdee2z', count: 108 },
+ { key: 'random-label-pesseby30', count: 109 },
+ { key: 'random-label-hpusey31', count: 110 },
+ { key: 'random-label-dmanthorpe32', count: 111 },
+ { key: 'random-label-natley33', count: 112 },
+ { key: 'random-label-iferentz34', count: 113 },
+ { key: 'random-label-adyble35', count: 114 },
+ { key: 'random-label-dlockitt36', count: 115 },
+ { key: 'random-label-acoxwell37', count: 116 },
+ { key: 'random-label-amcgarvey38', count: 117 },
+ { key: 'random-label-rmcgougan39', count: 118 },
+ { key: 'random-label-mscole3a', count: 119 },
+ { key: 'random-label-lmalim3b', count: 120 },
+ { key: 'random-label-cends3c', count: 121 },
+ { key: 'random-label-dmannie3d', count: 122 },
+ { key: 'random-label-lgoodricke3e', count: 123 },
+ { key: 'random-label-rcaghy3f', count: 124 },
+ { key: 'random-label-mprozillo3g', count: 125 },
+ { key: 'random-label-mcardnell3h', count: 126 },
+ { key: 'random-label-gericssen3i', count: 127 },
+ { key: 'random-label-fspooner3j', count: 128 },
+ { key: 'random-label-achadney3k', count: 129 },
+ { key: 'random-label-corchard3l', count: 130 },
+ { key: 'random-label-lyerill3m', count: 131 },
+ { key: 'random-label-jrusk3n', count: 132 },
+ { key: 'random-label-lbonelle3o', count: 133 },
+ { key: 'random-label-eduny3p', count: 134 },
+ { key: 'random-label-mhutchence3q', count: 135 },
+ { key: 'random-label-rmargeram3r', count: 136 },
+ { key: 'random-label-smaudlin3s', count: 137 },
+ { key: 'random-label-sfarrance3t', count: 138 },
+ { key: 'random-label-eclendennen3u', count: 139 },
+ { key: 'random-label-cyabsley3v', count: 140 },
+ { key: 'random-label-ahensmans3w', count: 141 },
+ { key: 'random-label-tsenchenko3x', count: 142 },
+ { key: 'random-label-ryurchishin3y', count: 143 },
+ { key: 'random-label-teby3z', count: 144 },
+ { key: 'random-label-dvaillant40', count: 145 },
+ { key: 'random-label-kpetyakov41', count: 146 },
+ { key: 'random-label-cmorrison42', count: 147 },
+ { key: 'random-label-ltwiddy43', count: 148 },
+ { key: 'random-label-ineame44', count: 149 },
+ { key: 'random-label-blucock45', count: 150 },
+ { key: 'random-label-kdunsford46', count: 151 },
+ { key: 'random-label-dducham47', count: 152 },
+ { key: 'random-label-javramovitz48', count: 153 },
+ { key: 'random-label-mascraft49', count: 154 },
+ { key: 'random-label-bloughead4a', count: 155 },
+ { key: 'random-label-sduckit4b', count: 156 },
+ { key: 'random-label-hhardman4c', count: 157 },
+ { key: 'random-label-cstaniforth4d', count: 158 },
+ { key: 'random-label-jedney4e', count: 159 },
+ { key: 'random-label-bobbard4f', count: 160 },
+ { key: 'random-label-cgiraux4g', count: 161 },
+ { key: 'random-label-tkiln4h', count: 162 },
+ { key: 'random-label-jwansbury4i', count: 163 },
+ { key: 'random-label-dquinlan4j', count: 164 },
+ { key: 'random-label-hgindghill4k', count: 165 },
+ { key: 'random-label-jjowle4l', count: 166 },
+ { key: 'random-label-egambrell4m', count: 167 },
+ { key: 'random-label-jmcgloughlin4n', count: 168 },
+ { key: 'random-label-bbabb4o', count: 169 },
+ { key: 'random-label-achuck4p', count: 170 },
+ { key: 'random-label-tsyers4q', count: 171 },
+ { key: 'random-label-jlandon4r', count: 172 },
+ { key: 'random-label-wteather4s', count: 173 },
+ { key: 'random-label-dfoskin4t', count: 174 },
+ { key: 'random-label-gmorlon4u', count: 175 },
+ { key: 'random-label-jseely4v', count: 176 },
+ { key: 'random-label-cbrass4w', count: 177 },
+ { key: 'random-label-fmanilo4x', count: 178 },
+ { key: 'random-label-bfrangleton4y', count: 179 },
+ { key: 'random-label-vbartkiewicz4z', count: 180 },
+ { key: 'random-label-tclymer50', count: 181 },
+ { key: 'random-label-pqueen51', count: 182 },
+ { key: 'random-label-bpol52', count: 183 },
+ { key: 'random-label-jclaeskens53', count: 184 },
+ { key: 'random-label-cstranieri54', count: 185 },
+ { key: 'random-label-drumbelow55', count: 186 },
+ { key: 'random-label-wbrumham56', count: 187 },
+ { key: 'random-label-azeal57', count: 188 },
+ { key: 'random-label-msnooks58', count: 189 },
+ { key: 'random-label-blapre59', count: 190 },
+ { key: 'random-label-cduckers5a', count: 191 },
+ { key: 'random-label-mgumary5b', count: 192 },
+ { key: 'random-label-rtebbs5c', count: 193 },
+ { key: 'random-label-eroe5d', count: 194 },
+ { key: 'random-label-rconfait5e', count: 195 },
+ { key: 'random-label-fsinderland5f', count: 196 },
+ { key: 'random-label-tdallywater5g', count: 197 },
+ { key: 'random-label-glindenman5h', count: 198 },
+ { key: 'random-label-fbauser5i', count: 199 },
+ { key: 'random-label-bdownton5j', count: 200 },
+];
+
+export const MOCK_RECEIVE_AGGREGATIONS_SUCCESS_MUTATION = [
+ {
+ type: types.REQUEST_AGGREGATIONS,
+ },
+ {
+ type: types.RECEIVE_AGGREGATIONS_SUCCESS,
+ payload: MOCK_AGGREGATIONS,
+ },
+];
+
+export const MOCK_RECEIVE_AGGREGATIONS_ERROR_MUTATION = [
+ {
+ type: types.REQUEST_AGGREGATIONS,
+ },
+ {
+ type: types.RECEIVE_AGGREGATIONS_ERROR,
+ },
+];
diff --git a/spec/frontend/search/store/actions_spec.js b/spec/frontend/search/store/actions_spec.js
index 3d19b27ff86..041679e9139 100644
--- a/spec/frontend/search/store/actions_spec.js
+++ b/spec/frontend/search/store/actions_spec.js
@@ -27,6 +27,9 @@ import {
MOCK_NAVIGATION_DATA,
MOCK_NAVIGATION_ACTION_MUTATION,
MOCK_ENDPOINT_RESPONSE,
+ MOCK_RECEIVE_AGGREGATIONS_SUCCESS_MUTATION,
+ MOCK_RECEIVE_AGGREGATIONS_ERROR_MUTATION,
+ MOCK_AGGREGATIONS,
} from '../mock_data';
jest.mock('~/flash');
@@ -295,4 +298,30 @@ describe('Global Search Store Actions', () => {
});
});
});
+
+ describe.each`
+ action | axiosMock | type | expectedMutations | errorLogs
+ ${actions.fetchLanguageAggregation} | ${{ method: 'onGet', code: 200 }} | ${'success'} | ${MOCK_RECEIVE_AGGREGATIONS_SUCCESS_MUTATION} | ${0}
+ ${actions.fetchLanguageAggregation} | ${{ method: 'onPut', code: 0 }} | ${'error'} | ${MOCK_RECEIVE_AGGREGATIONS_ERROR_MUTATION} | ${1}
+ ${actions.fetchLanguageAggregation} | ${{ method: 'onGet', code: 500 }} | ${'error'} | ${MOCK_RECEIVE_AGGREGATIONS_ERROR_MUTATION} | ${1}
+ `('fetchLanguageAggregation', ({ action, axiosMock, type, expectedMutations, errorLogs }) => {
+ describe(`on ${type}`, () => {
+ beforeEach(() => {
+ if (axiosMock.method) {
+ mock[axiosMock.method]().reply(
+ axiosMock.code,
+ axiosMock.code === 200 ? MOCK_AGGREGATIONS : [],
+ );
+ }
+ });
+
+ it(`should ${type === 'error' ? 'NOT ' : ''}dispatch ${
+ type === 'error' ? '' : 'the correct '
+ }mutations`, () => {
+ return testAction({ action, state, expectedMutations }).then(() => {
+ expect(logger.logError).toHaveBeenCalledTimes(errorLogs);
+ });
+ });
+ });
+ });
});
diff --git a/spec/frontend/search/store/getters_spec.js b/spec/frontend/search/store/getters_spec.js
index 081e6a986eb..818902ee720 100644
--- a/spec/frontend/search/store/getters_spec.js
+++ b/spec/frontend/search/store/getters_spec.js
@@ -1,7 +1,13 @@
import { GROUPS_LOCAL_STORAGE_KEY, PROJECTS_LOCAL_STORAGE_KEY } from '~/search/store/constants';
import * as getters from '~/search/store/getters';
import createState from '~/search/store/state';
-import { MOCK_QUERY, MOCK_GROUPS, MOCK_PROJECTS } from '../mock_data';
+import {
+ MOCK_QUERY,
+ MOCK_GROUPS,
+ MOCK_PROJECTS,
+ MOCK_AGGREGATIONS,
+ MOCK_LANGUAGE_AGGREGATIONS_BUCKETS,
+} from '../mock_data';
describe('Global Search Store Getters', () => {
let state;
@@ -29,4 +35,16 @@ describe('Global Search Store Getters', () => {
expect(getters.frequentProjects(state)).toStrictEqual(MOCK_PROJECTS);
});
});
+
+ describe('langugageAggregationBuckets', () => {
+ beforeEach(() => {
+ state.aggregations.data = MOCK_AGGREGATIONS;
+ });
+
+ it('returns the correct data', () => {
+ expect(getters.langugageAggregationBuckets(state)).toStrictEqual(
+ MOCK_LANGUAGE_AGGREGATIONS_BUCKETS,
+ );
+ });
+ });
});
diff --git a/spec/frontend/search/store/mutations_spec.js b/spec/frontend/search/store/mutations_spec.js
index a79ec8f70b0..d604cf38f8f 100644
--- a/spec/frontend/search/store/mutations_spec.js
+++ b/spec/frontend/search/store/mutations_spec.js
@@ -8,6 +8,7 @@ import {
MOCK_NAVIGATION_DATA,
MOCK_NAVIGATION_ACTION_MUTATION,
MOCK_DATA_FOR_NAVIGATION_ACTION_MUTATION,
+ MOCK_AGGREGATIONS,
} from '../mock_data';
describe('Global Search Store Mutations', () => {
@@ -108,4 +109,17 @@ describe('Global Search Store Mutations', () => {
);
});
});
+
+ describe.each`
+ mutation | data | result
+ ${types.REQUEST_AGGREGATIONS} | ${[]} | ${{ fetching: true, error: false, data: [] }}
+ ${types.RECEIVE_AGGREGATIONS_SUCCESS} | ${MOCK_AGGREGATIONS} | ${{ fetching: false, error: false, data: MOCK_AGGREGATIONS }}
+ ${types.RECEIVE_AGGREGATIONS_ERROR} | ${[]} | ${{ fetching: false, error: true, data: [] }}
+ `('$mutation', ({ mutation, data, result }) => {
+ it('sets correct object content', () => {
+ mutations[mutation](state, data);
+
+ expect(state.aggregations).toStrictEqual(result);
+ });
+ });
});
diff --git a/spec/helpers/registrations_helper_spec.rb b/spec/helpers/registrations_helper_spec.rb
index b2f9a794cb3..eec87bc8712 100644
--- a/spec/helpers/registrations_helper_spec.rb
+++ b/spec/helpers/registrations_helper_spec.rb
@@ -8,4 +8,20 @@ RSpec.describe RegistrationsHelper do
expect(helper.signup_username_data_attributes.keys).to include(:min_length, :min_length_message, :max_length, :max_length_message, :qa_selector)
end
end
+
+ describe '#arkose_labs_challenge_enabled?' do
+ before do
+ stub_application_setting(
+ arkose_labs_private_api_key: nil,
+ arkose_labs_public_api_key: nil,
+ arkose_labs_namespace: nil
+ )
+ stub_env('ARKOSE_LABS_PRIVATE_KEY', nil)
+ stub_env('ARKOSE_LABS_PUBLIC_KEY', nil)
+ end
+
+ it 'is false' do
+ expect(helper.arkose_labs_challenge_enabled?).to eq false
+ end
+ end
end
diff --git a/spec/lib/api/entities/merge_request_basic_spec.rb b/spec/lib/api/entities/merge_request_basic_spec.rb
index bb0e25d2613..33f8a806c50 100644
--- a/spec/lib/api/entities/merge_request_basic_spec.rb
+++ b/spec/lib/api/entities/merge_request_basic_spec.rb
@@ -4,11 +4,9 @@ require 'spec_helper'
RSpec.describe ::API::Entities::MergeRequestBasic do
let_it_be(:user) { create(:user) }
- let_it_be(:project) { create(:project, :public) }
let_it_be(:merge_request) { create(:merge_request) }
let_it_be(:labels) { create_list(:label, 3) }
let_it_be(:merge_requests) { create_list(:labeled_merge_request, 10, :unique_branches, labels: labels) }
-
let_it_be(:entity) { described_class.new(merge_request) }
# This mimics the behavior of the `Grape::Entity` serializer
@@ -16,7 +14,7 @@ RSpec.describe ::API::Entities::MergeRequestBasic do
described_class.new(obj).presented
end
- subject { entity.as_json }
+ subject(:json) { entity.as_json }
it 'includes expected fields' do
expected_fields = %i[
@@ -57,7 +55,7 @@ RSpec.describe ::API::Entities::MergeRequestBasic do
end
end
- context 'reviewers' do
+ describe 'reviewers' do
before do
merge_request.reviewers = [user]
end
@@ -68,4 +66,26 @@ RSpec.describe ::API::Entities::MergeRequestBasic do
expect(result['reviewers'][0]['username']).to eq user.username
end
end
+
+ describe 'squash' do
+ subject { json[:squash] }
+
+ before do
+ merge_request.target_project.project_setting.update!(squash_option: :never)
+ merge_request.update!(squash: true)
+ end
+
+ it { is_expected.to eq(true) }
+ end
+
+ describe 'squash_on_merge' do
+ subject { json[:squash_on_merge] }
+
+ before do
+ merge_request.target_project.project_setting.update!(squash_option: :never)
+ merge_request.update!(squash: true)
+ end
+
+ it { is_expected.to eq(false) }
+ end
end
diff --git a/spec/lib/gitlab/auth/ip_rate_limiter_spec.rb b/spec/lib/gitlab/auth/ip_rate_limiter_spec.rb
index 3d9be4c3489..c5703cf5c24 100644
--- a/spec/lib/gitlab/auth/ip_rate_limiter_spec.rb
+++ b/spec/lib/gitlab/auth/ip_rate_limiter_spec.rb
@@ -19,7 +19,7 @@ RSpec.describe Gitlab::Auth::IpRateLimiter, :use_clean_rails_memory_store_cachin
before do
stub_rack_attack_setting(options)
- Rack::Attack.reset!
+ Gitlab::Redis::RateLimiting.with(&:flushdb)
Rack::Attack.clear_configuration
Gitlab::RackAttack.configure(Rack::Attack)
end
diff --git a/spec/lib/gitlab/redis/cluster_rate_limiting_spec.rb b/spec/lib/gitlab/redis/cluster_rate_limiting_spec.rb
new file mode 100644
index 00000000000..3eba3233f08
--- /dev/null
+++ b/spec/lib/gitlab/redis/cluster_rate_limiting_spec.rb
@@ -0,0 +1,7 @@
+# frozen_string_literal: true
+
+require 'spec_helper'
+
+RSpec.describe Gitlab::Redis::ClusterRateLimiting, feature_category: :redis do
+ include_examples "redis_new_instance_shared_examples", 'cluster_rate_limiting', Gitlab::Redis::Cache
+end
diff --git a/spec/lib/gitlab/redis/multi_store_spec.rb b/spec/lib/gitlab/redis/multi_store_spec.rb
index 74b38cfa464..4c23f621b0f 100644
--- a/spec/lib/gitlab/redis/multi_store_spec.rb
+++ b/spec/lib/gitlab/redis/multi_store_spec.rb
@@ -1195,7 +1195,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when FF table guard raises' do
before do
- allow(Feature::FlipperFeature).to receive(:table_exists?).and_raise
+ allow(Feature::FlipperFeature).to receive(:table_exists?).and_raise(ActiveRecord::NoDatabaseError)
end
it 'multi store is disabled' do
@@ -1221,7 +1221,7 @@ RSpec.describe Gitlab::Redis::MultiStore, feature_category: :redis do
context 'when FF table guard raises' do
before do
- allow(Feature::FlipperFeature).to receive(:table_exists?).and_raise
+ allow(Feature::FlipperFeature).to receive(:table_exists?).and_raise(ActiveRecord::NoDatabaseError)
end
it 'multi store is disabled' do
diff --git a/spec/lib/gitlab/slash_commands/command_spec.rb b/spec/lib/gitlab/slash_commands/command_spec.rb
index f4664bcfef9..7e3ff46fae5 100644
--- a/spec/lib/gitlab/slash_commands/command_spec.rb
+++ b/spec/lib/gitlab/slash_commands/command_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe Gitlab::SlashCommands::Command do
+RSpec.describe Gitlab::SlashCommands::Command, feature_category: :integrations do
let(:project) { create(:project, :repository) }
let(:user) { create(:user) }
let(:chat_name) { double(:chat_name, user: user) }
@@ -28,7 +28,7 @@ RSpec.describe Gitlab::SlashCommands::Command do
it 'displays the help message' do
expect(subject[:response_type]).to be(:ephemeral)
expect(subject[:text]).to start_with('The specified command is not valid')
- expect(subject[:text]).to match('/gitlab issue show')
+ expect(subject[:text]).to include('/gitlab [project name or alias] issue show <id>')
end
end
diff --git a/spec/models/concerns/require_email_verification_spec.rb b/spec/models/concerns/require_email_verification_spec.rb
index d087b2864f8..0a6293f852e 100644
--- a/spec/models/concerns/require_email_verification_spec.rb
+++ b/spec/models/concerns/require_email_verification_spec.rb
@@ -2,7 +2,7 @@
require 'spec_helper'
-RSpec.describe RequireEmailVerification do
+RSpec.describe RequireEmailVerification, feature_category: :insider_threat do
let_it_be(:model) do
Class.new(ApplicationRecord) do
self.table_name = 'users'
@@ -15,11 +15,15 @@ RSpec.describe RequireEmailVerification do
using RSpec::Parameterized::TableSyntax
- where(:feature_flag_enabled, :two_factor_enabled, :overridden) do
- false | false | false
- false | true | false
- true | false | true
- true | true | false
+ where(:feature_flag_enabled, :two_factor_enabled, :skipped, :overridden) do
+ false | false | false | false
+ false | false | true | false
+ false | true | false | false
+ false | true | true | false
+ true | false | false | true
+ true | false | true | false
+ true | true | false | false
+ true | true | true | false
end
with_them do
@@ -29,6 +33,7 @@ RSpec.describe RequireEmailVerification do
before do
stub_feature_flags(require_email_verification: feature_flag_enabled ? instance : another_instance)
allow(instance).to receive(:two_factor_enabled?).and_return(two_factor_enabled)
+ stub_feature_flags(skip_require_email_verification: skipped ? instance : another_instance)
end
describe '#lock_access!' do
diff --git a/spec/requests/verifies_with_email_spec.rb b/spec/requests/verifies_with_email_spec.rb
index cac754a9cb1..8a6a7e717ff 100644
--- a/spec/requests/verifies_with_email_spec.rb
+++ b/spec/requests/verifies_with_email_spec.rb
@@ -223,6 +223,7 @@ feature_category: :user_management do
context 'when the feature flag is toggled on' do
before do
stub_feature_flags(require_email_verification: user)
+ stub_feature_flags(skip_require_email_verification: false)
end
it_behaves_like 'verifying with email'
@@ -242,6 +243,14 @@ feature_category: :user_management do
it_behaves_like 'verifying with email'
end
+
+ context 'when the skip_require_email_verification feature flag is turned on' do
+ before do
+ stub_feature_flags(skip_require_email_verification: user)
+ end
+
+ it_behaves_like 'not verifying with email'
+ end
end
end
end
diff --git a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
index 82ed6eb4c95..3f457890f35 100644
--- a/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
+++ b/spec/support/shared_examples/requests/rack_attack_shared_examples.rb
@@ -382,7 +382,7 @@ RSpec.shared_examples 'tracking when dry-run mode is set' do
end
def reset_rack_attack
- Rack::Attack.reset!
+ Gitlab::Redis::RateLimiting.with(&:flushdb)
Rack::Attack.clear_configuration
Gitlab::RackAttack.configure(Rack::Attack)
end
diff --git a/workhorse/go.mod b/workhorse/go.mod
index c9b83553edb..7c905f6e2b3 100644
--- a/workhorse/go.mod
+++ b/workhorse/go.mod
@@ -35,7 +35,7 @@ require (
golang.org/x/net v0.5.0
golang.org/x/oauth2 v0.2.0
golang.org/x/tools v0.2.0
- google.golang.org/grpc v1.52.0
+ google.golang.org/grpc v1.52.3
google.golang.org/protobuf v1.28.1
honnef.co/go/tools v0.3.3
)
diff --git a/workhorse/go.sum b/workhorse/go.sum
index 6cf889201bf..b1cb3634898 100644
--- a/workhorse/go.sum
+++ b/workhorse/go.sum
@@ -2699,8 +2699,8 @@ google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD
google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI=
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
-google.golang.org/grpc v1.52.0 h1:kd48UiU7EHsV4rnLyOJRuP/Il/UHE7gdDAQ+SZI7nZk=
-google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
+google.golang.org/grpc v1.52.3 h1:pf7sOysg4LdgBqduXveGKrcEwbStiK2rtfghdzlUYDQ=
+google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=