From 7ad147d6b88837b12b02d1b1711061dcdcd6c0e3 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 13 Apr 2021 12:11:32 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITALY_SERVER_VERSION | 2 +- .../extensions/code_block_highlight.js | 38 +++++++++ .../content_editor/services/create_editor.js | 30 ++++++- .../services/markdown_serializer.js | 5 +- .../javascripts/diffs/components/app.vue | 14 ++-- .../diffs/components/diff_file.vue | 11 +-- app/assets/javascripts/diffs/store/actions.js | 47 ----------- app/assets/javascripts/diffs/store/getters.js | 10 --- .../diffs/store/modules/diff_state.js | 1 - .../javascripts/diffs/store/modules/index.js | 6 +- .../javascripts/diffs/store/mutation_types.js | 1 - .../javascripts/diffs/store/mutations.js | 6 -- .../pipelines_list/pipelines_ci_templates.vue | 12 +++ .../merge_requests/resolve_todos_service.rb | 28 +++++++ app/services/merge_requests/update_service.rb | 6 +- app/views/admin/users/_head.html.haml | 12 +-- app/views/groups/runners/_runner.html.haml | 8 +- app/views/profiles/gpg_keys/_key.html.haml | 2 +- app/workers/all_queues.yml | 8 ++ .../merge_requests/resolve_todos_worker.rb | 18 ++++ .../20827-async-todo-creation-resolution.yml | 5 ++ ...alize-strings-in-users-_head-html-haml.yml | 5 ++ changelogs/unreleased/ab-spam-logs-index.yml | 5 ++ changelogs/unreleased/btn-icon-gpg-delete.yml | 5 ++ ...b-update-usage-ping-metrics-definition.yml | 5 ++ .../resolve_merge_request_todos_async.yml | 8 ++ ...136_i_testing_test_case_parsed_monthly.yml | 1 - ...rics_report_artifact_uploaders_monthly.yml | 20 ----- ...testing_paid_monthly_active_user_total.yml | 16 ---- ...40_testing_total_unique_counts_monthly.yml | 3 +- ...2134_i_testing_test_case_parsed_weekly.yml | 1 - ...trics_report_artifact_uploaders_weekly.yml | 20 ----- config/sidekiq_queues.yml | 2 + ...10412142223_add_user_index_on_spam_logs.rb | 17 ++++ ...ackfill_events_id_for_bigint_conversion.rb | 10 ++- ..._payload_event_id_for_bigint_conversion.rb | 10 ++- db/schema_migrations/20210412142223 | 1 + db/structure.sql | 2 + doc/administration/geo/index.md | 2 +- .../end_to_end/beginners_guide.md | 7 +- doc/development/usage_ping/dictionary.md | 58 ++++++------- doc/policy/maintenance.md | 2 +- doc/user/project/issues/managing_issues.md | 8 -- .../pages_new_project_template.md | 2 +- doc/user/project/pages/index.md | 2 +- lib/gitlab/ci/config/entry/processable.rb | 4 - .../ci/config/normalizer/matrix_strategy.rb | 8 +- lib/gitlab/ci/pipeline/chain/seed.rb | 4 +- lib/gitlab/ci/pipeline/seed/build.rb | 2 +- .../background_migration_helpers.rb | 20 +++-- lib/gitlab/web_ide/config/entry/terminal.rb | 8 +- locale/gitlab.pot | 13 ++- package.json | 4 +- qa/qa/service/praefect_manager.rb | 8 +- .../api/3_create/gitaly/gitaly_mtls_spec.rb | 2 +- scripts/gitaly_test.rb | 3 +- 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/fixtures/api_markdown.yml | 44 +++++++++- .../pipelines/pipelines_ci_templates_spec.js | 27 ++++++ .../ci/config/entry/processable_spec.rb | 29 ------- .../config/normalizer/matrix_strategy_spec.rb | 49 ----------- .../web_ide/config/entry/terminal_spec.rb | 20 ----- spec/models/concerns/milestoneish_spec.rb | 65 +++++++------- .../resolve_todos_service_spec.rb | 49 +++++++++++ .../merge_requests/update_service_spec.rb | 84 +++++++++++-------- .../resolve_todos_worker_spec.rb | 41 +++++++++ yarn.lock | 40 +++++---- 69 files changed, 580 insertions(+), 507 deletions(-) create mode 100644 app/assets/javascripts/content_editor/extensions/code_block_highlight.js create mode 100644 app/services/merge_requests/resolve_todos_service.rb create mode 100644 app/workers/merge_requests/resolve_todos_worker.rb create mode 100644 changelogs/unreleased/20827-async-todo-creation-resolution.yml create mode 100644 changelogs/unreleased/Externalize-strings-in-users-_head-html-haml.yml create mode 100644 changelogs/unreleased/ab-spam-logs-index.yml create mode 100644 changelogs/unreleased/btn-icon-gpg-delete.yml create mode 100644 changelogs/unreleased/eb-update-usage-ping-metrics-definition.yml create mode 100644 config/feature_flags/development/resolve_merge_request_todos_async.yml delete mode 100644 config/metrics/counts_28d/20210216182200_i_testing_metrics_report_artifact_uploaders_monthly.yml delete mode 100644 config/metrics/counts_28d/20210216183209_i_testing_paid_monthly_active_user_total.yml delete mode 100644 config/metrics/counts_7d/20210216182158_i_testing_metrics_report_artifact_uploaders_weekly.yml create mode 100644 db/migrate/20210412142223_add_user_index_on_spam_logs.rb create mode 100644 db/schema_migrations/20210412142223 create mode 100644 spec/services/merge_requests/resolve_todos_service_spec.rb create mode 100644 spec/workers/merge_requests/resolve_todos_worker_spec.rb diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index a9d42925fc7..07684334b57 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -4ea88e921af65ba0577c40f8b54830c97adaa56c +996add2f4e011cec8e9317912978cf1fa59e66c1 diff --git a/app/assets/javascripts/content_editor/extensions/code_block_highlight.js b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js new file mode 100644 index 00000000000..1d050ed208b --- /dev/null +++ b/app/assets/javascripts/content_editor/extensions/code_block_highlight.js @@ -0,0 +1,38 @@ +import { CodeBlockHighlight as BaseCodeBlockHighlight } from 'tiptap-extensions'; + +export default class GlCodeBlockHighlight extends BaseCodeBlockHighlight { + get schema() { + const baseSchema = super.schema; + + return { + ...baseSchema, + attrs: { + params: { + default: null, + }, + }, + parseDOM: [ + { + tag: 'pre', + preserveWhitespace: 'full', + getAttrs: (node) => { + const code = node.querySelector('code'); + + if (!code) { + return null; + } + + return { + /* `params` is the name of the attribute that + prosemirror-markdown uses to extract the language + of a codeblock. + https://github.com/ProseMirror/prosemirror-markdown/blob/master/src/to_markdown.js#L62 + */ + params: code.getAttribute('lang'), + }; + }, + }, + ], + }; + } +} diff --git a/app/assets/javascripts/content_editor/services/create_editor.js b/app/assets/javascripts/content_editor/services/create_editor.js index 5ff80350f5d..128d332b0a2 100644 --- a/app/assets/javascripts/content_editor/services/create_editor.js +++ b/app/assets/javascripts/content_editor/services/create_editor.js @@ -1,7 +1,20 @@ import { isFunction, isString } from 'lodash'; import { Editor } from 'tiptap'; -import { Bold, Code } from 'tiptap-extensions'; +import { + Bold, + Italic, + Code, + Link, + Image, + Heading, + Blockquote, + HorizontalRule, + BulletList, + OrderedList, + ListItem, +} from 'tiptap-extensions'; import { PROVIDE_SERIALIZER_OR_RENDERER_ERROR } from '../constants'; +import CodeBlockHighlight from '../extensions/code_block_highlight'; import createMarkdownSerializer from './markdown_serializer'; const createEditor = async ({ content, renderMarkdown, serializer: customSerializer } = {}) => { @@ -10,7 +23,20 @@ const createEditor = async ({ content, renderMarkdown, serializer: customSeriali } const editor = new Editor({ - extensions: [new Bold(), new Code()], + extensions: [ + new Bold(), + new Italic(), + new Code(), + new Link(), + new Image(), + new Heading({ levels: [1, 2, 3, 4, 5, 6] }), + new Blockquote(), + new HorizontalRule(), + new BulletList(), + new ListItem(), + new OrderedList(), + new CodeBlockHighlight(), + ], }); const serializer = customSerializer || createMarkdownSerializer({ render: renderMarkdown }); diff --git a/app/assets/javascripts/content_editor/services/markdown_serializer.js b/app/assets/javascripts/content_editor/services/markdown_serializer.js index 632d4f92218..e3b5775e320 100644 --- a/app/assets/javascripts/content_editor/services/markdown_serializer.js +++ b/app/assets/javascripts/content_editor/services/markdown_serializer.js @@ -60,9 +60,12 @@ const create = ({ render = () => null }) => { // creates a bold alias for the strong mark converter ...defaultMarkdownSerializer.marks.strong, }, + italic: { open: '_', close: '_', mixable: true, expelEnclosingWhitespace: true }, }); - return serializer.serialize(document); + return serializer.serialize(document, { + tightLists: true, + }); }, }; }; diff --git a/app/assets/javascripts/diffs/components/app.vue b/app/assets/javascripts/diffs/components/app.vue index 02fb5df07e8..8f41b848b0b 100644 --- a/app/assets/javascripts/diffs/components/app.vue +++ b/app/assets/javascripts/diffs/components/app.vue @@ -184,12 +184,7 @@ export default { 'viewDiffsFileByFile', 'mrReviews', ]), - ...mapGetters('diffs', [ - 'whichCollapsedTypes', - 'isParallelView', - 'currentDiffIndex', - 'fileCodequalityDiff', - ]), + ...mapGetters('diffs', ['whichCollapsedTypes', 'isParallelView', 'currentDiffIndex']), ...mapGetters(['isNotesFetched', 'getNoteableData']), diffs() { if (!this.viewDiffsFileByFile) { @@ -287,7 +282,6 @@ export default { endpointMetadata: this.endpointMetadata, endpointBatch: this.endpointBatch, endpointCoverage: this.endpointCoverage, - endpointCodequality: this.endpointCodequality, endpointUpdateUser: this.endpointUpdateUser, projectPath: this.projectPath, dismissEndpoint: this.dismissEndpoint, @@ -297,6 +291,10 @@ export default { mrReviews: this.rehydratedMrReviews, }); + if (this.endpointCodequality) { + this.setCodequalityEndpoint(this.endpointCodequality); + } + if (this.shouldShow) { this.fetchData(); } @@ -341,6 +339,7 @@ export default { ...mapActions('diffs', [ 'moveToNeighboringCommit', 'setBaseConfig', + 'setCodequalityEndpoint', 'fetchDiffFilesMeta', 'fetchDiffFilesBatch', 'fetchCoverageFiles', @@ -532,7 +531,6 @@ 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 { @@ -85,7 +80,7 @@ export default { genericError: GENERIC_ERROR, }, computed: { - ...mapState('diffs', ['currentDiffFileId']), + ...mapState('diffs', ['currentDiffFileId', 'codequalityDiff']), ...mapGetters(['isNotesFetched']), ...mapGetters('diffs', ['getDiffFileDiscussions']), viewBlobHref() { @@ -154,7 +149,9 @@ export default { return loggedIn && featureOn; }, hasCodequalityChanges() { - return this.codequalityDiff.length > 0; + return ( + this.codequalityDiff?.files && this.codequalityDiff?.files[this.file.file_path]?.length > 0 + ); }, }, watch: { diff --git a/app/assets/javascripts/diffs/store/actions.js b/app/assets/javascripts/diffs/store/actions.js index 81416984dbf..1c66ad1a18c 100644 --- a/app/assets/javascripts/diffs/store/actions.js +++ b/app/assets/javascripts/diffs/store/actions.js @@ -1,5 +1,4 @@ import Cookies from 'js-cookie'; -import Visibility from 'visibilityjs'; import Vue from 'vue'; import { deprecatedCreateFlash as createFlash } from '~/flash'; import { diffViewerModes } from '~/ide/constants'; @@ -53,15 +52,12 @@ import { prepareLineForRenamedFile, } from './utils'; -let eTagPoll; - export const setBaseConfig = ({ commit }, options) => { const { endpoint, endpointMetadata, endpointBatch, endpointCoverage, - endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -75,7 +71,6 @@ export const setBaseConfig = ({ commit }, options) => { endpointMetadata, endpointBatch, endpointCoverage, - endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -238,48 +233,6 @@ 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 b06faa2284b..dec3f87b03e 100644 --- a/app/assets/javascripts/diffs/store/getters.js +++ b/app/assets/javascripts/diffs/store/getters.js @@ -135,16 +135,6 @@ 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 e5bbc9ed8f8..38366663cfd 100644 --- a/app/assets/javascripts/diffs/store/modules/diff_state.js +++ b/app/assets/javascripts/diffs/store/modules/diff_state.js @@ -29,7 +29,6 @@ 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, diff --git a/app/assets/javascripts/diffs/store/modules/index.js b/app/assets/javascripts/diffs/store/modules/index.js index 6860e24db6b..03d11e60745 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 '../actions'; +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 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 b0f396f905a..4641731c4b6 100644 --- a/app/assets/javascripts/diffs/store/mutation_types.js +++ b/app/assets/javascripts/diffs/store/mutation_types.js @@ -11,7 +11,6 @@ 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 eacf76234fc..9ff9a02d444 100644 --- a/app/assets/javascripts/diffs/store/mutations.js +++ b/app/assets/javascripts/diffs/store/mutations.js @@ -33,7 +33,6 @@ export default { endpointMetadata, endpointBatch, endpointCoverage, - endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -47,7 +46,6 @@ export default { endpointMetadata, endpointBatch, endpointCoverage, - endpointCodequality, endpointUpdateUser, projectPath, dismissEndpoint, @@ -91,10 +89,6 @@ 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/pipelines/components/pipelines_list/pipelines_ci_templates.vue b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue index 4d4420436a5..c2ec8c57fd7 100644 --- a/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue +++ b/app/assets/javascripts/pipelines/components/pipelines_list/pipelines_ci_templates.vue @@ -1,5 +1,6 @@