From a5605d87fb839e0b1015ad9e736c44fbb2ada202 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 13 Apr 2021 18:11:28 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .rubocop_manual_todo.yml | 5 - Gemfile | 6 +- Gemfile.lock | 21 +-- app/assets/images/learn_gitlab/issue_created.svg | 65 ++++++++ app/assets/javascripts/diffs/components/app.vue | 14 +- .../javascripts/diffs/components/diff_file.vue | 11 +- .../javascripts/diffs/components/diff_row.vue | 17 ++ .../diffs/components/inline_diff_table_row.vue | 5 + .../diffs/components/parallel_diff_table_row.vue | 12 ++ app/assets/javascripts/diffs/store/actions.js | 47 ++++++ app/assets/javascripts/diffs/store/getters.js | 10 ++ .../javascripts/diffs/store/modules/diff_state.js | 6 +- .../javascripts/diffs/store/modules/index.js | 6 +- .../javascripts/diffs/store/mutation_types.js | 1 + app/assets/javascripts/diffs/store/mutations.js | 6 + .../javascripts/diffs/utils/interoperability.js | 49 ++++++ .../javascripts/ide/components/ide_status_mr.vue | 2 +- .../ide/components/nav_dropdown_button.vue | 2 +- .../components/provider_repo_table_row.vue | 2 +- .../monitoring/components/links_section.vue | 2 +- .../learn_gitlab/components/learn_gitlab_b.vue | 3 + .../components/learn_gitlab_info_card.vue | 2 +- .../pages/projects/learn_gitlab/constants/index.js | 9 + .../pipelines/components/graph/constants.js | 1 + .../components/graph/graph_component_wrapper.vue | 23 ++- .../components/graph/graph_view_selector.vue | 2 +- .../profiles/notifications_controller.rb | 23 ++- .../pipelines/get_pipeline_details.query.graphql | 1 + .../resolvers/concerns/board_issue_filterable.rb | 11 ++ .../types/boards/assignee_wildcard_id_enum.rb | 13 ++ app/graphql/types/boards/board_issue_input_type.rb | 4 + app/helpers/appearances_helper.rb | 1 + app/helpers/application_helper.rb | 9 +- app/helpers/learn_gitlab_helper.rb | 1 + app/models/concerns/bulk_member_access_load.rb | 26 ++- .../cascading_namespace_setting_attribute.rb | 2 +- app/models/concerns/has_repository.rb | 9 +- app/models/notification_setting.rb | 2 + .../user_max_access_level_in_projects_preloader.rb | 25 +++ app/models/project_team.rb | 4 + app/services/boards/lists/base_update_service.rb | 58 +++++++ app/services/boards/lists/update_service.rb | 45 +---- app/services/projects/update_pages_service.rb | 2 +- app/views/devise/passwords/new.html.haml | 4 +- .../import/shared/_new_project_form.html.haml | 2 +- app/views/projects/_new_project_fields.html.haml | 2 +- app/views/shared/projects/_search_bar.html.haml | 2 +- .../21043-fix-more-n-plus-one-queries.yml | 6 + ...ignee-wildcard-filters-board-issues-graphql.yml | 5 + ...3_inherit_default_branch_name_for_subgroups.yml | 5 + ...ernalize-strings-in-passwords-new-html-haml.yml | 5 + ...blessing_cascading_settings_default_enabled.yml | 5 + changelogs/unreleased/id-bump-gon-version.yml | 5 + .../unreleased/id-bump-rspec-rails-to-5-1.yml | 5 + ...040-fix-rails-savebang-gitaly-client-module.yml | 5 + ...kstage-reschedule-artifac-expiry-date-again.yml | 5 + config/application.rb | 28 ++-- .../development/cascading_namespace_settings.yml | 4 +- .../0_inject_enterprise_edition_module.rb | 6 + config/initializers/0_license.rb | 14 +- .../000_inflections.rb | 1 + ...00_reschedule_artifact_expiry_backfill_again.rb | 44 +++++ db/schema_migrations/20210413132500 | 1 + doc/administration/geo/disaster_recovery/index.md | 128 +++++++++++++++ .../monitoring/prometheus/gitlab_metrics.md | 12 ++ doc/api/graphql/reference/index.md | 9 + .../site_architecture/release_process.md | 181 +-------------------- doc/development/ee_features.md | 2 + doc/development/feature_flags/index.md | 3 +- doc/development/licensed_feature_availability.md | 13 ++ doc/integration/oauth_provider.md | 2 + doc/user/admin_area/geo_nodes.md | 6 + doc/user/project/description_templates.md | 13 +- doc/user/project/settings/index.md | 65 ++++++++ lib/gitlab.rb | 11 ++ lib/gitlab/subscription_portal.rb | 7 +- locale/gitlab.pot | 35 +++- package.json | 4 +- scripts/rspec_helpers.sh | 4 + .../profiles/notifications_controller_spec.rb | 24 +++ spec/deprecation_toolkit_env.rb | 1 - spec/features/admin/admin_settings_spec.rb | 2 +- .../diffs/components/compare_versions_spec.js | 34 ++-- spec/frontend/diffs/components/diff_row_spec.js | 17 ++ .../diffs/components/inline_diff_table_row_spec.js | 13 ++ .../components/parallel_diff_table_row_spec.js | 23 +++ spec/frontend/diffs/find_interop_attributes.js | 20 +++ spec/frontend/diffs/store/actions_spec.js | 48 ++++++ spec/frontend/diffs/store/getters_spec.js | 20 +++ spec/frontend/diffs/store/mutations_spec.js | 13 ++ spec/frontend/diffs/utils/interoperability_spec.js | 67 ++++++++ spec/frontend/fixtures/merge_requests_diffs.rb | 20 ++- .../__snapshots__/learn_gitlab_a_spec.js.snap | 22 ++- .../__snapshots__/learn_gitlab_b_spec.js.snap | 66 +++++++- .../learn_gitlab_section_card_spec.js.snap | 4 + .../learn_gitlab/components/learn_gitlab_a_spec.js | 6 +- .../learn_gitlab/components/learn_gitlab_b_spec.js | 6 +- .../projects/learn_gitlab/components/mock_data.js | 5 + .../graph/graph_component_wrapper_spec.js | 68 +++++++- spec/frontend/pipelines/graph/mock_data.js | 2 + .../diffs/diffs_interopability_api.js | 25 +++ .../diffs/diffs_interopability_spec.js | 161 ++++++++++++++++++ spec/frontend_integration/test_helpers/fixtures.js | 6 + .../test_helpers/mock_server/routes/diffs.js | 22 +++ .../test_helpers/mock_server/routes/index.js | 1 + .../resolvers/board_list_issues_resolver_spec.rb | 18 ++ .../types/boards/board_issue_input_type_spec.rb | 4 +- spec/helpers/application_helper_spec.rb | 14 +- spec/helpers/learn_gitlab_helper_spec.rb | 1 + .../gitaly_client/object_pool_service_spec.rb | 4 +- .../gitaly_client/repository_service_spec.rb | 2 +- spec/lib/gitlab/subscription_portal_spec.rb | 56 ++++--- spec/lib/gitlab_spec.rb | 118 +++++++++----- ...schedule_artifact_expiry_backfill_again_spec.rb | 38 +++++ spec/models/notification_setting_spec.rb | 14 ++ ..._max_access_level_in_projects_preloader_spec.rb | 37 +++++ spec/models/project_spec.rb | 60 ++----- spec/services/boards/lists/update_service_spec.rb | 41 ----- spec/spec_helper.rb | 1 + .../boards/lists/update_service_shared_examples.rb | 43 +++++ yarn.lock | 16 +- 121 files changed, 1847 insertions(+), 530 deletions(-) create mode 100644 app/assets/images/learn_gitlab/issue_created.svg create mode 100644 app/assets/javascripts/diffs/utils/interoperability.js create mode 100644 app/graphql/types/boards/assignee_wildcard_id_enum.rb create mode 100644 app/models/preloaders/user_max_access_level_in_projects_preloader.rb create mode 100644 app/services/boards/lists/base_update_service.rb create mode 100644 changelogs/unreleased/21043-fix-more-n-plus-one-queries.yml create mode 100644 changelogs/unreleased/280781-support-assignee-wildcard-filters-board-issues-graphql.yml create mode 100644 changelogs/unreleased/293953_inherit_default_branch_name_for_subgroups.yml create mode 100644 changelogs/unreleased/Externalize-strings-in-passwords-new-html-haml.yml create mode 100644 changelogs/unreleased/dblessing_cascading_settings_default_enabled.yml create mode 100644 changelogs/unreleased/id-bump-gon-version.yml create mode 100644 changelogs/unreleased/id-bump-rspec-rails-to-5-1.yml create mode 100644 changelogs/unreleased/issue-220040-fix-rails-savebang-gitaly-client-module.yml create mode 100644 changelogs/unreleased/mc-backstage-reschedule-artifac-expiry-date-again.yml create mode 100644 db/post_migrate/20210413132500_reschedule_artifact_expiry_backfill_again.rb create mode 100644 db/schema_migrations/20210413132500 create mode 100644 spec/frontend/diffs/find_interop_attributes.js create mode 100644 spec/frontend/diffs/utils/interoperability_spec.js create mode 100644 spec/frontend_integration/diffs/diffs_interopability_api.js create mode 100644 spec/frontend_integration/diffs/diffs_interopability_spec.js create mode 100644 spec/frontend_integration/test_helpers/mock_server/routes/diffs.js create mode 100644 spec/migrations/20210413132500_reschedule_artifact_expiry_backfill_again_spec.rb create mode 100644 spec/models/preloaders/user_max_access_level_in_projects_preloader_spec.rb create mode 100644 spec/support/shared_examples/boards/lists/update_service_shared_examples.rb diff --git a/.rubocop_manual_todo.yml b/.rubocop_manual_todo.yml index c2a529cf033..1073f6a04d1 100644 --- a/.rubocop_manual_todo.yml +++ b/.rubocop_manual_todo.yml @@ -46,8 +46,6 @@ Rails/SaveBang: Exclude: - 'ee/spec/controllers/projects/merge_requests_controller_spec.rb' - 'ee/spec/controllers/subscriptions_controller_spec.rb' - - 'ee/spec/frontend/fixtures/analytics.rb' - - 'ee/spec/graphql/resolvers/vulnerabilities_resolver_spec.rb' - 'ee/spec/initializers/fog_google_https_private_urls_spec.rb' - 'ee/spec/lib/analytics/merge_request_metrics_calculator_spec.rb' - 'ee/spec/lib/ee/gitlab/auth/ldap/sync/group_spec.rb' @@ -182,8 +180,6 @@ Rails/SaveBang: - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb' - 'spec/lib/gitlab/gfm/reference_rewriter_spec.rb' - 'spec/lib/gitlab/git_access_spec.rb' - - 'spec/lib/gitlab/gitaly_client/object_pool_service_spec.rb' - - 'spec/lib/gitlab/gitaly_client/repository_service_spec.rb' - 'spec/lib/gitlab/import_export/avatar_saver_spec.rb' - 'spec/lib/gitlab/import_export/base/relation_factory_spec.rb' - 'spec/lib/gitlab/import_export/design_repo_restorer_spec.rb' @@ -424,7 +420,6 @@ RSpec/EmptyLineAfterFinalLetItBe: Exclude: - ee/spec/controllers/admin/geo/projects_controller_spec.rb - ee/spec/controllers/admin/projects_controller_spec.rb - - ee/spec/controllers/ee/projects/jobs_controller_spec.rb - ee/spec/controllers/groups/analytics/cycle_analytics/stages_controller_spec.rb - ee/spec/controllers/groups/analytics/cycle_analytics/summary_controller_spec.rb - ee/spec/controllers/groups/analytics/cycle_analytics/value_streams_controller_spec.rb diff --git a/Gemfile b/Gemfile index cfa09f4c3cc..0cac20f42de 100644 --- a/Gemfile +++ b/Gemfile @@ -108,7 +108,7 @@ gem 'hashie-forbidden_attributes' gem 'kaminari', '~> 1.0' # HAML -gem 'hamlit', '~> 2.14.4' +gem 'hamlit', '~> 2.15.0' # Files attachments gem 'carrierwave', '~> 1.3' @@ -294,7 +294,7 @@ gem 'terser', '1.0.2' gem 'addressable', '~> 2.7' gem 'gemojione', '~> 3.3' -gem 'gon', '~> 6.2' +gem 'gon', '~> 6.4.0' gem 'request_store', '~> 1.5' gem 'base32', '~> 0.3.0' @@ -366,7 +366,7 @@ group :development, :test do gem 'database_cleaner', '~> 1.7.0' gem 'factory_bot_rails', '~> 6.1.0' - gem 'rspec-rails', '~> 4.1.2' + gem 'rspec-rails', '~> 5.0.1' # Prevent occasions where minitest is not bundled in packaged versions of ruby (see #3826) gem 'minitest', '~> 5.11.0' diff --git a/Gemfile.lock b/Gemfile.lock index 246e52650ce..98daf9aa8fb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -499,8 +499,9 @@ GEM rubyntlm (~> 0.5) globalid (0.4.2) activesupport (>= 4.2.0) - gon (6.2.0) - actionpack (>= 3.0) + gon (6.4.0) + actionpack (>= 3.0.20) + i18n (>= 0.7) multi_json request_store (>= 1.0) google-api-client (0.50.0) @@ -591,7 +592,7 @@ GEM rainbow rubocop (>= 0.50.0) sysexits (~> 1.1) - hamlit (2.14.4) + hamlit (2.15.0) temple (>= 0.8.2) thor tilt @@ -1075,10 +1076,10 @@ GEM proc_to_ast rspec (>= 2.13, < 4) unparser - rspec-rails (4.1.2) - actionpack (>= 4.2) - activesupport (>= 4.2) - railties (>= 4.2) + rspec-rails (5.0.1) + actionpack (>= 5.2) + activesupport (>= 5.2) + railties (>= 5.2) rspec-core (~> 3.10) rspec-expectations (~> 3.10) rspec-mocks (~> 3.10) @@ -1444,7 +1445,7 @@ DEPENDENCIES gitlab-styles (~> 6.2.0) gitlab_chronic_duration (~> 0.10.6.2) gitlab_omniauth-ldap (~> 2.1.1) - gon (~> 6.2) + gon (~> 6.4.0) google-api-client (~> 0.33) google-protobuf (~> 3.14.0) gpgme (~> 2.0.19) @@ -1460,7 +1461,7 @@ DEPENDENCIES gssapi guard-rspec haml_lint (~> 0.36.0) - hamlit (~> 2.14.4) + hamlit (~> 2.15.0) hangouts-chat (~> 0.0.5) hashie hashie-forbidden_attributes @@ -1563,7 +1564,7 @@ DEPENDENCIES rouge (~> 3.26.0) rqrcode-rails3 (~> 0.1.7) rspec-parameterized - rspec-rails (~> 4.1.2) + rspec-rails (~> 5.0.1) rspec-retry (~> 0.6.1) rspec_junit_formatter rspec_profiling (~> 0.0.6) diff --git a/app/assets/images/learn_gitlab/issue_created.svg b/app/assets/images/learn_gitlab/issue_created.svg new file mode 100644 index 00000000000..01652b97fc0 --- /dev/null +++ b/app/assets/images/learn_gitlab/issue_created.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 8f41b848b0b..02fb5df07e8 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -184,7 +184,12 @@ export default { 'viewDiffsFileByFile', 'mrReviews', ]), - ...mapGetters('diffs', ['whichCollapsedTypes', 'isParallelView', 'currentDiffIndex']), + ...mapGetters('diffs', [ + 'whichCollapsedTypes', + 'isParallelView', + 'currentDiffIndex', + 'fileCodequalityDiff', + ]), ...mapGetters(['isNotesFetched', 'getNoteableData']), diffs() { if (!this.viewDiffsFileByFile) { @@ -282,6 +287,7 @@ export default { endpointMetadata: this.endpointMetadata, endpointBatch: this.endpointBatch, endpointCoverage: this.endpointCoverage, + endpointCodequality: this.endpointCodequality, endpointUpdateUser: this.endpointUpdateUser, projectPath: this.projectPath, dismissEndpoint: this.dismissEndpoint, @@ -291,10 +297,6 @@ export default { mrReviews: this.rehydratedMrReviews, }); - if (this.endpointCodequality) { - this.setCodequalityEndpoint(this.endpointCodequality); - } - if (this.shouldShow) { this.fetchData(); } @@ -339,7 +341,6 @@ export default { ...mapActions('diffs', [ 'moveToNeighboringCommit', 'setBaseConfig', - 'setCodequalityEndpoint', 'fetchDiffFilesMeta', 'fetchDiffFilesBatch', 'fetchCoverageFiles', @@ -531,6 +532,7 @@ export default { :help-page-path="helpPagePath" :can-current-user-fork="canCurrentUserFork" :view-diffs-file-by-file="viewDiffsFileByFile" + :codequality-diff="fileCodequalityDiff(file.file_path)" />
[], + }, }, data() { return { @@ -80,7 +85,7 @@ export default { genericError: GENERIC_ERROR, }, computed: { - ...mapState('diffs', ['currentDiffFileId', 'codequalityDiff']), + ...mapState('diffs', ['currentDiffFileId']), ...mapGetters(['isNotesFetched']), ...mapGetters('diffs', ['getDiffFileDiscussions']), viewBlobHref() { @@ -149,9 +154,7 @@ export default { return loggedIn && featureOn; }, hasCodequalityChanges() { - return ( - this.codequalityDiff?.files && this.codequalityDiff?.files[this.file.file_path]?.length > 0 - ); + return this.codequalityDiff.length > 0; }, }, watch: { diff --git a/app/assets/javascripts/diffs/components/diff_row.vue b/app/assets/javascripts/diffs/components/diff_row.vue index 9f0f7d46804..8d398a2ded4 100644 --- a/app/assets/javascripts/diffs/components/diff_row.vue +++ b/app/assets/javascripts/diffs/components/diff_row.vue @@ -13,6 +13,11 @@ import { CONFLICT_THEIR, CONFLICT_MARKER, } from '../constants'; +import { + getInteropInlineAttributes, + getInteropOldSideAttributes, + getInteropNewSideAttributes, +} from '../utils/interoperability'; import DiffGutterAvatars from './diff_gutter_avatars.vue'; import * as utils from './diff_row_utils'; @@ -116,6 +121,16 @@ export default { isLeftConflictMarker() { return [CONFLICT_MARKER_OUR, CONFLICT_MARKER_THEIR].includes(this.line.left?.type); }, + interopLeftAttributes() { + if (this.inline) { + return getInteropInlineAttributes(this.line.left); + } + + return getInteropOldSideAttributes(this.line.left); + }, + interopRightAttributes() { + return getInteropNewSideAttributes(this.line.right); + }, }, mounted() { this.scrollToLineIfNeededParallel(this.line); @@ -181,6 +196,7 @@ export default {
diff --git a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue index 3d20dfd0c9b..147741fa2bb 100644 --- a/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue +++ b/app/assets/javascripts/diffs/components/parallel_diff_table_row.vue @@ -3,6 +3,10 @@ import { GlTooltipDirective, GlIcon, GlSafeHtmlDirective as SafeHtml } from '@gi import $ from 'jquery'; import { mapActions, mapGetters, mapState } from 'vuex'; import { CONTEXT_LINE_CLASS_NAME, PARALLEL_DIFF_VIEW_TYPE } from '../constants'; +import { + getInteropOldSideAttributes, + getInteropNewSideAttributes, +} from '../utils/interoperability'; import DiffGutterAvatars from './diff_gutter_avatars.vue'; import * as utils from './diff_row_utils'; @@ -108,6 +112,12 @@ export default { this.line.hasDiscussionsRight, ); }, + interopLeftAttributes() { + return getInteropOldSideAttributes(this.line.left); + }, + interopRightAttributes() { + return getInteropNewSideAttributes(this.line.right); + }, }, mounted() { this.scrollToLineIfNeededParallel(this.line); @@ -217,6 +227,7 @@ export default { :key="line.left.line_code" v-safe-html="line.left.rich_text" :class="parallelViewLeftLineType" + v-bind="interopLeftAttributes" class="line_content with-coverage parallel left-side" @mousedown="handleParallelLineMouseDown" > @@ -283,6 +294,7 @@ export default { hll: isHighlighted, }, ]" + v-bind="interopRightAttributes" class="line_content with-coverage parallel right-side" @mousedown="handleParallelLineMouseDown" > diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 1c66ad1a18c..81416984dbf 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -1,4 +1,5 @@ import Cookies from 'js-cookie'; +import Visibility from 'visibilityjs'; import Vue from 'vue'; import { deprecatedCreateFlash as createFlash } from '~/flash'; import { diffViewerModes } from '~/ide/constants'; @@ -52,12 +53,15 @@ import { prepareLineForRenamedFile, } from './utils'; +let eTagPoll; + export const setBaseConfig = ({ commit }, options) => { const { endpoint, endpointMetadata, endpointBatch, endpointCoverage, + endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -71,6 +75,7 @@ export const setBaseConfig = ({ commit }, options) => { endpointMetadata, endpointBatch, endpointCoverage, + endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -233,6 +238,48 @@ export const fetchCoverageFiles = ({ commit, state }) => { coveragePoll.makeRequest(); }; +export const clearEtagPoll = () => { + eTagPoll = null; +}; + +export const stopCodequalityPolling = () => { + if (eTagPoll) eTagPoll.stop(); +}; + +export const restartCodequalityPolling = () => { + if (eTagPoll) eTagPoll.restart(); +}; + +export const fetchCodequality = ({ commit, state, dispatch }) => { + eTagPoll = new Poll({ + resource: { + getCodequalityDiffReports: (endpoint) => axios.get(endpoint), + }, + data: state.endpointCodequality, + method: 'getCodequalityDiffReports', + successCallback: ({ status, data }) => { + if (status === httpStatusCodes.OK) { + commit(types.SET_CODEQUALITY_DATA, data); + + eTagPoll.stop(); + } + }, + errorCallback: () => createFlash(__('Something went wrong on our end. Please try again!')), + }); + + if (!Visibility.hidden()) { + eTagPoll.makeRequest(); + } + + Visibility.change(() => { + if (!Visibility.hidden()) { + dispatch('restartCodequalityPolling'); + } else { + dispatch('stopCodequalityPolling'); + } + }); +}; + export const setHighlightedRow = ({ commit }, lineCode) => { const fileHash = lineCode.split('_')[0]; commit(types.SET_HIGHLIGHTED_ROW, lineCode); diff --git a/app/assets/javascripts/diffs/store/getters.js b/app/assets/javascripts/diffs/store/getters.js index dec3f87b03e..b06faa2284b 100644 --- a/app/assets/javascripts/diffs/store/getters.js +++ b/app/assets/javascripts/diffs/store/getters.js @@ -135,6 +135,16 @@ export const fileLineCoverage = (state) => (file, line) => { return {}; }; +/** + * Returns the codequality diff data for a given file + * @param {string} filePath + * @returns {Array} + */ +export const fileCodequalityDiff = (state) => (filePath) => { + if (!state.codequalityDiff.files || !state.codequalityDiff.files[filePath]) return []; + return state.codequalityDiff.files[filePath]; +}; + /** * Returns index of a currently selected diff in diffFiles * @returns {number} diff --git a/app/assets/javascripts/diffs/store/modules/diff_state.js b/app/assets/javascripts/diffs/store/modules/diff_state.js index 38366663cfd..a99ef00d61e 100644 --- a/app/assets/javascripts/diffs/store/modules/diff_state.js +++ b/app/assets/javascripts/diffs/store/modules/diff_state.js @@ -9,7 +9,8 @@ import { import { fileByFile } from '../../utils/preferences'; import { getDefaultWhitespace } from '../utils'; -const viewTypeFromQueryString = getParameterValues('view')[0]; +const getViewTypeFromQueryString = () => getParameterValues('view')[0]; + const viewTypeFromCookie = Cookies.get(DIFF_VIEW_COOKIE_NAME); const defaultViewType = INLINE_DIFF_VIEW_TYPE; const whiteSpaceFromQueryString = getParameterValues('w')[0]; @@ -29,9 +30,10 @@ export default () => ({ startVersion: null, // Null unless a target diff is selected for comparison that is not the "base" diff diffFiles: [], coverageFiles: {}, + codequalityDiff: {}, mergeRequestDiffs: [], mergeRequestDiff: null, - diffViewType: viewTypeFromQueryString || viewTypeFromCookie || defaultViewType, + diffViewType: getViewTypeFromQueryString() || viewTypeFromCookie || defaultViewType, tree: [], treeEntries: {}, showTreeList: true, diff --git a/app/assets/javascripts/diffs/store/modules/index.js b/app/assets/javascripts/diffs/store/modules/index.js index 03d11e60745..6860e24db6b 100644 --- a/app/assets/javascripts/diffs/store/modules/index.js +++ b/app/assets/javascripts/diffs/store/modules/index.js @@ -1,7 +1,7 @@ -import * as actions from 'ee_else_ce/diffs/store/actions'; -import createState from 'ee_else_ce/diffs/store/modules/diff_state'; -import mutations from 'ee_else_ce/diffs/store/mutations'; +import * as actions from '../actions'; import * as getters from '../getters'; +import mutations from '../mutations'; +import createState from './diff_state'; export default () => ({ namespaced: true, diff --git a/app/assets/javascripts/diffs/store/mutation_types.js b/app/assets/javascripts/diffs/store/mutation_types.js index 4641731c4b6..b0f396f905a 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -11,6 +11,7 @@ export const SET_MR_FILE_REVIEWS = 'SET_MR_FILE_REVIEWS'; export const SET_DIFF_VIEW_TYPE = 'SET_DIFF_VIEW_TYPE'; export const SET_COVERAGE_DATA = 'SET_COVERAGE_DATA'; +export const SET_CODEQUALITY_DATA = 'SET_CODEQUALITY_DATA'; export const SET_MERGE_REQUEST_DIFFS = 'SET_MERGE_REQUEST_DIFFS'; export const TOGGLE_LINE_HAS_FORM = 'TOGGLE_LINE_HAS_FORM'; export const ADD_CONTEXT_LINES = 'ADD_CONTEXT_LINES'; diff --git a/app/assets/javascripts/diffs/store/mutations.js b/app/assets/javascripts/diffs/store/mutations.js index 9ff9a02d444..eacf76234fc 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -33,6 +33,7 @@ export default { endpointMetadata, endpointBatch, endpointCoverage, + endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -46,6 +47,7 @@ export default { endpointMetadata, endpointBatch, endpointCoverage, + endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -89,6 +91,10 @@ export default { Object.assign(state, { coverageFiles }); }, + [types.SET_CODEQUALITY_DATA](state, codequalityDiffData) { + Object.assign(state, { codequalityDiff: codequalityDiffData }); + }, + [types.RENDER_FILE](state, file) { renderFile(file); }, diff --git a/app/assets/javascripts/diffs/utils/interoperability.js b/app/assets/javascripts/diffs/utils/interoperability.js new file mode 100644 index 00000000000..a52e8fd25f5 --- /dev/null +++ b/app/assets/javascripts/diffs/utils/interoperability.js @@ -0,0 +1,49 @@ +const OLD = 'old'; +const NEW = 'new'; +const ATTR_PREFIX = 'data-interop-'; + +export const ATTR_TYPE = `${ATTR_PREFIX}type`; +export const ATTR_LINE = `${ATTR_PREFIX}line`; +export const ATTR_NEW_LINE = `${ATTR_PREFIX}new-line`; +export const ATTR_OLD_LINE = `${ATTR_PREFIX}old-line`; + +export const getInteropInlineAttributes = (line) => { + if (!line) { + return null; + } + + const interopType = line.type?.startsWith(OLD) ? OLD : NEW; + + const interopLine = interopType === OLD ? line.old_line : line.new_line; + + return { + [ATTR_TYPE]: interopType, + [ATTR_LINE]: interopLine, + [ATTR_NEW_LINE]: line.new_line, + [ATTR_OLD_LINE]: line.old_line, + }; +}; + +export const getInteropOldSideAttributes = (line) => { + if (!line) { + return null; + } + + return { + [ATTR_TYPE]: OLD, + [ATTR_LINE]: line.old_line, + [ATTR_OLD_LINE]: line.old_line, + }; +}; + +export const getInteropNewSideAttributes = (line) => { + if (!line) { + return null; + } + + return { + [ATTR_TYPE]: NEW, + [ATTR_LINE]: line.new_line, + [ATTR_NEW_LINE]: line.new_line, + }; +}; diff --git a/app/assets/javascripts/ide/components/ide_status_mr.vue b/app/assets/javascripts/ide/components/ide_status_mr.vue index a3b26d23a17..d05ca4141c8 100644 --- a/app/assets/javascripts/ide/components/ide_status_mr.vue +++ b/app/assets/javascripts/ide/components/ide_status_mr.vue @@ -20,7 +20,7 @@ export default {