From eb90d59b8c3133fac0dce157dfb6eb26ae735454 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 11 Dec 2024 18:26:46 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITALY_SERVER_VERSION | 2 +- .../components/new_access_token_app.vue | 5 +- app/assets/javascripts/merge_request_tabs.js | 2 +- .../merge_requests/reports/components/app.vue | 113 +++++++++ .../merge_requests/reports/constants.js | 4 + .../merge_requests/reports/index.js | 37 ++- .../reports/pages/blockers_page.vue | 9 + .../merge_requests/reports/pages/index.vue | 9 + .../merge_requests/reports/routes.js | 31 +++ .../pages/projects/blob/show/index.js | 1 - .../projects/merge_requests/reports/index.js | 5 + .../components/commit_pipeline_status.vue | 16 +- .../javascripts/search/results/constants.js | 2 +- .../components/queries/todo.fragment.graphql | 1 + .../todos/components/todo_item_title.vue | 61 +++-- .../todo_item_title_hidden_by_saml.vue | 2 +- .../components/list_selector/group_item.vue | 28 +-- .../components/list_selector/project_item.vue | 14 +- .../components/list_selector/user_item.vue | 18 +- .../components/content_editor.scss | 8 +- app/assets/stylesheets/framework.scss | 1 - .../stylesheets/framework/animations.scss | 9 - .../stylesheets/framework/source_editor.scss | 29 ++- app/assets/stylesheets/framework/spinner.scss | 39 --- .../stylesheets/framework/typography.scss | 5 + .../stylesheets/highlight/_white_base.scss | 30 +-- .../stylesheets/page_bundles/work_items.scss | 20 +- app/assets/stylesheets/pages/commits.scss | 11 - app/assets/stylesheets/pages/note_form.scss | 3 +- app/assets/stylesheets/vendors/atwho.scss | 5 +- app/controllers/application_controller.rb | 4 + .../concerns/sessionless_authentication.rb | 12 +- app/controllers/graphql_controller.rb | 33 ++- .../user_settings/passwords_controller.rb | 5 +- app/finders/ci/build_source_finder.rb | 83 +++++++ app/finders/ci/jobs_finder.rb | 5 +- .../resolvers/project_jobs_resolver.rb | 26 +- app/graphql/types/ci/job_source_enum.rb | 15 ++ app/helpers/application_helper.rb | 1 - app/helpers/ci/status_helper.rb | 6 +- app/helpers/projects_helper.rb | 9 - app/models/ci/build_source.rb | 11 +- app/models/oauth_access_token.rb | 8 +- app/services/groups/transfer_service.rb | 11 +- app/services/groups/update_service.rb | 14 +- ...assign_placeholder_user_records_service.rb | 83 ++++++- .../mark_package_for_destruction_service.rb | 2 +- .../application_settings/general.html.haml | 2 + app/views/ci/status/_icon.html.haml | 3 +- app/views/projects/commits/_commit.html.haml | 13 +- .../personal_access_tokens/index.html.haml | 2 +- ...eassign_placeholder_user_records_worker.rb | 14 +- .../bulk_import_importer_user_mapping.yml | 4 +- .../gitlab_com_derisk/fix_graphql_csrf.yml | 9 + .../reassignment_throttling.yml | 9 + .../populate_and_use_build_source_table.yml | 9 + .../backfill_resource_link_events.yml | 2 +- db/docs/software_licenses.yml | 1 - ...241201092435_add_index_to_build_sources.rb | 20 ++ ..._finalize_backfill_resource_link_events.rb | 9 +- db/schema_migrations/20241201092435 | 1 + db/structure.sql | 2 + doc/api/graphql/reference/index.md | 28 ++- doc/api/group_security_settings.md | 44 ++++ doc/api/notes.md | 5 + doc/ci/yaml/artifacts_reports.md | 2 +- .../vulnerabilities/index.md | 3 +- lib/api/npm_project_packages.rb | 10 +- locale/gitlab.pot | 30 +++ .../application_controller_spec.rb | 13 + spec/factories/ci/builds.rb | 6 + .../personal_access_tokens_spec.rb | 5 + spec/finders/ci/build_source_finder_spec.rb | 82 +++++++ .../reports/components/app_spec.js | 29 +++ .../results/components/blob_footer_spec.js | 2 +- .../todos/components/todo_item_title_spec.js | 4 +- spec/frontend/todos/mock_data.js | 2 + .../list_selector/group_item_spec.js | 28 +-- .../list_selector/project_item_spec.js | 25 +- .../list_selector/user_item_spec.js | 27 ++- .../resolvers/project_jobs_resolver_spec.rb | 62 +++++ spec/graphql/types/project_type_spec.rb | 6 +- spec/helpers/application_helper_spec.rb | 39 --- spec/models/oauth_access_token_spec.rb | 51 ++-- .../graphql/mutations/snippets/update_spec.rb | 12 +- spec/requests/api/graphql_spec.rb | 112 ++++++++- .../requests/api/npm_project_packages_spec.rb | 10 + .../passwords_controller_spec.rb | 61 +++++ spec/services/groups/transfer_service_spec.rb | 23 ++ spec/services/groups/update_service_spec.rb | 27 +++ ...n_placeholder_user_records_service_spec.rb | 225 +++++++++++++++++- ...rk_package_for_destruction_service_spec.rb | 13 +- .../npm/generate_metadata_service_spec.rb | 12 +- .../helpers/features/access_token_helpers.rb | 4 + ...gn_placeholder_user_records_worker_spec.rb | 17 ++ 95 files changed, 1586 insertions(+), 381 deletions(-) create mode 100644 app/assets/javascripts/merge_requests/reports/components/app.vue create mode 100644 app/assets/javascripts/merge_requests/reports/constants.js create mode 100644 app/assets/javascripts/merge_requests/reports/pages/blockers_page.vue create mode 100644 app/assets/javascripts/merge_requests/reports/pages/index.vue create mode 100644 app/assets/javascripts/merge_requests/reports/routes.js create mode 100644 app/assets/javascripts/pages/projects/merge_requests/reports/index.js delete mode 100644 app/assets/stylesheets/framework/spinner.scss create mode 100644 app/finders/ci/build_source_finder.rb create mode 100644 app/graphql/types/ci/job_source_enum.rb rename config/feature_flags/{wip => beta}/bulk_import_importer_user_mapping.yml (90%) create mode 100644 config/feature_flags/gitlab_com_derisk/fix_graphql_csrf.yml create mode 100644 config/feature_flags/gitlab_com_derisk/reassignment_throttling.yml create mode 100644 config/feature_flags/wip/populate_and_use_build_source_table.yml create mode 100644 db/migrate/20241201092435_add_index_to_build_sources.rb create mode 100644 db/schema_migrations/20241201092435 create mode 100644 doc/api/group_security_settings.md create mode 100644 spec/finders/ci/build_source_finder_spec.rb create mode 100644 spec/frontend/merge_requests/reports/components/app_spec.js create mode 100644 spec/requests/user_settings/passwords_controller_spec.rb diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 49420e8c346..fd5fa34f296 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -d62dac6422b1a1e4198a14b7b4e831633e85a79a +8fa071ac4eb77db878e85ce1fa6bb7bbad18e963 diff --git a/app/assets/javascripts/access_tokens/components/new_access_token_app.vue b/app/assets/javascripts/access_tokens/components/new_access_token_app.vue index d705b9a11ba..8d9a01c2a4d 100644 --- a/app/assets/javascripts/access_tokens/components/new_access_token_app.vue +++ b/app/assets/javascripts/access_tokens/components/new_access_token_app.vue @@ -102,7 +102,7 @@ export default { onSuccess(event) { this.beforeDisplayResults(); - const [{ newToken }] = convertEventDetail(event); + const [{ newToken, total }] = convertEventDetail(event); this.newToken = newToken; this.alert = createAlert({ message: this.alertInfoMessage, variant: VARIANT_INFO }); @@ -124,8 +124,7 @@ export default { document.querySelectorAll('.js-token-card').forEach((el) => { el.querySelector('.js-add-new-token-form').style.display = ''; el.querySelector('.js-toggle-button').style.display = 'block'; - el.querySelector('.js-token-count').innerText = - parseInt(el.querySelector('.js-token-count').innerText, 10) + 1; + el.querySelector('.js-token-count').innerText = total; }); }, }, diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js index 175fc166768..f4c79bd97bd 100644 --- a/app/assets/javascripts/merge_request_tabs.js +++ b/app/assets/javascripts/merge_request_tabs.js @@ -187,7 +187,7 @@ export function getActionFromHref(pathName) { export const pageBundles = { show: () => import(/* webpackPrefetch: true */ '~/mr_notes/mount_app'), diffs: () => import(/* webpackPrefetch: true */ '~/diffs'), - reports: () => import('ee_else_ce/merge_requests/reports'), + reports: () => import('~/merge_requests/reports'), }; export default class MergeRequestTabs { diff --git a/app/assets/javascripts/merge_requests/reports/components/app.vue b/app/assets/javascripts/merge_requests/reports/components/app.vue new file mode 100644 index 00000000000..f66470dc63b --- /dev/null +++ b/app/assets/javascripts/merge_requests/reports/components/app.vue @@ -0,0 +1,113 @@ + + + diff --git a/app/assets/javascripts/merge_requests/reports/constants.js b/app/assets/javascripts/merge_requests/reports/constants.js new file mode 100644 index 00000000000..4cd134372c5 --- /dev/null +++ b/app/assets/javascripts/merge_requests/reports/constants.js @@ -0,0 +1,4 @@ +export const BLOCKERS_ROUTE = 'index'; +export const CODE_QUALITY_ROUTE = 'code-quality'; +export const SECURITY_ROUTE = 'security'; +export const LICENSE_COMPLIANCE_ROUTE = 'license-compliance'; diff --git a/app/assets/javascripts/merge_requests/reports/index.js b/app/assets/javascripts/merge_requests/reports/index.js index 2d1ec238274..32b1e797b2b 100644 --- a/app/assets/javascripts/merge_requests/reports/index.js +++ b/app/assets/javascripts/merge_requests/reports/index.js @@ -1 +1,36 @@ -export default () => {}; +import Vue from 'vue'; +import VueRouter from 'vue-router'; +import VueApollo from 'vue-apollo'; +import createDefaultClient from '~/lib/graphql'; +import routes from './routes'; +import MergeRequestReportsApp from './components/app.vue'; + +export default () => { + Vue.use(VueRouter); + Vue.use(VueApollo); + + const el = document.getElementById('js-reports-tab'); + const { projectPath, iid, basePath } = el.dataset; + const apolloProvider = new VueApollo({ + defaultClient: createDefaultClient(), + }); + const router = new VueRouter({ + base: basePath, + mode: 'history', + routes, + }); + + // eslint-disable-next-line no-new + new Vue({ + el, + router, + apolloProvider, + provide: { + projectPath, + iid, + }, + render(createElement) { + return createElement(MergeRequestReportsApp); + }, + }); +}; diff --git a/app/assets/javascripts/merge_requests/reports/pages/blockers_page.vue b/app/assets/javascripts/merge_requests/reports/pages/blockers_page.vue new file mode 100644 index 00000000000..c3bf0782a5b --- /dev/null +++ b/app/assets/javascripts/merge_requests/reports/pages/blockers_page.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/assets/javascripts/merge_requests/reports/pages/index.vue b/app/assets/javascripts/merge_requests/reports/pages/index.vue new file mode 100644 index 00000000000..b4f055da191 --- /dev/null +++ b/app/assets/javascripts/merge_requests/reports/pages/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/app/assets/javascripts/merge_requests/reports/routes.js b/app/assets/javascripts/merge_requests/reports/routes.js new file mode 100644 index 00000000000..a3906ffbd03 --- /dev/null +++ b/app/assets/javascripts/merge_requests/reports/routes.js @@ -0,0 +1,31 @@ +import BlockersPage from 'ee_else_ce/merge_requests/reports/pages/blockers_page.vue'; +import IndexComponent from './pages/index.vue'; +import { + BLOCKERS_ROUTE, + CODE_QUALITY_ROUTE, + LICENSE_COMPLIANCE_ROUTE, + SECURITY_ROUTE, +} from './constants'; + +export default [ + { + path: '/', + name: BLOCKERS_ROUTE, + component: BlockersPage, + }, + { + path: '/?type=code-quality', + name: CODE_QUALITY_ROUTE, + component: IndexComponent, + }, + { + path: '/?type=security', + name: SECURITY_ROUTE, + component: IndexComponent, + }, + { + path: '/?type=license-compliance', + name: LICENSE_COMPLIANCE_ROUTE, + component: IndexComponent, + }, +]; diff --git a/app/assets/javascripts/pages/projects/blob/show/index.js b/app/assets/javascripts/pages/projects/blob/show/index.js index ff799809e88..ee396cb730f 100644 --- a/app/assets/javascripts/pages/projects/blob/show/index.js +++ b/app/assets/javascripts/pages/projects/blob/show/index.js @@ -229,7 +229,6 @@ const initTreeHistoryLinkApp = (el) => { { attrs: { href: url.href, - class: '!gl-ml-3', }, }, [__('History')], diff --git a/app/assets/javascripts/pages/projects/merge_requests/reports/index.js b/app/assets/javascripts/pages/projects/merge_requests/reports/index.js new file mode 100644 index 00000000000..efd5c7ccba9 --- /dev/null +++ b/app/assets/javascripts/pages/projects/merge_requests/reports/index.js @@ -0,0 +1,5 @@ +import { initMrPage } from '~/pages/projects/merge_requests/page'; +import initReportsApp from '~/merge_requests/reports'; + +initMrPage(); +initReportsApp(); diff --git a/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue b/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue index d7c38875d86..7d376cf143c 100644 --- a/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue +++ b/app/assets/javascripts/projects/tree/components/commit_pipeline_status.vue @@ -99,13 +99,11 @@ export default { }; diff --git a/app/assets/javascripts/search/results/constants.js b/app/assets/javascripts/search/results/constants.js index 23f13e9ad72..a023079a435 100644 --- a/app/assets/javascripts/search/results/constants.js +++ b/app/assets/javascripts/search/results/constants.js @@ -1,4 +1,4 @@ -export const DEFAULT_FETCH_CHUNKS = 50; +export const DEFAULT_FETCH_CHUNKS = 5; export const PROJECT_GRAPHQL_ID_TYPE = 'Project'; export const GROUP_GRAPHQL_ID_TYPE = 'Group'; export const SEARCH_RESULTS_DEBOUNCE = 500; diff --git a/app/assets/javascripts/todos/components/queries/todo.fragment.graphql b/app/assets/javascripts/todos/components/queries/todo.fragment.graphql index f2f3149aa9a..6aa0eceb358 100644 --- a/app/assets/javascripts/todos/components/queries/todo.fragment.graphql +++ b/app/assets/javascripts/todos/components/queries/todo.fragment.graphql @@ -29,6 +29,7 @@ fragment Todo on Todo { ... on Design { issue { id + name reference } } diff --git a/app/assets/javascripts/todos/components/todo_item_title.vue b/app/assets/javascripts/todos/components/todo_item_title.vue index 0cebbcfd141..a2b1d2a4601 100644 --- a/app/assets/javascripts/todos/components/todo_item_title.vue +++ b/app/assets/javascripts/todos/components/todo_item_title.vue @@ -34,6 +34,9 @@ export default { isAlert() { return this.todo.targetType === TODO_TARGET_TYPE_ALERT; }, + isDesign() { + return this.todo.targetType === TODO_TARGET_TYPE_DESIGN; + }, isMemberAccessRequestAction() { return this.todo.action === TODO_ACTION_TYPE_MEMBER_ACCESS_REQUESTED; }, @@ -72,19 +75,49 @@ export default { (this.isMergeRequest || this.isIssue || this.isAlert) && this.issuableState !== STATUS_OPEN ); }, - targetTitle() { + /** + * Full title line of the todo title + full reference, joined by a middot + */ + todoTitle() { + return [this.targetName, this.targetFullReference].filter(Boolean).join(' · '); + }, + /** + * Right half of a todo title: Full reference to the todo (parentPath + Target Reference) + */ + targetFullReference() { + return [this.parentPath, this.targetReference].filter(Boolean).join(' '); + }, + /** + * Left half of a To-Do title, often the entity name + */ + targetName() { if (this.isMemberAccessRequestAction) { return ''; } - return this.todo.targetEntity?.name ?? ''; + const name = this.todo.targetEntity?.name ?? ''; + + if (this.isDesign && this.todo.targetEntity?.issue?.name) { + if (name) { + return `${this.todo.targetEntity.issue.name} › ${name}`; + } + return this.todo.targetEntity.issue.name; + } + + return name; }, + /** + * Reference of the target entity + */ targetReference() { - if (this.todo.targetEntity?.issue?.reference) { + if (this.isDesign && this.todo.targetEntity?.issue?.reference) { return this.todo.targetEntity.issue.reference; } return this.todo.targetEntity?.reference ?? ''; }, + /** + * Parent path of the target entity Reference of the target entity + */ parentPath() { if (this.todo.group) { return this.todo.group.fullName; @@ -96,21 +129,6 @@ export default { return ''; }, - showSeparator() { - if (!this.targetTitle) { - return false; - } - - if (this.parentPath) { - return true; - } - - if (this.targetReference) { - return true; - } - - return false; - }, icon() { switch (this.todo.targetType) { case TODO_TARGET_TYPE_ISSUE: @@ -122,7 +140,7 @@ export default { case TODO_TARGET_TYPE_ALERT: return 'status-alert'; case TODO_TARGET_TYPE_DESIGN: - return 'issues'; + return 'media'; case TODO_TARGET_TYPE_SSH_KEY: return 'token'; case TODO_TARGET_TYPE_EPIC: @@ -140,10 +158,7 @@ export default {
- {{ targetTitle }} - · - {{ parentPath }} - {{ targetReference }} + {{ todoTitle }}
diff --git a/app/assets/javascripts/todos/components/todo_item_title_hidden_by_saml.vue b/app/assets/javascripts/todos/components/todo_item_title_hidden_by_saml.vue index 2eaa94c99cd..1a6e35a73ad 100644 --- a/app/assets/javascripts/todos/components/todo_item_title_hidden_by_saml.vue +++ b/app/assets/javascripts/todos/components/todo_item_title_hidden_by_saml.vue @@ -25,7 +25,7 @@ export default { {{ $options.i18n.hiddenTodoBadgeText }}
- {{ $options.i18n.hiddenTodoTitle }} + {{ $options.i18n.hiddenTodoTitle }}
diff --git a/app/assets/javascripts/vue_shared/components/list_selector/group_item.vue b/app/assets/javascripts/vue_shared/components/list_selector/group_item.vue index 1344174cad4..a9d72356882 100644 --- a/app/assets/javascripts/vue_shared/components/list_selector/group_item.vue +++ b/app/assets/javascripts/vue_shared/components/list_selector/group_item.vue @@ -1,11 +1,11 @@