From 05db4ead6d5c73cf62ad95d80ccac415bc3bf3cd Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Mon, 8 Nov 2021 15:13:35 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/rails.gitlab-ci.yml | 44 ++++++ .gitlab/ci/rules.gitlab-ci.yml | 7 + GITALY_SERVER_VERSION | 2 +- Gemfile | 2 +- Gemfile.lock | 11 +- .../components/devops_score.vue | 0 .../components/devops_score_callout.vue | 0 .../components/service_ping_disabled.vue | 0 .../constants.js | 0 .../devops_score.js | 0 .../devops_score_disabled_service_ping.js | 0 .../group_board_iterations.query.graphql | 10 -- .../project_board_iterations.query.graphql | 10 -- .../javascripts/boards/stores/actions.js | 48 ------- .../boards/stores/mutation_types.js | 4 - .../javascripts/boards/stores/mutations.js | 14 -- .../javascripts/diffs/components/app.vue | 4 + .../javascripts/diffs/utils/discussions.js | 76 ++++++++++ .../notes/components/discussion_notes.vue | 90 ++++++++---- .../pages/admin/dev_ops_report/index.js | 4 +- app/assets/stylesheets/framework/files.scss | 6 +- app/helpers/issues_helper.rb | 2 + app/models/concerns/alert_event_lifecycle.rb | 2 - app/models/concerns/issuable.rb | 1 - app/models/concerns/milestoneable.rb | 1 - .../project_access_changed_service.rb | 19 +++ .../concerns/issues/issue_type_helpers.rb | 12 ++ app/services/groups/transfer_service.rb | 17 +-- app/services/issues/base_service.rb | 9 +- app/services/issues/build_service.rb | 2 +- .../{_report.html.haml => _score.html.haml} | 0 app/views/admin/dev_ops_report/show.html.haml | 2 +- .../issuable/form/_type_selector.html.haml | 18 +-- .../project_recalculate_worker.rb | 2 + .../cleanup_container_repository_worker.rb | 5 +- config/application.rb | 16 ++- config/initializers/action_view.rb | 7 - config/initializers/cookies_serializer.rb | 1 - config/initializers/new_framework_defaults.rb | 24 ---- .../000_override_framework_defaults.rb | 35 +++++ .../graphql_known_operations_plugin.js | 112 +++++++++++++++ config/webpack.config.js | 3 + doc/ci/yaml/index.md | 4 +- doc/development/pipelines.md | 7 + doc/user/clusters/agent/install/index.md | 1 + doc/user/infrastructure/index.md | 11 +- lib/gitlab/graphql/known_operations.rb | 40 ++++++ lib/gitlab/sidekiq_config.rb | 34 +++-- lib/gitlab/sidekiq_config/cli_methods.rb | 1 + lib/gitlab/sidekiq_config/worker.rb | 7 +- lib/gitlab/webpack/file_loader.rb | 65 +++++++++ .../webpack/graphql_known_operations.rb | 25 ++++ lib/gitlab/webpack/manifest.rb | 50 +------ .../projects/menus/infrastructure_menu.rb | 2 +- lib/tasks/gitlab/sidekiq.rake | 7 +- locale/gitlab.pot | 6 + qa/Gemfile.lock | 10 +- scripts/rspec_helpers.sh | 1 + .../features/graphql_known_operations_spec.rb | 29 ++++ spec/features/issues/form_spec.rb | 57 +++++--- .../components/devops_score_callout_spec.js | 4 +- .../components/devops_score_spec.js | 4 +- .../components/service_ping_disabled_spec.js | 4 +- .../diffs/components/diff_discussions_spec.js | 4 + spec/frontend/diffs/utils/discussions_spec.js | 133 ++++++++++++++++++ .../notes/components/discussion_notes_spec.js | 4 + .../components/noteable_discussion_spec.js | 10 ++ .../notes/components/notes_app_spec.js | 4 + .../gitlab/graphql/known_operations_spec.rb | 72 ++++++++++ .../gitlab/sidekiq_config/cli_methods_spec.rb | 15 +- spec/lib/gitlab/sidekiq_config/worker_spec.rb | 17 ++- spec/lib/gitlab/webpack/file_loader_spec.rb | 79 +++++++++++ .../webpack/graphql_known_operations_spec.rb | 47 +++++++ .../menus/infrastructure_menu_spec.rb | 16 +++ .../project_access_changed_service_spec.rb | 21 +++ spec/services/groups/transfer_service_spec.rb | 43 ++++-- spec/spec_helper.rb | 4 +- spec/support/flaky_tests.rb | 36 +++++ ...leanup_container_repository_worker_spec.rb | 5 +- 79 files changed, 1189 insertions(+), 312 deletions(-) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/components/devops_score.vue (100%) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/components/devops_score_callout.vue (100%) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/components/service_ping_disabled.vue (100%) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/constants.js (100%) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/devops_score.js (100%) rename app/assets/javascripts/analytics/{devops_report => devops_reports}/devops_score_disabled_service_ping.js (100%) delete mode 100644 app/assets/javascripts/boards/graphql/group_board_iterations.query.graphql delete mode 100644 app/assets/javascripts/boards/graphql/project_board_iterations.query.graphql create mode 100644 app/assets/javascripts/diffs/utils/discussions.js create mode 100644 app/services/authorized_project_update/project_access_changed_service.rb create mode 100644 app/services/concerns/issues/issue_type_helpers.rb rename app/views/admin/dev_ops_report/{_report.html.haml => _score.html.haml} (100%) delete mode 100644 config/initializers/action_view.rb delete mode 100644 config/initializers/new_framework_defaults.rb create mode 100644 config/initializers_before_autoloader/000_override_framework_defaults.rb create mode 100644 config/plugins/graphql_known_operations_plugin.js create mode 100644 lib/gitlab/graphql/known_operations.rb create mode 100644 lib/gitlab/webpack/file_loader.rb create mode 100644 lib/gitlab/webpack/graphql_known_operations.rb create mode 100644 spec/features/graphql_known_operations_spec.rb rename spec/frontend/analytics/{devops_report => devops_reports}/components/service_ping_disabled_spec.js (90%) create mode 100644 spec/frontend/diffs/utils/discussions_spec.js create mode 100644 spec/lib/gitlab/graphql/known_operations_spec.rb create mode 100644 spec/lib/gitlab/webpack/file_loader_spec.rb create mode 100644 spec/lib/gitlab/webpack/graphql_known_operations_spec.rb create mode 100644 spec/services/authorized_project_update/project_access_changed_service_spec.rb create mode 100644 spec/support/flaky_tests.rb diff --git a/.gitlab/ci/rails.gitlab-ci.yml b/.gitlab/ci/rails.gitlab-ci.yml index 478fd01f541..8f3064c55f6 100644 --- a/.gitlab/ci/rails.gitlab-ci.yml +++ b/.gitlab/ci/rails.gitlab-ci.yml @@ -534,6 +534,50 @@ rspec:feature-flags: run_timed_command "bundle exec scripts/used-feature-flags"; fi +rspec:skipped-flaky-tests-report: + extends: + - .default-retry + - .rails:rules:skipped-flaky-tests-report + image: ruby:2.7-alpine + stage: post-test + # We cannot use needs since it would mean needing 84 jobs (since most are parallelized) + # so we use `dependencies` here. + dependencies: + # FOSS/EE jobs + - rspec migration pg12 + - rspec unit pg12 + - rspec integration pg12 + - rspec system pg12 + # FOSS/EE minimal jobs + - rspec migration pg12 minimal + - rspec unit pg12 minimal + - rspec integration pg12 minimal + - rspec system pg12 minimal + # EE jobs + - rspec-ee migration pg12 + - rspec-ee unit pg12 + - rspec-ee integration pg12 + - rspec-ee system pg12 + # EE minimal jobs + - rspec-ee migration pg12 minimal + - rspec-ee unit pg12 minimal + - rspec-ee integration pg12 minimal + - rspec-ee system pg12 minimal + # Geo jobs + - rspec-ee unit pg12 geo + - rspec-ee integration pg12 geo + - rspec-ee system pg12 geo + # Geo minimal jobs + - rspec-ee unit pg12 geo minimal + - rspec-ee integration pg12 geo minimal + - rspec-ee system pg12 geo minimal + script: + - cat rspec_flaky/skipped_flaky_tests_*_report.txt >> skipped_flaky_tests_report.txt + artifacts: + expire_in: 31d + paths: + - skipped_flaky_tests_report.txt + # EE/FOSS: default refs (MRs, default branch, schedules) jobs # ####################################################### diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index 3e9d977cd83..91320b8988f 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -1352,6 +1352,13 @@ when: never - changes: *code-backstage-patterns +.rails:rules:skipped-flaky-tests-report: + rules: + - <<: *if-not-ee + when: never + - if: '$SKIP_FLAKY_TESTS_AUTOMATICALLY == "true"' + changes: *code-backstage-patterns + ######################### # Static analysis rules # ######################### diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 016a2771cc5..c104cc574c6 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -7b9cd199b0851fd1b6615e0798f2aafddafd63cb +460a880c6993ab5f76cac951fccc02efd5cbd444 diff --git a/Gemfile b/Gemfile index 109c3c1cf5b..4ef4501b909 100644 --- a/Gemfile +++ b/Gemfile @@ -342,7 +342,7 @@ group :development do gem 'lefthook', '~> 0.7.0', require: false gem 'solargraph', '~> 0.43', require: false - gem 'letter_opener_web', '~> 1.4.1' + gem 'letter_opener_web', '~> 2.0.0' # Better errors handler gem 'better_errors', '~> 2.9.0' diff --git a/Gemfile.lock b/Gemfile.lock index 339579dccc7..7f1bf38a9c4 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -700,10 +700,11 @@ GEM lefthook (0.7.5) letter_opener (1.7.0) launchy (~> 2.2) - letter_opener_web (1.4.1) - actionmailer (>= 3.2) - letter_opener (~> 1.0) - railties (>= 3.2) + letter_opener_web (2.0.0) + actionmailer (>= 5.2) + letter_opener (~> 1.7) + railties (>= 5.2) + rexml libyajl2 (1.2.0) license_finder (6.0.0) bundler @@ -1516,7 +1517,7 @@ DEPENDENCIES kramdown (~> 2.3.1) kubeclient (~> 4.9.2) lefthook (~> 0.7.0) - letter_opener_web (~> 1.4.1) + letter_opener_web (~> 2.0.0) license_finder (~> 6.0) licensee (~> 9.14.1) lockbox (~> 0.6.2) diff --git a/app/assets/javascripts/analytics/devops_report/components/devops_score.vue b/app/assets/javascripts/analytics/devops_reports/components/devops_score.vue similarity index 100% rename from app/assets/javascripts/analytics/devops_report/components/devops_score.vue rename to app/assets/javascripts/analytics/devops_reports/components/devops_score.vue diff --git a/app/assets/javascripts/analytics/devops_report/components/devops_score_callout.vue b/app/assets/javascripts/analytics/devops_reports/components/devops_score_callout.vue similarity index 100% rename from app/assets/javascripts/analytics/devops_report/components/devops_score_callout.vue rename to app/assets/javascripts/analytics/devops_reports/components/devops_score_callout.vue diff --git a/app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue b/app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue similarity index 100% rename from app/assets/javascripts/analytics/devops_report/components/service_ping_disabled.vue rename to app/assets/javascripts/analytics/devops_reports/components/service_ping_disabled.vue diff --git a/app/assets/javascripts/analytics/devops_report/constants.js b/app/assets/javascripts/analytics/devops_reports/constants.js similarity index 100% rename from app/assets/javascripts/analytics/devops_report/constants.js rename to app/assets/javascripts/analytics/devops_reports/constants.js diff --git a/app/assets/javascripts/analytics/devops_report/devops_score.js b/app/assets/javascripts/analytics/devops_reports/devops_score.js similarity index 100% rename from app/assets/javascripts/analytics/devops_report/devops_score.js rename to app/assets/javascripts/analytics/devops_reports/devops_score.js diff --git a/app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js b/app/assets/javascripts/analytics/devops_reports/devops_score_disabled_service_ping.js similarity index 100% rename from app/assets/javascripts/analytics/devops_report/devops_score_disabled_service_ping.js rename to app/assets/javascripts/analytics/devops_reports/devops_score_disabled_service_ping.js diff --git a/app/assets/javascripts/boards/graphql/group_board_iterations.query.graphql b/app/assets/javascripts/boards/graphql/group_board_iterations.query.graphql deleted file mode 100644 index 1c382c4747b..00000000000 --- a/app/assets/javascripts/boards/graphql/group_board_iterations.query.graphql +++ /dev/null @@ -1,10 +0,0 @@ -query GroupBoardIterations($fullPath: ID!, $title: String) { - group(fullPath: $fullPath) { - iterations(includeAncestors: true, title: $title) { - nodes { - id - title - } - } - } -} diff --git a/app/assets/javascripts/boards/graphql/project_board_iterations.query.graphql b/app/assets/javascripts/boards/graphql/project_board_iterations.query.graphql deleted file mode 100644 index 078151a275a..00000000000 --- a/app/assets/javascripts/boards/graphql/project_board_iterations.query.graphql +++ /dev/null @@ -1,10 +0,0 @@ -query ProjectBoardIterations($fullPath: ID!, $title: String) { - project(fullPath: $fullPath) { - iterations(includeAncestors: true, title: $title) { - nodes { - id - title - } - } - } -} diff --git a/app/assets/javascripts/boards/stores/actions.js b/app/assets/javascripts/boards/stores/actions.js index c81e3cb79db..3a96e535cf7 100644 --- a/app/assets/javascripts/boards/stores/actions.js +++ b/app/assets/javascripts/boards/stores/actions.js @@ -36,13 +36,11 @@ import { } from '../boards_util'; import { gqlClient } from '../graphql'; import boardLabelsQuery from '../graphql/board_labels.query.graphql'; -import groupBoardIterationsQuery from '../graphql/group_board_iterations.query.graphql'; import groupBoardMilestonesQuery from '../graphql/group_board_milestones.query.graphql'; import groupProjectsQuery from '../graphql/group_projects.query.graphql'; import issueCreateMutation from '../graphql/issue_create.mutation.graphql'; import issueSetLabelsMutation from '../graphql/issue_set_labels.mutation.graphql'; import listsIssuesQuery from '../graphql/lists_issues.query.graphql'; -import projectBoardIterationsQuery from '../graphql/project_board_iterations.query.graphql'; import projectBoardMilestonesQuery from '../graphql/project_board_milestones.query.graphql'; import * as types from './mutation_types'; @@ -203,52 +201,6 @@ export default { }); }, - fetchIterations({ state, commit }, title) { - commit(types.RECEIVE_ITERATIONS_REQUEST); - - const { fullPath, boardType } = state; - - const variables = { - fullPath, - title, - }; - - let query; - if (boardType === BoardType.project) { - query = projectBoardIterationsQuery; - } - if (boardType === BoardType.group) { - query = groupBoardIterationsQuery; - } - - if (!query) { - // eslint-disable-next-line @gitlab/require-i18n-strings - throw new Error('Unknown board type'); - } - - return gqlClient - .query({ - query, - variables, - }) - .then(({ data }) => { - const errors = data[boardType]?.errors; - const iterations = data[boardType]?.iterations.nodes; - - if (errors?.[0]) { - throw new Error(errors[0]); - } - - commit(types.RECEIVE_ITERATIONS_SUCCESS, iterations); - - return iterations; - }) - .catch((e) => { - commit(types.RECEIVE_ITERATIONS_FAILURE); - throw e; - }); - }, - fetchMilestones({ state, commit }, searchTerm) { commit(types.RECEIVE_MILESTONES_REQUEST); diff --git a/app/assets/javascripts/boards/stores/mutation_types.js b/app/assets/javascripts/boards/stores/mutation_types.js index 928cece19f7..31b78014525 100644 --- a/app/assets/javascripts/boards/stores/mutation_types.js +++ b/app/assets/javascripts/boards/stores/mutation_types.js @@ -41,7 +41,3 @@ export const ADD_LIST_TO_HIGHLIGHTED_LISTS = 'ADD_LIST_TO_HIGHLIGHTED_LISTS'; export const REMOVE_LIST_FROM_HIGHLIGHTED_LISTS = 'REMOVE_LIST_FROM_HIGHLIGHTED_LISTS'; export const RESET_BOARD_ITEM_SELECTION = 'RESET_BOARD_ITEM_SELECTION'; export const SET_ERROR = 'SET_ERROR'; - -export const RECEIVE_ITERATIONS_REQUEST = 'RECEIVE_ITERATIONS_REQUEST'; -export const RECEIVE_ITERATIONS_SUCCESS = 'RECEIVE_ITERATIONS_SUCCESS'; -export const RECEIVE_ITERATIONS_FAILURE = 'RECEIVE_ITERATIONS_FAILURE'; diff --git a/app/assets/javascripts/boards/stores/mutations.js b/app/assets/javascripts/boards/stores/mutations.js index ef5b84b4575..2a2ce7652e6 100644 --- a/app/assets/javascripts/boards/stores/mutations.js +++ b/app/assets/javascripts/boards/stores/mutations.js @@ -64,20 +64,6 @@ export default { ); }, - [mutationTypes.RECEIVE_ITERATIONS_REQUEST](state) { - state.iterationsLoading = true; - }, - - [mutationTypes.RECEIVE_ITERATIONS_SUCCESS](state, iterations) { - state.iterations = iterations; - state.iterationsLoading = false; - }, - - [mutationTypes.RECEIVE_ITERATIONS_FAILURE](state) { - state.iterationsLoading = false; - state.error = __('Failed to load iterations.'); - }, - [mutationTypes.SET_ACTIVE_ID](state, { id, sidebarType }) { state.activeId = id; state.sidebarType = sidebarType; diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 66d06a3a1b6..f405b82b05b 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -44,6 +44,7 @@ import { TRACKING_MULTIPLE_FILES_MODE, } from '../constants'; +import { discussionIntersectionObserverHandlerFactory } from '../utils/discussions'; import diffsEventHub from '../event_hub'; import { reviewStatuses } from '../utils/file_reviews'; import { diffsApp } from '../utils/performance'; @@ -86,6 +87,9 @@ export default { ALERT_MERGE_CONFLICT, ALERT_COLLAPSED_FILES, }, + provide: { + discussionObserverHandler: discussionIntersectionObserverHandlerFactory(), + }, props: { endpoint: { type: String, diff --git a/app/assets/javascripts/diffs/utils/discussions.js b/app/assets/javascripts/diffs/utils/discussions.js new file mode 100644 index 00000000000..c404705d209 --- /dev/null +++ b/app/assets/javascripts/diffs/utils/discussions.js @@ -0,0 +1,76 @@ +function normalize(processable) { + const { entry } = processable; + const offset = entry.rootBounds.bottom - entry.boundingClientRect.top; + const direction = + offset < 0 ? 'Up' : 'Down'; /* eslint-disable-line @gitlab/require-i18n-strings */ + + return { + ...processable, + entry: { + time: entry.time, + type: entry.isIntersecting ? 'intersection' : `scroll${direction}`, + }, + }; +} + +function sort({ entry: alpha }, { entry: beta }) { + const diff = alpha.time - beta.time; + let order = 0; + + if (diff < 0) { + order = -1; + } else if (diff > 0) { + order = 1; + } else if (alpha.type === 'intersection' && beta.type === 'scrollUp') { + order = 2; + } else if (alpha.type === 'scrollUp' && beta.type === 'intersection') { + order = -2; + } + + return order; +} + +function filter(entry) { + return entry.type !== 'scrollDown'; +} + +export function discussionIntersectionObserverHandlerFactory() { + let unprocessed = []; + let timer = null; + + return (processable) => { + unprocessed.push(processable); + + if (timer) { + clearTimeout(timer); + } + + timer = setTimeout(() => { + unprocessed + .map(normalize) + .filter(filter) + .sort(sort) + .forEach((discussionObservationContainer) => { + const { + entry: { type }, + currentDiscussion, + isFirstUnresolved, + isDiffsPage, + functions: { setCurrentDiscussionId, getPreviousUnresolvedDiscussionId }, + } = discussionObservationContainer; + + if (type === 'intersection') { + setCurrentDiscussionId(currentDiscussion.id); + } else if (type === 'scrollUp') { + setCurrentDiscussionId( + isFirstUnresolved + ? null + : getPreviousUnresolvedDiscussionId(currentDiscussion.id, isDiffsPage), + ); + } + }); + + unprocessed = []; + }, 0); + }; +} diff --git a/app/assets/javascripts/notes/components/discussion_notes.vue b/app/assets/javascripts/notes/components/discussion_notes.vue index 6fcfa66ea49..d1df4eb848b 100644 --- a/app/assets/javascripts/notes/components/discussion_notes.vue +++ b/app/assets/javascripts/notes/components/discussion_notes.vue @@ -1,5 +1,6 @@ @@ -122,33 +152,35 @@ export default { @mouseleave="handleMouseLeave(discussion)" >