Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-02-23 12:10:23 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-02-23 12:10:23 +0300
commit946a41d182e40dd37f73c44721edc9bc9c1a0f7c (patch)
tree28f1f399faebd1bd7084522919bd8b6354c3debd
parent8b4276f873461953ee5a1fc46f084779f5847e3a (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--Gemfile2
-rw-r--r--Gemfile.checksum2
-rw-r--r--Gemfile.lock6
-rw-r--r--app/assets/javascripts/diffs/components/file_row_stats.vue2
-rw-r--r--app/assets/javascripts/ref/components/ref_selector.vue1
-rw-r--r--app/assets/javascripts/work_items/components/work_item_actions.vue1
-rw-r--r--app/assets/stylesheets/framework/modal.scss2
-rw-r--r--app/graphql/resolvers/project_merge_requests_resolver.rb8
-rw-r--r--config/feature_flags/development/vue_issues_dashboard.yml2
-rw-r--r--doc/api/users.md2
-rw-r--r--doc/development/database/add_foreign_key_to_existing_column.md19
-rw-r--r--doc/development/deprecation_guidelines/index.md2
-rw-r--r--doc/development/fe_guide/source_editor.md2
-rw-r--r--lib/tasks/gitlab/db.rake30
-rw-r--r--spec/requests/api/graphql/project/merge_requests_spec.rb3
-rw-r--r--spec/tasks/gitlab/db_rake_spec.rb74
16 files changed, 137 insertions, 21 deletions
diff --git a/Gemfile b/Gemfile
index a38c9361be7..48d61eae910 100644
--- a/Gemfile
+++ b/Gemfile
@@ -373,7 +373,7 @@ gem 'prometheus-client-mmap', '~> 0.17', require: 'prometheus/client'
gem 'warning', '~> 1.3.0'
group :development do
- gem 'lefthook', '~> 1.3.0', require: false
+ gem 'lefthook', '~> 1.2.9', require: false
gem 'rubocop'
gem 'solargraph', '~> 0.47.2', require: false
diff --git a/Gemfile.checksum b/Gemfile.checksum
index 24ae815ae2e..2dbcae42f0f 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -314,7 +314,7 @@
{"name":"kramdown","version":"2.3.2","platform":"ruby","checksum":"cb4530c2e9d16481591df2c9336723683c354e5416a5dd3e447fa48215a6a71c"},
{"name":"kramdown-parser-gfm","version":"1.1.0","platform":"ruby","checksum":"fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729"},
{"name":"launchy","version":"2.5.0","platform":"ruby","checksum":"954243c4255920982ce682f89a42e76372dba94770bf09c23a523e204bdebef5"},
-{"name":"lefthook","version":"1.3.0","platform":"ruby","checksum":"46460ceb0084d1a60c7aa2872c90fd9a97d92c32063b41ac88303e1d1a382b43"},
+{"name":"lefthook","version":"1.2.9","platform":"ruby","checksum":"1fd4a768e08fc624e756597fc628b3c7991267325974a7a5cc169595b425701d"},
{"name":"letter_opener","version":"1.7.0","platform":"ruby","checksum":"095bc0d58e006e5b43ea7d219e64ecf2de8d1f7d9dafc432040a845cf59b4725"},
{"name":"letter_opener_web","version":"2.0.0","platform":"ruby","checksum":"33860ad41e1785d75456500e8ca8bba8ed71ee6eaf08a98d06bbab67c5577b6f"},
{"name":"libyajl2","version":"1.2.0","platform":"ruby","checksum":"1117cd1e48db013b626e36269bbf1cef210538ca6d2e62d3fa3db9ded005b258"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 3b0ee82c3c3..a3d6dc31fb6 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -845,7 +845,7 @@ GEM
kramdown (~> 2.0)
launchy (2.5.0)
addressable (~> 2.7)
- lefthook (1.3.0)
+ lefthook (1.2.9)
letter_opener (1.7.0)
launchy (~> 2.2)
letter_opener_web (2.0.0)
@@ -1738,7 +1738,7 @@ DEPENDENCIES
knapsack (~> 1.21.1)
kramdown (~> 2.3.1)
kubeclient (~> 4.9.3)!
- lefthook (~> 1.3.0)
+ lefthook (~> 1.2.9)
letter_opener_web (~> 2.0.0)
license_finder (~> 7.0)
licensee (~> 9.15)
@@ -1893,4 +1893,4 @@ DEPENDENCIES
yajl-ruby (~> 1.4.3)
BUNDLED WITH
- 2.4.7
+ 2.4.6
diff --git a/app/assets/javascripts/diffs/components/file_row_stats.vue b/app/assets/javascripts/diffs/components/file_row_stats.vue
index 784f74e498f..f99f363a6be 100644
--- a/app/assets/javascripts/diffs/components/file_row_stats.vue
+++ b/app/assets/javascripts/diffs/components/file_row_stats.vue
@@ -10,7 +10,7 @@ export default {
</script>
<template>
- <span v-once class="file-row-stats">
+ <span class="file-row-stats">
<span class="cgreen"> +{{ file.addedLines }} </span>
<span class="cred"> -{{ file.removedLines }} </span>
</span>
diff --git a/app/assets/javascripts/ref/components/ref_selector.vue b/app/assets/javascripts/ref/components/ref_selector.vue
index 359909b8f3b..9826124912b 100644
--- a/app/assets/javascripts/ref/components/ref_selector.vue
+++ b/app/assets/javascripts/ref/components/ref_selector.vue
@@ -119,6 +119,7 @@ export default {
'gl-inset-border-1-red-500!': !this.state,
'gl-font-monospace': Boolean(this.selectedRef),
},
+ 'gl-mb-0',
];
if (Array.isArray(this.toggleButtonClass)) {
diff --git a/app/assets/javascripts/work_items/components/work_item_actions.vue b/app/assets/javascripts/work_items/components/work_item_actions.vue
index 9f9d94ec3c2..3c56b627673 100644
--- a/app/assets/javascripts/work_items/components/work_item_actions.vue
+++ b/app/assets/javascripts/work_items/components/work_item_actions.vue
@@ -115,6 +115,7 @@ export default {
v-if="canDelete"
v-gl-modal="'work-item-confirm-delete'"
data-testid="delete-action"
+ variant="danger"
>{{ i18n.deleteWorkItem }}</gl-dropdown-item
>
</gl-dropdown>
diff --git a/app/assets/stylesheets/framework/modal.scss b/app/assets/stylesheets/framework/modal.scss
index c9b17f5d5c4..f76a9cf0373 100644
--- a/app/assets/stylesheets/framework/modal.scss
+++ b/app/assets/stylesheets/framework/modal.scss
@@ -45,7 +45,7 @@
margin: #{2 * $grid-size} #{-2 * $grid-size} #{-2 * $grid-size};
}
- .text-danger {
+ .text-danger:not(.dropdown-item) {
font-weight: $gl-font-weight-bold;
}
}
diff --git a/app/graphql/resolvers/project_merge_requests_resolver.rb b/app/graphql/resolvers/project_merge_requests_resolver.rb
index 66c020a0c14..6a240541341 100644
--- a/app/graphql/resolvers/project_merge_requests_resolver.rb
+++ b/app/graphql/resolvers/project_merge_requests_resolver.rb
@@ -22,7 +22,13 @@ module Resolvers
def only_count_is_selected_with_merged_at_filter?(args)
return unless lookahead
- argument_names = args.compact.except(:lookahead, :sort, :merged_before, :merged_after).keys
+ # Filter out all elements with blank values. If any of the values are not
+ # scalars, e.g. hashes or array, filter blank values from them and remove
+ # them if the resulting collection is empty.
+ argument_names = args.except(:lookahead, :sort, :merged_before, :merged_after).filter_map do |key, value|
+ value = value.to_hash.compact if value.respond_to?(:to_hash)
+ key if value.present?
+ end
# no extra filtering arguments are provided
return unless argument_names.empty?
diff --git a/config/feature_flags/development/vue_issues_dashboard.yml b/config/feature_flags/development/vue_issues_dashboard.yml
index 133343b3a3c..3091cf8b8b4 100644
--- a/config/feature_flags/development/vue_issues_dashboard.yml
+++ b/config/feature_flags/development/vue_issues_dashboard.yml
@@ -5,4 +5,4 @@ rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/379025
milestone: '15.6'
type: development
group: group::project management
-default_enabled: false
+default_enabled: true
diff --git a/doc/api/users.md b/doc/api/users.md
index 4ecb3d48c0f..f877aa29b9c 100644
--- a/doc/api/users.md
+++ b/doc/api/users.md
@@ -41,7 +41,7 @@ GET /users
You can also use `?search=` to search for users by name, username, or public email. For example, `/users?search=John`. When you search for a:
-- Public email, you must use the full email address to get an exact match.
+- Public email, you must use the full email address to get an exact match. A search might return a partial match. For example, if you search for the email `on@example.com`, the search can return both `on@example.com` and `jon@example.com`.
- Name or username, you do not have to get an exact match because this is a fuzzy search.
In addition, you can lookup users by username:
diff --git a/doc/development/database/add_foreign_key_to_existing_column.md b/doc/development/database/add_foreign_key_to_existing_column.md
index 2c2999e69d6..a64fc047a57 100644
--- a/doc/development/database/add_foreign_key_to_existing_column.md
+++ b/doc/development/database/add_foreign_key_to_existing_column.md
@@ -155,13 +155,13 @@ To limit impact on GitLab.com, a process exists to validate them asynchronously
during weekend hours. Due to generally lower traffic and fewer deployments,
FK validation can proceed at a lower level of risk.
-### Schedule foreign key validation for a low-impact time
+#### Schedule foreign key validation for a low-impact time
1. [Schedule the FK to be validated](#schedule-the-fk-to-be-validated).
1. [Verify the MR was deployed and the FK is valid in production](#verify-the-mr-was-deployed-and-the-fk-is-valid-in-production).
1. [Add a migration to validate the FK synchronously](#add-a-migration-to-validate-the-fk-synchronously).
-### Schedule the FK to be validated
+#### Schedule the FK to be validated
1. Create a merge request containing a post-deployment migration, which prepares
the foreign key for asynchronous validation.
@@ -198,7 +198,7 @@ def down
end
```
-### Verify the MR was deployed and the FK is valid in production
+#### Verify the MR was deployed and the FK is valid in production
1. Verify that the post-deploy migration was executed on GitLab.com using ChatOps with
`/chatops run auto_deploy status <merge_sha>`. If the output returns `db/gprd`,
@@ -208,7 +208,7 @@ end
1. Use [Database Lab](database_lab.md) to check if validation was successful.
Ensure the output does not indicate the foreign key is `NOT VALID`.
-### Add a migration to validate the FK synchronously
+#### Add a migration to validate the FK synchronously
After the foreign key is valid on the production database, create a second
merge request that validates the foreign key synchronously. The schema changes
@@ -240,19 +240,20 @@ end
```
-## Test database FK changes locally
+### Test database FK changes locally
You must test the database foreign key changes locally before creating a merge request.
-### Verify the foreign keys validated asynchronously
+#### Verify the foreign keys validated asynchronously
Use the asynchronous helpers on your local environment to test changes for
validating a foreign key:
-1. Enable the feature flags by running `Feature.enable(:database_async_foreign_key_validation)`
- and `Feature.enable(:database_reindexing)` in the Rails console.
+1. Enable the feature flag by running `Feature.enable(:database_async_foreign_key_validation)`
+ in the Rails console.
1. Run `bundle exec rails db:migrate` so that it creates an entry in the async validation table.
-1. Run `bundle exec rails gitlab:db:reindex` so that the FK is validated asynchronously.
+1. Run `bundle exec rails gitlab:db:execute_async_fk_validations:all` so that the FK is validated
+ asynchronously on all databases.
1. To verify the foreign key, open the PostgreSQL console using the
[GDK](https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/postgresql.md)
command `gdk psql` and run the command `\d+ table_name` to check that your
diff --git a/doc/development/deprecation_guidelines/index.md b/doc/development/deprecation_guidelines/index.md
index e532fa82011..703228ab05e 100644
--- a/doc/development/deprecation_guidelines/index.md
+++ b/doc/development/deprecation_guidelines/index.md
@@ -62,6 +62,8 @@ A breaking change can be considered major if it affects many users, or represent
Deprecations should be announced on the [Deprecated feature removal schedule](../../update/deprecations.md).
+Deprecations should be announced [no later than the third milestone preceding intended removal](https://about.gitlab.com/handbook/product/gitlab-the-product/#process-for-deprecating-and-removing-a-feature).
+
Do not include the deprecation announcement in the merge request that introduces a code change for the deprecation.
Use a separate MR to create a deprecation entry. For steps to create a deprecation entry, see
[Deprecations](https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations).
diff --git a/doc/development/fe_guide/source_editor.md b/doc/development/fe_guide/source_editor.md
index 1cea8ccb1ab..9f52850041d 100644
--- a/doc/development/fe_guide/source_editor.md
+++ b/doc/development/fe_guide/source_editor.md
@@ -1,6 +1,6 @@
---
stage: Create
-group: Editor
+group: Source Code
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments
---
diff --git a/lib/tasks/gitlab/db.rake b/lib/tasks/gitlab/db.rake
index c4dc7b938cc..3ff512fd686 100644
--- a/lib/tasks/gitlab/db.rake
+++ b/lib/tasks/gitlab/db.rake
@@ -313,6 +313,36 @@ namespace :gitlab do
end
end
+ namespace :execute_async_fk_validations do
+ each_database(databases) do |database_name|
+ task database_name, [:pick] => :environment do |_, args|
+ args.with_defaults(pick: 2)
+
+ if Feature.disabled?(:database_async_foreign_key_validation, type: :ops)
+ puts <<~NOTE.color(:yellow)
+ Note: database async foreign key validation feature is currently disabled.
+
+ Enable with: Feature.enable(:database_async_foreign_key_validation)
+ NOTE
+ exit
+ end
+
+ Gitlab::Database::EachDatabase.each_database_connection(only: database_name) do
+ Gitlab::Database::AsyncForeignKeys.validate_pending_entries!(how_many: args[:pick].to_i)
+ end
+ end
+ end
+
+ task :all, [:pick] => :environment do |_, args|
+ default_pick = Gitlab.dev_or_test_env? ? 1000 : 2
+ args.with_defaults(pick: default_pick)
+
+ each_database(databases) do |database_name|
+ Rake::Task["gitlab:db:execute_async_fk_validations:#{database_name}"].invoke(args[:pick])
+ end
+ end
+ end
+
desc 'Check if there have been user additions to the database'
task active: :environment do
if ActiveRecord::Base.connection.migration_context.needs_migration?
diff --git a/spec/requests/api/graphql/project/merge_requests_spec.rb b/spec/requests/api/graphql/project/merge_requests_spec.rb
index 8407faa967e..156886ca211 100644
--- a/spec/requests/api/graphql/project/merge_requests_spec.rb
+++ b/spec/requests/api/graphql/project/merge_requests_spec.rb
@@ -588,8 +588,9 @@ RSpec.describe 'getting merge request listings nested in a project', feature_cat
end
let(:query) do
+ # Adding a no-op `not` filter to mimic the same query as the frontend does
graphql_query_for(:project, { full_path: project.full_path }, <<~QUERY)
- mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0) {
+ mergeRequests(mergedAfter: "2020-01-01", mergedBefore: "2020-01-05", first: 0, not: { labels: null }) {
totalTimeToMerge
count
}
diff --git a/spec/tasks/gitlab/db_rake_spec.rb b/spec/tasks/gitlab/db_rake_spec.rb
index 933eba40719..a9977e07feb 100644
--- a/spec/tasks/gitlab/db_rake_spec.rb
+++ b/spec/tasks/gitlab/db_rake_spec.rb
@@ -805,6 +805,80 @@ RSpec.describe 'gitlab:db namespace rake task', :silence_stdout, feature_categor
end
end
+ describe 'execute_async_fk_validations' do
+ before do
+ skip_if_multiple_databases_not_setup
+ end
+
+ it 'delegates ci task to Gitlab::Database::AsyncForeignKeys' do
+ expect(Gitlab::Database::AsyncForeignKeys).to receive(:validate_pending_entries!).with(how_many: 2)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:ci')
+ end
+
+ it 'delegates ci task to Gitlab::Database::AsyncForeignKeys with specified argument' do
+ expect(Gitlab::Database::AsyncForeignKeys).to receive(:validate_pending_entries!).with(how_many: 5)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:ci', '[5]')
+ end
+
+ it 'delegates main task to Gitlab::Database::AsyncForeignKeys' do
+ expect(Gitlab::Database::AsyncForeignKeys).to receive(:validate_pending_entries!).with(how_many: 2)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:main')
+ end
+
+ it 'delegates main task to Gitlab::Database::AsyncForeignKeys with specified argument' do
+ expect(Gitlab::Database::AsyncForeignKeys).to receive(:validate_pending_entries!).with(how_many: 7)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:main', '[7]')
+ end
+
+ it 'delegates all task to every database with higher default for dev' do
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:ci']).to receive(:invoke).with(1000)
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:main']).to receive(:invoke).with(1000)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:all')
+ end
+
+ it 'delegates all task to every database with lower default for prod' do
+ allow(Gitlab).to receive(:dev_or_test_env?).and_return(false)
+
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:ci']).to receive(:invoke).with(2)
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:main']).to receive(:invoke).with(2)
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:all')
+ end
+
+ it 'delegates all task to every database with specified argument' do
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:ci']).to receive(:invoke).with('50')
+ expect(Rake::Task['gitlab:db:execute_async_fk_validations:main']).to receive(:invoke).with('50')
+
+ run_rake_task('gitlab:db:execute_async_fk_validations:all', '[50]')
+ end
+
+ context 'when feature is not enabled' do
+ it 'is a no-op' do
+ stub_feature_flags(database_async_foreign_key_validation: false)
+
+ expect(Gitlab::Database::AsyncForeignKeys).not_to receive(:validate_pending_entries!)
+
+ expect { run_rake_task('gitlab:db:execute_async_fk_validations:main') }.to raise_error(SystemExit)
+ end
+ end
+
+ context 'with geo configured' do
+ before do
+ skip_unless_geo_configured
+ end
+
+ it 'does not create a task for the geo database' do
+ expect { run_rake_task('gitlab:db:execute_async_fk_validations:geo') }
+ .to raise_error(/Don't know how to build task 'gitlab:db:execute_async_fk_validations:geo'/)
+ end
+ end
+ end
+
describe 'active' do
using RSpec::Parameterized::TableSyntax