Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
		
							parent
							
								
									059cc73b5f
								
							
						
					
					
						commit
						daf5e72855
					
				|  | @ -39,7 +39,7 @@ export default { | ||||||
|     projectsFetchError: __('There was a problem fetching the projects'), |     projectsFetchError: __('There was a problem fetching the projects'), | ||||||
|     scopeFetchError: __('There was a problem fetching the job token scope value'), |     scopeFetchError: __('There was a problem fetching the job token scope value'), | ||||||
|     outboundTokenAlertDeprecationMessage: s__( |     outboundTokenAlertDeprecationMessage: s__( | ||||||
|       `CICD|The %{boldStart}Limit CI_JOB_TOKEN%{boldEnd} scope is deprecated and will be removed the 17.0 milestone. Configure the %{boldStart}CI_JOB_TOKEN%{boldEnd} allowlist instead. %{linkStart}How do I do this?%{linkEnd}`, |       `CICD|The %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}from%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting is deprecated and will be removed in the 18.0 milestone. Use the %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}to%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting and allowlist instead. %{linkStart}How do I do this?%{linkEnd}`, | ||||||
|     ), |     ), | ||||||
|     disableToggleWarning: s__('CICD|Disabling this feature is a permanent change.'), |     disableToggleWarning: s__('CICD|Disabling this feature is a permanent change.'), | ||||||
|   }, |   }, | ||||||
|  | @ -223,6 +223,11 @@ export default { | ||||||
|           <template #bold="{ content }"> |           <template #bold="{ content }"> | ||||||
|             <strong>{{ content }}</strong> |             <strong>{{ content }}</strong> | ||||||
|           </template> |           </template> | ||||||
|  |           <template #italicAndBold="{ content }"> | ||||||
|  |             <i | ||||||
|  |               ><strong>{{ content }}</strong></i | ||||||
|  |             > | ||||||
|  |           </template> | ||||||
|           <template #link="{ content }"> |           <template #link="{ content }"> | ||||||
|             <gl-link |             <gl-link | ||||||
|               :href="$options.deprecationDocumentationLink" |               :href="$options.deprecationDocumentationLink" | ||||||
|  |  | ||||||
|  | @ -298,8 +298,8 @@ class Namespace < ApplicationRecord | ||||||
|         .order( |         .order( | ||||||
|           Arel.sql(sanitize_sql( |           Arel.sql(sanitize_sql( | ||||||
|             [ |             [ | ||||||
|               "CASE WHEN starts_with(REPLACE(routes.name, ' ', ''), :pattern) OR starts_with(routes.path, :pattern) THEN 1 ELSE 2 END", |               "CASE WHEN REPLACE(routes.name, ' ', '') ILIKE :prefix_pattern OR routes.path ILIKE :prefix_pattern THEN 1 ELSE 2 END", | ||||||
|               { pattern: query } |               { prefix_pattern: "#{sanitize_sql_like(query)}%" } | ||||||
|             ] |             ] | ||||||
|           )), |           )), | ||||||
|           'routes.path' |           'routes.path' | ||||||
|  |  | ||||||
|  | @ -903,8 +903,8 @@ class User < MainClusterwide::ApplicationRecord | ||||||
|       ).order( |       ).order( | ||||||
|         Arel.sql(sanitize_sql( |         Arel.sql(sanitize_sql( | ||||||
|           [ |           [ | ||||||
|             "CASE WHEN starts_with(REPLACE(users.name, ' ', ''), :pattern) OR starts_with(users.username, :pattern) THEN 1 ELSE 2 END", |             "CASE WHEN REPLACE(users.name, ' ', '') ILIKE :prefix_pattern OR users.username ILIKE :prefix_pattern THEN 1 ELSE 2 END", | ||||||
|             { pattern: query } |             { prefix_pattern: "#{sanitize_sql_like(query)}%" } | ||||||
|           ] |           ] | ||||||
|         )), |         )), | ||||||
|         :username, |         :username, | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ If successful, returns [`200`](rest/index.md#status-codes) and the following res | ||||||
| | Attribute          | Type    | Description | | | Attribute          | Type    | Description | | ||||||
| |--------------------|---------|-------------| | |--------------------|---------|-------------| | ||||||
| | `inbound_enabled`  | boolean | Indicates if the [**Limit access _to_ this project** setting](../ci/jobs/ci_job_token.md#add-a-project-to-the-job-token-allowlist) is enabled. | | | `inbound_enabled`  | boolean | Indicates if the [**Limit access _to_ this project** setting](../ci/jobs/ci_job_token.md#add-a-project-to-the-job-token-allowlist) is enabled. | | ||||||
| | `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 17.0](../update/deprecations.md#default-cicd-job-token-ci_job_token-scope-changed). | | | `outbound_enabled` | boolean | Indicates if the CI/CD job token generated in this project has access to other projects. [Deprecated and planned for removal in GitLab 18.0](../update/deprecations.md#default-cicd-job-token-ci_job_token-scope-changed). | | ||||||
| 
 | 
 | ||||||
| Example request: | Example request: | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -240,15 +240,19 @@ Check [`production.log`](../../administration/logs/index.md#productionlog) to se | ||||||
| 
 | 
 | ||||||
| If that's the case, ensure the [**Due date** field is visible for issues](https://confluence.atlassian.com/jirakb/due-date-field-is-missing-189431917.html) in the integrated Jira project. | If that's the case, ensure the [**Due date** field is visible for issues](https://confluence.atlassian.com/jirakb/due-date-field-is-missing-189431917.html) in the integrated Jira project. | ||||||
| 
 | 
 | ||||||
| ### `An error occurred while requesting data from Jira` | ### Error when requesting data from Jira | ||||||
| 
 | 
 | ||||||
| When you try to view the Jira issue list in GitLab, you might get this message: | When you try to view the Jira issue list or create a Jira issue in GitLab, you might get one of the following errors: | ||||||
| 
 | 
 | ||||||
| ```plaintext | ```plaintext | ||||||
| An error occurred while requesting data from Jira | An error occurred while requesting data from Jira | ||||||
| ``` | ``` | ||||||
| 
 | 
 | ||||||
| This error occurs when the authentication for the Jira issue integration is not complete or correct. | ```plaintext | ||||||
|  | An error occurred while fetching issue list. Connection failed. Check your integration settings. | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | These errors occur when the authentication for the Jira issue integration is not complete or correct. | ||||||
| 
 | 
 | ||||||
| To resolve this issue, [configure the Jira issue integration](configure.md#configure-the-integration) again. | To resolve this issue, [configure the Jira issue integration](configure.md#configure-the-integration) again. | ||||||
| Ensure the authentication details are correct, enter your API token or password again, and save your changes. | Ensure the authentication details are correct, enter your API token or password again, and save your changes. | ||||||
|  |  | ||||||
|  | @ -40,10 +40,10 @@ The following languages are supported: | ||||||
| | C                | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | | | C                | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | C++              | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | C++              | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | C#               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | C#               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | CSS              | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | | CSS              | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||||
| | Go               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Go               | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Google SQL       | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Google SQL       | **{dotted-circle}** No | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | HTML             | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | | HTML             | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||||
| | Java             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Java             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | JavaScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | JavaScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Kotlin           | **{check-circle}** Yes <br><br>(Requires third-party extension providing Kotlin support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Kotlin           | **{check-circle}** Yes <br><br>(Requires third-party extension providing Kotlin support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
|  | @ -52,7 +52,7 @@ The following languages are supported: | ||||||
| | Ruby             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Ruby             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Rust             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Rust             | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Scala            | **{check-circle}** Yes <br><br>(Requires third-party extension providing Scala support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Scala            | **{check-circle}** Yes <br><br>(Requires third-party extension providing Scala support) | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Shell scripts (`bash` only) | **{dotted-circle}** No  | **{check-circle}** Yes | **{dotted-circle}** No  | **{dotted-circle}** No  | | | Shell scripts (`bash` only) | **{dotted-circle}** No  | **{check-circle}** Yes | **{check-circle}** Yes  | **{check-circle}** Yes  | | ||||||
| | Swift            | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | Swift            | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | TypeScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | | TypeScript       | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | **{check-circle}** Yes | | ||||||
| | Terraform        | **{check-circle}** Yes <br><br>(Requires third-party extension providing Terraform support) | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes <br><br>(Requires third-party extension providing the `terraform` file type) | | | Terraform        | **{check-circle}** Yes <br><br>(Requires third-party extension providing Terraform support) | **{check-circle}** Yes | **{dotted-circle}** No | **{check-circle}** Yes <br><br>(Requires third-party extension providing the `terraform` file type) | | ||||||
|  |  | ||||||
|  | @ -46,25 +46,32 @@ module Gitlab | ||||||
|         @queue ||= worker_class.sidekiq_options['queue'] |         @queue ||= worker_class.sidekiq_options['queue'] | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  |       def sidekiq_redis_pool | ||||||
|  |         @sidekiq_redis_pool ||= | ||||||
|  |           Gitlab::SidekiqSharding::Router.get_shard_instance(worker_class.sidekiq_options['store']).last | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|       def with_shared_connection(&block) |       def with_shared_connection(&block) | ||||||
|         Gitlab::Database::SharedModel.using_connection(connection, &block) |         Gitlab::Database::SharedModel.using_connection(connection, &block) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       def pending_jobs(include_dead_jobs: false) |       def pending_jobs(include_dead_jobs: false) | ||||||
|         Enumerator.new do |y| |         Enumerator.new do |y| | ||||||
|           queues = [ |           Sidekiq::Client.via(sidekiq_redis_pool) do | ||||||
|             Sidekiq::ScheduledSet.new, |             queues = [ | ||||||
|             Sidekiq::Queue.new(self.queue) |               Sidekiq::ScheduledSet.new, | ||||||
|           ] |               Sidekiq::Queue.new(self.queue) | ||||||
|  |             ] | ||||||
| 
 | 
 | ||||||
|           if include_dead_jobs |             if include_dead_jobs | ||||||
|             queues << Sidekiq::RetrySet.new |               queues << Sidekiq::RetrySet.new | ||||||
|             queues << Sidekiq::DeadSet.new |               queues << Sidekiq::DeadSet.new | ||||||
|           end |             end | ||||||
| 
 | 
 | ||||||
|           queues.each do |queue| |             queues.each do |queue| | ||||||
|             queue.each do |job| |               queue.each do |job| | ||||||
|               y << job if job.klass == worker_class.name |                 y << job if job.klass == worker_class.name | ||||||
|  |               end | ||||||
|             end |             end | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|  | @ -72,19 +79,21 @@ module Gitlab | ||||||
| 
 | 
 | ||||||
|       def steal(steal_class, retry_dead_jobs: false) |       def steal(steal_class, retry_dead_jobs: false) | ||||||
|         with_shared_connection do |         with_shared_connection do | ||||||
|           pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job| |           Sidekiq::Client.via(sidekiq_redis_pool) do | ||||||
|             migration_class, migration_args = job.args |             pending_jobs(include_dead_jobs: retry_dead_jobs).each do |job| | ||||||
|  |               migration_class, migration_args = job.args | ||||||
| 
 | 
 | ||||||
|             next unless migration_class == steal_class |               next unless migration_class == steal_class | ||||||
|             next if block_given? && !(yield job) |               next if block_given? && !(yield job) | ||||||
| 
 | 
 | ||||||
|             begin |               begin | ||||||
|               perform(migration_class, migration_args) if job.delete |                 perform(migration_class, migration_args) if job.delete | ||||||
|             rescue Exception # rubocop:disable Lint/RescueException |               rescue Exception # rubocop:disable Lint/RescueException | ||||||
|               worker_class # enqueue this migration again |                 worker_class # enqueue this migration again | ||||||
|                 .perform_async(migration_class, migration_args) |                   .perform_async(migration_class, migration_args) | ||||||
| 
 | 
 | ||||||
|               raise |                 raise | ||||||
|  |               end | ||||||
|             end |             end | ||||||
|           end |           end | ||||||
|         end |         end | ||||||
|  |  | ||||||
|  | @ -9658,7 +9658,7 @@ msgstr "" | ||||||
| msgid "CICD|Prevent access to this project from other project CI/CD job tokens, unless the other project is added to the allowlist. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API. %{linkStart}Learn more.%{linkEnd}" | msgid "CICD|Prevent access to this project from other project CI/CD job tokens, unless the other project is added to the allowlist. It is a security risk to disable this feature, because unauthorized projects might attempt to retrieve an active token and access the API. %{linkStart}Learn more.%{linkEnd}" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "CICD|The %{boldStart}Limit CI_JOB_TOKEN%{boldEnd} scope is deprecated and will be removed the 17.0 milestone. Configure the %{boldStart}CI_JOB_TOKEN%{boldEnd} allowlist instead. %{linkStart}How do I do this?%{linkEnd}" | msgid "CICD|The %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}from%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting is deprecated and will be removed in the 18.0 milestone. Use the %{boldStart}Limit access %{boldEnd}%{italicAndBoldStart}to%{italicAndBoldEnd}%{boldStart} this project%{boldEnd} setting and allowlist instead. %{linkStart}How do I do this?%{linkEnd}" | ||||||
| msgstr "" | msgstr "" | ||||||
| 
 | 
 | ||||||
| msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}" | msgid "CICD|The Auto DevOps pipeline runs by default in all projects with no CI/CD configuration file. %{link_start}What is Auto DevOps?%{link_end}" | ||||||
|  |  | ||||||
|  | @ -28,7 +28,7 @@ module QA | ||||||
|         ssh_key.remove_via_api! |         ssh_key.remove_via_api! | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347793' do |       it 'clones, pushes, and pulls a snippet over HTTP, edits via UI', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347793' do | ||||||
|         push = Resource::Repository::Push.fabricate! do |push| |         push = Resource::Repository::Push.fabricate! do |push| | ||||||
|           push.repository_http_uri = repository_uri_http |           push.repository_http_uri = repository_uri_http | ||||||
|           push.file_name = new_file |           push.file_name = new_file | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ module QA | ||||||
|         Flow::Login.sign_in |         Flow::Login.sign_in | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       it 'creates a personal snippet with multiple files', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347723' do |       it 'creates a personal snippet with multiple files', :blocking, testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/347723' do | ||||||
|         snippet |         snippet | ||||||
| 
 | 
 | ||||||
|         Page::Dashboard::Snippet::Show.perform do |snippet| |         Page::Dashboard::Snippet::Show.perform do |snippet| | ||||||
|  |  | ||||||
|  | @ -171,6 +171,7 @@ RSpec.describe '.gitlab/ci/rules.gitlab-ci.yml', feature_category: :tooling do | ||||||
|         '.gitlab/CODEOWNERS', |         '.gitlab/CODEOWNERS', | ||||||
|         '.gitleaksignore', |         '.gitleaksignore', | ||||||
|         '.gitpod.yml', |         '.gitpod.yml', | ||||||
|  |         '.graphqlrc', | ||||||
|         '.index.yml.example', |         '.index.yml.example', | ||||||
|         '.license_encryption_key.pub', |         '.license_encryption_key.pub', | ||||||
|         '.mailmap', |         '.mailmap', | ||||||
|  |  | ||||||
|  | @ -7,6 +7,12 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | ||||||
|   let(:tracking_database) { worker_class.tracking_database } |   let(:tracking_database) { worker_class.tracking_database } | ||||||
|   let(:coordinator) { described_class.new(worker_class) } |   let(:coordinator) { described_class.new(worker_class) } | ||||||
| 
 | 
 | ||||||
|  |   let(:redis_pool) do | ||||||
|  |     params = Gitlab::Redis::Queues.params | ||||||
|  |     params[:db] = params[:db] + 1 if params[:db] | ||||||
|  |     Sidekiq::RedisConnection.create(params) # rubocop:disable Rails/SaveBang -- RedisConnection only has .create | ||||||
|  |   end | ||||||
|  | 
 | ||||||
|   describe '.for_tracking_database' do |   describe '.for_tracking_database' do | ||||||
|     it 'returns an executor with the correct worker class and database' do |     it 'returns an executor with the correct worker class and database' do | ||||||
|       coordinator = described_class.for_tracking_database(tracking_database) |       coordinator = described_class.for_tracking_database(tracking_database) | ||||||
|  | @ -74,8 +80,24 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | ||||||
|         allow(Sidekiq::DeadSet).to receive(:new).and_return(dead_set) |         allow(Sidekiq::DeadSet).to receive(:new).and_return(dead_set) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  |       context 'when using a different shard instance' do | ||||||
|  |         before do | ||||||
|  |           if coordinator.instance_variable_defined?(:@sidekiq_redis_pool) | ||||||
|  |             coordinator.remove_instance_variable(:@sidekiq_redis_pool) | ||||||
|  |           end | ||||||
|  | 
 | ||||||
|  |           allow(Gitlab::SidekiqSharding::Router).to receive(:get_shard_instance).and_return(['shard', redis_pool]) | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         it 'uses the appropriate shard for the store' do | ||||||
|  |           expect(Sidekiq::Client).to receive(:via).with(redis_pool) | ||||||
|  | 
 | ||||||
|  |           coordinator.pending_jobs.to_a | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|       it 'does not include jobs for other workers' do |       it 'does not include jobs for other workers' do | ||||||
|         expect(coordinator.pending_jobs).not_to include(queue_incorrect_job_class.first) |         expect(coordinator.pending_jobs.to_a).not_to include(queue_incorrect_job_class.first) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|       context 'when not including dead jobs' do |       context 'when not including dead jobs' do | ||||||
|  | @ -108,6 +130,22 @@ RSpec.describe Gitlab::BackgroundMigration::JobCoordinator do | ||||||
|           .and_return(queue) |           .and_return(queue) | ||||||
|       end |       end | ||||||
| 
 | 
 | ||||||
|  |       context 'when using a different shard instance' do | ||||||
|  |         before do | ||||||
|  |           if coordinator.instance_variable_defined?(:@sidekiq_redis_pool) | ||||||
|  |             coordinator.remove_instance_variable(:@sidekiq_redis_pool) | ||||||
|  |           end | ||||||
|  | 
 | ||||||
|  |           allow(Gitlab::SidekiqSharding::Router).to receive(:get_shard_instance).and_return(['shard', redis_pool]) | ||||||
|  |         end | ||||||
|  | 
 | ||||||
|  |         it 'wraps job processing within Sidekiq::Client.via' do | ||||||
|  |           expect(Sidekiq::Client).to receive(:via).with(redis_pool) | ||||||
|  | 
 | ||||||
|  |           coordinator.steal('Foo') | ||||||
|  |         end | ||||||
|  |       end | ||||||
|  | 
 | ||||||
|       context 'when queue contains unprocessed jobs' do |       context 'when queue contains unprocessed jobs' do | ||||||
|         it 'steals jobs from a queue' do |         it 'steals jobs from a queue' do | ||||||
|           expect(queue[0]).to receive(:delete).and_return(true) |           expect(queue[0]).to receive(:delete).and_return(true) | ||||||
|  |  | ||||||
|  | @ -1166,7 +1166,7 @@ RSpec.describe Namespace, feature_category: :groups_and_projects do | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     it 'prioritizes sorting of matches that start with the query' do |     it 'prioritizes sorting of matches that start with the query' do | ||||||
|       expect(described_class.gfm_autocomplete_search('pare')).to eq([parent_group, group_1, group_2]) |       expect(described_class.gfm_autocomplete_search('pArE')).to eq([parent_group, group_1, group_2]) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     it 'falls back to sorting by full path' do |     it 'falls back to sorting by full path' do | ||||||
|  |  | ||||||
|  | @ -3570,7 +3570,7 @@ RSpec.describe User, feature_category: :user_profile do | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     it 'prioritizes sorting of matches that start with the query' do |     it 'prioritizes sorting of matches that start with the query' do | ||||||
|       expect(described_class.gfm_autocomplete_search('user')).to eq([user_2, user_1]) |       expect(described_class.gfm_autocomplete_search('uSeR')).to eq([user_2, user_1]) | ||||||
|     end |     end | ||||||
| 
 | 
 | ||||||
|     it 'falls back to sorting by username' do |     it 'falls back to sorting by username' do | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue