diff --git a/.browserslistrc b/.browserslistrc index 1bddd91cf0d..a02550a408c 100644 --- a/.browserslistrc +++ b/.browserslistrc @@ -1,15 +1,18 @@ # # This list of browsers is a conservative definition, based on -# https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers -# with the following reasoning: +# https://docs.gitlab.com/ee/install/requirements.html#supported-web-browsers. We +# also use the following reasoning to choose the target versions: # -# - We should support the latest ESR of Firefox: 91, because it used quite a lot. -# - We use Edge/Chrome >= 92 because they are about as old as the Firefox ESR -# - Safari 14.1 because it is the current minor version of the previous major version +# - Actual Browser usage on gitlab.com +# - Support second latest version of Firefox ESR +# - Support Chrome / Edge versions about the same age as the Firefox ESR version chosen +# +# If need be we raise versions closer to the actual supported web browsers. # # See also this epic: https://gitlab.com/groups/gitlab-org/-/epics/3957 # -chrome >= 92 -edge >= 92 -firefox >= 91 -safari >= 14.1 \ No newline at end of file +chrome >= 103 +edge >= 103 +firefox >= 102 +safari >= 15.6 + diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml index 0348a0c0865..e4646314c89 100644 --- a/.gitlab/ci/qa-common/main.gitlab-ci.yml +++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml @@ -59,7 +59,6 @@ stages: extends: - .bundler-variables - .qa-base - - .gitlab-qa-report stage: test tags: - e2e diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index b4e061e5ec4..f0b3eed0b55 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -981,8 +981,6 @@ changes: *nodejs-patterns - <<: *if-merge-request changes: *ci-qa-patterns - - <<: *if-security-merge-request - changes: *code-patterns - <<: *if-merge-request changes: *code-qa-patterns - <<: *if-force-ci @@ -1285,6 +1283,8 @@ # From .frontend:rules:default-frontend-jobs - <<: *if-merge-request-labels-pipeline-expedite when: never + - <<: *if-fork-merge-request + changes: *code-backstage-patterns - if: '$ENABLE_RSPEC_FRONTEND_FIXTURE == "true"' - <<: *if-merge-request-labels-run-all-rspec # From .frontend:rules:jest diff --git a/.rubocop_todo/rake/require.yml b/.rubocop_todo/rake/require.yml new file mode 100644 index 00000000000..cff1199f576 --- /dev/null +++ b/.rubocop_todo/rake/require.yml @@ -0,0 +1,18 @@ +--- +Rake/Require: + Details: grace period + Exclude: + - 'ee/lib/tasks/contracts/merge_requests.rake' + - 'lib/tasks/contracts/merge_requests.rake' + - 'lib/tasks/contracts/pipeline_schedules.rake' + - 'lib/tasks/contracts/pipelines.rake' + - 'lib/tasks/gitlab/artifacts/migrate.rake' + - 'lib/tasks/gitlab/backup.rake' + - 'lib/tasks/gitlab/cleanup.rake' + - 'lib/tasks/gitlab/docs/redirect.rake' + - 'lib/tasks/gitlab/graphql.rake' + - 'lib/tasks/gitlab/lfs/migrate.rake' + - 'lib/tasks/gitlab/openapi.rake' + - 'lib/tasks/import.rake' + - 'lib/tasks/tokens.rake' + - 'qa/tasks/ci.rake' diff --git a/CHANGELOG.md b/CHANGELOG.md index c679207ef53..8ae50ea0307 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,609 @@ documentation](doc/development/changelog.md) for instructions on adding your own entry. +## 16.11.0 (2024-04-17) + +### Added (121 changes) + +- [Add skip secret detection audit event](gitlab-org/gitlab@e5b10f3c044a8992907f2dcc598123d798be9c7e) ([merge request](gitlab-org/gitlab!147855)) **GitLab Enterprise Edition** +- [Added added_approver to the todo action enum in GraphQL](gitlab-org/gitlab@0f2966c47ed9f5e042b8fb633ce454aa4592aa35) by @zillemarco ([merge request](gitlab-org/gitlab!148831)) +- [Add setting for enabling pre-receive SD](gitlab-org/gitlab@dc4f895086986077fafc660537060d78546826b2) ([merge request](gitlab-org/gitlab!148332)) **GitLab Enterprise Edition** +- [Added pending member for project listing page](gitlab-org/gitlab@dcbb5001eca02fd8aa6d8dbd06a401fc49716988) ([merge request](gitlab-org/gitlab!146678)) **GitLab Enterprise Edition** +- [Merge branch 'add-support-for-v-prefix' into 'master' ](gitlab-org/gitlab@e5bcb9dc8a57d7bdcf6fc5ed4d9a34590fdf7348) ([merge request](gitlab-org/gitlab!148706)) +- [Simplifies SemanticVersionable concern](gitlab-org/gitlab@f7353bc52a84f417ccc032ae4ba45e1058c14c50) ([merge request](gitlab-org/gitlab!148706)) +- [Added model for external_status_checks_protected_branches](gitlab-org/gitlab@2647e53b6725a9c90e032488401d4b1d2827571e) ([merge request](gitlab-org/gitlab!149046)) **GitLab Enterprise Edition** +- [Update URL with cursor to load a specific page](gitlab-org/gitlab@4c7fb3d5d2853424555c64e23ebbe1ccb79dee0f) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/148593)) **GitLab Enterprise Edition** +- [Added update api for instance level audit streaming](gitlab-org/gitlab@444a1b0312439545bd7ca7bd50136047c8db9c6f) ([merge request](gitlab-org/gitlab!149104)) **GitLab Enterprise Edition** +- [Add endpoint for checking relation import status](gitlab-org/gitlab@f450696483846a1cd7da2f2e8315e52df979cd75) ([merge request](gitlab-org/gitlab!147775)) +- [Utilize show_diff_preview_in_email column](gitlab-org/gitlab@614f6d5d7d2c0358ebf5425e76d4f3062009be6c) by @joe-snyder ([merge request](gitlab-org/gitlab!98547)) +- [Add API for trigger project webhook](gitlab-org/gitlab@b9bf0c33d5139823dada3a401a2607fa3856b6b5) by @lifez ([merge request](gitlab-org/gitlab!147656)) +- [Add displaying list of linked policies to framework table](gitlab-org/gitlab@4528caee6d01cfb2e2c6b4f739cf7da3ed63a81f) ([merge request](gitlab-org/gitlab!149324)) **GitLab Enterprise Edition** +- [Change admin users search filter](gitlab-org/gitlab@60cb8a9b7be5eed84f1a2bf9d41c5e3a5620099a) by @bahek2462774 ([merge request](gitlab-org/gitlab!144907)) +- [Protected packages: Show protected label in packages list](gitlab-org/gitlab@42a2d94bac523ec8cbd000609c49a38b84a72b46) by @gerardo-navarro ([merge request](gitlab-org/gitlab!141134)) +- [Added delete api for instance level audit streaming](gitlab-org/gitlab@e81b3ef2809032b87bbdb1c3a662c256182aadad) ([merge request](gitlab-org/gitlab!149101)) **GitLab Enterprise Edition** +- [Update query for elevated_guests to use occupies_seat](gitlab-org/gitlab@0c7f5da4f50c6034cb018eca9378623869c5df53) ([merge request](gitlab-org/gitlab!148653)) **GitLab Enterprise Edition** +- [Frontend work for regex filter on Zoekt code search](gitlab-org/gitlab@bc2d7efa52429cabfd2cdd7a414c1aaf579a9728) ([merge request](gitlab-org/gitlab!144625)) +- [Enabled product_analytics_billing by default](gitlab-org/gitlab@e4fbfd31e5ebe071a848a6c38c00bc9e355133fc) ([merge request](gitlab-org/gitlab!149243)) **GitLab Enterprise Edition** +- [Added update api for group audit event destinations](gitlab-org/gitlab@a08acfeab8dc426b96563d9a7ae26203af0d1ac2) ([merge request](gitlab-org/gitlab!148388)) **GitLab Enterprise Edition** +- [Remove experiment flag for product analytics](gitlab-org/gitlab@1fb7122f8e60a51e9e0f31213cbf29f1b467b21d) ([merge request](gitlab-org/gitlab!148983)) **GitLab Enterprise Edition** +- [Add co_authored_by placeholder to suggestions template](gitlab-org/gitlab@be6287b6c6e3280b26750842090563b531301183) ([merge request](gitlab-org/gitlab!148890)) +- [New tests for project dropdown actions](gitlab-org/gitlab@61fc9592e2483aa2ba1577acc6d26b4e751c6915) by @espadav8 ([merge request](gitlab-org/gitlab!148750)) +- [Obfuscate external participants emails in system notes](gitlab-org/gitlab@db7f244e226dfe2959034713daffa4b5511865fc) ([merge request](gitlab-org/gitlab!141612)) +- [Update group policy to use admin_push_rules](gitlab-org/gitlab@ca6de0c1c208df53f13b08d024deafe4312853c6) ([merge request](gitlab-org/gitlab!147974)) **GitLab Enterprise Edition** +- [Added delete api for group audit event destinations](gitlab-org/gitlab@12d3cc288b8178cee1de4c8ac0bc9c89a514ece2) ([merge request](gitlab-org/gitlab!148738)) **GitLab Enterprise Edition** +- [Add top-level namespace to Usage Overview panel](gitlab-org/gitlab@3b8fbd9853cf73845a7dd95b7b11f4eb1bbeb1f5) ([merge request](gitlab-org/gitlab!148597)) **GitLab Enterprise Edition** +- [Add pre_receive_secret_detection_enabled param](gitlab-org/gitlab@875dfd8dbdd324b75e4fbc940381abd26cc28534) ([merge request](gitlab-org/gitlab!149160)) +- [Protected containers: Create protection rules in project setting ui](gitlab-org/gitlab@aef987b99cf9d7e53a114f0d9d705e2304844e33) by @gerardo-navarro ([merge request](gitlab-org/gitlab!146523)) +- [Add catalog component usage tracking in pipeline sequence](gitlab-org/gitlab@a0f6fd925367eb55a428a2687203888f6d6af64c) ([merge request](gitlab-org/gitlab!149138)) +- [Implement the ability to use shorthand for semantic versions](gitlab-org/gitlab@ae5f0b35997e69ba646fb5cb4b5ce11ab73a8370) ([merge request](gitlab-org/gitlab!147910)) +- [Add client for generating vertex embedding](gitlab-org/gitlab@d142f59a3c45d286fa15c61b5d28f2d5327ca501) ([merge request](gitlab-org/gitlab!148483)) **GitLab Enterprise Edition** +- [Expose metadata fields on Milestone type](gitlab-org/gitlab@3e5d0ab7f83a6f5562512bc465285b3883af15f9) ([merge request](gitlab-org/gitlab!148927)) +- [Document encryption support for Google Cloud Storage (GCS)](gitlab-org/gitlab@63e1b9dfd82aa5527006ed97c9b37dc4ea0031b7) ([merge request](gitlab-org/gitlab!148994)) +- [This MR adds new filter option](gitlab-org/gitlab@e62883d3d8504032bcf92805555e30ba7e20636b) ([merge request](gitlab-org/gitlab!148675)) **GitLab Enterprise Edition** +- [Added list api for listing instance level audit event destinations](gitlab-org/gitlab@86186adc05d92bc5a9a88f275c33d543cba424e3) ([merge request](gitlab-org/gitlab!148839)) **GitLab Enterprise Edition** +- [Added create api for instance audit event streaming destinations](gitlab-org/gitlab@20ec713cb27b4e8701317e2211b39f6daf960e02) ([merge request](gitlab-org/gitlab!148383)) **GitLab Enterprise Edition** +- [Adds "Allow runner registration token" setting to top-level group](gitlab-org/gitlab@29df08fb36a5c6b2626a021f5f2a3696cd637506) ([merge request](gitlab-org/gitlab!148557)) +- [Rollout new custom roles UI](gitlab-org/gitlab@e82557fd72bbdcb1eeab09499d12b84e91071bde) ([merge request](gitlab-org/gitlab!148468)) **GitLab Enterprise Edition** +- [This MR adds new policy type](gitlab-org/gitlab@34203ec1278f48992af196a9f717620962886916) ([merge request](gitlab-org/gitlab!148600)) **GitLab Enterprise Edition** +- [Add referrer_type filtering to containerRepository tags GraphQL query](gitlab-org/gitlab@4720e1cbb764c3807dc881dc06a145e4ba19d2c5) ([merge request](gitlab-org/gitlab!147277)) +- [Enable `group_saved_replies_flag` by default](gitlab-org/gitlab@04f93bbecb93e9a73d891611d258b76d9c4e3251) ([merge request](gitlab-org/gitlab!148958)) +- [Add manage security policy as custom ability](gitlab-org/gitlab@b6a8cf2d72af8ee4a64612711111586b4cafdad6) ([merge request](gitlab-org/gitlab!148371)) **GitLab Enterprise Edition** +- [Initialize bigint conversion for vulnerability_occurrence_pipelines](gitlab-org/gitlab@bd40369ab79962a83a19e852ab3624b958507a36) ([merge request](gitlab-org/gitlab!148735)) +- [Initialize bigint conversion for merge_trains](gitlab-org/gitlab@343e2b965acfdcbcb6d70b7f74dbfcf8b3fc55ed) ([merge request](gitlab-org/gitlab!148730)) +- [Initialize bigint conversion for merge_trains](gitlab-org/gitlab@09fcf24f778807dc4097b17b9088499a9a32234b) ([merge request](gitlab-org/gitlab!148786)) +- [Initialize bigint conversion for packages_build_infos](gitlab-org/gitlab@c65891c9240d56b53f391e0666631cb84a2e14b3) ([merge request](gitlab-org/gitlab!148791)) +- [Initialize bigint conversion for vulnerability_feedback](gitlab-org/gitlab@390b83d1b1280f8657d96f7ef7cacf8fa709118f) ([merge request](gitlab-org/gitlab!148790)) +- [Add a new worker to process the pipeline creation for sep](gitlab-org/gitlab@0185a66f0b645ad9625ea94d3ec7299d8959175b) ([merge request](gitlab-org/gitlab!147691)) **GitLab Enterprise Edition** +- [Removed auto_cancel_pipeline_on_job_failure feature flag](gitlab-org/gitlab@5e80edd594717e6a91c65223bd24b2bc716dbf0d) by @zillemarco ([merge request](gitlab-org/gitlab!148515)) +- [Add runner creation status](gitlab-org/gitlab@6faa548186a248a22a3686d8e125a4ca1d204f56) by @imskr ([merge request](gitlab-org/gitlab!144842)) +- [Add close on escape support](gitlab-org/gitlab@89c281d7077c29a6ec4a2a62443008e6ce8f2071) ([merge request](gitlab-org/gitlab!148852)) **GitLab Enterprise Edition** +- [Initialize bigint conversion for merge_requests](gitlab-org/gitlab@3c7e1f1157c6608ca54f1c19fada2fb4f5c48015) ([merge request](gitlab-org/gitlab!148788)) +- [Add accessLevel & isLastOrganizationOwner fields to organizationUser](gitlab-org/gitlab@2acf4411a1396b9f00b36e2c2b4f74de47de4785) ([merge request](gitlab-org/gitlab!148148)) +- [Improve the performance of group-level vulnerability export](gitlab-org/gitlab@3c0c31802ca926ade373a71c6c356085eeb254e0) ([merge request](gitlab-org/gitlab!147365)) +- [Enable Custom Webhook Headers feature](gitlab-org/gitlab@e05517344b269d3fe0f200f87ba7901d3852468e) by @Taucher2003 ([merge request](gitlab-org/gitlab!148690)) +- [Consider child pipelines for MR approval policies](gitlab-org/gitlab@5ba4ebdcd7c9de8296df6535c92b135465061069) ([merge request](gitlab-org/gitlab!147710)) **GitLab Enterprise Edition** +- [Add development widget (feature flags)](gitlab-org/gitlab@5dc384fd05ab651525ecc922ab6f62dba3569d93) ([merge request](gitlab-org/gitlab!148215)) **GitLab Enterprise Edition** +- [Beyond Identity: Add option to exclude service accounts](gitlab-org/gitlab@da808914d9bf0afbc194e428f1396a054303366a) ([merge request](gitlab-org/gitlab!148590)) +- [Add verified badge](gitlab-org/gitlab@89e089bbf086ca7d98cdc7d88ab4f5d007fa4127) ([merge request](gitlab-org/gitlab!147384)) +- [Add runner wait time stats by namespace](gitlab-org/gitlab@0f7fece2f8d894cb670859298fd2c6caca2e0541) ([merge request](gitlab-org/gitlab!147148)) **GitLab Enterprise Edition** +- [Support minimal access base for custom roles](gitlab-org/gitlab@95ffa5f8d64aae0cd99c7014488c57bbfc23ddc4) ([merge request](gitlab-org/gitlab!148390)) +- [Add object_attributes.action for note webhooks](gitlab-org/gitlab@abc1b67b29fc9c2a1cf7f4454b55ee527021631d) ([merge request](gitlab-org/gitlab!147856)) +- [Add cadence validation for sep creation](gitlab-org/gitlab@d8732ca1a7ce25be3d06a01879ed11895b126a35) ([merge request](gitlab-org/gitlab!148096)) **GitLab Enterprise Edition** +- [Enable combined analytics dashboards by default](gitlab-org/gitlab@0675178be05bcbe8236b6b74b74684eaa950bbaf) ([merge request](gitlab-org/gitlab!148559)) **GitLab Enterprise Edition** +- [Create and list apis for group audit events](gitlab-org/gitlab@f5bafe4a48bc98901b4e709bfadad3adfedb5379) ([merge request](gitlab-org/gitlab!147888)) **GitLab Enterprise Edition** +- [Default enable producy analytics admin settings FF](gitlab-org/gitlab@0c4927326f9bbacd66653adf39b3832b37e711f3) ([merge request](gitlab-org/gitlab!148539)) **GitLab Enterprise Edition** +- [Enabling FF ci_retry_on_exit_codes on SM](gitlab-org/gitlab@24590f014becc7a09566dcc384dc0dfc7657239d) ([merge request](gitlab-org/gitlab!148189)) +- [Add API endpoint to return current SSO session expiry time](gitlab-org/gitlab@a5f5dde09f72743021ca1f5aa2560aaa227f69b6) ([merge request](gitlab-org/gitlab!146011)) **GitLab Enterprise Edition** +- [Add REST API endpoint to sync push mirrors](gitlab-org/gitlab@1ab7f8dfad9608b4f5455f2c0d80c6a52c2d6fb5) ([merge request](gitlab-org/gitlab!148186)) +- [Rollout security_policies_policy_scope_project by default](gitlab-org/gitlab@dcbcf0bdb1a8be2268339148dc2fdcecde39a551) ([merge request](gitlab-org/gitlab!148407)) **GitLab Enterprise Edition** +- [Add custom webhook headers](gitlab-org/gitlab@1504f88df5a07db69abeef68edcf9c4ec5a63fcd) by @Taucher2003 ([merge request](gitlab-org/gitlab!146702)) +- [Remomve FF for search_add_archived_filter_to_zoekt](gitlab-org/gitlab@c2b5997f9b1e6d7326cacf73d591927c740538da) ([merge request](gitlab-org/gitlab!148107)) **GitLab Enterprise Edition** +- [Enalbed the global Duo Chat button](gitlab-org/gitlab@e3c4da4f8b7186e628f7dc8fea9e0bbf6ee2af82) ([merge request](gitlab-org/gitlab!148402)) **GitLab Enterprise Edition** +- [Validate check null constraint for vulnerability_reads#traversal_ids](gitlab-org/gitlab@e59b81bac5ad2b16797694870ef10e12095db594) ([merge request](gitlab-org/gitlab!148386)) +- [Switch Groups UX to emails_enabled](gitlab-org/gitlab@77b46f4a8ccb8901e04b50a378d10d5284d4f00b) by @joe-snyder ([merge request](gitlab-org/gitlab!135959)) **GitLab Enterprise Edition** +- [New Audit Event when approval rule is updated](gitlab-org/gitlab@45d8bc02374aefcf852f1a61b8849a11db930b6f) ([merge request](gitlab-org/gitlab!146819)) **GitLab Enterprise Edition** +- [Add list of tag in external pipeline validation api](gitlab-org/gitlab@0db47b7ac6a22038a0298ac9314389db4650ab4c) by @lifez ([merge request](gitlab-org/gitlab!148318)) +- [This MR adds breaking changes icon](gitlab-org/gitlab@3574df9f1f482529b31ae657476f1a1d0885757d) ([merge request](gitlab-org/gitlab!146921)) **GitLab Enterprise Edition** +- [Add user count to Usage Overview panel on Value Streams Dashboard](gitlab-org/gitlab@b52185cfd145cfa9165bd68e07d5be1e32fd0cd7) ([merge request](gitlab-org/gitlab!148254)) **GitLab Enterprise Edition** +- [Update JiraConnect app_descriptor](gitlab-org/gitlab@d4e186f8744231fc4c9c5139394446017d4034f0) ([merge request](gitlab-org/gitlab!148251)) +- [Finalize BackfillHasIssuesForExternalIssueLinks background migration](gitlab-org/gitlab@af5f897a532475711837ea27d3b8d32260d6c216) ([merge request](gitlab-org/gitlab!148244)) +- [Enable create_vulnerability_jira_issue_via_graphql by default](gitlab-org/gitlab@acab556c474c16825ea0da33449e2403f2a87b4b) ([merge request](gitlab-org/gitlab!148239)) **GitLab Enterprise Edition** +- [feat: Protected containers: Protection rules in project settings ui](gitlab-org/gitlab@794768d4aa5ca2347b9c7c20aca303ee487b5d0b) by @gerardo-navarro ([merge request](gitlab-org/gitlab!146436)) +- [Add a new column zoekt_settings in the application_settings](gitlab-org/gitlab@54abc04448244b588436065b6d807fe91af51a8c) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147914)) +- [Add a shared avatar image for security policy bots](gitlab-org/gitlab@799dd2d015217e47d82c9a3bfb7432e8bbc014c9) ([merge request](gitlab-org/gitlab!146942)) +- [Add Create New Merge Request button to issues in forked projects](gitlab-org/gitlab@a3d260fd772c7d407c8f363e849d1b9cb8e25886) ([merge request](gitlab-org/gitlab!147355)) +- [Accept generation_type parameter](gitlab-org/gitlab@682b3e557d9e76385799d13b8fac1a9a43e82ab4) ([merge request](gitlab-org/gitlab!147421)) **GitLab Enterprise Edition** +- [Add autocomplete support for wiki pages](gitlab-org/gitlab@27c318f7b83312cd6ec2a04704414ccbe6139556) ([merge request](gitlab-org/gitlab!143654)) +- [Introduces hidden variable to group and ci variables](gitlab-org/gitlab@8ecd09100a7e8af196c3ec4bef8db0ab9a106fa3) ([merge request](gitlab-org/gitlab!141926)) +- [Enable GitLab for Slack app for Instances and Groups](gitlab-org/gitlab@aca445a970e6cfccfe43566f34192835becec2af) ([merge request](gitlab-org/gitlab!147820)) +- [Add indirect membership API endpoint](gitlab-org/gitlab@35586c95a5c16dad059058c36f143fa956032e3a) ([merge request](gitlab-org/gitlab!145227)) **GitLab Enterprise Edition** +- [Expose `created_at` field in Tags API](gitlab-org/gitlab@dea10fa96631eecb3834a7fdf1a9b1eacacc61da) ([merge request](gitlab-org/gitlab!147785)) +- [Add topic support for Telegram](gitlab-org/gitlab@e6152b6d9b87bc5ba9f26f6d239b4f7c4cfc52a3) ([merge request](gitlab-org/gitlab!147734)) +- [Wait for ClickHouse workers before running migrations](gitlab-org/gitlab@9060b40f86cd60cd38b488914d017d3509ab9243) ([merge request](gitlab-org/gitlab!147925)) +- [Add `default_branch` attribute to Groups API](gitlab-org/gitlab@86ffba7a79ef7d6625062b2787be1551ea90dbd5) ([merge request](gitlab-org/gitlab!145803)) +- [Add post migration to set value of occupies_seat column](gitlab-org/gitlab@abdb1960504d0a5b89ad7b16dcd44143a8d259d9) ([merge request](gitlab-org/gitlab!146293)) +- [Add setting for pre-receive secret detection](gitlab-org/gitlab@631340d934a92d4eee47b762882b255eb739046f) ([merge request](gitlab-org/gitlab!147831)) **GitLab Enterprise Edition** +- [Remove feature toggle for policy scope](gitlab-org/gitlab@8c61aded645b4d1935d2d15e22c135a679e214f2) ([merge request](gitlab-org/gitlab!145997)) **GitLab Enterprise Edition** +- [Add '/clear' to Duo Chat commands in addition to '/clean'](gitlab-org/gitlab@b7beb41ec62dad5e59b543aaa455ba96472550b6) ([merge request](gitlab-org/gitlab!147380)) **GitLab Enterprise Edition** +- [Add setting for enabling CS for Registry](gitlab-org/gitlab@31a3e10652e98f380970e1fa88873ff643b1758d) ([merge request](gitlab-org/gitlab!147409)) **GitLab Enterprise Edition** +- [AddOnPurchase process trial attribute](gitlab-org/gitlab@318753cfb1c1f2dc35e400b53d74d116c3986a96) ([merge request](gitlab-org/gitlab!147522)) **GitLab Enterprise Edition** +- [Add detailed view for pods and services](gitlab-org/gitlab@07057f76bd480726d0db5ef84af5c7dbd9db55de) ([merge request](gitlab-org/gitlab!147553)) +- [Add array types to CI inputs](gitlab-org/gitlab@853153958068f8586bee2bfb6dca6a8c64925e3e) ([merge request](gitlab-org/gitlab!145954)) +- [Add full_path GQL field to ResourceType](gitlab-org/gitlab@c5c9e4a7c30f20c642d239e1f11945de8dbe2fcd) ([merge request](gitlab-org/gitlab!147623)) +- [Add report abuse button](gitlab-org/gitlab@a82ef82275695877f23351a4192763ec71e91d69) ([merge request](gitlab-org/gitlab!143692)) +- [Add access keyword in artifacts](gitlab-org/gitlab@9fa22477401fa7257391a7fab5a3b8bc683b9488) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/145206)) +- [Finalize PurgeSecurityScansWithEmptyFindingData migration](gitlab-org/gitlab@c5b2254257272ad4906664d98c019257a0ce06e3) ([merge request](gitlab-org/gitlab!147426)) +- [Work item two column loading skeleton](gitlab-org/gitlab@5c5d2ec1acf231d51a1bef7a65753deeefbcfb29) ([merge request](gitlab-org/gitlab!146615)) +- [Add trial column to subscription_add_on_purchases table](gitlab-org/gitlab@e64f8868f576f4616df91b101db9b9b2c1186089) ([merge request](gitlab-org/gitlab!147422)) **GitLab Enterprise Edition** +- [Add migration to index all projects](gitlab-org/gitlab@a81fb1fa887c886c053e08893a04cdb7abe4584d) ([merge request](gitlab-org/gitlab!145131)) **GitLab Enterprise Edition** +- [Add usage_count columns to catalog tables](gitlab-org/gitlab@92fa72a80a427e1c374d111eab00fc2191180b07) ([merge request](gitlab-org/gitlab!147293)) +- [Add a worker Zoekt::MarkReadyWorker](gitlab-org/gitlab@8b48c1465f408d915b60474a1bf38de04904e89c) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146475)) **GitLab Enterprise Edition** +- [Validate the foreign key & add to routing table commit_id](gitlab-org/gitlab@e88832c384b363628b9f8cc26446c51e413160a1) ([merge request](gitlab-org/gitlab!146964)) +- [Add avatar to new achievement form](gitlab-org/gitlab@91bd29352ce7830664da5d16cd8b1a23980f9cdd) ([merge request](gitlab-org/gitlab!147040)) +- [Add humanized role to removal events in audit details](gitlab-org/gitlab@bb18b60933e840a4f3179bab6d77d7fd8c108506) ([merge request](gitlab-org/gitlab!147435)) **GitLab Enterprise Edition** +- [Added model for instance level event type filters](gitlab-org/gitlab@585a40d553de3ea560447813e7fb79434d7afe3c) ([merge request](gitlab-org/gitlab!145421)) **GitLab Enterprise Edition** +- [Add frontend filter for zoekt code search](gitlab-org/gitlab@752200fdf1126146712847c1075b0a4c2d061bd1) ([merge request](gitlab-org/gitlab!147014)) **GitLab Enterprise Edition** +- [Add `spec` column to `catalog_resource_components`](gitlab-org/gitlab@c7cf6d3080559a2231dfd1b3ac01d0a5c14fab64) ([merge request](gitlab-org/gitlab!146674)) +- [Make `traversal_ids` column nullable if it's already not](gitlab-org/gitlab@155267bfa51e8d5e2efd45dc9e850eb7d774e0bb) ([merge request](gitlab-org/gitlab!147326)) +- [Add not valid null check constraint for `traversal_ids`](gitlab-org/gitlab@4255ad3962ac3cf3572dc4d088514ab6c4ed1aa3) ([merge request](gitlab-org/gitlab!147276)) + +### Fixed (141 changes) + +- [Update pages ci templates - Gatsby](gitlab-org/gitlab@f309140b1c746dbf93ba0e5d75342348760f64fe) ([merge request](gitlab-org/gitlab!148120)) +- [Consider merge request pipelines for license approval policies](gitlab-org/gitlab@334e560a3649c8071429023e4b745761311dbfcf) ([merge request](gitlab-org/gitlab!149192)) **GitLab Enterprise Edition** +- [Disable personal access tokens for enterprise users](gitlab-org/gitlab@cbf59303e43effeabe2d1fa7abe3df631cdff9dd) ([merge request](gitlab-org/gitlab!148415)) **GitLab Enterprise Edition** +- [Fix ArgumentError in ProjectApprovalRules API](gitlab-org/gitlab@e2d0c77bb4bc7045851c35c9f27b75a18a1a9b0b) ([merge request](gitlab-org/gitlab!149106)) **GitLab Enterprise Edition** +- [Add row gap between rows of codeowner approver avatars](gitlab-org/gitlab@57816fbf3da86695403517b75f5d6542ab0be68c) ([merge request](gitlab-org/gitlab!149008)) **GitLab Enterprise Edition** +- [Fix hover state of emoji on snippets](gitlab-org/gitlab@f0154f2277fb93bcadec376de10c1977d5e7cdfa) ([merge request](gitlab-org/gitlab!149153)) +- [Hide `New subgroup` button if visibility is restricted](gitlab-org/gitlab@97b12dbf8ea56eb4fdc96a8b775ac319f6bdb957) ([merge request](gitlab-org/gitlab!148758)) +- [Ensure command pallet search respects current ref](gitlab-org/gitlab@4db0a566751b3e28166813f6d14b81f8d0f30c82) ([merge request](gitlab-org/gitlab!149084)) +- [Escape markdown characters for Telegram integration](gitlab-org/gitlab@545fb61ba96dd21754e929fdb3f6de8d123671d2) ([merge request](gitlab-org/gitlab!148703)) +- [Fix job log link regex](gitlab-org/gitlab@bdbcbb71363fbe9b6503c87dec979de2ab1838c1) ([merge request](gitlab-org/gitlab!148891)) +- [Fix undefined method error when package.json is malformed](gitlab-org/gitlab@0e4e9aba50543be7b283ad3bc2d5753c2db8f931) ([merge request](gitlab-org/gitlab!149148)) +- [Remove unnecessary md header divider when previewing](gitlab-org/gitlab@4692a59fc53bfb1fc1dd2a4d11a498838218e1df) ([merge request](gitlab-org/gitlab!149012)) +- [Fix NoMethodError when an array parameter has an invalid format](gitlab-org/gitlab@920437053ace6d4d6625c60caa860305983d46dc) ([merge request](gitlab-org/gitlab!148962)) **GitLab Enterprise Edition** +- [MR approval widget: Align text correctly](gitlab-org/gitlab@4218a8b5430990ca3e2c4008140e36a55dcb6487) ([merge request](gitlab-org/gitlab!149056)) +- [[Batched Migration] Fix corrupted scanner_ids of vulnerability_reads](gitlab-org/gitlab@fc5abd0b3f19b5aaa009704bd9f586f457801537) ([merge request](gitlab-org/gitlab!148807)) **GitLab Enterprise Edition** +- [Temporarily restore old breadcrumbs UX](gitlab-org/gitlab@ae8f680b61091bddb1abd86624cdc36126e6ba6c) ([merge request](gitlab-org/gitlab!148673)) +- [Avoid bad MIN query plan during batch count](gitlab-org/gitlab@786631a70c5e96948be2bb96a9e62b76b41de516) ([merge request](gitlab-org/gitlab!148608)) **GitLab Enterprise Edition** +- [Show status, milestone and statistics on service desk issue list](gitlab-org/gitlab@135ed3c1ad3e8a035b633f3555cce54c7607ab5b) ([merge request](gitlab-org/gitlab!148895)) +- [Clean up instrumentation key in analytics controller](gitlab-org/gitlab@15067f062f8123521d576b4c39e4c659a0eba78d) ([merge request](gitlab-org/gitlab!148840)) **GitLab Enterprise Edition** +- [MR widget approvals: Auto update approvals](gitlab-org/gitlab@fa3bfef9a940b60742d5d7d20fda0b2640bc2ae1) ([merge request](gitlab-org/gitlab!148379)) +- [Let sub group api update default branch protection defaults](gitlab-org/gitlab@eafcf0f24fcd4f7a6eaa5b3e4e552cfbccdcd12e) ([merge request](gitlab-org/gitlab!148566)) +- [Fix migration error when updating from GitLab 16.9 to 16.10](gitlab-org/gitlab@d2f0aaf37ececcd92b0c1eab73129532c92fb71a) ([merge request](gitlab-org/gitlab!148135)) +- [MR sidebar: Fix reviewers loading icon position](gitlab-org/gitlab@af34d0b62b56e6d3b94b70ab28a277d9ea07a919) ([merge request](gitlab-org/gitlab!148950)) +- [MR approval in MR list: Fix display of total approvals](gitlab-org/gitlab@5b91c9e43f813c100dab62bb8df1861c0a831452) ([merge request](gitlab-org/gitlab!148941)) **GitLab Enterprise Edition** +- [Skip license capacity check for security policy bot user](gitlab-org/gitlab@33345f3c5ed65a5f4920a1f5c68e5b84582ae6aa) ([merge request](gitlab-org/gitlab!148893)) **GitLab Enterprise Edition** +- [Preserve indirect memberships](gitlab-org/gitlab@bd9dae0c2b320cc75a99b720e1733b5894ef66a2) ([merge request](gitlab-org/gitlab!148220)) +- [Fix border radius on MR diffs](gitlab-org/gitlab@f384129183453962a28da05cdc901d3986a9f737) ([merge request](gitlab-org/gitlab!148716)) +- [Adapt Graphql path depending on GitHub API endpoint](gitlab-org/gitlab@f3b9cd839825c0b5200870f1f76735ff433a0e5d) by @daniel.marks ([merge request](gitlab-org/gitlab!147143)) +- [Migrate sbom_occurrences.component_name to match](gitlab-org/gitlab@85faa73c55cc3aa61b41a0afdbbb3442edff3fd7) ([merge request](gitlab-org/gitlab!146776)) +- [Fix pipeline complete condition and include manual state](gitlab-org/gitlab@5713bf9fbb108efd38808ed8a955c2e79370f240) ([merge request](gitlab-org/gitlab!148866)) **GitLab Enterprise Edition** +- [Use 2x image source for avatars smaller than 96px](gitlab-org/gitlab@7fefa86be66444f85e1229b96a7feb2b960b17b5) ([merge request](gitlab-org/gitlab!148333)) +- [Prevent access to achievements for private groups](gitlab-org/gitlab@664430132351ea6aa881d78ae3ccb0f19f7a369b) ([merge request](gitlab-org/gitlab!147319)) +- [This MR fix scope column in policy list](gitlab-org/gitlab@ec655265e05b1924ebc9ce50ea5d758f2877fb60) ([merge request](gitlab-org/gitlab!148842)) **GitLab Enterprise Edition** +- [Fix missing validation for Branches::CreateService](gitlab-org/gitlab@b458ed5ee901060552dd2d2ab80d04fc3a773faa) ([merge request](gitlab-org/gitlab!148689)) +- [Make milestone titles unique in group hierarchy](gitlab-org/gitlab@aa5a790f9e3de50a049a1fd52d46a7e1f3c142a9) ([merge request](gitlab-org/gitlab!142857)) +- [Correct parse the `canEdit` permission for project dropdown items](gitlab-org/gitlab@310ceeea42b8586001d948f54a56c08f2547c644) by @espadav8 ([merge request](gitlab-org/gitlab!148659)) +- [Fix 500 error in Commits API when the repository is empty](gitlab-org/gitlab@778793d50837ca778541931827fe08cdc823765f) ([merge request](gitlab-org/gitlab!148405)) +- [MR widget: Fix alignment of approval button and text](gitlab-org/gitlab@07cbdc49f8fb6097db11417a32208a5881220cf3) ([merge request](gitlab-org/gitlab!148631)) +- [Fix "Import with projects" button not showing](gitlab-org/gitlab@fd2d9482bc2104f0df61c338ae6a415642a8f894) ([merge request](gitlab-org/gitlab!148613)) +- [Fix board scope assignee dropdown results](gitlab-org/gitlab@4ff3dcf5d4fdc51928bfe339271df898146dfe7a) ([merge request](gitlab-org/gitlab!148377)) **GitLab Enterprise Edition** +- [Invert emails_disabled into emails_enabled](gitlab-org/gitlab@e6f3c8ddaeb34ee8526645418eaf61935308038c) ([merge request](gitlab-org/gitlab!148577)) +- [Use locale-specific formatting for VSD table numbers](gitlab-org/gitlab@4b71d52baa05867abafcff3e03f5ad417d9dc4e0) ([merge request](gitlab-org/gitlab!148331)) **GitLab Enterprise Edition** +- [Correct diff colors & highlighting for none theme](gitlab-org/gitlab@8391bb3e6461fbf508bb965a7e98b33115e79cda) by @jameschensmith ([merge request](gitlab-org/gitlab!148538)) +- [Disable sending of Link header in preload_link_tag](gitlab-org/gitlab@76fe184e4281812a9f819c2b3a2c4c3a89b356f1) ([merge request](gitlab-org/gitlab!148280)) +- [Fix job sidebar when artifact access is restricted](gitlab-org/gitlab@e9cee36e9a051a782b8e47f8ecf5b43d6bc6d111) ([merge request](gitlab-org/gitlab!148453)) +- [This is a small breaking change, and while it's not being done in the](gitlab-org/gitlab@1e9e6d5fcd5913ca79505fff4dc1dd1a44f99935) by @gitlab-dependency-update-bot ([merge request](gitlab-org/gitlab!147619)) +- [Fix the test report modal](gitlab-org/gitlab@c9808da3a3bff4e6ad8e052391500c8128b84799) ([merge request](gitlab-org/gitlab!148440)) +- [Fix handling of DAGs within a stage in AtomicProcessingService ](gitlab-org/gitlab@9ceb88fe5421afa87af290da78f419032325d746) ([merge request](gitlab-org/gitlab!148211)) +- [Fix Duo Chat Popover Design Managment overlapping Bug](gitlab-org/gitlab@843bb55409348cc91e2d0ebb74094917e3823d3c) ([merge request](gitlab-org/gitlab!148434)) +- [Fix epic links in issue sidebar changing to work item link](gitlab-org/gitlab@d7ac773456fd49792073024a505a4dc24cbc3888) ([merge request](gitlab-org/gitlab!148420)) +- [Fix NoMethodError for tags#date](gitlab-org/gitlab@96858a07cc2046162dc7c15e5a95de33ba5f9c23) ([merge request](gitlab-org/gitlab!148413)) +- [Support large wiki content in webhooks](gitlab-org/gitlab@3e38cff3a36d741b89b59859317cf8d6b3916917) by @ivantedja ([merge request](gitlab-org/gitlab!146973)) +- [Fix included avatar in the code copy](gitlab-org/gitlab@fd451c621adcd6f59f03c636b665f3bf8b9c0cca) ([merge request](gitlab-org/gitlab!148243)) +- [Use a correct link to group templates docs](gitlab-org/gitlab@30669dff2c937c78033b3de578d0d9c4bfb4e1cb) ([merge request](gitlab-org/gitlab!148374)) **GitLab Enterprise Edition** +- [Fix URL validator for mirror services when using localhost](gitlab-org/gitlab@310317f36d14efe8b424b1fdcb5fe00abdae1395) ([merge request](gitlab-org/gitlab!148368)) +- [Expose `branches_to_be_notified` field for Telegram API](gitlab-org/gitlab@7bf6d3eee9c8a33f73a7b1f4e2a29268aa9d68b7) ([merge request](gitlab-org/gitlab!148281)) +- [Fix duplicate "Job suceeded lines"](gitlab-org/gitlab@e86eddfe31a4e1ba25e4ca271c6c2d693f72e69a) ([merge request](gitlab-org/gitlab!148255)) +- [WIP OVERWRITE LATER](gitlab-org/gitlab@81a73d56889b006adc1d36d60e04dbabb08e37c2) ([merge request](gitlab-org/gitlab!148262)) +- [Fail sync when a primary connection is unvailable](gitlab-org/gitlab@756f9cdb1518ded4c2f53e9971ba38634d1f129c) ([merge request](gitlab-org/gitlab!148105)) **GitLab Enterprise Edition** +- [Trigger Epic events after transaction has been finished](gitlab-org/gitlab@4eab137d71d3e4d7785efcea963088567c9b6e9f) ([merge request](gitlab-org/gitlab!147677)) **GitLab Enterprise Edition** +- [Update vulnerability_reads scanner in the ingestion pipeline](gitlab-org/gitlab@287fd2d24d774cde7293e803a2cdc7f2c4dcf7ff) ([merge request](gitlab-org/gitlab!148016)) **GitLab Enterprise Edition** +- [Strip keywords from chat final answer](gitlab-org/gitlab@ca76cb9a231b8842bfad0b90a624558da584fbc3) ([merge request](gitlab-org/gitlab!148177)) **GitLab Enterprise Edition** +- [Fix native browser navigation in MR single-file mode](gitlab-org/gitlab@95c6310bc3d409db219246bc8c96fed684ca6f34) ([merge request](gitlab-org/gitlab!147413)) +- [Fixes race condition for GFM rendering on issuable description](gitlab-org/gitlab@89a1fbb0cd5749991ca77cd0ce84747097a69613) ([merge request](gitlab-org/gitlab!148150)) +- [Branches list: Fix focus states](gitlab-org/gitlab@be5f35c4998e8e50461075b9cbcf84bcf4009763) ([merge request](gitlab-org/gitlab!148057)) +- [Fix cache timeout for commands](gitlab-org/gitlab@7655608a37274a2836fb1b799eeb886e0ebc65c3) ([merge request](gitlab-org/gitlab!147368)) +- [Fix wiki URLs for wiki webhooks](gitlab-org/gitlab@dc6f269ba62b3e8ab95aca104179007d969bb8cb) by @ivantedja ([merge request](gitlab-org/gitlab!147822)) +- [Fix size of design management todo button](gitlab-org/gitlab@8cec5771e1d853effa09babb9cbc9f7e3f2b007b) ([merge request](gitlab-org/gitlab!147941)) +- [Strip cookies for asset requests in development and test](gitlab-org/gitlab@58a4a2cb5fb3ee1e205df5c314cb48a64f4cfb97) ([merge request](gitlab-org/gitlab!148117)) +- [Remove echarts <5.x workaround in lead_time_charts](gitlab-org/gitlab@71b3002dbf56cc48fc0f2433ae8647688a36056f) ([merge request](gitlab-org/gitlab!148116)) **GitLab Enterprise Edition** +- [Fix styling of Incident timeline tab in dark mode](gitlab-org/gitlab@14bff2aa8bad57734a74f1210312337f6081d5f5) ([merge request](gitlab-org/gitlab!147852)) +- [Fixes a horizontal scrolling issue for json tables](gitlab-org/gitlab@d38662cb71260969cd10d98cc3d0651a9cc5f9d4) by @fagerburg ([merge request](gitlab-org/gitlab!147286)) +- [Fix blurry avatars when size < 48](gitlab-org/gitlab@d9d6391d1330e749500446b0e295106a61321716) ([merge request](gitlab-org/gitlab!147821)) +- [Fix the deprecated_properties method](gitlab-org/gitlab@c2c641f183d38ccfca4be64a3463f2e342eec11a) ([merge request](gitlab-org/gitlab!147958)) **GitLab Enterprise Edition** +- [Pipeline Sec: Fix issue with deleted Jira issue](gitlab-org/gitlab@4e7bf39e3087bccc23b14780afeb07afc22d9e22) ([merge request](gitlab-org/gitlab!148007)) **GitLab Enterprise Edition** +- [Fix component include path rendered in the components tab](gitlab-org/gitlab@79a10b4eca5b2ed002105bd5ad91ffc8e3501163) ([merge request](gitlab-org/gitlab!147998)) +- [Fix handling of DAGs within a stage in AtomicProcessingService](gitlab-org/gitlab@44911410286607e47a98e885744b06ec87d6c865) ([merge request](gitlab-org/gitlab!147875)) +- [Fix handleLocationHash behavior for MRs and issuables](gitlab-org/gitlab@ab1e57d6c1d78d3efa69dde14bd66c7d39e5cbd6) ([merge request](gitlab-org/gitlab!147711)) +- [Fix commit status API incorrectly overwriting MR head pipeline](gitlab-org/gitlab@6a4c87d6db68e2536b90b38c1e11f9a158bd7480) ([merge request](gitlab-org/gitlab!147212)) +- [Pipeline Sec: Fix Jira issue creation](gitlab-org/gitlab@da3b8c10a91c3152af0b00048ebcc2b9c4c7c765) ([merge request](gitlab-org/gitlab!147647)) **GitLab Enterprise Edition** +- [Handle null owner when indexing projects](gitlab-org/gitlab@059908f552762fbc26bc8d62f383770cfc02f926) ([merge request](gitlab-org/gitlab!147951)) **GitLab Enterprise Edition** +- [Add search functionality to sub group autocomplete](gitlab-org/gitlab@5172a9247bc4fc7b5192247db7dfd27be4d94dce) ([merge request](gitlab-org/gitlab!147578)) **GitLab Enterprise Edition** +- [Initialize hiding tooltip for links with tooltips when clicked](gitlab-org/gitlab@4fd57f617d97c9764e11c4c89c03e399fc1a3507) ([merge request](gitlab-org/gitlab!147947)) +- [Fix design management notification buttons feature flag](gitlab-org/gitlab@61e6d9765c2b4ecbcc236ec9f6ed5590037958fe) ([merge request](gitlab-org/gitlab!147945)) +- [ActionController::UrlGenerationError for old path redirects](gitlab-org/gitlab@4b37f666e26e3f382a88e5e4872ae2de9d2399e9) ([merge request](gitlab-org/gitlab!147933)) +- [Use vue routes for group custom Value Stream Dashboard](gitlab-org/gitlab@8b431614f3d6e8a254eef23dde703a0f35dc10d0) ([merge request](gitlab-org/gitlab!147842)) **GitLab Enterprise Edition** +- [Set `traversal_ids` and `archived` attributes always](gitlab-org/gitlab@589b246fa034fd339aefb746ac1de972409d843b) ([merge request](gitlab-org/gitlab!147082)) **GitLab Enterprise Edition** +- [Fix 500 error for erroneous content in markdown footnotes](gitlab-org/gitlab@8d061c5813ad28eea8afd6bdf15d098ad720a7a1) ([merge request](gitlab-org/gitlab!147922)) +- [Update pages ci templates - Nanoc](gitlab-org/gitlab@f6e2b4f9edf9a1ceba5428f0dd435caac0f10242) ([merge request](gitlab-org/gitlab!147722)) +- [Fix start_is_fixed and due_date_is_fixed default](gitlab-org/gitlab@2a2405c48f9081c415ba9623d653a85995a4ef69) ([merge request](gitlab-org/gitlab!147119)) **GitLab Enterprise Edition** +- [Skip migration when the partitioned FK exists](gitlab-org/gitlab@cb88e677ff9397c1b825d38381f987465fc76b1c) ([merge request](gitlab-org/gitlab!147878)) +- [Handle missing pipeline user name in terraform registry UI](gitlab-org/gitlab@db119bed67e45bb7779aaf187b3af77fbe8af7e7) ([merge request](gitlab-org/gitlab!147865)) +- [Reset pagination page](gitlab-org/gitlab@e164ef2015c9388d00bd3b4f9842fc747a779bb1) ([merge request](gitlab-org/gitlab!147832)) +- [Fix leave action label for project members](gitlab-org/gitlab@f8bb6dd151393ff9e2b0e59921204fa7665b2a41) ([merge request](gitlab-org/gitlab!147692)) +- [Replace space with HTML entity](gitlab-org/gitlab@eae79bfd94be8cb6d9a05adf2dd1fad284180116) ([merge request](gitlab-org/gitlab!147805)) **GitLab Enterprise Edition** +- [Apply inline validation to admin deletion protection settings](gitlab-org/gitlab@f5733cdc6a4a32780a0e1803d5bc447d1564f1c0) ([merge request](gitlab-org/gitlab!147299)) **GitLab Enterprise Edition** +- [Fix webhook test send wrong object kind for tag_push_event](gitlab-org/gitlab@ecc33395ae61141eb8d09245350ede435a070058) by @lifez ([merge request](gitlab-org/gitlab!147634)) +- [Use semaphore for storing security reports](gitlab-org/gitlab@fea7c1843b08a9377a96f0a15e071b560867948c) ([merge request](gitlab-org/gitlab!147816)) **GitLab Enterprise Edition** +- [Fix character escaping in fork divergence message](gitlab-org/gitlab@0699d4ed2e2e61da32798d73a62ff79dbeadf073) ([merge request](gitlab-org/gitlab!147808)) +- [Zoekt: Retry indexing if too many requests](gitlab-org/gitlab@0f2ecf22b24826efe5b30168acd9b5ee612ceda9) ([merge request](gitlab-org/gitlab!147776)) **GitLab Enterprise Edition** +- [Update pages ci templates - Lektor](gitlab-org/gitlab@89756d0a3c14b24dac2cc3b5e0a4d801b49ee876) ([merge request](gitlab-org/gitlab!147491)) +- [Fix focus state for dark mode rounded bottom markdown input](gitlab-org/gitlab@ce00c22b4ba4a87d03fe57c9bb0bcfae35eb4a9d) ([merge request](gitlab-org/gitlab!147476)) +- [Fix invalid CI input array type default value](gitlab-org/gitlab@3070c59f634ba8357fc9bcf32dcd763f1bfb0cd5) ([merge request](gitlab-org/gitlab!147681)) +- [Update redis-client to v0.21.1](gitlab-org/gitlab@2e2191cb4f7ef4fdb4f7088377483beab31e0714) ([merge request](gitlab-org/gitlab!147675)) +- [Include all changes made to issuable in hook data](gitlab-org/gitlab@9f0fd32b7039d6ba23b8829a1792490fbfc15626) ([merge request](gitlab-org/gitlab!147033)) +- [Fix markdown header for uses with restricted items](gitlab-org/gitlab@be9c2c1e736c48341a7446829c101b6738b46e71) ([merge request](gitlab-org/gitlab!147481)) +- [Fix VSD column names not matching the date range](gitlab-org/gitlab@45b59e2e3f52cfd953f51dd3e9c463d9ea2c7323) ([merge request](gitlab-org/gitlab!147668)) **GitLab Enterprise Edition** +- [Fix apparent spacing of issuable sidebar content](gitlab-org/gitlab@6502a266e8918d606b2266bae7edd21138a6c613) ([merge request](gitlab-org/gitlab!147294)) +- [Pass plan when create trials](gitlab-org/gitlab@5f8421ffd418ea5fcf6141d8a731afce3d9dba4a) ([merge request](gitlab-org/gitlab!147635)) **GitLab Enterprise Edition** +- [Remove `ci_fix_input_types` feature flag](gitlab-org/gitlab@bcd12f77cd3875df3a87add7eed73a94ddda46da) ([merge request](gitlab-org/gitlab!146897)) +- [Fix import of Gitea projects with a dot in owner name or project name](gitlab-org/gitlab@8c3c45e68887a072ac12ae3280bb5b0b489ba215) by @Cerdic ([merge request](gitlab-org/gitlab!146168)) +- [Strip namespaces from OS component names](gitlab-org/gitlab@4f416b69ff375b7f200eb903ae37855d3a3cb9e9) ([merge request](gitlab-org/gitlab!145613)) **GitLab Enterprise Edition** +- [Fix check for adminPath in home_panel.vue](gitlab-org/gitlab@5d16553bf2053166eedd63a6cf96f9bfc0f42f10) ([merge request](gitlab-org/gitlab!147562)) +- [Keep scope conditions for associations](gitlab-org/gitlab@0ce8a7ae2f050ed3b4b2ec190e98edf31e049c62) ([merge request](gitlab-org/gitlab!147550)) +- [Fix the case when mirror trigger builds is not set](gitlab-org/gitlab@9bc3be7276d094256814b2b16e78a3c9ed520f2f) ([merge request](gitlab-org/gitlab!147545)) **GitLab Enterprise Edition** +- [Fix new project group templates pagination](gitlab-org/gitlab@2c5f068a0ab0e187cc564fda6a4765431d8a6a24) ([merge request](gitlab-org/gitlab!147534)) **GitLab Enterprise Edition** +- [Fixes update analytics dashboards project settings](gitlab-org/gitlab@f095431a0d6bbeca0a94b3b4b515ac8e440bbb41) ([merge request](gitlab-org/gitlab!147533)) **GitLab Enterprise Edition** +- [Change CRM Contacts help icon color](gitlab-org/gitlab@337c6ce961bc7bd1a514d3cbfc6b98068a8f08fd) ([merge request](gitlab-org/gitlab!147331)) +- [Fix line width which separating the timeline events](gitlab-org/gitlab@fc17d327787945dc7d7a493c65ce30ce8a7d5cc1) by @antonkalmykov ([merge request](gitlab-org/gitlab!147037)) +- [Pipeline Sec Report: handle Jira issues](gitlab-org/gitlab@e80220aa097b1ff7e304c5669da175773d1121e0) ([merge request](gitlab-org/gitlab!147102)) **GitLab Enterprise Edition** +- [Enable 'self' in Content-Security-Policy worker-src directive](gitlab-org/gitlab@52ec8103551d0b5fbcaf3d1b02cbcaa9ffe441a1) ([merge request](gitlab-org/gitlab!147472)) +- [Ensure labels in inapplicable task list items are crossed out](gitlab-org/gitlab@4b6db3fe08157be75d3a286e6f1557ef864caacc) ([merge request](gitlab-org/gitlab!147361)) +- [Delete callback should use namespace_id](gitlab-org/gitlab@2e0540f4a5b45f9245103f3fa17356c24e885192) ([merge request](gitlab-org/gitlab!147459)) **GitLab Enterprise Edition** +- [Fix the permission check for pull mirroring](gitlab-org/gitlab@4249c03c44f11d49b4c201c5b1247513cffd0c43) ([merge request](gitlab-org/gitlab!146899)) **GitLab Enterprise Edition** +- [Update pages ci templates - JBake, Jekyll, Jigsaw](gitlab-org/gitlab@74943a41a628eb764472c0fd3809e46c4bb1095d) ([merge request](gitlab-org/gitlab!146529)) +- [Fix Vite HMR Content Security Policy rules](gitlab-org/gitlab@25f1a1d56fc1b814ff921535ef333997fae038a2) ([merge request](gitlab-org/gitlab!147366)) +- [Fix breadcrumb style broken in external_file page](gitlab-org/gitlab@2316e9dcb069aac982fba0133b41a300a4feefe3) ([merge request](gitlab-org/gitlab!143597)) +- [Remove indentation logic to fix Objective child list](gitlab-org/gitlab@72e68aec2d83e5f17b599691190a8c7bfcaa4474) ([merge request](gitlab-org/gitlab!147391)) +- [Adjust border radius of rounded note input](gitlab-org/gitlab@928efabcb3b056876cb6c57d5251372d7b6ab130) ([merge request](gitlab-org/gitlab!147385)) +- [Project item template: Fix alignment of CI/CD Catalog badge](gitlab-org/gitlab@ed2a3f707a789699f6ee402644572f9744aef9d7) ([merge request](gitlab-org/gitlab!147416)) +- [Return 401 when user sign ins but password authentication is not allowed](gitlab-org/gitlab@2fc17dcf0951ab65e7962ef1bbc3d47a5dd1b4f2) ([merge request](gitlab-org/gitlab!147343)) +- [Fix autocomplete for long items](gitlab-org/gitlab@6afbbc07bbf56afed66be66b1cded2a413bed70e) ([merge request](gitlab-org/gitlab!147337)) +- [Fix scheduling service statement timeout](gitlab-org/gitlab@f3611dd958710be31e1d39d723d8c07bc130f393) ([merge request](gitlab-org/gitlab!147328)) **GitLab Enterprise Edition** +- [Make the recently added not null migration no-op](gitlab-org/gitlab@9025c5e6f7f024288497f64a8f00e364ff1d96e8) ([merge request](gitlab-org/gitlab!147264)) +- [Fix the deprecated_properties method](gitlab-org/gitlab@fbed1c09ebb3a46e8403e992300986f4b9dba2e7) ([merge request](gitlab-org/gitlab!147281)) **GitLab Enterprise Edition** +- [Allow reset password when password auth is partially disabled](gitlab-org/gitlab@9198967aa9291c96da56547a853f101334be87d8) ([merge request](gitlab-org/gitlab!147198)) +- [Upgrade gitlab-fog-azure-rm to v1.9.1](gitlab-org/gitlab@e3a40763932e46429ce3e826356badccf654bf60) ([merge request](gitlab-org/gitlab!147219)) +- [Fix commit markdown parsing with word boundaries](gitlab-org/gitlab@9fc957662b0b2692306cc66cec89cdb4abbf1074) ([merge request](gitlab-org/gitlab!147185)) +- [Record unassignment notes for removed member](gitlab-org/gitlab@40f479d5fdc34e1886d6aaca2d8e0b4cfaf12286) by @euko ([merge request](gitlab-org/gitlab!146735)) +- [Fix Gitlab::HTTP_V2 allowed_internal_uris https scheme](gitlab-org/gitlab@c67777cf68bae073be21610e387e458b9de08d58) ([merge request](gitlab-org/gitlab!146919)) +- [Transfer group labels](gitlab-org/gitlab@4011fd1f703072aaf5e2e21573246ae0071ebcb6) by @euko ([merge request](gitlab-org/gitlab!146727)) + +### Changed (167 changes) + +- [Place relation import endpoint behind feature flag](gitlab-org/gitlab@32fa8cc96bc1866a3a2e1be517dddc0b5bb4eeec) ([merge request](gitlab-org/gitlab!149444)) +- [Add Google Artifact Registry count to Service Ping](gitlab-org/gitlab@fb05c4f181c1ddd5bed877219abb0db97612a31d) ([merge request](gitlab-org/gitlab!148414)) **GitLab Enterprise Edition** +- [Enable approval rues drawer feature flag](gitlab-org/gitlab@24c5aabcfb278469bcc956ae76f618066318272f) ([merge request](gitlab-org/gitlab!149045)) +- [Not throwing error when token not present](gitlab-org/gitlab@b5d98289e3724bc9bd3f7782a7a99e2fcf90907d) ([merge request](gitlab-org/gitlab!149392)) +- [Add help text for agent selector on env settings page](gitlab-org/gitlab@e949eae157b441f2593195d384359a8fee83b8e6) by @jzeng88 ([merge request](gitlab-org/gitlab!149033)) +- [Improve system note messaging for assumed merges](gitlab-org/gitlab@74389c2bcd8fafb3324f1459a4b0dde111636f2c) ([merge request](gitlab-org/gitlab!148147)) +- [Export for the new frameworks report (frontend)](gitlab-org/gitlab@50dd9ced39e545544a5d75f11001512c0241a7b7) ([merge request](gitlab-org/gitlab!146740)) **GitLab Enterprise Edition** +- [Redirect profile ssh keys to user settings](gitlab-org/gitlab@c1544549d186064042ebdbc5d842ece1b06c1457) ([merge request](gitlab-org/gitlab!148081)) **GitLab Enterprise Edition** +- [Fix deprecated properties method for multiple policies](gitlab-org/gitlab@1cdb8a3b5087fd46891e9c74ad232214a9521c7e) ([merge request](gitlab-org/gitlab!149264)) **GitLab Enterprise Edition** +- [Enable moving issue children by default](gitlab-org/gitlab@10fa5542b53ff7e08d95b81f8d0cf60a52f6a5c0) ([merge request](gitlab-org/gitlab!149156)) +- [Redirect profile gpg keys to user settings](gitlab-org/gitlab@9870ed2063627121b5bb39760e080cb10ba585d7) ([merge request](gitlab-org/gitlab!148528)) +- [Enable epic_color_highlight feature flag by default](gitlab-org/gitlab@a16fce87696a265f2ad8dcc136996eda03bbf99a) ([merge request](gitlab-org/gitlab!149147)) **GitLab Enterprise Edition** +- [Display descendant policies in compliance framework report](gitlab-org/gitlab@60f154d4d3397f29754bdfbc440e1ff8839576fb) ([merge request](gitlab-org/gitlab!149116)) **GitLab Enterprise Edition** +- [Allow relation tree restorer to import single relation](gitlab-org/gitlab@485fd4aaa0a12565e6283aeb92e8fe165e969da2) ([merge request](gitlab-org/gitlab!147904)) +- [Enable analytics dashboards animations and floating panels](gitlab-org/gitlab@fa00531c81e38d1190ced75830ff1dd7cc4281f5) ([merge request](gitlab-org/gitlab!149081)) **GitLab Enterprise Edition** +- [Update feature flag modal text](gitlab-org/gitlab@2b12f90a49a2fd657f19aac06999e2727226750c) ([merge request](gitlab-org/gitlab!149261)) +- [This MR updates copy for pipeline execution type](gitlab-org/gitlab@7a3d9c2f87c0238d1275d1f97279b7297ffb61d1) ([merge request](gitlab-org/gitlab!149187)) **GitLab Enterprise Edition** +- [Add pagination for the approval rules in the `Merge requests` settings](gitlab-org/gitlab@487e19f41dc759770bfcb32949a385fe5831d727) by @antonkalmykov ([merge request](gitlab-org/gitlab!148824)) **GitLab Enterprise Edition** +- [Remove orphaned indices for a namespace](gitlab-org/gitlab@831bcba18bd90a6487706032e70371102ee4305d) ([merge request](gitlab-org/gitlab!147482)) **GitLab Enterprise Edition** +- [Update dependency auto-deploy-image to v2.89.0](gitlab-org/gitlab@63927f21846020d245304dc862db5f7301093804) ([merge request](gitlab-org/gitlab!149236)) +- [Hide the `created_by` attribute from group/project non-admins](gitlab-org/gitlab@6acf810b4ca85ff48aba72c3e8296054abfb86a3) ([merge request](gitlab-org/gitlab!147870)) +- [Limit counters on group deletion](gitlab-org/gitlab@9c060bc84c6ebfd01fb1d227e40ffb3bb20c5094) ([merge request](gitlab-org/gitlab!148575)) +- [Remove Beta Labels from DuoChat Callout and Sidebar](gitlab-org/gitlab@206234fc578c9ccf64b9c452ae9064cd70aca586) ([merge request](gitlab-org/gitlab!149177)) **GitLab Enterprise Edition** +- [Add unicode_escaped_blob field](gitlab-org/gitlab@0a06e1dcb2474f866e2f335cee2d0cb3c6886db3) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/139090)) +- [Swap pipeline columns for p_ci_builds](gitlab-org/gitlab@44449068f2b450e2cbaa8feae58f819275bdb3f5) ([merge request](gitlab-org/gitlab!146759)) +- [Add info about release notes for policy rename](gitlab-org/gitlab@21782f49f506e21424294ef9ae73ad0bb3d2235a) ([merge request](gitlab-org/gitlab!148144)) **GitLab Enterprise Edition** +- [MR widget: Use secondary text style for merge train message](gitlab-org/gitlab@d79f1d4a3da2ff601038c0432a101320307d577c) ([merge request](gitlab-org/gitlab!149131)) **GitLab Enterprise Edition** +- [Snippets: Move embed and clone to actions](gitlab-org/gitlab@3d46019e187930303752f7cdec0e4ca7b9786688) ([merge request](gitlab-org/gitlab!147996)) +- [MR list: Show self approval](gitlab-org/gitlab@eec8884f56aa7276e391c24d8e67c8ec457a001c) ([merge request](gitlab-org/gitlab!149092)) +- [Update design of the pipeline graph](gitlab-org/gitlab@8a05ff09c54f5a840816308468fab1046be712ea) ([merge request](gitlab-org/gitlab!149068)) +- [Pipeline overview page: Migrate dropdown to GlDisclosureDropdown](gitlab-org/gitlab@a45e646fe225ee4a9cbb6ae0546d614803dac5fd) ([merge request](gitlab-org/gitlab!147273)) +- [Reduce sbom_occurrences table writes](gitlab-org/gitlab@f1e0086cfba47720fd5a07ea38c9a9c9640b4da5) ([merge request](gitlab-org/gitlab!148868)) **GitLab Enterprise Edition** +- [Added information to product analytics docs](gitlab-org/gitlab@6e8750493f2418655d88f21d778a95529326aab3) ([merge request](gitlab-org/gitlab!148601)) **GitLab Enterprise Edition** +- [Add the container to the cadence validation ff check](gitlab-org/gitlab@47ae7f5dce7b4bcf3cf91bd89c026ad697eab088) ([merge request](gitlab-org/gitlab!148892)) **GitLab Enterprise Edition** +- [Fix project overview bugs](gitlab-org/gitlab@cabb403855e5ae6a8d4f1f700a7425376a24b7a4) ([merge request](gitlab-org/gitlab!148953)) +- [Allow relation tree restorer to import single relation](gitlab-org/gitlab@ff17628fb19918ed0cf774fd5f48ab55101b740c) ([merge request](gitlab-org/gitlab!147913)) +- [Remove `scan_result_policies_block_unprotecting_branches` feature flag](gitlab-org/gitlab@9056627110b4ac647b32ddf6810f20c4b7333855) ([merge request](gitlab-org/gitlab!148549)) **GitLab Enterprise Edition** +- [Left-align activity timestamps on mobile](gitlab-org/gitlab@30c223251024930c15fad63342595d8b8e3c35b9) ([merge request](gitlab-org/gitlab!148711)) +- [Remove the need for SaaS to configure Product Analytics](gitlab-org/gitlab@85eb339cec332c1392d753fd789bd937d70388c7) ([merge request](gitlab-org/gitlab!147833)) +- [Add action menu to milestone row on milestones page](gitlab-org/gitlab@d9895d13de20db638e261cac294152df83b98341) ([merge request](gitlab-org/gitlab!148219)) +- [Move viewed file tooltip to the left; only show on hover](gitlab-org/gitlab@11105fe52389dfb17a10e39ea4b7b4995c5ee440) ([merge request](gitlab-org/gitlab!148558)) +- [Capture running builds on non-shared runners](gitlab-org/gitlab@d299c78fa96ee76d16a95524cf04cf5f8bc0c708) ([merge request](gitlab-org/gitlab!147943)) +- [Update epics foreign key on parent_id to nullify on delete](gitlab-org/gitlab@c6e4f7e2c0add5e048a32bd73e5113387add0ff5) ([merge request](gitlab-org/gitlab!148522)) +- [Merge request list: Improve approvals](gitlab-org/gitlab@443aab39ec9ac0a79299b6947cda09d9194d594b) ([merge request](gitlab-org/gitlab!148364)) +- [Add metadata database alert to registry pages in the UI](gitlab-org/gitlab@062eea6b2627d81ff3f8fb2ef36178f0e45d68bc) ([merge request](gitlab-org/gitlab!147503)) +- [Enable `security_policies_unassign_redundant_policy_projects` FF](gitlab-org/gitlab@3c0bbcf05586a51dded19fe27d396ded619be706) ([merge request](gitlab-org/gitlab!148741)) **GitLab Enterprise Edition** +- [Add a `personal` argument to `Query.projects`](gitlab-org/gitlab@2ae86907e57e69350029b9cd11f5219172542355) by @yasuk ([merge request](gitlab-org/gitlab!148393)) +- [Combine snippet embed and clone buttons into single code dropdown](gitlab-org/gitlab@4b8561afa2018da16348d43eb277cad8953b437b) ([merge request](gitlab-org/gitlab!147719)) +- [Drop workhorse_google_client feature flag](gitlab-org/gitlab@2715b0369da54560ccdc51f524f3187228620713) ([merge request](gitlab-org/gitlab!148755)) +- [Update text in deployment approval modal](gitlab-org/gitlab@5951bfd01255d5d0b9b1370317830cde22230238) ([merge request](gitlab-org/gitlab!148588)) **GitLab Enterprise Edition** +- [Distribute scheduled pipelines from Scan Execution Policy](gitlab-org/gitlab@7c1cac1a853639ab9a047f2d44ac39befe117ae1) ([merge request](gitlab-org/gitlab!145993)) **GitLab Enterprise Edition** +- [Update DevOps Reports illustrations](gitlab-org/gitlab@bfb5623d0b7ac5860f94c786c46cba71d6748fc0) ([merge request](gitlab-org/gitlab!148530)) **GitLab Enterprise Edition** +- [Update DevOps Adoption empty state illustration](gitlab-org/gitlab@f5df939dbb72e467918ea00eab9a269840c510ca) ([merge request](gitlab-org/gitlab!148546)) **GitLab Enterprise Edition** +- [Update ES shard size rake task and guidelines](gitlab-org/gitlab@9f48a818e5c0724bc5201c20ad68b7ad77e2cadb) ([merge request](gitlab-org/gitlab!146108)) **GitLab Enterprise Edition** +- [Update release empty state illustration](gitlab-org/gitlab@ab374d34bb7948dca1da5023ef301b8b2b8627de) ([merge request](gitlab-org/gitlab!148526)) +- [Add sales call to action when onboarding without purchase](gitlab-org/gitlab@7355dafcd25f41bea162fec4c3ee0dfe8ac4daf4) ([merge request](gitlab-org/gitlab!148439)) **GitLab Enterprise Edition** +- [Moves ml_experiment_tracking to group::mlops](gitlab-org/gitlab@a398f1a46638db397f1772498e9f5026a3b85339) ([merge request](gitlab-org/gitlab!148533)) +- [Truncate individual names](gitlab-org/gitlab@804f6efec7ef7c89405026f9a51c7c5d0e04e343) ([merge request](gitlab-org/gitlab!144369)) +- [Replace GlAvatar with ProjectAvatar in GroupItems](gitlab-org/gitlab@7bcb4defeab1ac52da0e58d8256e8b9d5027668a) by @espadav8 ([merge request](gitlab-org/gitlab!148464)) +- [Adjust default_enabled to true for wiki_content_background_job flag](gitlab-org/gitlab@672d92d44977ef0c1e8eaae7ecb85629f743e79a) by @ivantedja ([merge request](gitlab-org/gitlab!148616)) +- [Remove sub-header background from Compare revisions form](gitlab-org/gitlab@bbcf8f8cb4c63cfa0f4472edec747dfae0420ac2) by @espadav8 ([merge request](gitlab-org/gitlab!148614)) +- [Search iterations in descending order](gitlab-org/gitlab@17b0039b731cf31a7046720ecfe5d788b3fa070d) ([merge request](gitlab-org/gitlab!148465)) **GitLab Enterprise Edition** +- [Allow admins to disable runner registration token](gitlab-org/gitlab@7e4b4f7d0375b4d8a53ceb2705bc8280b3aae999) ([merge request](gitlab-org/gitlab!147559)) +- [Update issue filter search illustration](gitlab-org/gitlab@a23f546fc0c705257782abdac946b64451e8fa03) ([merge request](gitlab-org/gitlab!148521)) +- [Trigger search file modal when searching](gitlab-org/gitlab@d421d9cb81acaf422ecb04468450d23c03be74aa) ([merge request](gitlab-org/gitlab!148025)) +- [Cleanup web_ide_settings_sync feature flag](gitlab-org/gitlab@512cf3f80903e3288400ca93b71a73012299b32c) ([merge request](gitlab-org/gitlab!148365)) +- [Update color and spacing of releases page](gitlab-org/gitlab@09fc52c7762f812780bb35269be5de844e14a06e) ([merge request](gitlab-org/gitlab!148474)) +- [Make merge conflict file stand out more](gitlab-org/gitlab@fae96877f76f666ba5c33552f22a28c2b9804eef) ([merge request](gitlab-org/gitlab!147654)) +- [Update the cadence documentation for sep](gitlab-org/gitlab@2605c360256f47423ba2975003307dfa85a330ce) ([merge request](gitlab-org/gitlab!148109)) +- [Add alphabetical sort for branch names](gitlab-org/gitlab@4a0c51d52c0ff087c553328034c11b0c7b0d7060) by @gauravmarwal ([merge request](gitlab-org/gitlab!147034)) +- [Enable product_analytics_beta_option by default](gitlab-org/gitlab@3122e16371dc4e2e9330698d87f94cd6b5323add) ([merge request](gitlab-org/gitlab!148422)) +- [Make product_analytics_dashboards default enabled](gitlab-org/gitlab@104c9d4aef2c258181c15287589c8d4983be4637) ([merge request](gitlab-org/gitlab!148381)) +- [Add a validation to the scan execution policy cadence](gitlab-org/gitlab@3a3160b708ae1e67ef4a5ea738e447e9fc5b09d1) ([merge request](gitlab-org/gitlab!147576)) **GitLab Enterprise Edition** +- [Update MR changes empty state](gitlab-org/gitlab@d19cd4d747086f4677358fa7ea05484f659535fd) ([merge request](gitlab-org/gitlab!148051)) +- [Adds logo to MattermostSlashCommands](gitlab-org/gitlab@558a96afcba39e3d57af296cea1ec4d714adb4e3) ([merge request](gitlab-org/gitlab!148373)) +- [Update analytics dashboard observability](gitlab-org/gitlab@0f0627036905f892fe8b0cbb2afe459813ecbeb4) ([merge request](gitlab-org/gitlab!147163)) **GitLab Enterprise Edition** +- [Keep compliance frameworks for project transfers](gitlab-org/gitlab@b81b52b2c67664dd1dc941ab0e431d59d7869288) ([merge request](gitlab-org/gitlab!148142)) **GitLab Enterprise Edition** +- [This MR adds scope column to policies list](gitlab-org/gitlab@9d50f342072abdfe87a44b80c8eb5ef9662c118e) ([merge request](gitlab-org/gitlab!145047)) **GitLab Enterprise Edition** +- [Refactor BulkIndexer to able to handle other document references](gitlab-org/gitlab@2da4b1ca443ede7a42ecafbafbf1d37e9b6cfd45) ([merge request](gitlab-org/gitlab!146491)) **GitLab Enterprise Edition** +- [Add Mattermost logo](gitlab-org/gitlab@f3bd984876b13ea6328327f36314167cef9c0051) ([merge request](gitlab-org/gitlab!147893)) +- [Blocks unprovisioned access to product analytics apis](gitlab-org/gitlab@f58377548fa9370b80861dcf52d3ec48fbf8d484) ([merge request](gitlab-org/gitlab!147841)) **GitLab Enterprise Edition** +- [Add empty state for sidebar CRM widget](gitlab-org/gitlab@b764d0da8be493cfd4ff961b659fc982e827f55e) ([merge request](gitlab-org/gitlab!147694)) +- [Snippets delete modal improvements](gitlab-org/gitlab@0898b4148bc60063d3785eb2273247d67b6689c8) ([merge request](gitlab-org/gitlab!148044)) +- [This MR adds branch exceptions selector](gitlab-org/gitlab@2c9b4b8a89f12fe9bb6a6f1f0053cedde65dbe6c) ([merge request](gitlab-org/gitlab!141650)) **GitLab Enterprise Edition** +- [Move Google Cloud instructions to reduce duplication](gitlab-org/gitlab@9ac8d4aa4d79650640828f28e46b5e721ae5a9a1) ([merge request](gitlab-org/gitlab!148190)) +- [Adding alert for duo pro trials for existing users](gitlab-org/gitlab@f43b7f57087aaf6b9e2bbd94aeb057e5c494e9bd) ([merge request](gitlab-org/gitlab!148012)) **GitLab Enterprise Edition** +- [Deprecate security_auto_fix from graphql type](gitlab-org/gitlab@a69eb00b15bf14aae02ae885c9aefcee38cd5e9f) ([merge request](gitlab-org/gitlab!147157)) +- [Show package processing error message returned from API](gitlab-org/gitlab@03da4ea38f9d5acec50d9499c9e27193b70d3810) ([merge request](gitlab-org/gitlab!147026)) +- [Add columns for require_reauthentication_to_approve](gitlab-org/gitlab@24c9690f099da9fead2a364b87aef39cc08fc851) ([merge request](gitlab-org/gitlab!146374)) +- [MR more actions dropdown: Improve alignment on small viewports](gitlab-org/gitlab@e8950e4bc438552fa65da59ed6b22d08bb30423d) ([merge request](gitlab-org/gitlab!148000)) +- [Issuables: Improve more actions on smaller devices](gitlab-org/gitlab@1cbafae293a2d030eca6b5c36119d070e849c04b) ([merge request](gitlab-org/gitlab!147999)) +- [Update CreateIssueForm to support Japanese IME](gitlab-org/gitlab@b1a1cf97ed248a5d20e926b7e629aff1ccb489e0) ([merge request](gitlab-org/gitlab!147814)) **GitLab Enterprise Edition** +- [Snippets page: Adjust header elements to match issuables](gitlab-org/gitlab@228280f9ef67c19f739f5113367457c2cfdc6419) ([merge request](gitlab-org/gitlab!147451)) +- [Change button text from "Create/add new role" to "Create role"](gitlab-org/gitlab@da8245685deb6715a760d2c7dcc43cb1d123b86e) ([merge request](gitlab-org/gitlab!147507)) **GitLab Enterprise Edition** +- [Collapse sidebar on ESC key if in overlay mode](gitlab-org/gitlab@fdc93c8c76210fb393cd469fbc2223a9f76ca12d) ([merge request](gitlab-org/gitlab!147001)) +- [Stop calling the migration's workers and update them to no-op](gitlab-org/gitlab@511b7db63830f0370845f950816c90b6d45d69fe) ([merge request](gitlab-org/gitlab!147228)) +- [Unify the more actions kebab menu tooltip behavior](gitlab-org/gitlab@aa4126f55207d6849c97ffce972fd4a7ad840b32) ([merge request](gitlab-org/gitlab!147540)) +- [Snippets page: Migrates dropdown to GlDisclosureDropdown](gitlab-org/gitlab@c475073d10e440e33bf4929ec911201eecd4336a) ([merge request](gitlab-org/gitlab!147518)) +- [Update dependency auto-deploy-image to v2.88.0](gitlab-org/gitlab@a69a8c5cfba9d2949d266f358a772c008dbf4ec3) ([merge request](gitlab-org/gitlab!147935)) +- [Improve UX feedback when project deploy feature flags limit is reached](gitlab-org/gitlab@584c89afc0260ae41f48a6b96f91c7e0931b75af) by @antonkalmykov ([merge request](gitlab-org/gitlab!147446)) +- [Add provider selection in product analytics onboarding](gitlab-org/gitlab@1940cd0405f1cb0f9747f3f25c8cfeb1c889dd21) ([merge request](gitlab-org/gitlab!145880)) **GitLab Enterprise Edition** +- [Add descendant filter to security policies graphql query](gitlab-org/gitlab@15ac762e945f3e1488c059eb57302139bba077f0) ([merge request](gitlab-org/gitlab!145825)) **GitLab Enterprise Edition** +- [Clarify supported signed commits types](gitlab-org/gitlab@d9d9f2115fdb93ced6c7713da36cb2c4a11328ab) ([merge request](gitlab-org/gitlab!147556)) **GitLab Enterprise Edition** +- [Edit branch rule name](gitlab-org/gitlab@2ac027412c70a4a76c037c7d06518155a32d5eb3) ([merge request](gitlab-org/gitlab!147308)) +- [Improve license matching when evaluating policies](gitlab-org/gitlab@40c4f39deecdb36b7ffa2dd49981b1c10a11b926) ([merge request](gitlab-org/gitlab!147598)) **GitLab Enterprise Edition** +- [Update project and group transfer modal text](gitlab-org/gitlab@c2515558105c95c1220b41a500ec422eb4f8e441) ([merge request](gitlab-org/gitlab!146938)) +- [Updated gitlab-ui and refactored duo chat](gitlab-org/gitlab@0e4cea3574e69fe33f2c546d16ad2712666d9006) ([merge request](gitlab-org/gitlab!147802)) **GitLab Enterprise Edition** +- [This MR adds policy scope to a drawer](gitlab-org/gitlab@9ae60e3cf90df6e51e89325d36e6684fcd2428be) ([merge request](gitlab-org/gitlab!145567)) **GitLab Enterprise Edition** +- [Add empty state for discussion in sidebar](gitlab-org/gitlab@5a172ca1a1db009c5d50bc4b3ca8148aca8ee837) ([merge request](gitlab-org/gitlab!147642)) +- [Remove namespace alias from DORA performance counts](gitlab-org/gitlab@a6287c22842e298fd8865016112f4e40dbb54c3d) by @jzeng88 ([merge request](gitlab-org/gitlab!147400)) **GitLab Enterprise Edition** +- [Update importers to use application settings to limit number of jobs](gitlab-org/gitlab@3254590fd2105fcd995f0ccb5e0b3e214c9a59c6) ([merge request](gitlab-org/gitlab!143875)) +- [Add placeholder and validation for linkedin profile input](gitlab-org/gitlab@0381be4712ae81e508abe78b292c6fc1fabef6b1) ([merge request](gitlab-org/gitlab!147288)) +- [Set AddOnPurchase trail value in CreateService](gitlab-org/gitlab@13174ab1ce2ee8a94cee7b3b8cfba5ee0b4ab221) ([merge request](gitlab-org/gitlab!147764)) **GitLab Enterprise Edition** +- [Use static_holmes instead of charlock_holmes](gitlab-org/gitlab@4f5136b7735810d03ce9aa20b5257ccec446808a) ([merge request](gitlab-org/gitlab!147721)) +- [Make consistent padding in the package asset table row](gitlab-org/gitlab@925520fe0473c090a78cdc89baee0c41176a62cc) by @antonkalmykov ([merge request](gitlab-org/gitlab!147211)) +- [Add groups_direct field in JWT for Vault integration](gitlab-org/gitlab@3b628813eff7ddd1ef085708e2fb63df3536d899) by @alexandru.jieanu ([merge request](gitlab-org/gitlab!146881)) +- [Export for the new frameworks report (backend)](gitlab-org/gitlab@3bac11cb79bf24c72b15082fe484a06edc411936) ([merge request](gitlab-org/gitlab!144815)) **GitLab Enterprise Edition** +- [This MR changes key name for license rule](gitlab-org/gitlab@9a8e4548524fe903b5b988e1e0aba048d3a0a535) ([merge request](gitlab-org/gitlab!147184)) **GitLab Enterprise Edition** +- [Well segment: Change border color to default gray-100](gitlab-org/gitlab@8fa2fbf74694b5932162f222cb3409baaf4b4b2c) ([merge request](gitlab-org/gitlab!147674)) +- [Reorganization project overview page](gitlab-org/gitlab@f0af2950542c1329cafa13342cf6b86bde3f2d03) ([merge request](gitlab-org/gitlab!145678)) +- [Fix formatting of issue summaries](gitlab-org/gitlab@8622a816cd7cfc298cce6e28d79525dbf80de204) ([merge request](gitlab-org/gitlab!147466)) **GitLab Enterprise Edition** +- [Use textarea for collapsed snippet description](gitlab-org/gitlab@e637e32fb073ff0cd16a7f4f6d472ffa02415845) ([merge request](gitlab-org/gitlab!147585)) +- [Disable file path input until project is selected](gitlab-org/gitlab@8fe848cbafaf0b786efffa28a2b4c5814fdcf652) ([merge request](gitlab-org/gitlab!147307)) +- [Fix and refactor snippets list view](gitlab-org/gitlab@ee9bb496ca85487ded7e6599c608bc596cc39b1b) ([merge request](gitlab-org/gitlab!147580)) +- [Update markdown styles for quoted lists](gitlab-org/gitlab@58ad2dbb905877f7d1934798c6e630c50722ef6f) ([merge request](gitlab-org/gitlab!147646)) +- [Upgrade Elasticsearch version to 8.11.4](gitlab-org/gitlab@04103822e6731f1f69d806f5e0378425472b3231) ([merge request](gitlab-org/gitlab!147527)) +- [Hide invited group name and source from project/group non-admins](gitlab-org/gitlab@a984f85ae821842538743d453fd3c26c79b2a636) ([merge request](gitlab-org/gitlab!147629)) +- [Show Duo Pro button for ultimate trial](gitlab-org/gitlab@1a126e4bbf21e6056919d0d9e35302971025e22d) ([merge request](gitlab-org/gitlab!147548)) **GitLab Enterprise Edition** +- [Remove claude 2.1 feature flag](gitlab-org/gitlab@04c4cec133da5f095ddccc6b80304f01fd55bc58) ([merge request](gitlab-org/gitlab!147253)) +- [Delete redundant policy configurations on assignment](gitlab-org/gitlab@bd8219a5ff8924b192e830bd0d9b0828f16d749c) ([merge request](gitlab-org/gitlab!143668)) **GitLab Enterprise Edition** +- [Add $gl-padding margin bottom to in open
](gitlab-org/gitlab@32c118ce721f62f18cafea19fa615e1e3cb51dbd) ([merge request](gitlab-org/gitlab!147492)) +- [Remove CI_COMPONENT_FQDN variable](gitlab-org/gitlab@c5497cf4aa3287d5cd2d817db2e8b09e07f03c0c) ([merge request](gitlab-org/gitlab!146797)) +- [Updates model registry table docs with correct schema](gitlab-org/gitlab@aa3c9018fb4dbd623fc8cdbcb55a5a791d45d250) ([merge request](gitlab-org/gitlab!146898)) +- [Migrate button-class-vue in todo.vue](gitlab-org/gitlab@69ef496e2898633f7884b94f160f5553450bd3e1) ([merge request](gitlab-org/gitlab!147203)) +- [Cleanup snippets edit page](gitlab-org/gitlab@fe21c3ef651f3d5d508d1d179ed2f1a02d5997c9) ([merge request](gitlab-org/gitlab!147442)) +- [Update deprecation milestone for job token setting](gitlab-org/gitlab@6097ab4273c38d2b7625e79107940e282108c90c) ([merge request](gitlab-org/gitlab!147320)) +- [Change username validation message](gitlab-org/gitlab@cbafeab9d89686143a214b0f632b322eb0274ae6) by @jzeng88 ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147213)) **GitLab Enterprise Edition** +- [Backport Work Item copy changes to legacy issuables](gitlab-org/gitlab@ca1533961fe1ff8a841ebb1e36f4ea3b6638b079) ([merge request](gitlab-org/gitlab!147369)) +- [Updating tab title](gitlab-org/gitlab@f1d14b00ecadcc50cadb3024ff9640d5d21a7af9) ([merge request](gitlab-org/gitlab!147094)) +- [Display project and subgroup counters when deleting group](gitlab-org/gitlab@1b001708ad7aacdee9c7f537ceacf314ed7c315d) ([merge request](gitlab-org/gitlab!145838)) +- [Issuables: Mark destructive action (delete) as such](gitlab-org/gitlab@8f64896cfa3c2b55442762864d90b9cf56111b8a) ([merge request](gitlab-org/gitlab!147441)) +- [Migrates user access badge to use GlBadge](gitlab-org/gitlab@0afdd01a0e777d74960ca04349bf1ba01ce0c03b) ([merge request](gitlab-org/gitlab!147437)) +- [Add logging for JWT errors](gitlab-org/gitlab@bbad75c4d5811a645fca9a71b70b637820da729b) ([merge request](gitlab-org/gitlab!147234)) +- [Add thread count and remove participants from sidebar](gitlab-org/gitlab@80ea76d941891c82d7239ed2996f7d2db9aff364) ([merge request](gitlab-org/gitlab!146037)) +- [User profile: Hide sidebar if user is blocked](gitlab-org/gitlab@366b3ce92586831e4ea910ac960332c4ae403649) ([merge request](gitlab-org/gitlab!147354)) +- [Improved CI YAML schema tests](gitlab-org/gitlab@097f279544068ada7441e865b1f5819ff1b97b8e) by @zillemarco ([merge request](gitlab-org/gitlab!139716)) +- [Fix runner form headings to match Pajamas](gitlab-org/gitlab@be576ce1ed8e7b68eff6563d1571bd8c29957b36) ([merge request](gitlab-org/gitlab!146383)) +- [Display created and finshed pipeline times](gitlab-org/gitlab@d0c74ae64c7a80223183186099ec6efd6a2fbb21) ([merge request](gitlab-org/gitlab!147060)) +- [Use standardized panel errors for Value stream dashboard](gitlab-org/gitlab@86a9a9194dd2a61263440f31441c177ad3e3990a) ([merge request](gitlab-org/gitlab!147287)) **GitLab Enterprise Edition** +- [Add tooltip to snippet visibility icon](gitlab-org/gitlab@442bba2c81e87e6126a1fd74133194494a4dbfa4) ([merge request](gitlab-org/gitlab!147295)) +- [Migrates code dropdown to Vue](gitlab-org/gitlab@60a1a8f38183f774e12fbc7d3a265bae05a6e62f) ([merge request](gitlab-org/gitlab!146633)) +- [Cleaned up code_suggestions_ga_owner_alert feature flag](gitlab-org/gitlab@032cc3a042653d306ab8636d5dea204145073e43) ([merge request](gitlab-org/gitlab!146322)) **GitLab Enterprise Edition** +- [Improve loading states of sidebar items](gitlab-org/gitlab@beef7d7944736f4401c48eea519c27c5cae137e8) ([merge request](gitlab-org/gitlab!147330)) +- [Log if pipeline creation limit might be exceeded](gitlab-org/gitlab@c1e13cf9138c4dc3ecd117739bedf1f6cda00385) ([merge request](gitlab-org/gitlab!147306)) +- [Show deployment count](gitlab-org/gitlab@a5ca23c5cf5b6d515865c1c5051d3cf92b49dfcb) ([merge request](gitlab-org/gitlab!147280)) +- [Refactor enterprise_user trait into factory](gitlab-org/gitlab@a18dd07b682299c653d63f44d30cc238441974f0) by @jzeng88 ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/145626)) **GitLab Enterprise Edition** +- [Update dependency auto-deploy-image to v2.87.0](gitlab-org/gitlab@aa08f973bcfcaa3f61cc0aa632d3698c0a8f3751) ([merge request](gitlab-org/gitlab!147272)) +- [Change username text color to use same across UI](gitlab-org/gitlab@18f99db2f182da23df0e4c31903159eb14e1db7c) ([merge request](gitlab-org/gitlab!147260)) +- [Remove feature flag fetch_tags_from_registry_api](gitlab-org/gitlab@0e2677a0f6be7b37324b4db1a6fdcc39bd8eb1da) ([merge request](gitlab-org/gitlab!147233)) +- [Remove api: API::Internal::ContainerRegistry::Migration](gitlab-org/gitlab@00886957027172084f211dff4d6a18ab0271b68e) ([merge request](gitlab-org/gitlab!147229)) +- [Do not expand CI predefined `TRIGGER_PAYLOAD` variable](gitlab-org/gitlab@e91bece35975a4f2e5e0da30eec651a125d76da6) by @vytautasbert ([merge request](gitlab-org/gitlab!146242)) +- [Block compliance fraework removal when there are linked policies](gitlab-org/gitlab@e417b94198995f065763e1d80e7d62da381417db) ([merge request](gitlab-org/gitlab!147041)) **GitLab Enterprise Edition** +- [Raise atom feed title length limit to 160 characters](gitlab-org/gitlab@fbddd8ad18df8794627ebb20279ac3315bbc5f72) by @kxxt ([merge request](gitlab-org/gitlab!145730)) +- [Fix pagination issue on adherences report](gitlab-org/gitlab@7d8bf7fe05c5bf658ada58ff15408396db3dd653) ([merge request](gitlab-org/gitlab!147022)) **GitLab Enterprise Edition** +- [Trim further file content for code suggestions](gitlab-org/gitlab@abbfb78f8ec921a4cde20340e79d03da1e1cbe17) ([merge request](gitlab-org/gitlab!146977)) **GitLab Enterprise Edition** +- [Update milestone icon](gitlab-org/gitlab@0ef8adbdf7769f36c4747a3d3e9069a001bd14ff) ([merge request](gitlab-org/gitlab!146828)) **GitLab Enterprise Edition** +- [Reject project CI jobs on reserved policy stages](gitlab-org/gitlab@82a6d2066bbc73c5ee41be5ca630bd4101ec0ed4) ([merge request](gitlab-org/gitlab!146307)) **GitLab Enterprise Edition** + +### Deprecated (1 change) + +- [Deprecate GITLAB_SHARED_RUNNERS_REGISTRATION_TOKEN](gitlab-org/gitlab@b35c2cc49458a06c641f150802faa3604ae98cc4) ([merge request](gitlab-org/gitlab!148310)) + +### Removed (19 changes) + +- [Remove about section](gitlab-org/gitlab@62fbee1ba9a04453909b25e24f4f7e5db0694d74) ([merge request](gitlab-org/gitlab!147948)) +- [Remove CH analytics related feature flags](gitlab-org/gitlab@7f85033ebb8d6b46203a94626e2cab7cc145824e) ([merge request](gitlab-org/gitlab!148651)) **GitLab Enterprise Edition** +- [Remove modify_auto_fix_setting](gitlab-org/gitlab@67de5f0af68d99b3104e25004b9bb2930a89dc55) ([merge request](gitlab-org/gitlab!149286)) +- [Remove beta badge](gitlab-org/gitlab@5cab24cfce096bb3203a8ffa1285ff11582fa353) ([merge request](gitlab-org/gitlab!149018)) +- [Clean up default_to_import_tab experiment](gitlab-org/gitlab@163a262210660a0ce2328f9976e20ca46ebce1f7) ([merge request](gitlab-org/gitlab!149130)) +- [Remove ff and policy information related to](gitlab-org/gitlab@00a8ca95ce9890bd44a2e077728f83550e5bc805) ([merge request](gitlab-org/gitlab!147202)) +- [Remove the backend changes for automatic diff summary](gitlab-org/gitlab@397e3d8c6e6177b10b62d5507177ac2edb8e0155) ([merge request](gitlab-org/gitlab!148122)) +- [Remove ignore column rule from GeoNodeStatus](gitlab-org/gitlab@9bc24bb9d4a09ff63bc9d31af8a353f93b87d1b2) ([merge request](gitlab-org/gitlab!148335)) **GitLab Enterprise Edition** +- [Remove runner registration compatibility alert](gitlab-org/gitlab@5213b04f44787bf348ed19e94ef2f38b50eb7785) ([merge request](gitlab-org/gitlab!148152)) +- [refactor: Drop col 'package_name_pattern_ilike_query' Part 3](gitlab-org/gitlab@afc688f79144701a6f0c215c2f96fbd850f7aefc) by @gerardo-navarro ([merge request](gitlab-org/gitlab!142305)) +- [Remove CI text interpolation code](gitlab-org/gitlab@96f86196a6571c751433fd7eda099446ce9a4ece) ([merge request](gitlab-org/gitlab!147803)) +- [Clean up auto_fix related action and services](gitlab-org/gitlab@b8898d459cec9ae3122e698d446738b7f44ed200) ([merge request](gitlab-org/gitlab!147161)) **GitLab Enterprise Edition** +- [Remove final mentions of Ai::SyncServiceTokenWorker](gitlab-org/gitlab@f0a6080f0dd86678283a0e15c24bc6c2f24d44c7) ([merge request](gitlab-org/gitlab!147452)) **GitLab Enterprise Edition** +- [Remove github_import_extended_events feature flag](gitlab-org/gitlab@6052e8d7e8973b20a27a3575f732b4f04d02628a) ([merge request](gitlab-org/gitlab!146695)) +- [CI/CD Catalog experiment badge](gitlab-org/gitlab@e249ed0e906fdc5d029a1db6b0ef38ca5baa8e1b) ([merge request](gitlab-org/gitlab!147630)) +- [Remove CH materialized view rebuilding FFs](gitlab-org/gitlab@e593b34b6a5aa9e00be73d40cffd42cdb257dda7) ([merge request](gitlab-org/gitlab!146592)) +- [Remove latest_version from Ci::Catalog::ResourceType](gitlab-org/gitlab@917b922b5f351a748e72fb00a49b6cf2d84b71c0) ([merge request](gitlab-org/gitlab!146913)) +- [Remove frontend code for security_auto_fix with](gitlab-org/gitlab@f4d3dd1222a472ae144a87eed37462d1284de5bb) ([merge request](gitlab-org/gitlab!147078)) **GitLab Enterprise Edition** +- [Remove ignore column](gitlab-org/gitlab@fe8ca866391350852803c8b6670a9c0de18cd09f) by @imskr ([merge request](gitlab-org/gitlab!147250)) + +### Security (7 changes) + +- [Fix stored xss using the gollum filter](gitlab-org/gitlab@8240472c85efd51938ad064ab5cc4a39e374d0c8) ([merge request](gitlab-org/gitlab!149158)) +- [Update Gitlab::Regex::Packages#slack_link_regex](gitlab-org/gitlab@ea5f384a4e51d16b1fe00ba9233abc09fb2b92d6) ([merge request](gitlab-org/gitlab!149158)) +- [Fix XSS in autocomplete in rich text editor](gitlab-org/gitlab@d3ca8e6cc9cc98a48d53d7f968cd922ded0d74f8) ([merge request](gitlab-org/gitlab!149158)) +- [Correctly parse attachments for junit result](gitlab-org/gitlab@9a0357ac244a3c7282d73864d5792d1aff3f48dd) ([merge request](gitlab-org/gitlab!149158)) +- [Fix stored xss in wikis using the abstract_reference_filter](gitlab-org/gitlab@4ba8bee6bb39fb830c592c57d5d4595411c8a9ad) +- [Limit the number of emojis we will transform](gitlab-org/gitlab@ce5a24e34504c1f4b4408c83ebb801a055809bea) +- [Remove `unsafe-inline` from CSP](gitlab-org/gitlab@a7a302b7484d972fa85e2003a799349c541077b4) ([merge request](gitlab-org/gitlab!147268)) + +### Performance (8 changes) + +- [Preload `vulnerability_reads` for vulnerability records](gitlab-org/gitlab@a36e652efbb76203555cc3b5afd72d225eb5b047) ([merge request](gitlab-org/gitlab!149304)) **GitLab Enterprise Edition** +- [Preload releases for Tags API](gitlab-org/gitlab@5a78293c8227686315b62b1f429f7b6669b9f24f) ([merge request](gitlab-org/gitlab!140484)) +- [Added index for member_approval on member_namespace_id and status](gitlab-org/gitlab@7377e5a0e2dac6b06feddd21bafa197a22cdd182) ([merge request](gitlab-org/gitlab!149044)) +- [Release skipping copy operation in generic packages upload](gitlab-org/gitlab@3e0dd0a3cafab219b5e7aa2d23995433db470fe3) ([merge request](gitlab-org/gitlab!148947)) +- [Enable and remove the FF ci_rule_exists_extension_optimization](gitlab-org/gitlab@ccdac7fcf341030e2d3cdeaa2aad1c54cd2fb2c7) ([merge request](gitlab-org/gitlab!148682)) +- [Avoid duplicated keys in ProtectedBranches cache](gitlab-org/gitlab@75183a5901df5b550879a78ba04a15470f1c01a7) ([merge request](gitlab-org/gitlab!148172)) +- [Use replica DB to read ContainerRepository requiring_cleanup ids](gitlab-org/gitlab@5b757f6da9638f94570c8a5f4ef464f329d1637f) ([merge request](gitlab-org/gitlab!147074)) +- [Optimize performance of ambiguous ref detection](gitlab-org/gitlab@e38ec0f827400093797c9608d2d9a86931c4c531) ([merge request](gitlab-org/gitlab!147557)) + +### Other (113 changes) + +- [Removed Tanukibot from Translations](gitlab-org/gitlab@a2c915e9cc23c1767618404fc13c4f01ce75ceb3) by @NIKU-SINGH ([merge request](gitlab-org/gitlab!149328)) **GitLab Enterprise Edition** +- [Drop a partial index we no longer need](gitlab-org/gitlab@ce5d50df74794888b895388028da95c07f0b135f) ([merge request](gitlab-org/gitlab!149218)) +- [Add relaxed sharding keys for groups_and_projects](gitlab-org/gitlab@7d37ac964b121056ef24c01cf03b9f89fcd2e9ae) ([merge request](gitlab-org/gitlab!149299)) +- [Update artifact_state to include partition_id filter for job_artifacts](gitlab-org/gitlab@d370ffc255670587ba9091ba9bfc4841d5cdfc80) ([merge request](gitlab-org/gitlab!146305)) +- [Remove identity_verification feature flag](gitlab-org/gitlab@be6f616110a4a36515ade286d91abe773a6d1902) ([merge request](gitlab-org/gitlab!148888)) +- [Enable save_policy_violation_data by default](gitlab-org/gitlab@557fffb41124987e98cc62c1eb572235ba4d050c) ([merge request](gitlab-org/gitlab!149388)) **GitLab Enterprise Edition** +- [Add relaxed sharding keys for source_code_management](gitlab-org/gitlab@7e8e7d61321969a5c5f14cbd6eb921bcff8099dd) ([merge request](gitlab-org/gitlab!148951)) +- [Add relaxed sharding keys for continuous_delivery](gitlab-org/gitlab@d087a3dfd833081f3270473cd4584912ea70fbea) ([merge request](gitlab-org/gitlab!149294)) +- [Add Sidekiq shard-support for active jobs](gitlab-org/gitlab@cf10df05928636cca210560cafeb34428fb24348) ([merge request](gitlab-org/gitlab!148637)) +- [Update status of namespace in URL path to Beta from Experiment](gitlab-org/gitlab@0f30d0144634ee1a65435d1d697340c1fbc0ee8b) ([merge request](gitlab-org/gitlab!148621)) +- [Add relaxed sharding keys for vulnerability_management](gitlab-org/gitlab@7324229b273d51b04e2da297247fb4d38aa58b1e) ([merge request](gitlab-org/gitlab!149297)) +- [Add relaxed sharding keys for devops_reports](gitlab-org/gitlab@cc6cb9bd1b9b2ff48cdababaa5d9b6ae6d781e5d) ([merge request](gitlab-org/gitlab!149298)) +- [Add relaxed sharding keys for importers](gitlab-org/gitlab@cd15a5948cf911d3bcfa2c45cffc515f8a774546) ([merge request](gitlab-org/gitlab!149295)) +- [Quarantine a flaky test](gitlab-org/gitlab@8577724795dad8de0558c351c0f45718f2dfab18) ([merge request](gitlab-org/gitlab!149287)) +- [Quarantine a flaky test](gitlab-org/gitlab@5136480176a92b5afc9e88d26fad2cbd91651120) ([merge request](gitlab-org/gitlab!149292)) +- [Support classic tokens only](gitlab-org/gitlab@795bd63fa964fc8a1e5fbea8e750a089689ff2b5) ([merge request](gitlab-org/gitlab!148398)) +- [Adjust UI to new designs](gitlab-org/gitlab@99ca6307e61a75506a55b22bebea2400695614bc) ([merge request](gitlab-org/gitlab!148696)) +- [Revert 'ci-rules-exists-add-paths-project-ref'](gitlab-org/gitlab@89133ab27ace8fdc455833baee5b94de72af89f0) ([merge request](gitlab-org/gitlab!149266)) +- [Return all visible groups for the Organization.groups GraphQL query](gitlab-org/gitlab@f579c7fcd8eb13002dd5bba358dce02c0e0d87a1) ([merge request](gitlab-org/gitlab!146600)) +- [Globally enabled the Duo Chat callout](gitlab-org/gitlab@645c1f1637c4ad230d849cac5b94850af1b1f68d) ([merge request](gitlab-org/gitlab!149059)) **GitLab Enterprise Edition** +- [Remove feature flags related to FF merge trains](gitlab-org/gitlab@4c024b8c82abad6925577e14137ae728f151cbba) ([merge request](gitlab-org/gitlab!148964)) +- [Remove sbom_occurrences_vulnerabilities feature flag](gitlab-org/gitlab@29145495ac2a7262425944cfa657835bd3216cbd) ([merge request](gitlab-org/gitlab!148998)) **GitLab Enterprise Edition** +- [Remove the FF ci_parallel_remote_includes](gitlab-org/gitlab@3a2c20f792893ac9fa3a6537083026187e488f24) ([merge request](gitlab-org/gitlab!149134)) +- [Protected packages: Use namespace for external string](gitlab-org/gitlab@bf7fbf998ab2ec2edb6dea7e02f8d0108f320c6e) by @gerardo-navarro ([merge request](gitlab-org/gitlab!149113)) +- [Protected packages + containers: Adjust style and wording in settings UI](gitlab-org/gitlab@b7cb3e617114b9cc7535d3e552bad150bd446d84) by @gerardo-navarro ([merge request](gitlab-org/gitlab!148704)) +- [Quarantine a flaky test](gitlab-org/gitlab@20de72ec85589163c98b843003b9ffda698574a2) ([merge request](gitlab-org/gitlab!149078)) +- [Quarantine a flaky test](gitlab-org/gitlab@848d093630c75c294736e364c1d1ce2595ff5342) ([merge request](gitlab-org/gitlab!149064)) +- [Quarantine a flaky test](gitlab-org/gitlab@56c4817c4b1a22c24b36f8519e6d69b6186dc27f) ([merge request](gitlab-org/gitlab!149075)) +- [Quarantine a flaky test](gitlab-org/gitlab@6907a2cefc9e54be0721f6c7c493d090de827d7e) ([merge request](gitlab-org/gitlab!149065)) +- [Quarantine a flaky test](gitlab-org/gitlab@c3bba73c876e2f91efd0f182af9ab295597506b4) ([merge request](gitlab-org/gitlab!149074)) +- [Quarantine a flaky test](gitlab-org/gitlab@eb62b4a7d6caa65593dd13a47815e945c6c293f5) ([merge request](gitlab-org/gitlab!149072)) +- [Quarantine a flaky test](gitlab-org/gitlab@47f8bc50e897cdf9bdfa2c95ade96282eae72c5d) ([merge request](gitlab-org/gitlab!149071)) +- [Add and backfill project_id for deployment_approvals](gitlab-org/gitlab@c2e7da79997c9367ec37e6beda269ced8b533498) ([merge request](gitlab-org/gitlab!149031)) +- [Drop an unnecessary index on merge_requests](gitlab-org/gitlab@cc96c157f239907b0103c55898578f400c7790a3) ([merge request](gitlab-org/gitlab!148490)) +- [Clean up dora_performers_score_panel feature flag](gitlab-org/gitlab@b37063a371e3348712fdd6818a30d74c78df6c72) ([merge request](gitlab-org/gitlab!148973)) **GitLab Enterprise Edition** +- [Add relaxed sharding keys for system_access](gitlab-org/gitlab@44c0956d60b63ab5e0775a900eb6476e2f18aecf) ([merge request](gitlab-org/gitlab!148949)) +- [Add a migration to backfill zoekt_settings in application_settings](gitlab-org/gitlab@100e7f8746da72119163a57a195ca56d160f3905) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/148014)) **GitLab Enterprise Edition** +- [Add relaxed sharding keys for pipeline_composition](gitlab-org/gitlab@6dafca0da880249bba35e5f6c75ddbc8b8263bde) ([merge request](gitlab-org/gitlab!148948)) +- [Add sharding keys for continuous_delivery](gitlab-org/gitlab@fe492cd4c24684a5d190639526c1f282c9cd6b7c) ([merge request](gitlab-org/gitlab!142493)) +- [Add closes_work_item column to merge_requests_closing_issues](gitlab-org/gitlab@39fd40250ec4d7100df419293b15a5e46191ae79) ([merge request](gitlab-org/gitlab!148763)) +- [Remove FF search_add_archived_filter_to_zoekt](gitlab-org/gitlab@ce8c1e208f45cbe24595f151fd8c1d257f0310c9) ([merge request](gitlab-org/gitlab!148551)) **GitLab Enterprise Edition** +- [Fix Style/KeywordParametersOrder offenses](gitlab-org/gitlab@79b0fd0a7f4eabdebe91da01fa356af1cdc71119) by @harryminsky ([merge request](gitlab-org/gitlab!148567)) **GitLab Enterprise Edition** +- [Fix Lint/RedundantDirGlobSort offenses](gitlab-org/gitlab@2b1829232ccfb3101b8681bc545b5ba14ba58f58) ([merge request](gitlab-org/gitlab!148582)) +- [Quarantine a flaky test](gitlab-org/gitlab@783ea4eaefe32a6fecfdda723c1b996c8c100c17) ([merge request](gitlab-org/gitlab!148856)) +- [Add relaxed sharding keys for release_orchestration](gitlab-org/gitlab@2274785bd784dfb4fda398d5b906be82a81678db) ([merge request](gitlab-org/gitlab!148836)) +- [Add relaxed sharding keys for continuous_integration](gitlab-org/gitlab@2af79b9748da46d525b6b7e1531d1a7d58fd3a29) ([merge request](gitlab-org/gitlab!148835)) +- [Explicitly pass organization when a user namespace is created](gitlab-org/gitlab@f3d0799e44b372dbb63954212343acf7345189d9) ([merge request](gitlab-org/gitlab!148818)) +- [Remove collapse_generated_diff_files FF](gitlab-org/gitlab@58a9c214ba078bce15bd6fcf420bbebd08c36899) ([merge request](gitlab-org/gitlab!148478)) +- [Remove search_index_all_projects FF](gitlab-org/gitlab@d50f4f1ca6f352b367a20696f7264bf8a1302ceb) ([merge request](gitlab-org/gitlab!148111)) **GitLab Enterprise Edition** +- [Remove a partial index with locked_state on merge_requests](gitlab-org/gitlab@c4f4e335df8228984b785ac456f58bb9178df0db) ([merge request](gitlab-org/gitlab!148646)) +- [Remove usages of FullPath and SetFullPath RPCs](gitlab-org/gitlab@32393507bd640aec2b5078ee7e76f45244689b3c) ([merge request](gitlab-org/gitlab!147651)) +- [Move ref validation to services](gitlab-org/gitlab@147d4fd4def3b5f591178b1c171910079b09f17e) ([merge request](gitlab-org/gitlab!146764)) +- [Add development widget to work item types](gitlab-org/gitlab@7c2ea75132f59b0fb5599cf1011f608674b3c32a) ([merge request](gitlab-org/gitlab!148119)) +- [Create events definitions and reference them on UI elements](gitlab-org/gitlab@be2fa80363a086d046b3f03b326b5351620cad63) ([merge request](gitlab-org/gitlab!147673)) +- [Refactor LfsStorageController#upload_finalize into service](gitlab-org/gitlab@5bd8976a7d7e5f5153c92c10a1a238de74435c7c) by @missy-davies ([merge request](gitlab-org/gitlab!139729)) +- [Add relaxed sharding keys for team_planning](gitlab-org/gitlab@950f0665725a64db412262b59900fbd6de058a1e) ([merge request](gitlab-org/gitlab!148672)) +- [Enforce not-null constraint vs_code_settings version](gitlab-org/gitlab@d73d7b283386ed5a9ba291b2b3f49d0661e66a90) ([merge request](gitlab-org/gitlab!148648)) +- [Migrate inputs to spec on CI components table](gitlab-org/gitlab@9ff7f0872dbd089f16e89fc1bcb151021466e4ee) ([merge request](gitlab-org/gitlab!148547)) +- [Remove "fetch_commits_for_bitbucket_server" feature flag](gitlab-org/gitlab@c971bda0141b79005afe97e89a1f8081e54e2416) ([merge request](gitlab-org/gitlab!148657)) +- [Remove security_policies_policy_scope feature flag](gitlab-org/gitlab@ccdd99f9601cba26f0d3775bfda3c5067f59cf46) ([merge request](gitlab-org/gitlab!147386)) **GitLab Enterprise Edition** +- [Move right side panel into its own component](gitlab-org/gitlab@e9c465a377e4c9d13ed8dcad0b25b05d4c21f4d0) by @espadav8 ([merge request](gitlab-org/gitlab!148461)) +- [Remove use_registration_type_db_value feature flag](gitlab-org/gitlab@a1e3f2bff8b28359cbc714eb3803e6d7a22de95f) ([merge request](gitlab-org/gitlab!148595)) **GitLab Enterprise Edition** +- [Add next desired sharding keys for code_review_workflow](gitlab-org/gitlab@e7a83dda1616fbd0dae531f7cd25c425b3319f48) ([merge request](gitlab-org/gitlab!148532)) +- [Add next desired sharding keys for incident_management](gitlab-org/gitlab@d981c6f7d9ac6d13ba0807e116855887ccae9382) ([merge request](gitlab-org/gitlab!148531)) +- [Add next desired sharding keys for portfolio_management](gitlab-org/gitlab@460a1b05e7bc6ea480499133dbbdb15361d8a23f) ([merge request](gitlab-org/gitlab!148529)) +- [Finalize backfill vs_code_settings table migration](gitlab-org/gitlab@d105097d252eb65e2c7609808df660b4dbb925f1) ([merge request](gitlab-org/gitlab!148367)) +- [Remove arkose_labs_signup_challenge feature flag](gitlab-org/gitlab@4276f0048ac1d060e1d8536eddf45c2cc5f2ca98) ([merge request](gitlab-org/gitlab!147767)) +- [Protected containers: Resolve duplicate test assertions](gitlab-org/gitlab@9cc4b1b0ce27055df79ef4731a2072f40233ed95) by @gerardo-navarro ([merge request](gitlab-org/gitlab!148252)) +- [Add desired sharding keys for geo_replication](gitlab-org/gitlab@fa96b612b05f861721c277c887e9885f5504a1c3) ([merge request](gitlab-org/gitlab!148061)) +- [Remove `group_analytics_dashboards` feature flag](gitlab-org/gitlab@9c38ad6deef6d8123896eadfaa1aa702fa6196a6) ([merge request](gitlab-org/gitlab!147013)) **GitLab Enterprise Edition** +- [Add storage_shard label by decomposing instrumentation class name](gitlab-org/gitlab@f698dae407cebe4e12a62dca39028279ebe98897) ([merge request](gitlab-org/gitlab!147746)) +- [Remove feature flag use_partition_id_filter_on_ci_job_artifacts](gitlab-org/gitlab@a58b1c3ad28329bc40f1df414356f511c676abd2) ([merge request](gitlab-org/gitlab!148029)) +- [Finalize migration BackfillDefaultOrganizationUsers](gitlab-org/gitlab@295e8510ca9389c3156b54ba18d08d802d1c3a0b) ([merge request](gitlab-org/gitlab!147516)) +- [Protected containers: Adjust error message in docker client](gitlab-org/gitlab@13417ca9003d59e0536e2ad166029b4a9ed0d731) by @gerardo-navarro ([merge request](gitlab-org/gitlab!148087)) +- [Add desired sharding keys for audit_events](gitlab-org/gitlab@547eb9efc2f01024ffdc35535c710bad8018ecce) ([merge request](gitlab-org/gitlab!148067)) +- [Add desired sharding keys for package_registry](gitlab-org/gitlab@ed4cebb62545b275b0bb1823ff96618c134579b7) ([merge request](gitlab-org/gitlab!148065)) +- [Add desired sharding keys for team_planning](gitlab-org/gitlab@8be2b931e341e36db286aef9a9a5fade4b54f204) ([merge request](gitlab-org/gitlab!148063)) +- [Add desired sharding keys for portfolio_management](gitlab-org/gitlab@4a121810e6d3f98175d7e85c7328e89f7fd775ec) ([merge request](gitlab-org/gitlab!148060)) +- [Add desired sharding keys for incident_management](gitlab-org/gitlab@7ea185c0efb61a38cfb6e821e3e8219af2ece4c1) ([merge request](gitlab-org/gitlab!148043)) +- [Add desired sharding keys for service_desk](gitlab-org/gitlab@464b55c52ee5afd640d1d2524d1655e2e69247c0) ([merge request](gitlab-org/gitlab!148041)) +- [Add desired sharding keys for error_tracking](gitlab-org/gitlab@dabaf4a1de77a57f791bddb5f7770e5262073a67) ([merge request](gitlab-org/gitlab!148038)) +- [Add desired sharding keys for metrics](gitlab-org/gitlab@8e885408fcb425c643961244624ee41cc38d2a54) ([merge request](gitlab-org/gitlab!148035)) +- [Update schema for clusterwide tables in web_ide](gitlab-org/gitlab@cfd0ed92e464eb15bf047db4b697558f133a94a2) ([merge request](gitlab-org/gitlab!147982)) +- [Update schema for clusterwide tables in team_planning](gitlab-org/gitlab@52e858a8f4c94b26e724854b61fa2fb5259d81df) ([merge request](gitlab-org/gitlab!147981)) +- [Update schema for clusterwide tables in importers](gitlab-org/gitlab@c4fdf02c1044f544504563674a2ee7c2bb6c6e54) ([merge request](gitlab-org/gitlab!147980)) +- [Update schema for clusterwide tables in system_access](gitlab-org/gitlab@883691365e1b424f33b10091f572551837153d50) ([merge request](gitlab-org/gitlab!147979)) +- [Update schema for clusterwide tables in user_profile](gitlab-org/gitlab@22bbf1c56bdf44f55adfa6f3d9f426eb098b3aee) ([merge request](gitlab-org/gitlab!147978)) +- [Update schema for clusterwide tables in deployment_management](gitlab-org/gitlab@b0854c4e78023392c85ac0a39b1912307783030a) ([merge request](gitlab-org/gitlab!147972)) +- [Use PipelineTriggers::DestroyService across endpoints](gitlab-org/gitlab@85bded241311852974738edb35559141009c92a9) by @missy-davies ([merge request](gitlab-org/gitlab!136163)) +- [Add missing attributes in the search/count endpoint](gitlab-org/gitlab@f93369b84e4dd53e1d084d322a5e534c899fd38b) ([merge request](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147796)) +- [Update artifacts queries to use partition_id filter](gitlab-org/gitlab@bf891b816aacf233a9280ebd2b4928391131eafe) ([merge request](gitlab-org/gitlab!147126)) +- [Adds sharding_key to internal_ids](gitlab-org/gitlab@9f9e531d020e8f89afc5c85dd1030f6b9f10db5c) ([merge request](gitlab-org/gitlab!147705)) +- [Add sharding keys for error_tracking](gitlab-org/gitlab@54ec24bb31ae92b19a8237d8aedd275bbd43870c) ([merge request](gitlab-org/gitlab!147788)) +- [Add sharding keys for metrics](gitlab-org/gitlab@a50560611537ba8df6d3758cdc727eea59151733) ([merge request](gitlab-org/gitlab!147787)) +- [Add sharding keys for navigation](gitlab-org/gitlab@9c99f8829d400e748a409e679194222c8c8f36f9) ([merge request](gitlab-org/gitlab!147784)) +- [Add sharding keys for service_desk](gitlab-org/gitlab@5f7162a6fbf5cd4172e54f1c54b333a58e70ab67) ([merge request](gitlab-org/gitlab!147783)) +- [Add sharding keys for incident_management](gitlab-org/gitlab@3ae59207a80b6e46b8c6232d3513d8ece0aaff07) ([merge request](gitlab-org/gitlab!147779)) +- [Remove epic_events_on_contributions_calendar feature flag](gitlab-org/gitlab@3f985a78b205ffb208ea5a1dc0e38c8a9f06e084) ([merge request](gitlab-org/gitlab!147760)) +- [Use partitioned foreign key between ci_builds and ci_stages](gitlab-org/gitlab@6a18d4996153cecada618bfd35c36a9eea070b72) ([merge request](gitlab-org/gitlab!147648)) +- [Use routing tables for ci_job_artifacts and ci_stages ](gitlab-org/gitlab@001e895189c01640f729f104430596055cfbb919) ([merge request](gitlab-org/gitlab!147438)) +- [Add relation import tracker and table](gitlab-org/gitlab@6591d0b946a8dcc069b3c8250291aec1e235732a) ([merge request](gitlab-org/gitlab!146778)) +- [Show alert to explain where code suggestions moved](gitlab-org/gitlab@d293a5a61db21f431772a12d99b786afd0fcbad3) ([merge request](gitlab-org/gitlab!144807)) **GitLab Enterprise Edition** +- [Adding p_ci_build_names table and model](gitlab-org/gitlab@af1699a0822078be97696954a5df78127a9f79e6) ([merge request](gitlab-org/gitlab!146555)) +- [Refactor push_rules_helpers_spec.rb to improve tests speed](gitlab-org/gitlab@baa2641e1d44660613148e85216d6ce5d9ebe779) ([merge request](gitlab-org/gitlab!147571)) **GitLab Enterprise Edition** +- [Update indentation on yaml docs](gitlab-org/gitlab@d0f731e72094927a87411b152486e69f55700bcd) ([merge request](gitlab-org/gitlab!147564)) +- [Adjust naming in admin network settings](gitlab-org/gitlab@39219aedd2a6c92964d9949ffed00060721c5c18) by @gerardo-navarro ([merge request](gitlab-org/gitlab!147536)) +- [refactor: Add feature category for rack attack tests](gitlab-org/gitlab@adf26bc8186ac36c44c5044bdcdd5cd59212c5cd) by @gerardo-navarro ([merge request](gitlab-org/gitlab!147530)) +- [Finalize migration BackfillDefaultOrganizationOwnersAgain](gitlab-org/gitlab@918153f76698b529d56f79f6768333189b2013d2) ([merge request](gitlab-org/gitlab!147514)) +- [Remove "external_pipeline_validation_service_url" feature flag](gitlab-org/gitlab@95259cdfe652b81023988a868827c7d21faa9cd3) ([merge request](gitlab-org/gitlab!147407)) +- [Port the project admin button to Vue](gitlab-org/gitlab@62bdb1e1a41db8e3161146f43724e43743e5e150) by @espadav8 ([merge request](gitlab-org/gitlab!144736)) +- [Drop promote_ultimate_features_at column](gitlab-org/gitlab@b5dbcc83686be21fbf90d176bfd07707f21d1518) ([merge request](gitlab-org/gitlab!145706)) +- [Finalize the backfill migration for onboarding status step url](gitlab-org/gitlab@f986c1b1cf00968ff106136893bfe68d47895c69) ([merge request](gitlab-org/gitlab!147278)) +- [Remove ClusterRepositoryCache migration helper class](gitlab-org/gitlab@f71a7a94ce8d70d9d378ebc225b802b58f0ae006) ([merge request](gitlab-org/gitlab!147244)) + ## 16.10.3 (2024-04-12) No changes. diff --git a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_add_note.vue b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_add_note.vue index 610b34a466f..2f114817037 100644 --- a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_add_note.vue +++ b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_add_note.vue @@ -10,9 +10,9 @@ export default { i18n: { reply: __('Reply…'), replyToComment: __('Reply to comment'), - commentError: __('Your comment could not be submitted because %{reason}.'), + commentError: __('Comment could not be submitted: %{reason}.'), genericError: __( - 'Your comment could not be submitted! Please check your network connection and try again.', + 'Comment could not be submitted. Please check your network connection and try again.', ), }, components: { diff --git a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_edit_note.vue b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_edit_note.vue index e2c348f8079..0bfbb782d64 100644 --- a/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_edit_note.vue +++ b/app/assets/javascripts/admin/abuse_report/components/notes/abuse_report_edit_note.vue @@ -9,7 +9,7 @@ import AbuseReportCommentForm from './abuse_report_comment_form.vue'; export default { name: 'AbuseReportEditNote', i18n: { - updateError: __('Your comment could not be updated because %{reason}.'), + updateError: __('Comment could not be updated: %{reason}.'), genericError: __('Something went wrong while editing your comment. Please try again.'), }, components: { diff --git a/app/assets/javascripts/blob/components/blob_content_error.vue b/app/assets/javascripts/blob/components/blob_content_error.vue index 4c5d9831237..49b49a5546a 100644 --- a/app/assets/javascripts/blob/components/blob_content_error.vue +++ b/app/assets/javascripts/blob/components/blob_content_error.vue @@ -55,7 +55,7 @@ export default { }, }, errorMessage: __( - 'This content could not be displayed because %{reason}. You can %{options} instead.', + 'Content could not be displayed: %{reason}. Options to address this: %{options}.', ), }; diff --git a/app/assets/javascripts/boards/components/new_board_button.vue b/app/assets/javascripts/boards/components/new_board_button.vue index ebbd8f7237d..1fc9b55b40d 100644 --- a/app/assets/javascripts/boards/components/new_board_button.vue +++ b/app/assets/javascripts/boards/components/new_board_button.vue @@ -36,7 +36,10 @@ export default { + + {{ confidentialItemText }} - - { joins("INNER JOIN project_mirror_data import_state ON import_state.project_id = projects.id") } scope :for_group, -> (group) { where(group: group) } - scope :for_group_and_its_subgroups, ->(group) { where(namespace_id: group.self_and_descendants.select(:id)) } + scope :for_group_and_its_subgroups, ->(group) { where(namespace_id: group.self_and_descendant_ids) } scope :for_group_and_its_ancestor_groups, ->(group) { where(namespace_id: group.self_and_ancestors.select(:id)) } scope :is_importing, -> { with_import_state.where(import_state: { status: %w[started scheduled] }) } diff --git a/app/services/projects/cleanup_service.rb b/app/services/projects/cleanup_service.rb index 75be3425029..d0f6e5331ea 100644 --- a/app/services/projects/cleanup_service.rb +++ b/app/services/projects/cleanup_service.rb @@ -20,7 +20,7 @@ module Projects RepositoryCleanupWorker.perform_async(project.id, current_user.id) end rescue Project::RepositoryReadOnlyError => err - { status: :error, message: (_('Failed to make repository read-only. %{reason}') % { reason: err.message }) } + { status: :error, message: (_('Failed to make repository read-only: %{reason}') % { reason: err.message }) } end def cleanup_after(project) diff --git a/app/services/todos/destroy/entity_leave_service.rb b/app/services/todos/destroy/entity_leave_service.rb index 387c5ce063a..cc5f3fe4e13 100644 --- a/app/services/todos/destroy/entity_leave_service.rb +++ b/app/services/todos/destroy/entity_leave_service.rb @@ -125,7 +125,7 @@ module Todos # rubocop: enable CodeReuse/ActiveRecord def non_authorized_reporter_groups - entity.self_and_descendants.select(:id) + entity.self_and_descendant_ids .id_not_in(authorized_reporter_groups) end diff --git a/app/views/layouts/project.html.haml b/app/views/layouts/project.html.haml index a0d993c73c5..ee87e0ae159 100644 --- a/app/views/layouts/project.html.haml +++ b/app/views/layouts/project.html.haml @@ -22,6 +22,7 @@ = render 'projects/invite_members_modal', project: @project = render_if_exists "shared/saml_reload_modal", group_or_project: @project += dispensable_render_if_exists "projects/transferring_alert", project: @project = dispensable_render_if_exists "projects/importing_alert", project: @project = dispensable_render_if_exists "shared/web_hooks/web_hook_disabled_alert" = dispensable_render_if_exists "projects/free_user_cap_alert", project: @project diff --git a/app/views/notify/closed_issue_email.html.haml b/app/views/notify/closed_issue_email.html.haml index d3733ab3a09..f4b873d8f42 100644 --- a/app/views/notify/closed_issue_email.html.haml +++ b/app/views/notify/closed_issue_email.html.haml @@ -1,2 +1,2 @@ %p - = _("Issue was closed by %{name} %{reason}").html_safe % { name: sanitize_name(@updated_by.name), reason: closure_reason_text(@closed_via, format: formats.first) } + = closure_reason_text(@closed_via, format: formats.first, name: @updated_by.name) diff --git a/app/views/notify/closed_issue_email.text.haml b/app/views/notify/closed_issue_email.text.haml index ff2548a4b42..fff441d31ec 100644 --- a/app/views/notify/closed_issue_email.text.haml +++ b/app/views/notify/closed_issue_email.text.haml @@ -1,3 +1,3 @@ -= _("Issue was closed by %{name} %{reason}").html_safe % { name: sanitize_name(@updated_by.name), reason: closure_reason_text(@closed_via, format: formats.first) } += closure_reason_text(@closed_via, format: formats.first, name: @updated_by.name) Issue ##{@issue.iid}: #{project_issue_url(@issue.project, @issue)} diff --git a/app/views/projects/_transferring_alert.haml b/app/views/projects/_transferring_alert.haml new file mode 100644 index 00000000000..3546b7a17c5 --- /dev/null +++ b/app/views/projects/_transferring_alert.haml @@ -0,0 +1,9 @@ +- return unless project.git_transfer_in_progress? + +- content_for :page_level_alert do + = render Pajamas::AlertComponent.new(variant: :warning, + dismissible: false, + title: _('Transfer in progress'), + alert_options: { class: 'gl-mb-3', data: { testid: "transferring-alert" } }) do |c| + - c.with_body do + = s_('TransferProject|This project is being transferred. Do not make any changes to the project until the transfer is complete.') diff --git a/app/views/projects/graphs/charts.html.haml b/app/views/projects/graphs/charts.html.haml index f026a6158cb..e0d742138e3 100644 --- a/app/views/projects/graphs/charts.html.haml +++ b/app/views/projects/graphs/charts.html.haml @@ -18,10 +18,8 @@ .repo-charts.my-5 #js-code-coverage-chart{ data: project_coverage_chart_data_attributes(@daily_coverage_options, @ref) } -.repo-charts - .sub-header-block.border-top - - .row.tree-ref-header +.repo-charts.gl-border-t + .row.tree-ref-header.gl-pt-5 .col-md-6 %h4 - start_time = capture do diff --git a/app/views/shared/milestones/_header.html.haml b/app/views/shared/milestones/_header.html.haml index a7fd83bf2f5..3eae1bcd080 100644 --- a/app/views/shared/milestones/_header.html.haml +++ b/app/views/shared/milestones/_header.html.haml @@ -34,7 +34,7 @@ = _('Edit') - if milestone.project_milestone? && milestone.project.group %li.gl-dropdown-item - %button.gl-button.btn.btn-link.menu-item.js-promote-project-milestone-button{ data: { milestone_title: milestone.title, + %button.js-promote-project-milestone-button{ data: { milestone_title: milestone.title, group_name: milestone.project.group.name, url: promote_project_milestone_path(milestone.project, milestone)}, disabled: true, diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 5ccdd99601f..1635b48ea0b 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -886,6 +886,21 @@ Gitlab.ee do Settings.cron_jobs['click_house_ci_finished_builds_sync_worker']['cron'] ||= '*/3 * * * *' Settings.cron_jobs['click_house_ci_finished_builds_sync_worker']['args'] ||= [1] Settings.cron_jobs['click_house_ci_finished_builds_sync_worker']['job_class'] = 'ClickHouse::CiFinishedBuildsSyncCronWorker' + Settings.cron_jobs['click_house_events_sync_worker'] ||= {} + Settings.cron_jobs['click_house_events_sync_worker']['cron'] ||= "*/3 * * * *" + Settings.cron_jobs['click_house_events_sync_worker']['job_class'] = 'ClickHouse::EventsSyncWorker' + Settings.cron_jobs['click_house_event_authors_consistency_cron_worker'] ||= {} + Settings.cron_jobs['click_house_event_authors_consistency_cron_worker']['cron'] ||= "*/30 * * * *" + Settings.cron_jobs['click_house_event_authors_consistency_cron_worker']['job_class'] = 'ClickHouse::EventAuthorsConsistencyCronWorker' + Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker'] ||= {} + Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker']['cron'] ||= "*/45 * * * *" + Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker']['job_class'] = 'ClickHouse::EventPathsConsistencyCronWorker' + Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker'] ||= {} + Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker']['cron'] ||= "*/10 * * * *" + Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker']['job_class'] = 'ClickHouse::RebuildMaterializedViewCronWorker' + Settings.cron_jobs['click_house_code_suggestion_events_cron_worker'] ||= {} + Settings.cron_jobs['click_house_code_suggestion_events_cron_worker']['cron'] ||= "*/5 * * * *" + Settings.cron_jobs['click_house_code_suggestion_events_cron_worker']['job_class'] = 'ClickHouse::CodeSuggestionEventsCronWorker' Settings.cron_jobs['gitlab_subscriptions_add_on_purchases_schedule_bulk_refresh_user_assignments_worker'] ||= {} Settings.cron_jobs['gitlab_subscriptions_add_on_purchases_schedule_bulk_refresh_user_assignments_worker']['cron'] ||= "0 */4 * * *" Settings.cron_jobs['gitlab_subscriptions_add_on_purchases_schedule_bulk_refresh_user_assignments_worker']['job_class'] = 'GitlabSubscriptions::AddOnPurchases::ScheduleBulkRefreshUserAssignmentsWorker' @@ -900,27 +915,12 @@ Gitlab.ee do Settings.cron_jobs['gitlab_subscriptions_schedule_refresh_seats_worker'] ||= {} Settings.cron_jobs['gitlab_subscriptions_schedule_refresh_seats_worker']['cron'] ||= "0 */6 * * *" Settings.cron_jobs['gitlab_subscriptions_schedule_refresh_seats_worker']['job_class'] = 'GitlabSubscriptions::ScheduleRefreshSeatsWorker' - Settings.cron_jobs['click_house_events_sync_worker'] ||= {} - Settings.cron_jobs['click_house_events_sync_worker']['cron'] ||= "*/3 * * * *" - Settings.cron_jobs['click_house_events_sync_worker']['job_class'] = 'ClickHouse::EventsSyncWorker' - Settings.cron_jobs['click_house_event_authors_consistency_cron_worker'] ||= {} - Settings.cron_jobs['click_house_event_authors_consistency_cron_worker']['cron'] ||= "*/30 * * * *" - Settings.cron_jobs['click_house_event_authors_consistency_cron_worker']['job_class'] = 'ClickHouse::EventAuthorsConsistencyCronWorker' - Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker'] ||= {} - Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker']['cron'] ||= "*/45 * * * *" - Settings.cron_jobs['click_house_event_namespace_paths_consistency_cron_worker']['job_class'] = 'ClickHouse::EventPathsConsistencyCronWorker' - Settings.cron_jobs['click_house_audit_events_sync_worker'] ||= {} - Settings.cron_jobs['click_house_audit_events_sync_worker']['cron'] ||= "*/3 * * * *" - Settings.cron_jobs['click_house_audit_events_sync_worker']['job_class'] = 'ClickHouse::AuditEventsSyncWorker' - Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker'] ||= {} - Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker']['cron'] ||= "*/10 * * * *" - Settings.cron_jobs['click_house_rebuild_materialized_view_cron_worker']['job_class'] = 'ClickHouse::RebuildMaterializedViewCronWorker' - Settings.cron_jobs['click_house_code_suggestion_events_cron_worker'] ||= {} - Settings.cron_jobs['click_house_code_suggestion_events_cron_worker']['cron'] ||= "*/5 * * * *" - Settings.cron_jobs['click_house_code_suggestion_events_cron_worker']['job_class'] = 'ClickHouse::CodeSuggestionEventsCronWorker' Settings.cron_jobs['vertex_ai_refresh_access_token_worker'] ||= {} Settings.cron_jobs['vertex_ai_refresh_access_token_worker']['cron'] ||= '*/50 * * * *' Settings.cron_jobs['vertex_ai_refresh_access_token_worker']['job_class'] = 'Llm::VertexAiAccessTokenRefreshWorker' + Settings.cron_jobs['click_house_audit_events_sync_worker'] ||= {} + Settings.cron_jobs['click_house_audit_events_sync_worker']['cron'] ||= "*/3 * * * *" + Settings.cron_jobs['click_house_audit_events_sync_worker']['job_class'] = 'ClickHouse::AuditEventsSyncWorker' end end diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 949d7f941f7..48bc59e9845 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -52,6 +52,8 @@ Sidekiq.configure_server do |config| config.error_handlers.delete(Sidekiq::Config::ERROR_HANDLER) end + config.logger.level = ENV.fetch("GITLAB_LOG_LEVEL", ::Logger::INFO) + Sidekiq.logger.info "Listening on queues #{config[:queues].uniq.sort}" # In Sidekiq 6.x, connection pools have a size of concurrency+5. diff --git a/config/tailwind.config.js b/config/tailwind.config.js index 09af5ced25e..628f99cd2a8 100644 --- a/config/tailwind.config.js +++ b/config/tailwind.config.js @@ -91,7 +91,7 @@ module.exports = { boxShadow: { none: 'none', // TODO: I don't think we have a --t-gray matching class... --t-gray-a-24 seems close - DEFAULT: '0 1px 4px 0 rgba(#000, 0.3)', + DEFAULT: '0 1px 4px 0 #0000004d', sm: '0 1px 2px var(--t-gray-a-08, #1f1e2414)', md: '0 2px 8px var(--t-gray-a-16, #1f1e2429), 0 0 2px var(--t-gray-a-16, #1f1e2429)', lg: '0 4px 12px var(--t-gray-a-16, #1f1e2429), 0 0 4px var(--t-gray-a-16, #1f1e2429)', diff --git a/db/docs/batched_background_migrations/backfill_jira_tracker_data_project_keys.yml b/db/docs/batched_background_migrations/backfill_jira_tracker_data_project_keys.yml new file mode 100644 index 00000000000..4c3e828dfab --- /dev/null +++ b/db/docs/batched_background_migrations/backfill_jira_tracker_data_project_keys.yml @@ -0,0 +1,8 @@ +--- +migration_job_name: BackfillJiraTrackerDataProjectKeys +description: Populate project_keys with project_key if project_keys hasn't been copied yet +feature_category: integrations +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/148433 +milestone: '17.0' +queued_migration_version: 20240402143848 +finalize_after: '2024-05-31' diff --git a/db/migrate/20240415134942_add_imported_to_notes.rb b/db/migrate/20240415134942_add_imported_to_notes.rb new file mode 100644 index 00000000000..14cfad1f5cd --- /dev/null +++ b/db/migrate/20240415134942_add_imported_to_notes.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToNotes < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :notes, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135009_add_imported_to_merge_requests.rb b/db/migrate/20240415135009_add_imported_to_merge_requests.rb new file mode 100644 index 00000000000..4101eccb43d --- /dev/null +++ b/db/migrate/20240415135009_add_imported_to_merge_requests.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToMergeRequests < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :merge_requests, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135029_add_imported_to_issues.rb b/db/migrate/20240415135029_add_imported_to_issues.rb new file mode 100644 index 00000000000..28785862d7a --- /dev/null +++ b/db/migrate/20240415135029_add_imported_to_issues.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToIssues < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :issues, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135048_add_imported_to_epics.rb b/db/migrate/20240415135048_add_imported_to_epics.rb new file mode 100644 index 00000000000..f9f0bce6bab --- /dev/null +++ b/db/migrate/20240415135048_add_imported_to_epics.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToEpics < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :epics, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135110_add_imported_to_events.rb b/db/migrate/20240415135110_add_imported_to_events.rb new file mode 100644 index 00000000000..49bc5e91254 --- /dev/null +++ b/db/migrate/20240415135110_add_imported_to_events.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToEvents < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :events, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135132_add_imported_to_snippets.rb b/db/migrate/20240415135132_add_imported_to_snippets.rb new file mode 100644 index 00000000000..2d1fdc71add --- /dev/null +++ b/db/migrate/20240415135132_add_imported_to_snippets.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToSnippets < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :snippets, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135156_add_imported_to_designs.rb b/db/migrate/20240415135156_add_imported_to_designs.rb new file mode 100644 index 00000000000..df5f2a11935 --- /dev/null +++ b/db/migrate/20240415135156_add_imported_to_designs.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToDesigns < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :design_management_designs, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415135324_add_imported_to_resource_event_tables.rb b/db/migrate/20240415135324_add_imported_to_resource_event_tables.rb new file mode 100644 index 00000000000..6eee5d0fbd2 --- /dev/null +++ b/db/migrate/20240415135324_add_imported_to_resource_event_tables.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddImportedToResourceEventTables < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :resource_state_events, :imported, :integer, default: 0, null: false, limit: 2 + add_column :resource_label_events, :imported, :integer, default: 0, null: false, limit: 2 + add_column :resource_milestone_events, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/migrate/20240415164720_add_imported_to_temp_notes_backup.rb b/db/migrate/20240415164720_add_imported_to_temp_notes_backup.rb new file mode 100644 index 00000000000..73da8febbd7 --- /dev/null +++ b/db/migrate/20240415164720_add_imported_to_temp_notes_backup.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddImportedToTempNotesBackup < Gitlab::Database::Migration[2.2] + milestone '17.0' + + def change + add_column :temp_notes_backup, :imported, :integer, default: 0, null: false, limit: 2 + end +end diff --git a/db/post_migrate/20240402143848_queue_backfill_jira_tracker_data_project_keys.rb b/db/post_migrate/20240402143848_queue_backfill_jira_tracker_data_project_keys.rb new file mode 100644 index 00000000000..0fe98f42cc5 --- /dev/null +++ b/db/post_migrate/20240402143848_queue_backfill_jira_tracker_data_project_keys.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +class QueueBackfillJiraTrackerDataProjectKeys < Gitlab::Database::Migration[2.2] + milestone '17.0' + + restrict_gitlab_migration gitlab_schema: :gitlab_main + + MIGRATION = "BackfillJiraTrackerDataProjectKeys" + DELAY_INTERVAL = 2.minutes + BATCH_SIZE = 1000 + SUB_BATCH_SIZE = 100 + + def up + queue_batched_background_migration( + MIGRATION, + :jira_tracker_data, + :id, + job_interval: DELAY_INTERVAL, + batch_size: BATCH_SIZE, + sub_batch_size: SUB_BATCH_SIZE + ) + end + + def down + delete_batched_background_migration(MIGRATION, :jira_tracker_data, :id, []) + end +end diff --git a/db/post_migrate/20240412125902_sync_index_for_p_ci_builds_part4.rb b/db/post_migrate/20240412125902_sync_index_for_p_ci_builds_part4.rb new file mode 100644 index 00000000000..0f29826eb33 --- /dev/null +++ b/db/post_migrate/20240412125902_sync_index_for_p_ci_builds_part4.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +class SyncIndexForPCiBuildsPart4 < Gitlab::Database::Migration[2.2] + include Gitlab::Database::PartitioningMigrationHelpers + + milestone '17.0' + disable_ddl_transaction! + + INDEXES = [ + { + name: 'p_ci_builds_runner_id_bigint_idx', + columns: [:runner_id_convert_to_bigint], + options: { where: "status::text = 'running'::text AND type::text = 'Ci::Build'::text" } + }, + { + name: 'p_ci_builds_status_type_runner_id_bigint_idx', + columns: [:status, :type, :runner_id_convert_to_bigint] + }, + { + name: 'p_ci_builds_project_id_bigint_id_idx', + columns: [:project_id_convert_to_bigint, :id] + } + ] + TABLE_NAME = :p_ci_builds + + def up + INDEXES.each do |definition| + name, columns, options = definition.values_at(:name, :columns, :options) + add_concurrent_partitioned_index(TABLE_NAME, columns, name: name, **(options || {})) + end + end + + def down + INDEXES.each do |definition| + name = definition[:name] + remove_concurrent_partitioned_index_by_name(TABLE_NAME, name) + end + end +end diff --git a/db/schema_migrations/20240402143848 b/db/schema_migrations/20240402143848 new file mode 100644 index 00000000000..284f104d0f6 --- /dev/null +++ b/db/schema_migrations/20240402143848 @@ -0,0 +1 @@ +e40831799705c77d63474320ee3ad5e2751646e276a827441fe4e58254f3940f \ No newline at end of file diff --git a/db/schema_migrations/20240412125902 b/db/schema_migrations/20240412125902 new file mode 100644 index 00000000000..2e9f41ad04f --- /dev/null +++ b/db/schema_migrations/20240412125902 @@ -0,0 +1 @@ +c30acd3d908f41607f92da396a6a276e4fbd3186edcf1c237f521a859430d2cc \ No newline at end of file diff --git a/db/schema_migrations/20240415134942 b/db/schema_migrations/20240415134942 new file mode 100644 index 00000000000..e7b543b7499 --- /dev/null +++ b/db/schema_migrations/20240415134942 @@ -0,0 +1 @@ +d5e6e6528c8f58d82c666d81e18da6247886a23aa5722fb371cea23b0a614d48 \ No newline at end of file diff --git a/db/schema_migrations/20240415135009 b/db/schema_migrations/20240415135009 new file mode 100644 index 00000000000..4f98135f7d1 --- /dev/null +++ b/db/schema_migrations/20240415135009 @@ -0,0 +1 @@ +d210368410e6d03c57199d1b4fe75652d49da8260a91a238a684e39349546a87 \ No newline at end of file diff --git a/db/schema_migrations/20240415135029 b/db/schema_migrations/20240415135029 new file mode 100644 index 00000000000..3647314d83a --- /dev/null +++ b/db/schema_migrations/20240415135029 @@ -0,0 +1 @@ +83b01048cf6d8dd770de7d085333516e84625535ebd238a91a8fd3919461717b \ No newline at end of file diff --git a/db/schema_migrations/20240415135048 b/db/schema_migrations/20240415135048 new file mode 100644 index 00000000000..c807412fd6b --- /dev/null +++ b/db/schema_migrations/20240415135048 @@ -0,0 +1 @@ +da4fac700bb88854534542a03dc73ed495d39c7ee4cfecdb4721227e652a9dd6 \ No newline at end of file diff --git a/db/schema_migrations/20240415135110 b/db/schema_migrations/20240415135110 new file mode 100644 index 00000000000..546546f26c1 --- /dev/null +++ b/db/schema_migrations/20240415135110 @@ -0,0 +1 @@ +7af637894b463cce350af704f2bb7ad76160f2aaa56ce94177f75367a70eeee0 \ No newline at end of file diff --git a/db/schema_migrations/20240415135132 b/db/schema_migrations/20240415135132 new file mode 100644 index 00000000000..c0b9a8a69fd --- /dev/null +++ b/db/schema_migrations/20240415135132 @@ -0,0 +1 @@ +fd67478569eaea20f5e139f936cc6543027a3db5f4c15ae9aba927fd01d931e1 \ No newline at end of file diff --git a/db/schema_migrations/20240415135156 b/db/schema_migrations/20240415135156 new file mode 100644 index 00000000000..a92443e4e2f --- /dev/null +++ b/db/schema_migrations/20240415135156 @@ -0,0 +1 @@ +290a65b2b0cf3f82c94d29cd76e1f298b82766a0c7f0f25eaab517e028b7a023 \ No newline at end of file diff --git a/db/schema_migrations/20240415135324 b/db/schema_migrations/20240415135324 new file mode 100644 index 00000000000..1f7c8b5f674 --- /dev/null +++ b/db/schema_migrations/20240415135324 @@ -0,0 +1 @@ +95f6ecf12fee7db963b8e3e580b3cfc5ccf104fd0481af32604a9011ce33ad57 \ No newline at end of file diff --git a/db/schema_migrations/20240415164720 b/db/schema_migrations/20240415164720 new file mode 100644 index 00000000000..6e79d26f682 --- /dev/null +++ b/db/schema_migrations/20240415164720 @@ -0,0 +1 @@ +40d7a47f5eed49385ef83629c63b3103c450e382b3697510e39883056ec67712 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 5deb5598d1f..b5a3dc574b0 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -8252,6 +8252,7 @@ CREATE TABLE design_management_designs ( cached_markdown_version integer, description text, description_html text, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_07155e2715 CHECK ((char_length((filename)::text) <= 255)), CONSTRAINT check_aaf9fa6ae5 CHECK ((char_length(description) <= 1000000)), CONSTRAINT check_cfb92df01a CHECK ((iid IS NOT NULL)) @@ -8742,6 +8743,7 @@ CREATE TABLE epics ( total_opened_issue_count integer DEFAULT 0 NOT NULL, total_closed_issue_count integer DEFAULT 0 NOT NULL, issue_id integer, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_ca608c40b3 CHECK ((char_length(color) <= 7)), CONSTRAINT check_fcfb4a93ff CHECK ((lock_version IS NOT NULL)) ); @@ -8837,6 +8839,7 @@ CREATE TABLE events ( fingerprint bytea, id bigint NOT NULL, target_id bigint, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_97e06e05ad CHECK ((octet_length(fingerprint) <= 128)) ); @@ -10417,6 +10420,7 @@ CREATE TABLE issues ( namespace_id bigint, start_date date, tmp_epic_id bigint, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_2addf801cd CHECK ((work_item_type_id IS NOT NULL)), CONSTRAINT check_c33362cd43 CHECK ((namespace_id IS NOT NULL)), CONSTRAINT check_fba63f706d CHECK ((lock_version IS NOT NULL)) @@ -11319,6 +11323,7 @@ CREATE TABLE merge_requests ( merged_commit_sha bytea, override_requested_changes boolean DEFAULT false NOT NULL, head_pipeline_id_convert_to_bigint bigint, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_970d272570 CHECK ((lock_version IS NOT NULL)) ); @@ -12006,7 +12011,8 @@ CREATE TABLE notes ( last_edited_at timestamp with time zone, internal boolean DEFAULT false NOT NULL, id bigint NOT NULL, - namespace_id bigint + namespace_id bigint, + imported smallint DEFAULT 0 NOT NULL ); CREATE SEQUENCE notes_id_seq @@ -15231,7 +15237,8 @@ CREATE TABLE resource_label_events ( created_at timestamp with time zone NOT NULL, cached_markdown_version integer, reference text, - reference_html text + reference_html text, + imported smallint DEFAULT 0 NOT NULL ); CREATE SEQUENCE resource_label_events_id_seq @@ -15270,7 +15277,8 @@ CREATE TABLE resource_milestone_events ( milestone_id bigint, action smallint NOT NULL, state smallint NOT NULL, - created_at timestamp with time zone NOT NULL + created_at timestamp with time zone NOT NULL, + imported smallint DEFAULT 0 NOT NULL ); CREATE SEQUENCE resource_milestone_events_id_seq @@ -15294,6 +15302,7 @@ CREATE TABLE resource_state_events ( close_after_error_tracking_resolve boolean DEFAULT false NOT NULL, close_auto_resolve_prometheus_alert boolean DEFAULT false NOT NULL, source_merge_request_id bigint, + imported smallint DEFAULT 0 NOT NULL, CONSTRAINT check_f0bcfaa3a2 CHECK ((char_length(source_commit) <= 40)), CONSTRAINT state_events_must_belong_to_issue_or_merge_request_or_epic CHECK ((((issue_id <> NULL::bigint) AND (merge_request_id IS NULL) AND (epic_id IS NULL)) OR ((issue_id IS NULL) AND (merge_request_id <> NULL::bigint) AND (epic_id IS NULL)) OR ((issue_id IS NULL) AND (merge_request_id IS NULL) AND (epic_id <> NULL::integer)))) ); @@ -16116,7 +16125,8 @@ CREATE TABLE snippets ( encrypted_secret_token character varying(255), encrypted_secret_token_iv character varying(255), secret boolean DEFAULT false NOT NULL, - repository_read_only boolean DEFAULT false NOT NULL + repository_read_only boolean DEFAULT false NOT NULL, + imported smallint DEFAULT 0 NOT NULL ); CREATE SEQUENCE snippets_id_seq @@ -16542,7 +16552,8 @@ CREATE TABLE temp_notes_backup ( last_edited_at timestamp with time zone, internal boolean NOT NULL, id bigint NOT NULL, - namespace_id bigint + namespace_id bigint, + imported smallint DEFAULT 0 NOT NULL ); CREATE TABLE term_agreements ( @@ -24117,6 +24128,14 @@ CREATE INDEX idx_vulnerability_reads_project_id_scanner_id_vulnerability_id ON v CREATE UNIQUE INDEX idx_work_item_types_on_namespace_id_and_name_null_namespace ON work_item_types USING btree (btrim(lower(name)), ((namespace_id IS NULL))) WHERE (namespace_id IS NULL); +CREATE INDEX p_ci_builds_project_id_bigint_id_idx ON ONLY p_ci_builds USING btree (project_id_convert_to_bigint, id); + +CREATE INDEX index_3591adffe4 ON ci_builds USING btree (project_id_convert_to_bigint, id); + +CREATE INDEX p_ci_builds_status_type_runner_id_bigint_idx ON ONLY p_ci_builds USING btree (status, type, runner_id_convert_to_bigint); + +CREATE INDEX index_9f1fa3baee ON ci_builds USING btree (status, type, runner_id_convert_to_bigint); + CREATE INDEX index_abuse_events_on_abuse_report_id ON abuse_events USING btree (abuse_report_id); CREATE INDEX index_abuse_events_on_category_and_source ON abuse_events USING btree (category, source); @@ -24331,6 +24350,10 @@ CREATE UNIQUE INDEX index_aws_roles_on_role_external_id ON aws_roles USING btree CREATE UNIQUE INDEX index_aws_roles_on_user_id ON aws_roles USING btree (user_id); +CREATE INDEX p_ci_builds_runner_id_bigint_idx ON ONLY p_ci_builds USING btree (runner_id_convert_to_bigint) WHERE (((status)::text = 'running'::text) AND ((type)::text = 'Ci::Build'::text)); + +CREATE INDEX index_b4cf879bcf ON ci_builds USING btree (runner_id_convert_to_bigint) WHERE (((status)::text = 'running'::text) AND ((type)::text = 'Ci::Build'::text)); + CREATE INDEX index_background_migration_jobs_for_partitioning_migrations ON background_migration_jobs USING btree (((arguments ->> 2))) WHERE (class_name = 'Gitlab::Database::PartitioningMigrationHelpers::BackfillPartitionedTable'::text); CREATE INDEX index_background_migration_jobs_on_class_name_and_arguments ON background_migration_jobs USING btree (class_name, arguments); @@ -29473,8 +29496,14 @@ ALTER INDEX p_ci_stages_pkey ATTACH PARTITION ci_stages_pkey; ALTER INDEX p_ci_job_artifacts_job_id_file_type_partition_id_idx ATTACH PARTITION idx_ci_job_artifacts_on_job_id_file_type_and_partition_id_uniq; +ALTER INDEX p_ci_builds_project_id_bigint_id_idx ATTACH PARTITION index_3591adffe4; + +ALTER INDEX p_ci_builds_status_type_runner_id_bigint_idx ATTACH PARTITION index_9f1fa3baee; + ALTER INDEX p_ci_builds_runner_id_bigint_id_idx ATTACH PARTITION index_adafd086ad; +ALTER INDEX p_ci_builds_runner_id_bigint_idx ATTACH PARTITION index_b4cf879bcf; + ALTER INDEX p_ci_builds_metadata_build_id_idx ATTACH PARTITION index_ci_builds_metadata_on_build_id_and_has_exposed_artifacts; ALTER INDEX p_ci_builds_metadata_build_id_id_idx ATTACH PARTITION index_ci_builds_metadata_on_build_id_and_id_and_interruptible; diff --git a/doc/administration/logs/index.md b/doc/administration/logs/index.md index 9f72b45737a..5e1a85801c1 100644 --- a/doc/administration/logs/index.md +++ b/doc/administration/logs/index.md @@ -67,7 +67,6 @@ Some of these services have their own environment variables to override the log | GitLab QA Runtime | `INFO` | `QA_LOG_LEVEL` | | Google APIs | `INFO` | | | Rack Timeout | `ERROR` | | -| Sidekiq (server) | `INFO` | | | Snowplow Tracker | `FATAL` | | | gRPC Client (Gitaly) | `WARN` | `GRPC_LOG_LEVEL` | | LLM | `INFO` | `LLM_DEBUG` | diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 01295064525..8d7b5069dea 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -8,6 +8,8 @@ info: To determine the technical writer assigned to the Stage/Group associated w This documentation is auto generated by a script. Please do not edit this file directly. + To edit the introductory text, modify `tooling/graphql/docs/templates/default.md.haml`. + Run `bundle exec rake gitlab:graphql:compile_docs` or check the `compile_docs` task in `lib/tasks/gitlab/graphql.rake`. --> @@ -16,7 +18,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w This documentation is self-generated based on GitLab current GraphQL schema. -The API can be explored using the [interactive GraphQL explorer](../index.md#interactive-graphql-explorer). +The API can be explored using the [interactive GraphQL explorer](../index.md#interactive-graphql-explorer). Developers can also [generate a machine-readable GraphQL schema in IDL and JSON formats](../../../development/rake_tasks.md#update-machine-readable-schema-files). Each table below documents a GraphQL type. Types match loosely to models, but not all fields and methods on a model are available via GraphQL. diff --git a/doc/architecture/blueprints/cells/infrastructure/index.md b/doc/architecture/blueprints/cells/infrastructure/index.md index 0ddd7694b1f..e7edbf3028e 100644 --- a/doc/architecture/blueprints/cells/infrastructure/index.md +++ b/doc/architecture/blueprints/cells/infrastructure/index.md @@ -7,6 +7,8 @@ coach: [ "@andrewn" ] status: proposed --- + + # Cells: Infrastructure ## Pre-reads @@ -289,6 +291,95 @@ frame "Google Cloud Platform" <> {
+### Rings + +`Rings` serve as the basis of the mental model of how we group the Cells we provision and the existing infrastructure. +Inside of a ring, there is X number of Cells, subsequent rings consist of more cells gradually covering the entire fleet. +Each Ring will be a superset of the previous rings. +For example ring zero only contains the Cells in ring zero, +ring 5 contains the Cells in `ring 5` and all other rings before it. +Changes cascade outwards from inner rings to outer rings in discrete stages. +For example If a change has reached `ring 5`, it will have reached ring 4, 3, 2, and 1. + +Any type of rollout will allow start from `ring 0` and move to subsequent rings if the change is successful, +if it fails we can stop the rollout and we don't affect all of our customers. +With this type of progressive rollout, we'll get the following benefits: + +1. Changes have a smaller blast radius, not affecting all customers at once. +1. Clear boundaries on how to roll out a change. +1. Removes the need of having different environments like [Staging](#staging), all Cells will be production. +1. The more confident we are with a change the wider the audience. + +```plantuml +@startuml + +skinparam frame { + borderColor<> #0F9D58 +} + +skinparam frame { + borderColor<> #F4B400 +} + +left to right direction + +frame "Ring 3" <> { + component "NjkwYzdhNzYtMjljNS00Y" + component "ZjNkOTJhMGUtNTExZC00Y" + component "Mzg5OGE0ZDEtMmM4OC00M" + component "ZDQ2MTg0MmUtYTEzZC00Y" + + frame "Ring 2" <> { + component "NDBiMWNhNmYtZGY0Yi00M" + component "OTI2MmYwMWMtMDk5Zi00Z" + component "NjExNWY2MDctNDBhOS00Y" + component "NTIxM2YyYmEtZjhjZC00O" + component "OTQ0MzRhNjMtMTA1Ni00Y" + component "N2M1MWZiOGEtZTRkMy00Z" + component "YjA0ZGI3ZTQtOGRhOS00N" + component "MWY2Y2U4ZGMtMzBhYS00Y" + component "ZGM2YWZhMmYtM2JiZC00M" + component "OTg0YWE3OTUtMjEyNC00Y" + + frame "Ring 1" <> { + frame "Ring 0" <> { + component "Canary stage" <> as cny + component "NmY1ZjlkY2YtZjZhZS00N" + } + + component "Main stage\nPrimary Cell" <> as Primary + } + } +} + +@enduml +``` + +For [Cells 1.0](../iterations/cells-1.0.md) our aim is to have up to 10 cells inside `ring 2`. +The number of Cells in a ring is arbitrary, their size is still to be determined. +It will take into consideration our necessity to [adequately test auto-deploy packages before a public release](deployments.md#package-rollout-policy), +the speed of a full production rollout for security fixes, +and the protection from outages or bugs of our users. + +Where we'll eventually use rings for: + +1. [Deployments](deployments.md#ring-deployment). +1. Roll out configuration changes. +1. Feature flag rollouts. + +#### Staging + +We do not have the traditional Staging environment in rings, +because we can test changes in the first rings which achieves the same outcome. +This doesn't mean that we will shut off the existing staging environment, +which will still be in use for the non-cell infrastructure. + +With this set up we'll end up removing some of the problems we have with staging right now: + +1. Staging is not a real representation of Production. +1. We consider Staging as Production because it blocks deployments. +1. The configuration of Staging can drift from Production. + ## Large Domains The infrastructure is multifaceted and all teams have a role in setting up the cell infrastructure. diff --git a/doc/development/database/efficient_in_operator_queries.md b/doc/development/database/efficient_in_operator_queries.md index c426781d711..6c11b6eadf3 100644 --- a/doc/development/database/efficient_in_operator_queries.md +++ b/doc/development/database/efficient_in_operator_queries.md @@ -633,7 +633,7 @@ order = Gitlab::Pagination::Keyset::Order.build([ records = Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder.new( scope: Epic.where.not(closed_at: nil).reorder(order), # filter out NULL values - array_scope: Group.find(9970).self_and_descendants.select(:id), + array_scope: Group.find(9970).self_and_descendant_ids, array_mapping_scope: -> (id_expression) { Epic.where(Epic.arel_table[:group_id].eq(id_expression)) } ).execute.limit(20) @@ -714,7 +714,7 @@ scope = cte.apply_to(Issue.where({}).reorder(order)) opts = { scope: scope, - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) } } diff --git a/doc/integration/advanced_search/elasticsearch.md b/doc/integration/advanced_search/elasticsearch.md index 4609ce3967b..cef2add0d54 100644 --- a/doc/integration/advanced_search/elasticsearch.md +++ b/doc/integration/advanced_search/elasticsearch.md @@ -683,7 +683,7 @@ The following are some available Rake tasks: | [`sudo gitlab-rake gitlab:elastic:mark_reindex_failed`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Mark the most recent re-index job as failed. | | [`sudo gitlab-rake gitlab:elastic:list_pending_migrations`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | List pending migrations. Pending migrations include those that have not yet started, have started but not finished, and those that are halted. | | [`sudo gitlab-rake gitlab:elastic:estimate_cluster_size`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Get an estimate of cluster size based on the total repository size. | -| [`sudo gitlab-rake gitlab:elastic:estimate_shard_sizes`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Get an estimate of shard sizes for each index based on approximate database counts. This estimate does not include repository data (code, commits, and wikis). | +| [`sudo gitlab-rake gitlab:elastic:estimate_shard_sizes`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Get an estimate of shard sizes for each index based on approximate database counts. This estimate does not include repository data (code, commits, and wikis). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146108) in GitLab 16.11. | | [`sudo gitlab-rake gitlab:elastic:enable_search_with_elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Enables advanced search with Elasticsearch. | | [`sudo gitlab-rake gitlab:elastic:disable_search_with_elasticsearch`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/ee/lib/tasks/gitlab/elastic.rake) | Disables advanced search with Elasticsearch. | @@ -754,6 +754,8 @@ To update the shard size for an index, change the setting and trigger [zero-down ##### Indices with database data +> - `gitlab:elastic:estimate_shard_sizes` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/146108) in GitLab 16.11. + For indices that contain database data: - `gitlab-production-projects` diff --git a/doc/user/analytics/dora_metrics.md b/doc/user/analytics/dora_metrics.md index 31f2d128ca8..761a82078e4 100644 --- a/doc/user/analytics/dora_metrics.md +++ b/doc/user/analytics/dora_metrics.md @@ -70,7 +70,7 @@ Over time, the lead time for changes should decrease, while your team's performa ### How lead time for changes is calculated -GitLab calculates lead time for changes based on the number of seconds to successfully deliver a commit into production: from merge request merge time (when the merge button is clicked) to code successfully running in production, without adding the `coding_time` to the calculation. Data is aggregated right after the deployment is finished, with a slight delay. +GitLab calculates lead time for changes based on the number of seconds to successfully deliver a merge request into production: from merge request merge time (when the merge button is clicked) to code successfully running in production, without adding the `coding_time` to the calculation. Data is aggregated right after the deployment is finished, with a slight delay. By default, lead time for changes supports measuring only one branch operation with multiple deployment jobs (for example, from development to staging to production on the default branch). When a merge request gets merged on staging, and then on production, GitLab interprets them as two deployed merge requests, not one. diff --git a/gems/gitlab-housekeeper/README.md b/gems/gitlab-housekeeper/README.md index 094777be8bb..417aa10fea7 100644 --- a/gems/gitlab-housekeeper/README.md +++ b/gems/gitlab-housekeeper/README.md @@ -52,6 +52,7 @@ mandatory, while others are optional. | `identifiers` | Array | Yes | Decides the name of the source branch name of the MR | `change.identifiers = [[self.class.name](http://self.class.name).demodulize, changed_files.last]` | | `changed_files` | Array | Yes | Array containing the path to files that are changed and needs to be committed | `change.changed_files = [file_1_path, file_2_path]` | | `labels` | Array | No | Default is `[]`. Array of labels that needs to be assigned to the MR upon creation | `change.labels = ['database', 'maintenance::scalability']` | +| `assignees` | Array | No | Default is `[]`. Array of usernames to which the MR should be assigned upon creation | `change.assignees = ['gitlab-bot', 'gitlab-qa']` | | `reviewers` | Array | No | Default is `[]`. Array of usernames to which the MR should be assigned for review upon creation | `change.reviewers = ['gitlab-bot', 'gitlab-qa']` | | `changelog_type` | String | No | Default is `other`. Used to set a changelog type in the commit message | `change.changelog_type = 'fixed'` | | `push_options.ci_skip` | Boolean | No | Default is `false`. Setting to `true` creates an MR without kicking off a new pipeline | `change.push_options.ci_skip = true ` | diff --git a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/change.rb b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/change.rb index cf97e440c38..5bad19f1d54 100644 --- a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/change.rb +++ b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/change.rb @@ -15,15 +15,21 @@ module Gitlab :mr_web_url, :push_options, :non_housekeeper_changes - attr_reader :reviewers + attr_reader :assignees, + :reviewers def initialize @labels = [] + @assignees = [] @reviewers = [] @non_housekeeper_changes = [] @push_options = PushOptions.new end + def assignees=(assignees) + @assignees = Array(assignees) + end + def reviewers=(reviewers) @reviewers = Array(reviewers) end diff --git a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/gitlab_client.rb b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/gitlab_client.rb index e972baca412..49b00ac4f9f 100644 --- a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/gitlab_client.rb +++ b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/gitlab_client.rb @@ -43,12 +43,18 @@ module Gitlab next false unless note["system"] next false if note["author"]["id"] == current_user_id - changes << :title if note['body'].start_with?("changed title from") - changes << :description if note['body'] == "changed the description" - changes << :code if note['body'].match?(/added \d+ commit/) - - changes << :reviewers if note['body'].include?('requested review from') - changes << :reviewers if note['body'].include?('removed review request for') + case note['body'] + when /^changed title from/ + changes << :title + when /^changed the description$/ + changes << :description + when /added \d+ commit/ + changes << :code + when /assigned to|unassigned/ + changes << :assignees + when /requested review from|removed review request for/ + changes << :reviewers + end end resource_label_events = get_merge_request_resource_label_events( @@ -146,6 +152,7 @@ module Gitlab target_branch: target_branch, target_project_id: target_project_id, remove_source_branch: true, + assignee_ids: usernames_to_ids(change.assignees), reviewer_ids: usernames_to_ids(change.reviewers) }) end @@ -156,6 +163,7 @@ module Gitlab body[:title] = change.title if change.update_required?(:title) body[:description] = change.mr_description if change.update_required?(:description) body[:add_labels] = Array(change.labels).join(',') if change.update_required?(:labels) + body[:assignee_ids] = usernames_to_ids(change.assignees) if change.update_required?(:assignees) body[:reviewer_ids] = usernames_to_ids(change.reviewers) if change.update_required?(:reviewers) return if body.empty? diff --git a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/runner.rb b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/runner.rb index be831310a58..15d881d59fa 100644 --- a/gems/gitlab-housekeeper/lib/gitlab/housekeeper/runner.rb +++ b/gems/gitlab-housekeeper/lib/gitlab/housekeeper/runner.rb @@ -136,9 +136,10 @@ module Gitlab @logger.puts change.description @logger.puts - if change.labels.present? || change.reviewers.present? + if change.labels.present? || change.assignees.present? || change.reviewers.present? @logger.puts '=> Attributes:' @logger.puts "Labels: #{change.labels.join(', ')}" + @logger.puts "Assignees: #{change.assignees.join(', ')}" @logger.puts "Reviewers: #{change.reviewers.join(', ')}" @logger.puts end diff --git a/gems/gitlab-housekeeper/spec/gitlab/housekeeper/change_spec.rb b/gems/gitlab-housekeeper/spec/gitlab/housekeeper/change_spec.rb index 402fef37b90..e0fa793d655 100644 --- a/gems/gitlab-housekeeper/spec/gitlab/housekeeper/change_spec.rb +++ b/gems/gitlab-housekeeper/spec/gitlab/housekeeper/change_spec.rb @@ -16,11 +16,21 @@ RSpec.describe ::Gitlab::Housekeeper::Change do change = described_class.new expect(change.labels).to eq([]) + expect(change.assignees).to eq([]) expect(change.reviewers).to eq([]) expect(change.push_options.ci_skip).to eq(false) end end + describe '#assignees=' do + it 'always sets an array' do + change = described_class.new + change.assignees = 'foo' + + expect(change.assignees).to eq(['foo']) + end + end + describe '#reviewers=' do it 'always sets an array' do change = described_class.new diff --git a/gems/gitlab-housekeeper/spec/gitlab/housekeeper/gitlab_client_spec.rb b/gems/gitlab-housekeeper/spec/gitlab/housekeeper/gitlab_client_spec.rb index 37777df7c33..52534c6cb9d 100644 --- a/gems/gitlab-housekeeper/spec/gitlab/housekeeper/gitlab_client_spec.rb +++ b/gems/gitlab-housekeeper/spec/gitlab/housekeeper/gitlab_client_spec.rb @@ -23,6 +23,24 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do } end + let(:added_assignee_note) do + { + id: 1698248524, + body: "assigned to @gitlab-bot", + author: { "id" => 1234 }, + system: true + } + end + + let(:removed_assignee_note) do + { + id: 1698248524, + body: "unassigned @gitlab-bot", + author: { "id" => 1234 }, + system: true + } + end + let(:added_reviewer_note) do { id: 1698248524, @@ -156,15 +174,16 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do context 'when all important things change' do let(:notes) do - [not_a_system_note, updated_title_note, updated_description_note, added_commit_note, added_reviewer_note] + [not_a_system_note, updated_title_note, updated_description_note, added_commit_note, added_reviewer_note, + added_assignee_note] end let(:resource_label_events) do [removed_label_event] end - it 'returns :title, :description, :code, :labels' do - expect(non_housekeeper_changes).to match_array([:title, :description, :code, :labels, :reviewers]) + it 'returns :title, :description, :code, :labels, :assignees, :reviewers' do + expect(non_housekeeper_changes).to match_array([:title, :description, :code, :labels, :assignees, :reviewers]) end end @@ -202,6 +221,26 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end end + context 'when assignees are added' do + let(:notes) do + [not_a_system_note, added_assignee_note] + end + + it 'returns :assignees' do + expect(non_housekeeper_changes).to match_array([:assignees]) + end + end + + context 'when assignees are removed' do + let(:notes) do + [not_a_system_note, removed_assignee_note] + end + + it 'returns :assignees' do + expect(non_housekeeper_changes).to match_array([:assignees]) + end + end + context 'when reviewers are added' do let(:notes) do [not_a_system_note, added_reviewer_note] @@ -230,6 +269,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end describe '#create_or_update_merge_request' do + let(:assignee_id) { 111 } let(:reviewer_id) { 999 } let(:change) do @@ -249,7 +289,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do let(:existing_mrs) { [] } before do - # Stub the user id of the reviewers + # Stub the user id of the reviewers and assignees stub_request(:get, "https://gitlab.com/api/v4/users") .with( query: { username: 'thegitlabreviewer' }, @@ -258,6 +298,14 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do } ) .to_return(status: 200, body: [{ id: reviewer_id }].to_json) + stub_request(:get, "https://gitlab.com/api/v4/users") + .with( + query: { username: 'thegitlabassignee' }, + headers: { + 'Private-Token' => 'the-api-token' + } + ) + .to_return(status: 200, body: [{ id: assignee_id }].to_json) # Stub the check to see if the merge request already exists stub_request(:get, "https://gitlab.com/api/v4/projects/456/merge_requests?state=opened&source_branch=the-source-branch&target_branch=the-target-branch&source_project_id=123") @@ -284,6 +332,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do target_branch: "the-target-branch", target_project_id: 456, remove_source_branch: true, + assignee_ids: [assignee_id], reviewer_ids: [reviewer_id] }, headers: { @@ -316,6 +365,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do title: "The change title", description: change.mr_description, add_labels: "some-label-1,some-label-2", + assignee_ids: [assignee_id], reviewer_ids: [reviewer_id] }.to_json, headers: { @@ -346,7 +396,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do create_change(non_housekeeper_changes: non_housekeeper_changes) end - context 'when update_title: false' do + context 'when the title has changed' do let(:non_housekeeper_changes) { [:title] } it 'does not update the title' do @@ -355,6 +405,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do body: { description: change.mr_description, add_labels: "some-label-1,some-label-2", + assignee_ids: [assignee_id], reviewer_ids: [reviewer_id] }.to_json, headers: { @@ -368,7 +419,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end end - context 'when update_description: false' do + context 'when the description has changed' do let(:non_housekeeper_changes) { [:description] } it 'does not update the description' do @@ -377,6 +428,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do body: { title: "The change title", add_labels: "some-label-1,some-label-2", + assignee_ids: [assignee_id], reviewer_ids: [reviewer_id] }.to_json, headers: { @@ -390,7 +442,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end end - context 'when update_labels: false' do + context 'when labels have changed' do let(:non_housekeeper_changes) { [:labels] } it 'does not update the labels' do @@ -399,6 +451,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do body: { title: "The change title", description: change.mr_description, + assignee_ids: [assignee_id], reviewer_ids: [reviewer_id] }.to_json, headers: { @@ -412,7 +465,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end end - context 'when update_reviewers: false' do + context 'when reviewers have changed' do let(:non_housekeeper_changes) { [:reviewers] } it 'does not update the reviewers' do @@ -421,7 +474,31 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do body: { title: "The change title", description: change.mr_description, - add_labels: "some-label-1,some-label-2" + add_labels: "some-label-1,some-label-2", + assignee_ids: [assignee_id] + }.to_json, + headers: { + 'Content-Type' => 'application/json', + 'Private-Token' => 'the-api-token' + } + ).to_return(status: 200, body: '{}') + + client.create_or_update_merge_request(**params) + expect(stub).to have_been_requested + end + end + + context 'when assignees have changed' do + let(:non_housekeeper_changes) { [:assignees] } + + it 'does not update the assignees' do + stub = stub_request(:put, "https://gitlab.com/api/v4/projects/456/merge_requests/1234") + .with( + body: { + title: "The change title", + description: change.mr_description, + add_labels: "some-label-1,some-label-2", + reviewer_ids: [reviewer_id] }.to_json, headers: { 'Content-Type' => 'application/json', @@ -435,7 +512,7 @@ RSpec.describe ::Gitlab::Housekeeper::GitlabClient do end context 'when there is nothing to update' do - let(:non_housekeeper_changes) { [:title, :description, :labels, :reviewers] } + let(:non_housekeeper_changes) { [:title, :description, :labels, :assignees, :reviewers] } it 'does not make a request' do client.create_or_update_merge_request(**params) diff --git a/gems/gitlab-housekeeper/spec/spec_helper.rb b/gems/gitlab-housekeeper/spec/spec_helper.rb index 63817f06bee..5ccc19aca01 100644 --- a/gems/gitlab-housekeeper/spec/spec_helper.rb +++ b/gems/gitlab-housekeeper/spec/spec_helper.rb @@ -7,12 +7,14 @@ require 'webmock/rspec' require 'gitlab/rspec/all' module HousekeeperFactory + # rubocop: disable Metrics/ParameterLists def create_change( identifiers: %w[the identifier], title: 'The change title', description: 'The change description', changed_files: ['change1.txt', 'change2.txt'], labels: %w[some-label-1 some-label-2], + assignees: ['thegitlabassignee'], reviewers: ['thegitlabreviewer'], mr_web_url: nil, non_housekeeper_changes: [] @@ -24,12 +26,14 @@ module HousekeeperFactory change.description = description change.changed_files = changed_files change.labels = labels + change.assignees = assignees change.reviewers = reviewers change.mr_web_url = mr_web_url change.non_housekeeper_changes = non_housekeeper_changes change end + # rubocop: enable Metrics/ParameterLists end RSpec.configure do |config| diff --git a/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys.rb b/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys.rb new file mode 100644 index 00000000000..1ce9d90bc51 --- /dev/null +++ b/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + class BackfillJiraTrackerDataProjectKeys < BatchedMigrationJob + operation_name :backfill_jira_tracker_data_project_keys + + feature_category :integrations + + def perform + each_sub_batch do |sub_batch| + sub_batch.where(project_keys: []).where.not(project_key: [nil, '']).find_each do |jira_tracker_data| + jira_tracker_data.update!(project_keys: [jira_tracker_data.project_key]) + end + end + end + end + end +end diff --git a/lib/gitlab/design_management/copy_design_collection_model_attributes.yml b/lib/gitlab/design_management/copy_design_collection_model_attributes.yml index fe1baeb7b67..bf2626c06a3 100644 --- a/lib/gitlab/design_management/copy_design_collection_model_attributes.yml +++ b/lib/gitlab/design_management/copy_design_collection_model_attributes.yml @@ -17,6 +17,7 @@ design_attributes: - filename - relative_position - description + - imported version_attributes: - author_id diff --git a/lib/gitlab/popen.rb b/lib/gitlab/popen.rb index 586b271c4d0..7c897a555e7 100644 --- a/lib/gitlab/popen.rb +++ b/lib/gitlab/popen.rb @@ -31,6 +31,10 @@ module Gitlab raise "System commands must be given as an array of strings" end + if cmd.one? && cmd.first.match?(/\s/) + raise "System commands must be split into an array of space-separated values" + end + path ||= Dir.pwd vars['PWD'] = path options = { chdir: path } diff --git a/locale/gitlab.pot b/locale/gitlab.pot index e032315abf9..e1a369f76e7 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -1433,6 +1433,9 @@ msgstr "" msgid "%{verb} this %{noun} as a draft." msgstr "" +msgid "%{viewer} could not be displayed: %{reason}. Options to address this: %{options}." +msgstr "" + msgid "%{webhooks_link_start}%{webhook_type}%{webhooks_link_end} enable you to send notifications to web applications in response to events in a group or project." msgstr "" @@ -12735,6 +12738,15 @@ msgstr "" msgid "Comment added to the timeline." msgstr "" +msgid "Comment could not be submitted. Please check your network connection and try again." +msgstr "" + +msgid "Comment could not be submitted: %{reason}." +msgstr "" + +msgid "Comment could not be updated: %{reason}." +msgstr "" + msgid "Comment form position" msgstr "" @@ -14242,6 +14254,9 @@ msgstr "" msgid "Content" msgstr "" +msgid "Content could not be displayed: %{reason}. Options to address this: %{options}." +msgstr "" + msgid "Content parsed with %{link}." msgstr "" @@ -21473,7 +21488,7 @@ msgstr "" msgid "Failed to load stacktrace." msgstr "" -msgid "Failed to make repository read-only. %{reason}" +msgid "Failed to make repository read-only: %{reason}" msgstr "" msgid "Failed to mark this issue as a duplicate because referenced issue was not found." @@ -28099,7 +28114,13 @@ msgstr "" msgid "Issue update failed" msgstr "" -msgid "Issue was closed by %{name} %{reason}" +msgid "Issue was closed by %{name}" +msgstr "" + +msgid "Issue was closed by %{name} via %{closed_via}" +msgstr "" + +msgid "Issue was closed by %{name} via merge request %{link}" msgstr "" msgid "Issue weight" @@ -31940,6 +31961,9 @@ msgstr "" msgid "MergeRequests|Can't perform this action automatically. It may have already been done, or a more recent commit may have updated some of this content. Please perform this action locally." msgstr "" +msgid "MergeRequests|Comment could not be submitted: %{reason}." +msgstr "" + msgid "MergeRequests|Commit cherry-pick failed" msgstr "" @@ -31988,9 +32012,6 @@ msgstr "" msgid "MergeRequests|View replaced file @ %{commitId}" msgstr "" -msgid "MergeRequests|Your comment could not be submitted because %{reason}." -msgstr "" - msgid "MergeRequests|commented on commit %{commitLink}" msgstr "" @@ -34878,6 +34899,9 @@ msgstr "" msgid "ObservabilityMetrics|+%{count} more" msgstr "" +msgid "ObservabilityMetrics|Attribute" +msgstr "" + msgid "ObservabilityMetrics|Attributes" msgstr "" @@ -52246,9 +52270,6 @@ msgstr "" msgid "This %{noteableTypeText} is %{confidentialLinkStart}confidential%{confidentialLinkEnd} and its %{lockedLinkStart}discussion is locked%{lockedLinkEnd}." msgstr "" -msgid "This %{viewer} could not be displayed because %{reason}. You can %{options} instead." -msgstr "" - msgid "This Cron pattern is invalid" msgstr "" @@ -52366,9 +52387,6 @@ msgstr "" msgid "This commit was signed with multiple signatures." msgstr "" -msgid "This content could not be displayed because %{reason}. You can %{options} instead." -msgstr "" - msgid "This content could not be displayed because it is stored in LFS. You can %{linkStart}download it%{linkEnd} instead." msgstr "" @@ -54053,6 +54071,9 @@ msgstr "" msgid "Transfer group to another parent group." msgstr "" +msgid "Transfer in progress" +msgstr "" + msgid "Transfer project" msgstr "" @@ -54107,6 +54128,9 @@ msgstr "" msgid "TransferProject|Root namespace can't be updated if the project has NPM packages scoped to the current root level namespace." msgstr "" +msgid "TransferProject|This project is being transferred. Do not make any changes to the project until the transfer is complete." +msgstr "" + msgid "TransferProject|You don't have permission to transfer projects into that namespace." msgstr "" @@ -54619,7 +54643,7 @@ msgstr "" msgid "Unable to schedule a pipeline to run immediately" msgstr "" -msgid "Unable to sign you in to the group with SAML due to \"%{reason}\"" +msgid "Unable to sign in to group with SAML: \"%{reason}\"" msgstr "" msgid "Unable to suggest a path. Please refresh and try again." @@ -59657,15 +59681,9 @@ msgstr "" msgid "Your changes have been successfully committed." msgstr "" -msgid "Your comment could not be submitted because %{reason}." -msgstr "" - msgid "Your comment could not be submitted! Please check your network connection and try again." msgstr "" -msgid "Your comment could not be updated because %{reason}." -msgstr "" - msgid "Your comment will be discarded." msgstr "" @@ -62090,12 +62108,6 @@ msgstr "" msgid "via" msgstr "" -msgid "via %{closed_via}" -msgstr "" - -msgid "via merge request %{link}" -msgstr "" - msgid "view it on GitLab" msgstr "" diff --git a/rubocop/cop/rake/require.rb b/rubocop/cop/rake/require.rb index eff0d45fe19..1b358505f6f 100644 --- a/rubocop/cop/rake/require.rb +++ b/rubocop/cop/rake/require.rb @@ -17,6 +17,14 @@ module RuboCop # Gitlab::Json.parse(...) # end # + # namespace :json do + # require_relative 'gitlab/json' + # require 'json' + # + # task :parse_json do + # end + # end + # # # good # # task :parse_json do @@ -26,6 +34,15 @@ module RuboCop # Gitlab::Json.parse(...) # end # + # namespace :json do + # task :parse_json do + # require_relative 'gitlab/json' + # require 'json' + # + # Gitlab::Json.parse(...) + # end + # end + # # RSpec::Core::RakeTask.new(:parse_json) do |t, args| # require_relative 'gitlab/json' # require 'json' @@ -54,6 +71,8 @@ module RuboCop METHODS = %i[require require_relative].freeze RESTRICT_ON_SEND = METHODS + EAGER_EVALUATED_BLOCKS = %i[namespace].freeze + def_node_matcher :require_method, <<~PATTERN (send nil? ${#{METHODS.map(&:inspect).join(' ')}} $_) PATTERN @@ -65,7 +84,8 @@ module RuboCop return unless method return if requires_task?(file) - return if inside_block_or_method?(node) + return if inside_block(node, skip: EAGER_EVALUATED_BLOCKS) + return if inside_method?(node) add_offense(node) end @@ -85,8 +105,14 @@ module RuboCop file.source.include?('task') end - def inside_block_or_method?(node) - node.each_ancestor(:block, :def).any? + def inside_block(node, skip:) + node.each_ancestor(:block).any? do |block| + !skip.include?(block.method_name) # rubocop:disable Rails/NegateInclude -- This is not Rails + end + end + + def inside_method?(node) + node.each_ancestor(:def, :defs).any? end end end diff --git a/scripts/lint/unused_helper_methods.rb b/scripts/lint/unused_helper_methods.rb index b7b651614ef..cb040b300e6 100755 --- a/scripts/lint/unused_helper_methods.rb +++ b/scripts/lint/unused_helper_methods.rb @@ -5,6 +5,11 @@ # require 'parallel' +require 'rainbow' + +UNUSED_METHODS = 51 + +print_output = %w[true 1].include? ENV["REPORT_ALL_UNUSED_METHODS"] start = Process.clock_gettime(Process::CLOCK_MONOTONIC) @@ -30,7 +35,7 @@ helpers = source_files.keys.grep(%r{app/helpers}).flat_map do |filename| end end -puts "Scanning #{source_files.size} files for #{helpers.size} helpers..." +puts "Scanning #{source_files.size} files for #{helpers.size} helpers..." if print_output # Combine all the source code into one big string, because regex are fast. # @@ -38,18 +43,37 @@ source_code = source_files.values.flatten.join # Iterate over all the helpers and reject any that appear anywhere in the complete source. # -unused = Parallel.flat_map(helpers, progress: 'Checking helpers') do |helper| +unused = Parallel.flat_map(helpers, progress: ('Checking helpers' if print_output)) do |helper| /(? UNUSED_METHODS + added = unused.size - UNUSED_METHODS + puts Rainbow("ERROR: #{added} unused methods were added. Please remove them.").red.bright + + exit 1 +elsif unused.size < UNUSED_METHODS + warning = <<~UPDATE_UNUSED + WARNING: It appears you have removed unused methods. Thank you! + + Please update scripts/lint/unused_helper_methods.rb to reflect the new number: + UNUSED_METHODS = #{unused.size} + UPDATE_UNUSED + + puts Rainbow(warning).yellow.bright +end diff --git a/spec/controllers/activity_pub/projects/releases_controller_spec.rb b/spec/controllers/activity_pub/projects/releases_controller_spec.rb index 4102789ee43..6033bec0c14 100644 --- a/spec/controllers/activity_pub/projects/releases_controller_spec.rb +++ b/spec/controllers/activity_pub/projects/releases_controller_spec.rb @@ -7,16 +7,12 @@ RSpec.describe ActivityPub::Projects::ReleasesController, feature_category: :gro let_it_be(:project) { create(:project, :repository, :public) } let_it_be(:private_project) { create(:project, :repository, :private) } - let_it_be(:developer) { create(:user) } + let_it_be(:developer) { create(:user, developer_of: project) } let_it_be(:release_1) { create(:release, project: project, released_at: Time.zone.parse('2018-10-18')) } let_it_be(:release_2) { create(:release, project: project, released_at: Time.zone.parse('2019-10-19')) } let(:request_body) { '' } - before_all do - project.add_developer(developer) - end - shared_examples 'common access controls' do it 'renders a 200' do perform_action(verb, action, params, request_body) diff --git a/spec/controllers/dashboard/labels_controller_spec.rb b/spec/controllers/dashboard/labels_controller_spec.rb index e7091664d1a..41ba96a2b41 100644 --- a/spec/controllers/dashboard/labels_controller_spec.rb +++ b/spec/controllers/dashboard/labels_controller_spec.rb @@ -4,18 +4,13 @@ require 'spec_helper' RSpec.describe Dashboard::LabelsController do let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project) } - let_it_be(:project_2) { create(:project) } + let_it_be(:project) { create(:project, reporters: user) } + let_it_be(:project_2) { create(:project, reporters: user) } let_it_be(:label) { create(:label, project: project, title: 'some_label') } let_it_be(:label_with_same_title) { create(:label, project: project_2, title: 'some_label') } let_it_be(:unrelated_label) { create(:label, project: create(:project, :public)) } - before_all do - project.add_reporter(user) - project_2.add_reporter(user) - end - before do sign_in(user) end diff --git a/spec/controllers/groups/boards_controller_spec.rb b/spec/controllers/groups/boards_controller_spec.rb index 4e441f86765..39795d40441 100644 --- a/spec/controllers/groups/boards_controller_spec.rb +++ b/spec/controllers/groups/boards_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Groups::BoardsController do let_it_be(:group) { create(:group) } - let_it_be(:user) { create(:user) } - - before_all do - group.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: group) } before do sign_in(user) diff --git a/spec/controllers/import/manifest_controller_spec.rb b/spec/controllers/import/manifest_controller_spec.rb index c06bd660cd2..27c166524d6 100644 --- a/spec/controllers/import/manifest_controller_spec.rb +++ b/spec/controllers/import/manifest_controller_spec.rb @@ -6,11 +6,7 @@ RSpec.describe Import::ManifestController, :clean_gitlab_redis_shared_state, fea include ImportSpecHelper let_it_be(:user) { create(:user) } - let_it_be(:group) { create(:group) } - - before_all do - group.add_maintainer(user) - end + let_it_be(:group) { create(:group, maintainers: user) } before do stub_application_setting(import_sources: ['manifest']) diff --git a/spec/controllers/projects/boards_controller_spec.rb b/spec/controllers/projects/boards_controller_spec.rb index 89d0669f47b..f81e99cb500 100644 --- a/spec/controllers/projects/boards_controller_spec.rb +++ b/spec/controllers/projects/boards_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Projects::BoardsController do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: project) } before do sign_in(user) diff --git a/spec/controllers/projects/error_tracking/projects_controller_spec.rb b/spec/controllers/projects/error_tracking/projects_controller_spec.rb index 63346faccbf..b455ce512c2 100644 --- a/spec/controllers/projects/error_tracking/projects_controller_spec.rb +++ b/spec/controllers/projects/error_tracking/projects_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Projects::ErrorTracking::ProjectsController do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: project) } before do sign_in(user) diff --git a/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb b/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb index e011428adde..ee96417875a 100644 --- a/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb +++ b/spec/controllers/projects/error_tracking/stack_traces_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Projects::ErrorTracking::StackTracesController do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: project) } before do sign_in(user) diff --git a/spec/controllers/projects/error_tracking_controller_spec.rb b/spec/controllers/projects/error_tracking_controller_spec.rb index 475e7d3229c..8a2273695d3 100644 --- a/spec/controllers/projects/error_tracking_controller_spec.rb +++ b/spec/controllers/projects/error_tracking_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Projects::ErrorTrackingController do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: project) } before do sign_in(user) diff --git a/spec/controllers/projects/feature_flags_controller_spec.rb b/spec/controllers/projects/feature_flags_controller_spec.rb index ac2e4233709..c7337ab1fb9 100644 --- a/spec/controllers/projects/feature_flags_controller_spec.rb +++ b/spec/controllers/projects/feature_flags_controller_spec.rb @@ -7,16 +7,11 @@ RSpec.describe Projects::FeatureFlagsController do include FeatureFlagHelpers let_it_be(:project) { create(:project) } - let_it_be(:developer) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:developer) { create(:user, developer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let(:user) { developer } - before_all do - project.add_developer(developer) - project.add_reporter(reporter) - end - before do sign_in(user) end diff --git a/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb b/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb index 32817f048e6..5d8fac676da 100644 --- a/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb +++ b/spec/controllers/projects/feature_flags_user_lists_controller_spec.rb @@ -4,13 +4,8 @@ require 'spec_helper' RSpec.describe Projects::FeatureFlagsUserListsController do let_it_be(:project) { create(:project) } - let_it_be(:reporter) { create(:user) } - let_it_be(:developer) { create(:user) } - - before_all do - project.add_reporter(reporter) - project.add_developer(developer) - end + let_it_be(:reporter) { create(:user, reporter_of: project) } + let_it_be(:developer) { create(:user, developer_of: project) } def request_params(extra_params = {}) { namespace_id: project.namespace, project_id: project }.merge(extra_params) diff --git a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb index 78d75fae8ce..02699d9129c 100644 --- a/spec/controllers/projects/merge_requests/diffs_controller_spec.rb +++ b/spec/controllers/projects/merge_requests/diffs_controller_spec.rb @@ -142,11 +142,7 @@ RSpec.describe Projects::MergeRequests::DiffsController, feature_category: :code let(:merge_request) { create(:merge_request_with_diffs, target_project: project, source_project: project) } let_it_be_with_reload(:user) { create(:user) } - let_it_be(:other_project) { create(:project) } - - before_all do - other_project.add_maintainer(user) - end + let_it_be(:other_project) { create(:project, maintainers: user) } before do project.add_maintainer(user) if maintainer diff --git a/spec/controllers/projects/settings/operations_controller_spec.rb b/spec/controllers/projects/settings/operations_controller_spec.rb index 525b0eb24d7..6fce6824bd2 100644 --- a/spec/controllers/projects/settings/operations_controller_spec.rb +++ b/spec/controllers/projects/settings/operations_controller_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe Projects::Settings::OperationsController, feature_category: :incident_management do let_it_be(:user) { create(:user) } - let_it_be(:project, reload: true) { create(:project) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:project, reload: true) { create(:project, maintainers: user) } before do sign_in(user) diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb index 9a8233e4383..fd1ee0491fa 100644 --- a/spec/features/expand_collapse_diffs_spec.rb +++ b/spec/features/expand_collapse_diffs_spec.rb @@ -270,7 +270,7 @@ RSpec.describe 'Expand and collapse diffs', :js, feature_category: :source_code_ # Wait for elements to appear to ensure full page reload expect(page).to have_content("File suppressed by a .gitattributes entry or the file's encoding is unsupported.") - expect(page).to have_content('This source diff could not be displayed because it is too large.') + expect(page).to have_content('source diff could not be displayed: it is too large.') expect(page).to have_content('too_large_image.jpg') find('.note-textarea') diff --git a/spec/features/merge_request/user_posts_notes_spec.rb b/spec/features/merge_request/user_posts_notes_spec.rb index 962337c52f3..420537f8e06 100644 --- a/spec/features/merge_request/user_posts_notes_spec.rb +++ b/spec/features/merge_request/user_posts_notes_spec.rb @@ -121,7 +121,7 @@ RSpec.describe 'Merge request > User posts notes', :js, feature_category: :code_ click_button 'Add comment now' - expect(page).to have_content('Your comment could not be submitted because discussion to reply to cannot be found') + expect(page).to have_content('Comment could not be submitted: discussion to reply to cannot be found') end end end diff --git a/spec/features/merge_request/user_sees_diff_spec.rb b/spec/features/merge_request/user_sees_diff_spec.rb index 57f378a86b6..905e25f5107 100644 --- a/spec/features/merge_request/user_sees_diff_spec.rb +++ b/spec/features/merge_request/user_sees_diff_spec.rb @@ -160,7 +160,7 @@ RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_re let(:file_name) { 'a/image.png' } it 'shows an error message' do - expect(page).not_to have_content('could not be displayed because it is stored in LFS') + expect(page).not_to have_content('could not be displayed: it is stored in LFS') end end @@ -168,7 +168,7 @@ RSpec.describe 'Merge request > User sees diff', :js, feature_category: :code_re let(:file_name) { 'a/ruby.rb' } it 'shows an error message' do - expect(page).to have_content('This source diff could not be displayed because it is stored in LFS') + expect(page).to have_content('source diff could not be displayed: it is stored in LFS') end end end diff --git a/spec/features/projects/diffs/diff_show_spec.rb b/spec/features/projects/diffs/diff_show_spec.rb index eb700e10141..5f5b8901b78 100644 --- a/spec/features/projects/diffs/diff_show_spec.rb +++ b/spec/features/projects/diffs/diff_show_spec.rb @@ -48,7 +48,7 @@ RSpec.describe 'Diff file viewer', :js, :with_clean_rails_cache, feature_categor end it 'shows an error message' do - expect(page).to have_content('This source diff could not be displayed because it is stored in LFS. You can view the blob instead.') + expect(page).to have_content('source diff could not be displayed: it is stored in LFS. Options to address this: view the blob.') end end diff --git a/spec/finders/ci/runner_jobs_finder_spec.rb b/spec/finders/ci/runner_jobs_finder_spec.rb index 2f1611910a5..ee8b4734d76 100644 --- a/spec/finders/ci/runner_jobs_finder_spec.rb +++ b/spec/finders/ci/runner_jobs_finder_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Ci::RunnerJobsFinder, feature_category: :fleet_visibility do let_it_be(:project) { create(:project) } let_it_be(:runner) { create(:ci_runner, :instance) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, developer_of: project) } let_it_be(:runner_manager) { create(:ci_runner_machine, runner: runner) } let_it_be(:jobs) { create_list(:ci_build, 5, runner_manager: runner_manager, project: project) } @@ -13,10 +13,6 @@ RSpec.describe Ci::RunnerJobsFinder, feature_category: :fleet_visibility do subject(:returned_jobs) { described_class.new(runner, user, params).execute } - before_all do - project.add_developer(user) - end - describe '#execute' do context 'when params is empty' do let!(:job1) { create(:ci_build, project: project) } diff --git a/spec/finders/concerns/finder_methods_spec.rb b/spec/finders/concerns/finder_methods_spec.rb index 09ec8110129..8f94e17eb60 100644 --- a/spec/finders/concerns/finder_methods_spec.rb +++ b/spec/finders/concerns/finder_methods_spec.rb @@ -22,17 +22,12 @@ RSpec.describe FinderMethods do end let_it_be(:user) { create(:user) } - let_it_be(:authorized_project) { create(:project) } - let_it_be(:unmatched_project) { create(:project, name: 'foo') } + let_it_be(:authorized_project) { create(:project, developers: user) } + let_it_be(:unmatched_project) { create(:project, name: 'foo', developers: user) } let_it_be(:unauthorized_project) { create(:project) } subject(:finder) { finder_class.new(user) } - before_all do - authorized_project.add_developer(user) - unmatched_project.add_developer(user) - end - # rubocop:disable Rails/FindById describe '#find_by!' do it 'returns the project if the user has access' do diff --git a/spec/finders/data_transfer/group_data_transfer_finder_spec.rb b/spec/finders/data_transfer/group_data_transfer_finder_spec.rb index 0c54e6504e8..7321fa5f5f2 100644 --- a/spec/finders/data_transfer/group_data_transfer_finder_spec.rb +++ b/spec/finders/data_transfer/group_data_transfer_finder_spec.rb @@ -4,16 +4,12 @@ require 'spec_helper' RSpec.describe DataTransfer::GroupDataTransferFinder, feature_category: :source_code_management do let_it_be(:user) { create(:user) } - let_it_be(:namespace_1) { create(:group) } + let_it_be(:namespace_1) { create(:group, owners: user) } let_it_be(:project_1) { create(:project, group: namespace_1) } let_it_be(:project_2) { create(:project, group: namespace_1) } let(:from_date) { Date.new(2022, 2, 1) } let(:to_date) { Date.new(2023, 1, 1) } - before_all do - namespace_1.add_owner(user) - end - describe '#execute' do let(:subject) { described_class.new(group: namespace_1, from: from_date, to: to_date, user: user) } diff --git a/spec/finders/feature_flags_user_lists_finder_spec.rb b/spec/finders/feature_flags_user_lists_finder_spec.rb index fc904a174d7..b3a3e79c4dc 100644 --- a/spec/finders/feature_flags_user_lists_finder_spec.rb +++ b/spec/finders/feature_flags_user_lists_finder_spec.rb @@ -4,11 +4,7 @@ require 'spec_helper' RSpec.describe FeatureFlagsUserListsFinder do let_it_be(:project) { create(:project, :repository) } - let_it_be(:user) { create(:user) } - - before_all do - project.add_maintainer(user) - end + let_it_be(:user) { create(:user, maintainer_of: project) } describe '#execute' do it 'returns user lists' do diff --git a/spec/frontend/admin/abuse_report/components/notes/abuse_report_add_note_spec.js b/spec/frontend/admin/abuse_report/components/notes/abuse_report_add_note_spec.js index 959b52beaef..560b0a2d43f 100644 --- a/spec/frontend/admin/abuse_report/components/notes/abuse_report_add_note_spec.js +++ b/spec/frontend/admin/abuse_report/components/notes/abuse_report_add_note_spec.js @@ -183,8 +183,8 @@ describe('Abuse Report Add Note', () => { await waitForPromises(); const errorMessage = errorResponse - ? 'Your comment could not be submitted because the discussion could not be found.' - : 'Your comment could not be submitted! Please check your network connection and try again.'; + ? 'Comment could not be submitted: the discussion could not be found.' + : 'Comment could not be submitted. Please check your network connection and try again.'; expect(createAlert).toHaveBeenCalledWith({ message: errorMessage, diff --git a/spec/frontend/admin/abuse_report/components/notes/abuse_report_edit_note_spec.js b/spec/frontend/admin/abuse_report/components/notes/abuse_report_edit_note_spec.js index 88f243b2501..50ffa960f2c 100644 --- a/spec/frontend/admin/abuse_report/components/notes/abuse_report_edit_note_spec.js +++ b/spec/frontend/admin/abuse_report/components/notes/abuse_report_edit_note_spec.js @@ -116,7 +116,7 @@ describe('Abuse Report Edit Note', () => { await waitForPromises(); const errorMessage = errorResponse - ? 'Your comment could not be updated because the note could not be found.' + ? 'Comment could not be updated: the note could not be found.' : 'Something went wrong while editing your comment. Please try again.'; expect(createAlert).toHaveBeenCalledWith({ diff --git a/spec/frontend/observability/client_spec.js b/spec/frontend/observability/client_spec.js index cb2a2814505..46726d491fa 100644 --- a/spec/frontend/observability/client_spec.js +++ b/spec/frontend/observability/client_spec.js @@ -728,7 +728,7 @@ describe('buildClient', () => { expect(getQueryParam()).toBe(''); }); - it('sets the start_with query param based on the search filter', async () => { + it('sets the search query param based on the search filter', async () => { await client.fetchMetrics({ filters: { search: [{ value: 'foo' }, { value: 'bar' }, { value: ' ' }] }, }); @@ -786,6 +786,20 @@ describe('buildClient', () => { }); expect(getQueryParam()).toBe(''); }); + + it('handles attribute filter', async () => { + await client.fetchMetrics({ + filters: { + attribute: [ + { value: 'foo.bar', operator: '=' }, + { value: 'foo.baz', operator: '=' }, + { value: 'not-supported', operator: '!=' }, + ], + unsupported: [{ value: 'foo.bar', operator: '=' }], + }, + }); + expect(getQueryParam()).toBe('attributes=foo.bar&attributes=foo.baz'); + }); }); it('rejects if metrics are missing', async () => { diff --git a/spec/frontend/work_items/components/work_item_actions_spec.js b/spec/frontend/work_items/components/work_item_actions_spec.js index 4d016fa5ae6..2757189904b 100644 --- a/spec/frontend/work_items/components/work_item_actions_spec.js +++ b/spec/frontend/work_items/components/work_item_actions_spec.js @@ -190,6 +190,10 @@ describe('WorkItemActions component', () => { { divider: true, }, + { + testId: TEST_ID_TOGGLE_ACTION, + text: '', + }, { testId: TEST_ID_LOCK_ACTION, text: 'Lock discussion', @@ -198,10 +202,6 @@ describe('WorkItemActions component', () => { testId: TEST_ID_CONFIDENTIALITY_TOGGLE_ACTION, text: 'Turn on confidentiality', }, - { - testId: TEST_ID_TOGGLE_ACTION, - text: '', - }, { testId: TEST_ID_COPY_REFERENCE_ACTION, text: 'Copy reference', diff --git a/spec/graphql/mutations/boards/issues/issue_move_list_spec.rb b/spec/graphql/mutations/boards/issues/issue_move_list_spec.rb index 8e9a567f614..65417200337 100644 --- a/spec/graphql/mutations/boards/issues/issue_move_list_spec.rb +++ b/spec/graphql/mutations/boards/issues/issue_move_list_spec.rb @@ -8,8 +8,8 @@ RSpec.describe Mutations::Boards::Issues::IssueMoveList do let_it_be(:group) { create(:group, :public) } let_it_be(:project) { create(:project, group: group) } let_it_be(:board) { create(:board, group: group) } - let_it_be(:user) { create(:user) } - let_it_be(:guest) { create(:user) } + let_it_be(:user) { create(:user, maintainer_of: group) } + let_it_be(:guest) { create(:user, guest_of: group) } let_it_be(:development) { create(:label, project: project, name: 'Development') } let_it_be(:testing) { create(:label, project: project, name: 'Testing') } let_it_be(:list1) { create(:list, board: board, label: development, position: 0) } @@ -29,11 +29,6 @@ RSpec.describe Mutations::Boards::Issues::IssueMoveList do } end - before_all do - group.add_maintainer(user) - group.add_guest(guest) - end - describe '#resolve' do subject do sync(resolve(described_class, args: params.merge(move_params), ctx: current_ctx)) diff --git a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb index 2476431816e..0b0ce03c958 100644 --- a/spec/graphql/mutations/environments/canary_ingress/update_spec.rb +++ b/spec/graphql/mutations/environments/canary_ingress/update_spec.rb @@ -5,18 +5,13 @@ require 'spec_helper' RSpec.describe Mutations::Environments::CanaryIngress::Update do let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project) } - let_it_be(:maintainer) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:maintainer) { create(:user, maintainer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let(:user) { maintainer } subject(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } - before_all do - project.add_maintainer(maintainer) - project.add_reporter(reporter) - end - describe '#resolve' do subject { mutation.resolve(id: environment_id, weight: weight) } diff --git a/spec/graphql/mutations/environments/delete_spec.rb b/spec/graphql/mutations/environments/delete_spec.rb index 49248408d2c..7a9d1e1a195 100644 --- a/spec/graphql/mutations/environments/delete_spec.rb +++ b/spec/graphql/mutations/environments/delete_spec.rb @@ -4,19 +4,14 @@ require 'spec_helper' RSpec.describe Mutations::Environments::Delete, feature_category: :environment_management do let_it_be(:project) { create(:project) } - let_it_be(:maintainer) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:maintainer) { create(:user, maintainer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let(:environment) { create(:environment, project: project, state: state) } let(:user) { maintainer } subject(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } - before_all do - project.add_maintainer(maintainer) - project.add_reporter(reporter) - end - describe '#resolve' do subject { mutation.resolve(id: environment_id) } diff --git a/spec/graphql/mutations/environments/stop_spec.rb b/spec/graphql/mutations/environments/stop_spec.rb index d61aff81725..6e16a9e8360 100644 --- a/spec/graphql/mutations/environments/stop_spec.rb +++ b/spec/graphql/mutations/environments/stop_spec.rb @@ -5,18 +5,13 @@ require 'spec_helper' RSpec.describe Mutations::Environments::Stop, feature_category: :environment_management do let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project, state: 'available') } - let_it_be(:maintainer) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:maintainer) { create(:user, maintainer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let(:user) { maintainer } subject(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } - before_all do - project.add_maintainer(maintainer) - project.add_reporter(reporter) - end - describe '#resolve' do subject { mutation.resolve(id: environment_id, force: force) } diff --git a/spec/graphql/mutations/environments/update_spec.rb b/spec/graphql/mutations/environments/update_spec.rb index 5c61b3c5dbe..c2db01de153 100644 --- a/spec/graphql/mutations/environments/update_spec.rb +++ b/spec/graphql/mutations/environments/update_spec.rb @@ -5,18 +5,13 @@ require 'spec_helper' RSpec.describe Mutations::Environments::Update, feature_category: :environment_management do let_it_be(:project) { create(:project) } let_it_be(:environment) { create(:environment, project: project) } - let_it_be(:maintainer) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:maintainer) { create(:user, maintainer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let(:user) { maintainer } subject(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } - before_all do - project.add_maintainer(maintainer) - project.add_reporter(reporter) - end - describe '#resolve' do subject { mutation.resolve(id: environment_id, **kwargs) } diff --git a/spec/graphql/mutations/issues/link_alerts_spec.rb b/spec/graphql/mutations/issues/link_alerts_spec.rb index a6ce5cdd7ab..38f16a8adac 100644 --- a/spec/graphql/mutations/issues/link_alerts_spec.rb +++ b/spec/graphql/mutations/issues/link_alerts_spec.rb @@ -4,8 +4,8 @@ require 'spec_helper' RSpec.describe Mutations::Issues::LinkAlerts, feature_category: :incident_management do let_it_be(:project) { create(:project) } - let_it_be(:guest) { create(:user) } - let_it_be(:developer) { create(:user) } + let_it_be(:guest) { create(:user, guest_of: project) } + let_it_be(:developer) { create(:user, developer_of: project) } let_it_be(:issue) { create(:incident, project: project) } let_it_be(:alert1) { create(:alert_management_alert, project: project) } let_it_be(:alert2) { create(:alert_management_alert, project: project) } @@ -14,11 +14,6 @@ RSpec.describe Mutations::Issues::LinkAlerts, feature_category: :incident_manage specify { expect(described_class).to require_graphql_authorizations(:update_issue, :admin_issue) } - before_all do - project.add_guest(guest) - project.add_developer(developer) - end - describe '#resolve' do let(:alert_references) { [alert1.to_reference, alert2.details_url, 'invalid-reference'] } diff --git a/spec/graphql/mutations/issues/set_severity_spec.rb b/spec/graphql/mutations/issues/set_severity_spec.rb index 84736fe7ee6..f647e2f6cb3 100644 --- a/spec/graphql/mutations/issues/set_severity_spec.rb +++ b/spec/graphql/mutations/issues/set_severity_spec.rb @@ -4,19 +4,14 @@ require 'spec_helper' RSpec.describe Mutations::Issues::SetSeverity do let_it_be(:project) { create(:project) } - let_it_be(:guest) { create(:user) } - let_it_be(:reporter) { create(:user) } + let_it_be(:guest) { create(:user, guest_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } let_it_be(:issue) { create(:incident, project: project) } let(:mutation) { described_class.new(object: nil, context: { current_user: user }, field: nil) } specify { expect(described_class).to require_graphql_authorizations(:update_issue, :admin_issue) } - before_all do - project.add_guest(guest) - project.add_reporter(reporter) - end - describe '#resolve' do let(:severity) { 'critical' } diff --git a/spec/graphql/mutations/issues/unlink_alert_spec.rb b/spec/graphql/mutations/issues/unlink_alert_spec.rb index 2f1d5084faf..2ba0ebfe469 100644 --- a/spec/graphql/mutations/issues/unlink_alert_spec.rb +++ b/spec/graphql/mutations/issues/unlink_alert_spec.rb @@ -5,8 +5,8 @@ require 'spec_helper' RSpec.describe Mutations::Issues::UnlinkAlert, feature_category: :incident_management do let_it_be(:project) { create(:project) } let_it_be(:another_project) { create(:project) } - let_it_be(:guest) { create(:user) } - let_it_be(:developer) { create(:user) } + let_it_be(:guest) { create(:user, guest_of: project) } + let_it_be(:developer) { create(:user, developer_of: project) } let_it_be(:internal_alert) { create(:alert_management_alert, project: project) } let_it_be(:external_alert) { create(:alert_management_alert, project: another_project) } let_it_be(:issue) { create(:incident, project: project, alert_management_alerts: [internal_alert, external_alert]) } @@ -15,11 +15,6 @@ RSpec.describe Mutations::Issues::UnlinkAlert, feature_category: :incident_manag specify { expect(described_class).to require_graphql_authorizations(:update_issue, :admin_issue) } - before_all do - project.add_guest(guest) - project.add_developer(developer) - end - describe '#resolve' do let(:alert_to_unlink) { internal_alert } diff --git a/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb b/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb index c4ceecb9d46..57b2752df2e 100644 --- a/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb +++ b/spec/graphql/mutations/pages/mark_onboarding_complete_spec.rb @@ -4,8 +4,8 @@ require 'spec_helper' RSpec.describe Mutations::Pages::MarkOnboardingComplete do let_it_be(:project) { create(:project, :public, :repository) } - let_it_be(:developer) { create(:user) } - let_it_be(:owner) { create(:user) } + let_it_be(:developer) { create(:user, developer_of: project) } + let_it_be(:owner) { create(:user, owner_of: project) } let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } @@ -15,11 +15,6 @@ RSpec.describe Mutations::Pages::MarkOnboardingComplete do } end - before_all do - project.add_owner(owner) - project.add_developer(developer) - end - describe '#resolve' do subject(:resolve) do mutation.resolve(**mutation_arguments) diff --git a/spec/graphql/mutations/todos/mark_done_spec.rb b/spec/graphql/mutations/todos/mark_done_spec.rb index 51df2032cf1..b75eee4f7c4 100644 --- a/spec/graphql/mutations/todos/mark_done_spec.rb +++ b/spec/graphql/mutations/todos/mark_done_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Mutations::Todos::MarkDone do let_it_be(:project) { create(:project) } let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:current_user) { create(:user) } + let_it_be(:current_user) { create(:user, developer_of: project) } let_it_be(:author) { create(:user) } let_it_be(:other_user) { create(:user) } @@ -18,10 +18,6 @@ RSpec.describe Mutations::Todos::MarkDone do let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } - before_all do - project.add_developer(current_user) - end - specify { expect(described_class).to require_graphql_authorizations(:update_todo) } describe '#resolve' do diff --git a/spec/graphql/mutations/todos/restore_spec.rb b/spec/graphql/mutations/todos/restore_spec.rb index fad9d6c08a6..bfc956a4570 100644 --- a/spec/graphql/mutations/todos/restore_spec.rb +++ b/spec/graphql/mutations/todos/restore_spec.rb @@ -7,7 +7,7 @@ RSpec.describe Mutations::Todos::Restore do let_it_be(:project) { create(:project) } let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:current_user) { create(:user) } + let_it_be(:current_user) { create(:user, developer_of: project) } let_it_be(:author) { create(:user) } let_it_be(:other_user) { create(:user) } @@ -18,10 +18,6 @@ RSpec.describe Mutations::Todos::Restore do let(:mutation) { described_class.new(object: nil, context: { current_user: current_user }, field: nil) } - before_all do - project.add_developer(current_user) - end - specify { expect(described_class).to require_graphql_authorizations(:update_todo) } describe '#resolve' do diff --git a/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb index f80b33e644e..5e0c6b392b8 100644 --- a/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb +++ b/spec/graphql/resolvers/error_tracking/sentry_detailed_error_resolver_spec.rb @@ -6,15 +6,11 @@ RSpec.describe Resolvers::ErrorTracking::SentryDetailedErrorResolver do include GraphqlHelpers let_it_be(:project) { create(:project) } - let_it_be(:current_user) { create(:user) } + let_it_be(:current_user) { create(:user, developer_of: project) } let(:issue_details_service) { instance_double('ErrorTracking::IssueDetailsService') } let(:service_response) { {} } - before_all do - project.add_developer(current_user) - end - before do allow(ErrorTracking::IssueDetailsService) .to receive(:new) diff --git a/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb b/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb index 5834faea97e..ca216e9f37c 100644 --- a/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb +++ b/spec/graphql/resolvers/error_tracking/sentry_error_collection_resolver_spec.rb @@ -6,14 +6,10 @@ RSpec.describe Resolvers::ErrorTracking::SentryErrorCollectionResolver do include GraphqlHelpers let_it_be(:project) { create(:project) } - let_it_be(:current_user) { create(:user) } + let_it_be(:current_user) { create(:user, developer_of: project) } let(:list_issues_service) { instance_double('ErrorTracking::ListIssuesService') } - before_all do - project.add_developer(current_user) - end - before do allow(ErrorTracking::ListIssuesService) .to receive(:new) diff --git a/spec/graphql/resolvers/group_issues_resolver_spec.rb b/spec/graphql/resolvers/group_issues_resolver_spec.rb index f5f6086cc09..71d12b92072 100644 --- a/spec/graphql/resolvers/group_issues_resolver_spec.rb +++ b/spec/graphql/resolvers/group_issues_resolver_spec.rb @@ -7,10 +7,10 @@ RSpec.describe Resolvers::GroupIssuesResolver do let_it_be(:current_user) { create(:user) } - let_it_be(:group) { create(:group) } + let_it_be(:group) { create(:group, developers: current_user) } let_it_be(:project) { create(:project, group: group) } let_it_be(:other_project) { create(:project, group: group) } - let_it_be(:subgroup) { create(:group, parent: group) } + let_it_be(:subgroup) { create(:group, parent: group, developers: current_user) } let_it_be(:subproject) { create(:project, group: subgroup) } let_it_be(:issue1) { create(:incident, project: project, state: :opened, created_at: 3.hours.ago, updated_at: 3.hours.ago) } @@ -22,11 +22,6 @@ RSpec.describe Resolvers::GroupIssuesResolver do let_it_be(:subissue2) { create(:issue, project: subproject) } let_it_be(:subissue3) { create(:issue, project: subproject) } - before_all do - group.add_developer(current_user) - subgroup.add_developer(current_user) - end - describe '#resolve' do it 'finds all group issues' do expect(resolve_issues).to contain_exactly(issue1, issue2, issue3) diff --git a/spec/graphql/resolvers/work_items/types_resolver_spec.rb b/spec/graphql/resolvers/work_items/types_resolver_spec.rb index 22c6219c02e..765fd3b00e7 100644 --- a/spec/graphql/resolvers/work_items/types_resolver_spec.rb +++ b/spec/graphql/resolvers/work_items/types_resolver_spec.rb @@ -6,13 +6,9 @@ RSpec.describe Resolvers::WorkItems::TypesResolver do include GraphqlHelpers let_it_be(:current_user) { create(:user) } - let_it_be(:group) { create(:group) } + let_it_be(:group) { create(:group, developers: current_user) } let_it_be(:project) { create(:project, group: group) } - before_all do - group.add_developer(current_user) - end - shared_examples 'a work item type resolver' do let(:args) { {} } diff --git a/spec/helpers/ci/secure_files_helper_spec.rb b/spec/helpers/ci/secure_files_helper_spec.rb index 049a09afd03..07ecbc95678 100644 --- a/spec/helpers/ci/secure_files_helper_spec.rb +++ b/spec/helpers/ci/secure_files_helper_spec.rb @@ -8,12 +8,8 @@ RSpec.describe Ci::SecureFilesHelper, feature_category: :mobile_devops do let_it_be(:guest) { create(:user) } let_it_be(:anonymous) { create(:user) } let_it_be(:unconfirmed) { create(:user, :unconfirmed) } - let_it_be(:project) { create(:project, creator_id: maintainer.id) } - - before_all do - project.add_maintainer(maintainer) - project.add_developer(developer) - project.add_guest(guest) + let_it_be(:project) do + create(:project, creator_id: maintainer.id, maintainers: maintainer, developers: developer, guests: guest) end subject { helper.show_secure_files_setting(project, user) } diff --git a/spec/helpers/emails_helper_spec.rb b/spec/helpers/emails_helper_spec.rb index ee623cea664..28377aa5cbb 100644 --- a/spec/helpers/emails_helper_spec.rb +++ b/spec/helpers/emails_helper_spec.rb @@ -21,26 +21,26 @@ RSpec.describe EmailsHelper do context "and format is text" do it "returns plain text" do - expect(helper.closure_reason_text(merge_request, format: :text)).to eq("via merge request #{merge_request.to_reference} (#{merge_request_presenter.web_url})") + expect(helper.closure_reason_text(merge_request, format: :text, name: user.name)).to include("via merge request #{merge_request.to_reference} (#{merge_request_presenter.web_url})") end end context "and format is HTML" do it "returns HTML" do - expect(helper.closure_reason_text(merge_request, format: :html)).to eq("via merge request #{link_to(merge_request.to_reference, merge_request_presenter.web_url)}") + expect(helper.closure_reason_text(merge_request, format: :html, name: user.name)).to include("via merge request #{link_to(merge_request.to_reference, merge_request_presenter.web_url)}") end end context "and format is unknown" do it "returns plain text" do - expect(helper.closure_reason_text(merge_request, format: 'unknown')).to eq("via merge request #{merge_request.to_reference} (#{merge_request_presenter.web_url})") + expect(helper.closure_reason_text(merge_request, format: 'unknown', name: user.name)).to include("via merge request #{merge_request.to_reference} (#{merge_request_presenter.web_url})") end end end context 'when user cannot read merge request' do it "does not have link to merge request" do - expect(helper.closure_reason_text(merge_request)).to be_empty + expect(helper.closure_reason_text(merge_request, format: nil, name: nil)).to be_empty end end end @@ -58,20 +58,28 @@ RSpec.describe EmailsHelper do end it "returns plain text" do - expect(closure_reason_text(closed_via)).to eq("via #{closed_via}") + expect(closure_reason_text(closed_via, format: nil, name: nil)).to include("via #{closed_via}") end end context 'when user cannot read commits' do it "returns plain text" do - expect(closure_reason_text(closed_via)).to be_empty + expect(closure_reason_text(closed_via, format: nil, name: nil)).to be_empty end end end context 'when not given anything' do it "returns empty string" do - expect(closure_reason_text(nil)).to eq("") + expect(closure_reason_text(nil, format: nil, name: nil)).to eq("") + end + end + + context 'when only given a name' do + let(:user) { build_stubbed(:user) } + + it "returns plain text" do + expect(closure_reason_text(nil, format: nil, name: user.name)).to eq("Issue was closed by #{user.name}") end end end diff --git a/spec/helpers/notes_helper_spec.rb b/spec/helpers/notes_helper_spec.rb index 18e4dfc3cf2..efc649e5fd6 100644 --- a/spec/helpers/notes_helper_spec.rb +++ b/spec/helpers/notes_helper_spec.rb @@ -6,11 +6,11 @@ RSpec.describe NotesHelper, feature_category: :team_planning do include RepoHelpers let_it_be(:owner) { create(:owner) } - let_it_be(:group) { create(:group) } + let_it_be(:group) { create(:group, owners: owner) } let_it_be(:project) { create(:project, namespace: group) } - let_it_be(:maintainer) { create(:user) } - let_it_be(:reporter) { create(:user) } - let_it_be(:guest) { create(:user) } + let_it_be(:maintainer) { create(:user, maintainer_of: project) } + let_it_be(:reporter) { create(:user, reporter_of: project) } + let_it_be(:guest) { create(:user, guest_of: project) } let_it_be(:owner_note) { create(:note, author: owner, project: project) } let_it_be(:maintainer_note) { create(:note, author: maintainer, project: project) } @@ -18,13 +18,6 @@ RSpec.describe NotesHelper, feature_category: :team_planning do let!(:notes) { [owner_note, maintainer_note, reporter_note] } - before_all do - group.add_owner(owner) - project.add_maintainer(maintainer) - project.add_reporter(reporter) - project.add_guest(guest) - end - describe '#note_target_title' do context 'note does not exist' do it 'returns nil' do diff --git a/spec/lib/gitlab/auth/auth_finders_spec.rb b/spec/lib/gitlab/auth/auth_finders_spec.rb index 95199ae18de..efce440b528 100644 --- a/spec/lib/gitlab/auth/auth_finders_spec.rb +++ b/spec/lib/gitlab/auth/auth_finders_spec.rb @@ -10,12 +10,12 @@ RSpec.describe Gitlab::Auth::AuthFinders, feature_category: :system_access do let_it_be(:user, freeze: true) { create(:user).tap(&:feed_token).tap(&:static_object_token) } let_it_be(:personal_access_token, freeze: true) { create(:personal_access_token, user: user) } - let_it_be(:project, freeze: true) { create(:project, :private) } + let_it_be(:project, freeze: true) { create(:project, :private, developers: user) } let_it_be(:pipeline, freeze: true) { create(:ci_pipeline, project: project) } let_it_be(:job, freeze: true) { create(:ci_build, :running, pipeline: pipeline, user: user) } let_it_be(:failed_job, freeze: true) { create(:ci_build, :failed, pipeline: pipeline, user: user) } - let_it_be(:project2, freeze: true) { create(:project, :private) } + let_it_be(:project2, freeze: true) { create(:project, :private, developers: user) } let_it_be(:pipeline2, freeze: true) { create(:ci_pipeline, project: project2) } let_it_be(:job2, freeze: true) { create(:ci_build, :running, pipeline: pipeline2, user: user) } @@ -28,11 +28,6 @@ RSpec.describe Gitlab::Auth::AuthFinders, feature_category: :system_access do let(:request) { ActionDispatch::Request.new(env) } let(:params) { {} } - before_all do - project.add_developer(user) - project2.add_developer(user) - end - def set_param(key, value) request.update_param(key, value) end diff --git a/spec/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys_spec.rb b/spec/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys_spec.rb new file mode 100644 index 00000000000..79e05b8a84c --- /dev/null +++ b/spec/lib/gitlab/background_migration/backfill_jira_tracker_data_project_keys_spec.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::BackgroundMigration::BackfillJiraTrackerDataProjectKeys, feature_category: :integrations do + let(:integrations_table) { table(:integrations) } + let(:jira_tracker_data_table) { table(:jira_tracker_data) } + let(:jira_integration) { integrations_table.create!(id: 1, type_new: 'JiraService') } + let!(:integration1) { jira_tracker_data_table.create!(integration_id: jira_integration.id, project_key: nil) } + let!(:integration2) { jira_tracker_data_table.create!(integration_id: jira_integration.id, project_key: '') } + let!(:integration3) do + jira_tracker_data_table.create!(integration_id: jira_integration.id, project_key: 'GTL', project_keys: ['GTL']) + end + + let!(:integration4) do + jira_tracker_data_table.create!(integration_id: jira_integration.id, project_key: 'GTL', project_keys: []) + end + + subject(:perform_migration) do + described_class.new( + start_id: integration1.id, + end_id: integration4.id, + batch_table: :jira_tracker_data, + batch_column: :id, + sub_batch_size: 4, + pause_ms: 0, + connection: ActiveRecord::Base.connection + ).perform + end + + it 'updates project_keys values only for integrations with project_key and without project_keys' do + expect { perform_migration }.to not_change { integration1.reload.project_keys } + .and not_change { integration2.reload.project_keys } + .and not_change { integration3.reload.project_keys } + .and change { integration4.reload.project_keys }.to(['GTL']) + end +end diff --git a/spec/lib/gitlab/import_export/safe_model_attributes.yml b/spec/lib/gitlab/import_export/safe_model_attributes.yml index 2547f4abda0..608f1830547 100644 --- a/spec/lib/gitlab/import_export/safe_model_attributes.yml +++ b/spec/lib/gitlab/import_export/safe_model_attributes.yml @@ -34,6 +34,7 @@ Issue: - external_key - issue_type - email_message_id +- imported Event: - id - target_type @@ -44,6 +45,7 @@ Event: - action - author_id - fingerprint +- imported WikiPage::Meta: - id - title @@ -87,6 +89,7 @@ Note: - confidential - last_edited_at - internal +- imported Notes::NoteMetadata: - note_id - email_participant @@ -133,6 +136,7 @@ ProjectSnippet: - file_name - type - visibility_level +- imported Release: - id - name @@ -217,6 +221,7 @@ MergeRequest: - allow_maintainer_to_push - merge_ref_sha - draft +- imported MergeRequestDiff: - id - state @@ -996,6 +1001,7 @@ Epic: - total_closed_issue_weight - total_opened_issue_count - total_closed_issue_count + - imported EpicIssue: - id - relative_position diff --git a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb index 1c67c9e0b95..c471a6f0370 100644 --- a/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb +++ b/spec/lib/gitlab/pagination/keyset/in_operator_optimization/query_builder_spec.rb @@ -97,7 +97,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { ignored_column_model.where(ignored_column_model.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (id_expression) { ignored_column_model.where(ignored_column_model.arel_table[:id].eq(id_expression)) } } @@ -146,7 +146,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -200,7 +200,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (_relative_position_expression, id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -224,7 +224,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.merge(base_scope.dup).where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (_relative_position_expression, id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -250,7 +250,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (_created_at_expression, id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -282,7 +282,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:options) do { scope: scope, - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -330,7 +330,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder options = { scope: scope, - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) }, finder_query: -> (id_expression) { Issue.where(Issue.arel_table[:id].eq(id_expression)) } } @@ -360,7 +360,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) } } end @@ -402,7 +402,7 @@ RSpec.describe Gitlab::Pagination::Keyset::InOperatorOptimization::QueryBuilder let(:in_operator_optimization_options) do { - array_scope: Project.where(namespace_id: top_level_group.self_and_descendants.select(:id)).select(:id), + array_scope: Project.where(namespace_id: top_level_group.self_and_descendant_ids).select(:id), array_mapping_scope: -> (id_expression) { Issue.where(Issue.arel_table[:project_id].eq(id_expression)) } } end diff --git a/spec/lib/gitlab/popen_spec.rb b/spec/lib/gitlab/popen_spec.rb index 78455cb705f..b0c406eb398 100644 --- a/spec/lib/gitlab/popen_spec.rb +++ b/spec/lib/gitlab/popen_spec.rb @@ -57,6 +57,12 @@ RSpec.describe Gitlab::Popen do end end + context 'unsafe array command' do + it 'raises an error when it gets called with an unsafe array' do + expect { @klass.new.popen(['ls -l'], path) }.to raise_error(RuntimeError) + end + end + context 'with custom options' do let(:vars) { { 'foobar' => 123, 'PWD' => path } } let(:options) { { chdir: path } } diff --git a/spec/lib/gitlab/seeders/ci/catalog/resource_seeder_spec.rb b/spec/lib/gitlab/seeders/ci/catalog/resource_seeder_spec.rb index f4f38a861ee..42a0ca477f6 100644 --- a/spec/lib/gitlab/seeders/ci/catalog/resource_seeder_spec.rb +++ b/spec/lib/gitlab/seeders/ci/catalog/resource_seeder_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe ::Gitlab::Seeders::Ci::Catalog::ResourceSeeder, feature_category: :pipeline_composition do let_it_be(:admin) { create(:admin) } - let_it_be_with_reload(:group) { create(:group) } + let_it_be_with_reload(:group) { create(:group, owners: admin) } let_it_be(:seed_count) { 2 } let_it_be(:last_resource_id) { seed_count - 1 } let(:publish) { true } @@ -13,10 +13,6 @@ RSpec.describe ::Gitlab::Seeders::Ci::Catalog::ResourceSeeder, feature_category: subject(:seeder) { described_class.new(group_path: group_path, seed_count: seed_count, publish: publish) } - before_all do - group.add_owner(admin) - end - describe '#seed' do subject(:seed) { seeder.seed } diff --git a/spec/migrations/20240402143848_queue_backfill_jira_tracker_data_project_keys_spec.rb b/spec/migrations/20240402143848_queue_backfill_jira_tracker_data_project_keys_spec.rb new file mode 100644 index 00000000000..4ff6a2ac082 --- /dev/null +++ b/spec/migrations/20240402143848_queue_backfill_jira_tracker_data_project_keys_spec.rb @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require 'spec_helper' +require_migration! + +RSpec.describe QueueBackfillJiraTrackerDataProjectKeys, feature_category: :integrations do + let!(:batched_migration) { described_class::MIGRATION } + + it 'schedules a new batched migration' do + reversible_migration do |migration| + migration.before -> { + expect(batched_migration).not_to have_scheduled_batched_migration + } + + migration.after -> { + expect(batched_migration).to have_scheduled_batched_migration( + table_name: :jira_tracker_data, + column_name: :id, + interval: described_class::DELAY_INTERVAL, + batch_size: described_class::BATCH_SIZE, + sub_batch_size: described_class::SUB_BATCH_SIZE + ) + } + end + end +end diff --git a/spec/models/ci/catalog/listing_spec.rb b/spec/models/ci/catalog/listing_spec.rb index 1d20ab4f274..72831658855 100644 --- a/spec/models/ci/catalog/listing_spec.rb +++ b/spec/models/ci/catalog/listing_spec.rb @@ -22,7 +22,7 @@ RSpec.describe Ci::Catalog::Listing, feature_category: :pipeline_composition do end let_it_be(:project_noaccess) { create(:project, namespace: namespace, name: 'Project with no access') } - let_it_be(:internal_project) { create(:project, :internal, name: 'Internal project') } + let_it_be(:internal_project) { create(:project, :internal, name: 'Internal project', owners: user) } let_it_be(:private_project) do create(:project, namespace: namespace, name: 'B Project', description: 'Rspec test framework') @@ -35,7 +35,6 @@ RSpec.describe Ci::Catalog::Listing, feature_category: :pipeline_composition do namespace_project_b.add_reporter(user) public_namespace_project.add_reporter(user) public_project.add_reporter(user) - internal_project.add_owner(user) end describe '#resources' do diff --git a/spec/models/group_spec.rb b/spec/models/group_spec.rb index 58923fe4d04..86df51d947b 100644 --- a/spec/models/group_spec.rb +++ b/spec/models/group_spec.rb @@ -3936,4 +3936,20 @@ RSpec.describe Group, feature_category: :groups_and_projects do expect(group.group_readme).to be(nil) end end + + describe '#members_with_descendants' do + it 'returns members from root and descendant groups' do + group = create(:group) + subgroup = create(:group, parent: group) + subsubgroup = create(:group, parent: subgroup) + + group_member1 = create(:group_member, source: group) + group_member2 = create(:group_member, source: subgroup) + group_member3 = create(:group_member, source: subsubgroup) + create(:group_member) # member outside of the hierarchy + + expect(group.members_with_descendants).to match_array([group_member1, group_member2, group_member3]) + expect(subgroup.members_with_descendants).to match_array([group_member2, group_member3]) + end + end end diff --git a/spec/models/preloaders/group_policy_preloader_spec.rb b/spec/models/preloaders/group_policy_preloader_spec.rb index 57ff77decd4..d8aa678f95a 100644 --- a/spec/models/preloaders/group_policy_preloader_spec.rb +++ b/spec/models/preloaders/group_policy_preloader_spec.rb @@ -5,20 +5,13 @@ require 'spec_helper' RSpec.describe Preloaders::GroupPolicyPreloader do let_it_be(:user) { create(:user) } let_it_be(:root_parent) { create(:group, :private, name: 'root-1', path: 'root-1') } - let_it_be(:guest_group) { create(:group, name: 'public guest', path: 'public-guest') } - let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer', parent: root_parent) } - let_it_be(:private_developer_group) { create(:group, :private, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer') } - let_it_be(:public_maintainer_group) { create(:group, :private, name: 'a public maintainer', path: 'a-public-maintainer') } + let_it_be(:guest_group) { create(:group, name: 'public guest', path: 'public-guest', guests: user) } + let_it_be(:private_maintainer_group) { create(:group, :private, name: 'b private maintainer', path: 'b-private-maintainer', parent: root_parent, maintainers: user) } + let_it_be(:private_developer_group) { create(:group, :private, project_creation_level: nil, name: 'c public developer', path: 'c-public-developer', developers: user) } + let_it_be(:public_maintainer_group) { create(:group, :private, name: 'a public maintainer', path: 'a-public-maintainer', maintainers: user) } let(:base_groups) { [guest_group, private_maintainer_group, private_developer_group, public_maintainer_group] } - before_all do - guest_group.add_guest(user) - private_maintainer_group.add_maintainer(user) - private_developer_group.add_developer(user) - public_maintainer_group.add_maintainer(user) - end - it 'avoids N+1 queries when authorizing a list of groups', :request_store do preload_groups_for_policy(user) control = ActiveRecord::QueryRecorder.new { authorize_all_groups(user) } diff --git a/spec/models/preloaders/project_policy_preloader_spec.rb b/spec/models/preloaders/project_policy_preloader_spec.rb index a278194e9e1..188568ce19a 100644 --- a/spec/models/preloaders/project_policy_preloader_spec.rb +++ b/spec/models/preloaders/project_policy_preloader_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe Preloaders::ProjectPolicyPreloader do let_it_be(:user) { create(:user) } let_it_be(:root_parent) { create(:group, :private, name: 'root-1', path: 'root-1') } - let_it_be(:guest_project) { create(:project, name: 'public guest', path: 'public-guest') } + let_it_be(:guest_project) { create(:project, name: 'public guest', path: 'public-guest', guests: user) } let_it_be(:private_maintainer_project) do create(:project, :private, name: 'b private maintainer', path: 'b-private-maintainer', namespace: root_parent) end @@ -23,7 +23,6 @@ RSpec.describe Preloaders::ProjectPolicyPreloader do end before_all do - guest_project.add_guest(user) private_maintainer_project.add_maintainer(user) private_developer_project.add_developer(user) public_maintainer_project.add_maintainer(user) diff --git a/spec/models/snippet_spec.rb b/spec/models/snippet_spec.rb index ff1c5959cb0..a226a877f55 100644 --- a/spec/models/snippet_spec.rb +++ b/spec/models/snippet_spec.rb @@ -856,7 +856,8 @@ RSpec.describe Snippet, feature_category: :source_code_management do 'url' => Gitlab::UrlBuilder.build(snippet), 'type' => 'PersonalSnippet', 'created_at' => be_like_time(snippet.created_at), - 'updated_at' => be_like_time(snippet.updated_at) + 'updated_at' => be_like_time(snippet.updated_at), + 'imported' => 0 ) end end diff --git a/spec/policies/design_management/design_policy_spec.rb b/spec/policies/design_management/design_policy_spec.rb index 5b209965187..6372d1c8c8d 100644 --- a/spec/policies/design_management/design_policy_spec.rb +++ b/spec/policies/design_management/design_policy_spec.rb @@ -14,20 +14,17 @@ RSpec.describe DesignManagement::DesignPolicy, feature_category: :portfolio_mana let_it_be(:maintainer) { create(:user) } let_it_be(:owner) { create(:user) } let_it_be(:admin) { create(:admin) } - let_it_be(:project) { create(:project, :public, namespace: owner.namespace) } + let_it_be(:project) do + create(:project, :public, namespace: owner.namespace, guests: guest, maintainers: maintainer, developers: developer, + reporters: reporter) + end + let_it_be(:issue) { create(:issue, project: project) } let(:design) { create(:design, issue: issue) } subject(:design_policy) { described_class.new(current_user, design) } - before_all do - project.add_guest(guest) - project.add_maintainer(maintainer) - project.add_developer(developer) - project.add_reporter(reporter) - end - shared_examples_for "design abilities not available" do context "for owners" do let(:current_user) { owner } diff --git a/spec/policies/release_policy_spec.rb b/spec/policies/release_policy_spec.rb index 5a34b1f4236..e96fc6e328c 100644 --- a/spec/policies/release_policy_spec.rb +++ b/spec/policies/release_policy_spec.rb @@ -5,16 +5,11 @@ require 'spec_helper' RSpec.describe ReleasePolicy, :request_store do let_it_be(:developer) { create(:user) } let_it_be(:maintainer) { create(:user) } - let_it_be(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository, developers: developer, maintainers: maintainer) } let_it_be(:release, reload: true) { create(:release, project: project) } let(:user) { developer } - before_all do - project.add_developer(developer) - project.add_maintainer(maintainer) - end - subject { described_class.new(user, release) } context 'when the user has access to the protected tag' do diff --git a/spec/policies/work_item_policy_spec.rb b/spec/policies/work_item_policy_spec.rb index c06a24d8df4..c8a947576b7 100644 --- a/spec/policies/work_item_policy_spec.rb +++ b/spec/policies/work_item_policy_spec.rb @@ -7,7 +7,7 @@ RSpec.describe WorkItemPolicy, feature_category: :team_planning do let_it_be(:project) { create(:project, group: group) } let_it_be(:public_project) { create(:project, :public, group: group) } let_it_be(:guest) { create(:user, guest_of: project) } - let_it_be(:guest_author) { create(:user, guest_of: project) } + let_it_be(:guest_author) { create(:user, guest_of: project, developer_of: public_project) } let_it_be(:reporter) { create(:user, reporter_of: project) } let_it_be(:group_reporter) { create(:user, reporter_of: group) } let_it_be(:non_member_user) { create(:user) } @@ -19,10 +19,6 @@ RSpec.describe WorkItemPolicy, feature_category: :team_planning do subject { described_class.new(current_user, work_item_subject) } - before_all do - public_project.add_developer(guest_author) - end - describe 'read_work_item' do context 'when project is public' do let(:work_item_subject) { public_work_item } diff --git a/spec/presenters/ci/pipeline_presenter_spec.rb b/spec/presenters/ci/pipeline_presenter_spec.rb index 126017775cf..c0b85dde739 100644 --- a/spec/presenters/ci/pipeline_presenter_spec.rb +++ b/spec/presenters/ci/pipeline_presenter_spec.rb @@ -6,7 +6,7 @@ RSpec.describe Ci::PipelinePresenter do include Gitlab::Routing let_it_be(:user) { create(:user) } - let_it_be_with_reload(:project) { create(:project, :test_repo) } + let_it_be_with_reload(:project) { create(:project, :test_repo, developers: user) } let_it_be_with_reload(:pipeline) { create(:ci_pipeline, project: project) } let(:current_user) { user } @@ -15,10 +15,6 @@ RSpec.describe Ci::PipelinePresenter do described_class.new(pipeline) end - before_all do - project.add_developer(user) - end - before do allow(presenter).to receive(:current_user) { current_user } end diff --git a/spec/presenters/issue_presenter_spec.rb b/spec/presenters/issue_presenter_spec.rb index 3391ec6d8ca..a019e6e573c 100644 --- a/spec/presenters/issue_presenter_spec.rb +++ b/spec/presenters/issue_presenter_spec.rb @@ -9,7 +9,7 @@ RSpec.describe IssuePresenter do let_it_be(:reporter) { create(:user) } let_it_be(:guest) { create(:user) } let_it_be(:developer) { create(:user) } - let_it_be(:group) { create(:group) } + let_it_be(:group) { create(:group, developers: [user, developer], reporters: reporter, guests: guest) } let_it_be(:project) { create(:project, group: group) } let_it_be(:issue) { create(:issue, project: project) } let_it_be(:task) { create(:issue, :task, project: project) } @@ -20,13 +20,6 @@ RSpec.describe IssuePresenter do let(:obfuscated_email) { 'an*****@e*****.c**' } let(:email) { 'any@email.com' } - before_all do - group.add_developer(user) - group.add_developer(developer) - group.add_reporter(reporter) - group.add_guest(guest) - end - describe '#web_url' do it 'returns correct path' do expect(presenter.web_url).to eq("http://localhost/#{project.full_path}/-/issues/#{presented_issue.iid}") diff --git a/spec/presenters/projects/settings/deploy_keys_presenter_spec.rb b/spec/presenters/projects/settings/deploy_keys_presenter_spec.rb index 0d340c5e713..d0d888a09e1 100644 --- a/spec/presenters/projects/settings/deploy_keys_presenter_spec.rb +++ b/spec/presenters/projects/settings/deploy_keys_presenter_spec.rb @@ -5,17 +5,12 @@ require 'spec_helper' RSpec.describe Projects::Settings::DeployKeysPresenter do let_it_be(:project, refind: true) { create(:project) } let_it_be(:other_project) { create(:project) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, maintainer_of: [project, other_project]) } subject(:presenter) do described_class.new(project, current_user: user) end - before_all do - project.add_maintainer(user) - other_project.add_maintainer(user) - end - it 'inherits from Gitlab::View::Presenter::Simple' do expect(described_class.superclass).to eq(Gitlab::View::Presenter::Simple) end diff --git a/spec/requests/projects/incidents_controller_spec.rb b/spec/requests/projects/incidents_controller_spec.rb index 9a0d6cdf8ce..03c87e17d31 100644 --- a/spec/requests/projects/incidents_controller_spec.rb +++ b/spec/requests/projects/incidents_controller_spec.rb @@ -4,15 +4,10 @@ require 'spec_helper' RSpec.describe Projects::IncidentsController, feature_category: :incident_management do let_it_be_with_refind(:project) { create(:project) } - let_it_be(:developer) { create(:user) } - let_it_be(:guest) { create(:user) } + let_it_be(:developer) { create(:user, developer_of: project) } + let_it_be(:guest) { create(:user, guest_of: project) } let_it_be(:anonymous) { nil } - before_all do - project.add_guest(guest) - project.add_developer(developer) - end - before do sign_in(user) if user end diff --git a/spec/rubocop/cop/rake/require_spec.rb b/spec/rubocop/cop/rake/require_spec.rb index de484643d6e..603a4a56c9f 100644 --- a/spec/rubocop/cop/rake/require_spec.rb +++ b/spec/rubocop/cop/rake/require_spec.rb @@ -26,7 +26,7 @@ RSpec.describe RuboCop::Cop::Rake::Require do allow(cop).to receive(:in_rake_file?).and_return(true) end - it 'registers an offenses for require methods' do + it 'registers offenses for require methods' do expect_offense(<<~RUBY) require 'json' ^^^^^^^^^^^^^^ #{msg} @@ -35,6 +35,26 @@ RSpec.describe RuboCop::Cop::Rake::Require do RUBY end + it 'registers offenses for require methods inside `namespace` definitions' do + expect_offense(<<~RUBY) + namespace :foo do + require 'json' + ^^^^^^^^^^^^^^ #{msg} + + task :parse do + end + end + + namespace :bar do + require_relative 'gitlab/json' + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{msg} + + task :parse do + end + end + RUBY + end + it 'does not register offense inside `task` definition' do expect_no_offenses(<<~RUBY) task :parse do @@ -63,8 +83,13 @@ RSpec.describe RuboCop::Cop::Rake::Require do require 'json' end + def self.run + require 'yaml' + end + task :parse do load_deps + run end RUBY end diff --git a/spec/serializers/deployment_entity_spec.rb b/spec/serializers/deployment_entity_spec.rb index c8b484435f8..a1f71dd185a 100644 --- a/spec/serializers/deployment_entity_spec.rb +++ b/spec/serializers/deployment_entity_spec.rb @@ -6,7 +6,7 @@ RSpec.describe DeploymentEntity do let_it_be(:developer) { create(:user) } let_it_be(:reporter) { create(:user) } let_it_be(:user) { developer } - let_it_be(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository, developers: developer, reporters: reporter) } let_it_be(:environment) { create(:environment, project: project) } let_it_be_with_reload(:pipeline) { create(:ci_pipeline, project: project, user: user) } let_it_be_with_reload(:build) { create(:ci_build, :manual, :environment_with_deployment_tier, pipeline: pipeline) } @@ -21,11 +21,6 @@ RSpec.describe DeploymentEntity do subject { entity.as_json } - before_all do - project.add_developer(developer) - project.add_reporter(reporter) - end - before do allow(request).to receive(:current_user).and_return(user) allow(request).to receive(:project).and_return(project) diff --git a/spec/serializers/environment_entity_spec.rb b/spec/serializers/environment_entity_spec.rb index 551acd2860d..845293ff67c 100644 --- a/spec/serializers/environment_entity_spec.rb +++ b/spec/serializers/environment_entity_spec.rb @@ -12,13 +12,9 @@ RSpec.describe EnvironmentEntity do end let_it_be(:user) { create(:user) } - let_it_be(:project) { create(:project, :repository) } + let_it_be(:project) { create(:project, :repository, developers: user) } let_it_be(:environment, refind: true) { create(:environment, project: project) } - before_all do - project.add_developer(user) - end - before do allow(request).to receive(:current_user).and_return(user) allow(request).to receive(:project).and_return(project) diff --git a/spec/serializers/environment_serializer_spec.rb b/spec/serializers/environment_serializer_spec.rb index 8e4bb2c7dd0..8daa4d7e18c 100644 --- a/spec/serializers/environment_serializer_spec.rb +++ b/spec/serializers/environment_serializer_spec.rb @@ -6,7 +6,7 @@ RSpec.describe EnvironmentSerializer, feature_category: :continuous_delivery do include CreateEnvironmentsHelpers let_it_be(:user) { create(:user) } - let_it_be(:project, reload: true) { create(:project, :repository) } + let_it_be(:project, reload: true) { create(:project, :repository, developers: user) } let(:json) do described_class @@ -14,10 +14,6 @@ RSpec.describe EnvironmentSerializer, feature_category: :continuous_delivery do .represent(resource) end - before_all do - project.add_developer(user) - end - it_behaves_like 'avoid N+1 on environments serialization' context 'when :environment_stop_actions_include_all_finished_deployments FF is disabled' do diff --git a/spec/services/integrations/slack_installation/group_service_spec.rb b/spec/services/integrations/slack_installation/group_service_spec.rb index d13de025fb6..d8d7bf6c56d 100644 --- a/spec/services/integrations/slack_installation/group_service_spec.rb +++ b/spec/services/integrations/slack_installation/group_service_spec.rb @@ -4,15 +4,11 @@ require 'spec_helper' RSpec.describe Integrations::SlackInstallation::GroupService, feature_category: :integrations do let_it_be_with_refind(:group) { create(:group) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, owner_of: group) } let(:params) { {} } subject(:service) { described_class.new(group, current_user: user, params: params) } - before_all do - group.add_owner(user) - end - it_behaves_like Integrations::SlackInstallation::BaseService do let(:installation_alias) { group.full_path } let(:integration) { Integrations::GitlabSlackApplication.for_group(group).first } diff --git a/spec/services/integrations/slack_installation/project_service_spec.rb b/spec/services/integrations/slack_installation/project_service_spec.rb index 483a7046d66..97cbb359fde 100644 --- a/spec/services/integrations/slack_installation/project_service_spec.rb +++ b/spec/services/integrations/slack_installation/project_service_spec.rb @@ -4,15 +4,11 @@ require 'spec_helper' RSpec.describe Integrations::SlackInstallation::ProjectService, feature_category: :integrations do let_it_be_with_refind(:project) { create(:project) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, owner_of: project) } let(:params) { {} } subject(:service) { described_class.new(project, current_user: user, params: params) } - before_all do - project.add_owner(user) - end - it_behaves_like Integrations::SlackInstallation::BaseService do let(:installation_alias) { project.full_path } let(:integration) { project.gitlab_slack_application_integration } diff --git a/spec/support/shared_examples/features/value_streams_dashboard_shared_examples.rb b/spec/support/shared_examples/features/value_streams_dashboard_shared_examples.rb index f29b9409fdf..fff8569b31f 100644 --- a/spec/support/shared_examples/features/value_streams_dashboard_shared_examples.rb +++ b/spec/support/shared_examples/features/value_streams_dashboard_shared_examples.rb @@ -40,7 +40,7 @@ RSpec.shared_examples 'renders metrics comparison table' do it 'renders the metrics comparison visualization' do expect(metric_table).to be_visible - expect(metric_table).to have_content format(_("Metrics comparison for %{name} group"), name: group_name) + expect(metric_table).to have_content format(_("Metrics comparison for %{title}"), title: panel_title) end it "renders the available metrics" do diff --git a/spec/views/layouts/project.html.haml_spec.rb b/spec/views/layouts/project.html.haml_spec.rb index d19c600d9f2..ac75c825947 100644 --- a/spec/views/layouts/project.html.haml_spec.rb +++ b/spec/views/layouts/project.html.haml_spec.rb @@ -4,10 +4,11 @@ require 'spec_helper' RSpec.describe 'layouts/project', feature_category: :groups_and_projects do let(:invite_member) { true } + let(:project) { build_stubbed(:project) } before do allow(view).to receive(:can_admin_project_member?).and_return(invite_member) - assign(:project, build_stubbed(:project)) + assign(:project, project) allow(view).to receive(:current_user_mode).and_return(Gitlab::Auth::CurrentUserMode.new(build_stubbed(:user))) end @@ -26,4 +27,24 @@ RSpec.describe 'layouts/project', feature_category: :groups_and_projects do it { is_expected.not_to have_selector('.js-invite-members-modal') } end + + context 'with no transfer in progress' do + before do + allow(project).to receive(:git_transfer_in_progress?).and_return(false) + end + + it 'does not render the alert' do + is_expected.not_to have_css('[data-testid="transferring-alert"]') + end + end + + context 'with transfer in progress' do + before do + allow(project).to receive(:git_transfer_in_progress?).and_return(true) + end + + it 'renders the alert' do + is_expected.to have_css('[data-testid="transferring-alert"]') + end + end end diff --git a/spec/views/projects/settings/operations/show.html.haml_spec.rb b/spec/views/projects/settings/operations/show.html.haml_spec.rb index 664c8b7432e..9edacad3f74 100644 --- a/spec/views/projects/settings/operations/show.html.haml_spec.rb +++ b/spec/views/projects/settings/operations/show.html.haml_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' RSpec.describe 'projects/settings/operations/show' do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, maintainer_of: project) } let_it_be(:error_tracking_setting) do create(:project_error_tracking_setting, project: project) @@ -12,10 +12,6 @@ RSpec.describe 'projects/settings/operations/show' do let_it_be(:prometheus_integration) { create(:prometheus_integration, project: project) } - before_all do - project.add_maintainer(user) - end - before do assign :project, project diff --git a/spec/workers/issuable/related_links_create_worker_spec.rb b/spec/workers/issuable/related_links_create_worker_spec.rb index d2d0aeb7081..4e048bb63fa 100644 --- a/spec/workers/issuable/related_links_create_worker_spec.rb +++ b/spec/workers/issuable/related_links_create_worker_spec.rb @@ -9,7 +9,7 @@ RSpec.describe Issuable::RelatedLinksCreateWorker, feature_category: :portfolio_ let_it_be(:target2) { create(:work_item, :task, project: project) } let_it_be(:link1) { create(:work_item_link, source: issuable, target: target1) } let_it_be(:link2) { create(:work_item_link, source: issuable, target: target2) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, reporter_of: project) } let(:params) do { @@ -21,10 +21,6 @@ RSpec.describe Issuable::RelatedLinksCreateWorker, feature_category: :portfolio_ }.transform_keys(&:to_s) end - before_all do - project.add_reporter(user) - end - subject { described_class.new.perform(params) } describe '#perform' do diff --git a/spec/workers/work_items/import_work_items_csv_worker_spec.rb b/spec/workers/work_items/import_work_items_csv_worker_spec.rb index 056960fbcf2..ec6fefa5385 100644 --- a/spec/workers/work_items/import_work_items_csv_worker_spec.rb +++ b/spec/workers/work_items/import_work_items_csv_worker_spec.rb @@ -4,14 +4,10 @@ require 'spec_helper' RSpec.describe WorkItems::ImportWorkItemsCsvWorker, feature_category: :team_planning do let_it_be(:project) { create(:project) } - let_it_be(:user) { create(:user) } + let_it_be(:user) { create(:user, reporter_of: project) } let(:upload) { create(:upload, :with_file) } - before_all do - project.add_reporter(user) - end - subject { described_class.new.perform(user.id, project.id, upload.id) } describe '#perform' do diff --git a/tooling/graphql/docs/helper.rb b/tooling/graphql/docs/helper.rb index 99f689f3cb1..f17acda11f8 100644 --- a/tooling/graphql/docs/helper.rb +++ b/tooling/graphql/docs/helper.rb @@ -64,6 +64,8 @@ module Tooling This documentation is auto generated by a script. Please do not edit this file directly. + To edit the introductory text, modify `tooling/graphql/docs/templates/default.md.haml`. + Run `bundle exec rake gitlab:graphql:compile_docs` or check the `compile_docs` task in `lib/tasks/gitlab/graphql.rake`. --> diff --git a/tooling/graphql/docs/templates/default.md.haml b/tooling/graphql/docs/templates/default.md.haml index 2ff10cf29cd..46862d00b5b 100644 --- a/tooling/graphql/docs/templates/default.md.haml +++ b/tooling/graphql/docs/templates/default.md.haml @@ -7,7 +7,7 @@ This documentation is self-generated based on GitLab current GraphQL schema. - The API can be explored using the [interactive GraphQL explorer](../index.md#interactive-graphql-explorer). + The API can be explored using the [interactive GraphQL explorer](../index.md#interactive-graphql-explorer). Developers can also [generate a machine-readable GraphQL schema in IDL and JSON formats](../../../development/rake_tasks.md#update-machine-readable-schema-files). Each table below documents a GraphQL type. Types match loosely to models, but not all fields and methods on a model are available via GraphQL. diff --git a/vendor/project_templates/typo3_distribution.tar.gz b/vendor/project_templates/typo3_distribution.tar.gz index 27464406e40..720ce106047 100644 Binary files a/vendor/project_templates/typo3_distribution.tar.gz and b/vendor/project_templates/typo3_distribution.tar.gz differ