Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-04-28 09:12:20 +00:00
parent 58d8928b52
commit 23ac82a9db
117 changed files with 1123 additions and 513 deletions

10
Gemfile
View File

@ -1,9 +1,5 @@
# frozen_string_literal: true
def next?
File.basename(__FILE__) == "Gemfile.next"
end
source 'https://rubygems.org'
if ENV.fetch('BUNDLER_CHECKSUM_VERIFICATION_OPT_IN', 'false') != 'false' # this verification is still experimental
@ -29,11 +25,7 @@ gem 'bundler-checksum', '~> 0.1.0', path: 'vendor/gems/bundler-checksum', requir
#
# See https://docs.gitlab.com/ee/development/gemfile.html#upgrade-rails for guidelines when upgrading Rails
if next?
gem 'rails', '~> 7.1.5.1', feature_category: :shared
else
gem 'rails', '~> 7.0.8.7', feature_category: :shared
end
gem 'rails', '~> 7.1.5.1', feature_category: :shared
gem 'activerecord-gitlab', path: 'gems/activerecord-gitlab', feature_category: :shared
# This can be dropped after upgrading to Rails 7.2: https://github.com/rails/rails/pull/49674

View File

@ -2,18 +2,18 @@
{"name":"CFPropertyList","version":"3.0.7","platform":"ruby","checksum":"c45721614aca8d5eb6fa216f2ec28ec38de1a94505e9766a20e98745492c3c4c"},
{"name":"RedCloth","version":"4.3.4","platform":"ruby","checksum":"5231b2fdd91a933915cba330e5fd1a74025e77b56f57b7404c7191ebf2812297"},
{"name":"acme-client","version":"2.0.21","platform":"ruby","checksum":"e0a044f993cd26f0ba7f8b13a3b2b007ef864cfaa333075a2d8865b087297641"},
{"name":"actioncable","version":"7.0.8.7","platform":"ruby","checksum":"4034513841df2fd09dbbf38f37c1a00fc6c841122a8714e5d6916b8d6ce2f162"},
{"name":"actionmailbox","version":"7.0.8.7","platform":"ruby","checksum":"940eeaa3d8e85dcd9fc6069e39571e13c5a4bdb0db52c7ab96d14da81d6ac1c2"},
{"name":"actionmailer","version":"7.0.8.7","platform":"ruby","checksum":"8be8f9a2f8774af89822bc92e1ab6df10b3a2be59c75486a34e86a1f10d88d14"},
{"name":"actionpack","version":"7.0.8.7","platform":"ruby","checksum":"40e6b1d687904a4fd2285d1fa3aad3d9a9d9ba8fd8858dd0faa9f4673c3f5e2c"},
{"name":"actiontext","version":"7.0.8.7","platform":"ruby","checksum":"cb75d2db97d5b2c8caccdc0f643541df36c2c53f076a2d49b226f971d8d528a0"},
{"name":"actionview","version":"7.0.8.7","platform":"ruby","checksum":"be975bc9c61903fe5da80a97c345271159033bcbba63988c7f27b6b8b98f7fed"},
{"name":"activejob","version":"7.0.8.7","platform":"ruby","checksum":"eff4db3aeaee34863a47570089d11d5577ed0ea42b1475dc9be6a413be182a20"},
{"name":"activemodel","version":"7.0.8.7","platform":"ruby","checksum":"f13b04bb055c1e85b965ce40b0a2e671b8d97835083597bc7fbc04cde0f40a83"},
{"name":"activerecord","version":"7.0.8.7","platform":"ruby","checksum":"f94fc8510e58a18e462c5ee8862c9be75e2bfad0688e8d022b86a6e05df2a45a"},
{"name":"actioncable","version":"7.1.5.1","platform":"ruby","checksum":"764637b5b2d97b94e412d562c177bfd16b0fd769d55c98846362f5263e8aaa0d"},
{"name":"actionmailbox","version":"7.1.5.1","platform":"ruby","checksum":"c3c20589fe43e6fa88bba2d76a6f9805ffdd02531f4a9a4af8197d59f5a5360a"},
{"name":"actionmailer","version":"7.1.5.1","platform":"ruby","checksum":"b213d6d880b23b093ccfef3b4f87a3d27e4666442f71b5b634b2d19e19a49759"},
{"name":"actionpack","version":"7.1.5.1","platform":"ruby","checksum":"2bc263d9f43f16cc3b3360f59659ab11f140577602f371f1a968e2672b38d718"},
{"name":"actiontext","version":"7.1.5.1","platform":"ruby","checksum":"b8e261cfad5bc6a78b3f15be5e7c7f32190041b3dc6f027a3a353b4392d2f7ec"},
{"name":"actionview","version":"7.1.5.1","platform":"ruby","checksum":"8c559a213501798e29b50b5341a643a70bbf6fa0aa2abaf571d0efc59dc4f6aa"},
{"name":"activejob","version":"7.1.5.1","platform":"ruby","checksum":"7633376c857f4c491d06b5a7f5d86d9f07afc595398354a3f1abe80eb7e35767"},
{"name":"activemodel","version":"7.1.5.1","platform":"ruby","checksum":"74727466854a7fbdfe8f2702ca3112b23877500d4926bf7e02e921ad542191f1"},
{"name":"activerecord","version":"7.1.5.1","platform":"ruby","checksum":"f40ad1609bf33b9ba5bdc4e16d80a77b1517153234ceb413d31d635d7b91f1e3"},
{"name":"activerecord-explain-analyze","version":"0.1.0","platform":"ruby","checksum":"5debb11fe23f35b91953a80677d80ba9284ee737fd9d148c1d7603ce45217f7b"},
{"name":"activestorage","version":"7.0.8.7","platform":"ruby","checksum":"ca411e73733a50983f44b0945bfd0612313beb3a8f914cd3a88e4fcd99399ef5"},
{"name":"activesupport","version":"7.0.8.7","platform":"ruby","checksum":"df4702375de924aae81709c831605317c5417f0bd9e502a0373ff84a067204ff"},
{"name":"activestorage","version":"7.1.5.1","platform":"ruby","checksum":"ae6b8b076858c666eaad6f896d786b67654235e861e24a83f61f1cc97b43ff63"},
{"name":"activesupport","version":"7.1.5.1","platform":"ruby","checksum":"9f0c482e473b9868cb3dfe3e9db549a3bd2302c02e4f595a5caac144a8c7cfb8"},
{"name":"addressable","version":"2.8.7","platform":"ruby","checksum":"462986537cf3735ab5f3c0f557f14155d778f4b43ea4f485a9deb9c8f7c58232"},
{"name":"aes_key_wrap","version":"1.1.0","platform":"ruby","checksum":"b935f4756b37375895db45669e79dfcdc0f7901e12d4e08974d5540c8e0776a5"},
{"name":"akismet","version":"3.0.0","platform":"ruby","checksum":"74991b8e3d3257eeea996b47069abb8da2006c84a144255123e8dffd1c86b230"},
@ -50,7 +50,7 @@
{"name":"batch-loader","version":"2.0.5","platform":"ruby","checksum":"964bf638b8f498bab40abaafc6f89c057b2e02aa25b64fc1ec12872ad6bff213"},
{"name":"bcrypt","version":"3.1.20","platform":"java","checksum":"8236dff31f6f36cffe334939e4ea59c41e1c94e2e246c01783575fa6df40373f"},
{"name":"bcrypt","version":"3.1.20","platform":"ruby","checksum":"8410f8c7b3ed54a3c00cd2456bf13917d695117f033218e2483b2e40b0784099"},
{"name":"benchmark","version":"0.2.0","platform":"ruby","checksum":"5f7087b794613abdd3ac9c13f4351f65b164bcb15ced2ad29508e365f9b28c77"},
{"name":"benchmark","version":"0.4.0","platform":"ruby","checksum":"0f12f8c495545e3710c3e4f0480f63f06b4c842cc94cec7f33a956f5180e874a"},
{"name":"benchmark-ips","version":"2.14.0","platform":"ruby","checksum":"b72bc8a65d525d5906f8cd94270dccf73452ee3257a32b89fbd6684d3e8a9b1d"},
{"name":"benchmark-malloc","version":"0.2.0","platform":"ruby","checksum":"37c68f0435261634026f584d79956a35325a3027e3e6b4cc8d7575aa10537e6b"},
{"name":"benchmark-memory","version":"0.2.0","platform":"ruby","checksum":"ca1e436433b09535ee8f64f80600a5edb407cff1f6ac70e089ca238118e6ab5c"},
@ -337,8 +337,11 @@
{"name":"imagen","version":"0.2.0","platform":"ruby","checksum":"369fe912078877dba92615ebfc6f35a7d833e31f24f47bdd3ad5371a4139e24b"},
{"name":"influxdb-client","version":"3.2.0","platform":"ruby","checksum":"dc1e8ec80542f64c9f31af6d9bfa4c147474bf32b9179a7f0cab970793b8e1f2"},
{"name":"invisible_captcha","version":"2.1.0","platform":"ruby","checksum":"02b452f3eb1b691d155ba3e8e97e1be0e6b6be62e8bc94957234b9cde0852b1e"},
{"name":"io-console","version":"0.8.0","platform":"java","checksum":"3cc6fd5c66e587145c1fdf8dc40c2e3d851e90722a5d0cc3f38da352f06fe1bd"},
{"name":"io-console","version":"0.8.0","platform":"ruby","checksum":"cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2"},
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"irb","version":"1.15.1","platform":"ruby","checksum":"d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
@ -518,10 +521,12 @@
{"name":"pg_query","version":"6.1.0","platform":"ruby","checksum":"8b005229e209f12c5887c34c60d0eb2a241953b9475b53a9840d24578532481e"},
{"name":"plist","version":"3.7.0","platform":"ruby","checksum":"703ca90a7cb00e8263edd03da2266627f6741d280c910abbbac07c95ffb2f073"},
{"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"},
{"name":"pp","version":"0.6.2","platform":"ruby","checksum":"947ec3120c6f92195f8ee8aa25a7b2c5297bb106d83b41baa02983686577b6ff"},
{"name":"prawn","version":"2.5.0","platform":"ruby","checksum":"f4e20e3b4f30bf5b9ae37dad15eb421831594553aa930b2391b0fa0a99c43cb6"},
{"name":"prawn-svg","version":"0.37.0","platform":"ruby","checksum":"271bdd032c066777b2e76fe971b570e24cb6f4890d5658588106e8aa5b6e2830"},
{"name":"premailer","version":"1.23.0","platform":"ruby","checksum":"f0d7f6ba299559c96ddf982aa5263f85e5617c86437c8d8ffff120813b2d7efb"},
{"name":"premailer-rails","version":"1.12.0","platform":"ruby","checksum":"c13815d161b9bc7f7d3d81396b0bb0a61a90fa9bd89931548bf4e537c7710400"},
{"name":"prettyprint","version":"0.2.0","platform":"ruby","checksum":"2bc9e15581a94742064a3cc8b0fb9d45aae3d03a1baa6ef80922627a0766f193"},
{"name":"prime","version":"0.1.3","platform":"ruby","checksum":"baf031c50d6ce923594913befc8ac86a3251bffb9d6a5e8b03687962054e53e3"},
{"name":"prism","version":"1.2.0","platform":"ruby","checksum":"24ff9cd3232346e68052659f14c9a618022ea98935f774df465206aba5c06d2f"},
{"name":"proc_to_ast","version":"0.1.0","platform":"ruby","checksum":"92a73fa66e2250a83f8589f818b0751bcf227c68f85916202df7af85082f8691"},
@ -537,6 +542,8 @@
{"name":"pry-byebug","version":"3.10.1","platform":"ruby","checksum":"c8f975c32255bfdb29e151f5532130be64ff3d0042dc858d0907e849125581f8"},
{"name":"pry-rails","version":"0.3.11","platform":"ruby","checksum":"a69e28e24a34d75d1f60bcf241192a54253f8f7ef8a62cba1e75750a9653593d"},
{"name":"pry-shell","version":"0.6.4","platform":"ruby","checksum":"ad024882d29912b071a7de65ebea538b242d2dc1498c60c7c2352ef94769f208"},
{"name":"psych","version":"5.2.3","platform":"java","checksum":"3e5425b9e8a2f41cc2707d5ef14fdc1ae908abbafb12fe45727bd63900056585"},
{"name":"psych","version":"5.2.3","platform":"ruby","checksum":"84a54bb952d14604fea22d99938348814678782f58b12648fcdfa4d2fce859ee"},
{"name":"public_suffix","version":"6.0.1","platform":"ruby","checksum":"61d44e1cab5cbbbe5b31068481cf16976dd0dc1b6b07bd95617ef8c5e3e00c6f"},
{"name":"puma","version":"6.5.0","platform":"java","checksum":"a58eea585d291aa33796add9884208bc1591da5d8e61886f8ac74d080b298c40"},
{"name":"puma","version":"6.5.0","platform":"ruby","checksum":"94d1b75cab7f356d52e4f1b17b9040a090889b341dbeee6ee3703f441dc189f2"},
@ -554,12 +561,13 @@
{"name":"rack-session","version":"1.0.2","platform":"ruby","checksum":"a02115e5420b4de036839b9811e3f7967d73446a554b42aa45106af335851d76"},
{"name":"rack-test","version":"2.1.0","platform":"ruby","checksum":"0c61fc61904049d691922ea4bb99e28004ed3f43aa5cfd495024cc345f125dfb"},
{"name":"rack-timeout","version":"0.7.0","platform":"ruby","checksum":"757337e9793cca999bb73a61fe2a7d4280aa9eefbaf787ce3b98d860749c87d9"},
{"name":"rails","version":"7.0.8.7","platform":"ruby","checksum":"5e67ed4dd915746349bfb8c7ae2f531d3a36eb68fbe2f60ede02a0500715cded"},
{"name":"rackup","version":"1.0.1","platform":"ruby","checksum":"ba86604a28989fe1043bff20d819b360944ca08156406812dca6742b24b3c249"},
{"name":"rails","version":"7.1.5.1","platform":"ruby","checksum":"05aea2ed7b6392b41ce0fc11455de118455025a431b6ea334a7ac2b101608804"},
{"name":"rails-controller-testing","version":"1.0.5","platform":"ruby","checksum":"741448db59366073e86fc965ba403f881c636b79a2c39a48d0486f2607182e94"},
{"name":"rails-dom-testing","version":"2.0.3","platform":"ruby","checksum":"b140c4f39f6e609c8113137b9a60dfc2ecb89864e496f87f23a68b3b8f12d8d1"},
{"name":"rails-dom-testing","version":"2.2.0","platform":"ruby","checksum":"e515712e48df1f687a1d7c380fd7b07b8558faa26464474da64183a7426fa93b"},
{"name":"rails-html-sanitizer","version":"1.6.1","platform":"ruby","checksum":"e3d2fb10339f03b802e39c7f6cac28c54fd404d3f65ae39c31cca9d150c5cbf0"},
{"name":"rails-i18n","version":"7.0.10","platform":"ruby","checksum":"efae16e0ac28c0f42e98555c8db1327d69ab02058c8b535e0933cb106dd931ca"},
{"name":"railties","version":"7.0.8.7","platform":"ruby","checksum":"1ab985280b02bc4b176d36e1011148db600b763c646e3de88c02a665d864505f"},
{"name":"railties","version":"7.1.5.1","platform":"ruby","checksum":"0be15562e2ded4efdc1b6c30f884b6d838c9ba49573dde042334b752b043e2fb"},
{"name":"rainbow","version":"3.1.1","platform":"ruby","checksum":"039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a"},
{"name":"rake","version":"13.0.6","platform":"ruby","checksum":"5ce4bf5037b4196c24ac62834d8db1ce175470391026bd9e557d669beeb19097"},
{"name":"rake-compiler-dock","version":"1.9.1","platform":"ruby","checksum":"e73720a29aba9c114728ce39cc0d8eef69ba61d88e7978c57bac171724cd4d53"},
@ -569,6 +577,7 @@
{"name":"rbs","version":"3.6.1","platform":"ruby","checksum":"ed7273d018556844583d1785ac54194e67eec594d68e317d57fa90ad035532c0"},
{"name":"rbtrace","version":"0.5.1","platform":"ruby","checksum":"e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc"},
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
{"name":"rdoc","version":"6.13.0","platform":"ruby","checksum":"32c2139ae43ed91b7c43032fe5423d21d57718829cc5a11e5c9710d2aa5e0329"},
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-gnu","checksum":"ed3fe87adbc637373268d2a1b69f07def5079535dd961db735fdfac8fa63520f"},
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-musl","checksum":"edf696d3a4587f580828e99cf36b7e04a86e0ebe103f704955b310a3f61e69de"},
{"name":"re2","version":"2.15.0","platform":"arm-linux-gnu","checksum":"dbe53c65859a868b42297939daeb610806ae6b1181ff09d1c454e1cdf86ebbc0"},
@ -597,6 +606,7 @@
{"name":"regexp_parser","version":"2.10.0","platform":"ruby","checksum":"cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61"},
{"name":"regexp_property_values","version":"1.0.0","platform":"java","checksum":"5e26782b01241616855c4ee7bb8a62fce9387e484f2d3eaf04f2a0633708222e"},
{"name":"regexp_property_values","version":"1.0.0","platform":"ruby","checksum":"162499dc0bba1e66d334273a059f207a61981cc8cc69d2ca743594e7886d080f"},
{"name":"reline","version":"0.6.0","platform":"ruby","checksum":"57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2"},
{"name":"representable","version":"3.2.0","platform":"ruby","checksum":"cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace"},
{"name":"request_store","version":"1.7.0","platform":"ruby","checksum":"e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb"},
{"name":"responders","version":"3.0.1","platform":"ruby","checksum":"613fe28e498987f4feaa3230aa6313ca4bd5f0563a3da83511b0dd6cd8f47292"},
@ -679,6 +689,7 @@
{"name":"sass-embedded","version":"1.77.5","platform":"x86_64-linux-musl","checksum":"c5dd43155112f7b4eb9e3cafb8ceaa54a157977a2033b1022875bac71a4a4d56"},
{"name":"sawyer","version":"0.9.2","platform":"ruby","checksum":"fa3a72d62a4525517b18857ddb78926aab3424de0129be6772a8e2ba240e7aca"},
{"name":"sd_notify","version":"0.1.1","platform":"ruby","checksum":"cbc7ac6caa7cedd26b30a72b5eeb6f36050dc0752df263452ea24fb5a4ad3131"},
{"name":"securerandom","version":"0.4.1","platform":"ruby","checksum":"cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1"},
{"name":"seed-fu","version":"2.3.9","platform":"ruby","checksum":"6d902d12dc1b88a16d487506baacc93b3a92e3671fdd603110d1600d35fbf478"},
{"name":"selenium-webdriver","version":"4.27.0","platform":"ruby","checksum":"8821f4ad60b935cfcdc5954c0a6642d894e936250aece8bf37a6fcbebe5eb6e0"},
{"name":"semver_dialects","version":"3.6.0","platform":"ruby","checksum":"bb8a78037c6c748114267d0e00f0a19e2701a3837c00cc37336e8224bc8473a3"},
@ -718,6 +729,8 @@
{"name":"state_machines-activemodel","version":"0.8.0","platform":"ruby","checksum":"e932dab190d4be044fb5f9cab01a3ea0b092c5f113d4676c6c0a0d49bf738d2c"},
{"name":"state_machines-activerecord","version":"0.8.0","platform":"ruby","checksum":"072fb701b8ab03de0608297f6c55dc34ed096e556fa8f77e556f3c461c71aab6"},
{"name":"state_machines-rspec","version":"0.6.0","platform":"ruby","checksum":"2ba57a45df57d0c97f79146e2e0f65f519b52e65e182805ef79cb73b1fe5c0bd"},
{"name":"stringio","version":"3.1.7","platform":"java","checksum":"167bdd3d60a002ee94bc289cc3259638aaadc36a47b3086a44a694b5dc72a499"},
{"name":"stringio","version":"3.1.7","platform":"ruby","checksum":"5b78b7cb242a315fb4fca61a8255d62ec438f58da2b90be66048546ade4507fa"},
{"name":"strings","version":"0.2.1","platform":"ruby","checksum":"933293b3c95cf85b81eb44b3cf673e3087661ba739bbadfeadf442083158d6fb"},
{"name":"strings-ansi","version":"0.2.0","platform":"ruby","checksum":"90262d760ea4a94cc2ae8d58205277a343409c288cbe7c29416b1826bd511c88"},
{"name":"swd","version":"2.0.3","platform":"ruby","checksum":"4cdbe2a4246c19f093fce22e967ec3ebdd4657d37673672e621bf0c7eb770655"},

View File

@ -235,73 +235,85 @@ GEM
base64 (~> 0.2.0)
faraday (>= 1.0, < 3.0.0)
faraday-retry (>= 1.0, < 3.0.0)
actioncable (7.0.8.7)
actionpack (= 7.0.8.7)
activesupport (= 7.0.8.7)
actioncable (7.1.5.1)
actionpack (= 7.1.5.1)
activesupport (= 7.1.5.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
actionmailbox (7.0.8.7)
actionpack (= 7.0.8.7)
activejob (= 7.0.8.7)
activerecord (= 7.0.8.7)
activestorage (= 7.0.8.7)
activesupport (= 7.0.8.7)
zeitwerk (~> 2.6)
actionmailbox (7.1.5.1)
actionpack (= 7.1.5.1)
activejob (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
mail (>= 2.7.1)
net-imap
net-pop
net-smtp
actionmailer (7.0.8.7)
actionpack (= 7.0.8.7)
actionview (= 7.0.8.7)
activejob (= 7.0.8.7)
activesupport (= 7.0.8.7)
actionmailer (7.1.5.1)
actionpack (= 7.1.5.1)
actionview (= 7.1.5.1)
activejob (= 7.1.5.1)
activesupport (= 7.1.5.1)
mail (~> 2.5, >= 2.5.4)
net-imap
net-pop
net-smtp
rails-dom-testing (~> 2.0)
actionpack (7.0.8.7)
actionview (= 7.0.8.7)
activesupport (= 7.0.8.7)
rack (~> 2.0, >= 2.2.4)
rails-dom-testing (~> 2.2)
actionpack (7.1.5.1)
actionview (= 7.1.5.1)
activesupport (= 7.1.5.1)
nokogiri (>= 1.8.5)
racc
rack (>= 2.2.4)
rack-session (>= 1.0.1)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.2.0)
actiontext (7.0.8.7)
actionpack (= 7.0.8.7)
activerecord (= 7.0.8.7)
activestorage (= 7.0.8.7)
activesupport (= 7.0.8.7)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
actiontext (7.1.5.1)
actionpack (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
globalid (>= 0.6.0)
nokogiri (>= 1.8.5)
actionview (7.0.8.7)
activesupport (= 7.0.8.7)
actionview (7.1.5.1)
activesupport (= 7.1.5.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activejob (7.0.8.7)
activesupport (= 7.0.8.7)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activejob (7.1.5.1)
activesupport (= 7.1.5.1)
globalid (>= 0.3.6)
activemodel (7.0.8.7)
activesupport (= 7.0.8.7)
activerecord (7.0.8.7)
activemodel (= 7.0.8.7)
activesupport (= 7.0.8.7)
activemodel (7.1.5.1)
activesupport (= 7.1.5.1)
activerecord (7.1.5.1)
activemodel (= 7.1.5.1)
activesupport (= 7.1.5.1)
timeout (>= 0.4.0)
activerecord-explain-analyze (0.1.0)
activerecord (>= 4)
pg
activestorage (7.0.8.7)
actionpack (= 7.0.8.7)
activejob (= 7.0.8.7)
activerecord (= 7.0.8.7)
activesupport (= 7.0.8.7)
activestorage (7.1.5.1)
actionpack (= 7.1.5.1)
activejob (= 7.1.5.1)
activerecord (= 7.1.5.1)
activesupport (= 7.1.5.1)
marcel (~> 1.0)
mini_mime (>= 1.1.0)
activesupport (7.0.8.7)
activesupport (7.1.5.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
mutex_m
securerandom (>= 0.3)
tzinfo (~> 2.0)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
@ -379,7 +391,7 @@ GEM
base64 (0.2.0)
batch-loader (2.0.5)
bcrypt (3.1.20)
benchmark (0.2.0)
benchmark (0.4.0)
benchmark-ips (2.14.0)
benchmark-malloc (0.2.0)
benchmark-memory (0.2.0)
@ -1033,8 +1045,13 @@ GEM
csv
invisible_captcha (2.1.0)
rails (>= 5.2)
io-console (0.8.0)
io-event (1.9.0)
ipaddress (0.8.3)
irb (1.15.1)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
jaeger-client (1.1.0)
opentracing (~> 0.3)
thrift
@ -1453,6 +1470,8 @@ GEM
google-protobuf (>= 3.25.3)
plist (3.7.0)
png_quantizator (0.2.1)
pp (0.6.2)
prettyprint
prawn (2.5.0)
matrix (~> 0.4)
pdf-core (~> 0.10.0)
@ -1470,6 +1489,7 @@ GEM
actionmailer (>= 3)
net-smtp
premailer (~> 1.7, >= 1.7.9)
prettyprint (0.2.0)
prime (0.1.3)
forwardable
singleton
@ -1495,6 +1515,9 @@ GEM
pry (>= 0.13.0)
tty-markdown
tty-prompt
psych (5.2.3)
date
stringio
public_suffix (6.0.1)
puma (6.5.0)
nio4r (~> 2.0)
@ -1524,26 +1547,30 @@ GEM
rack-test (2.1.0)
rack (>= 1.3)
rack-timeout (0.7.0)
rails (7.0.8.7)
actioncable (= 7.0.8.7)
actionmailbox (= 7.0.8.7)
actionmailer (= 7.0.8.7)
actionpack (= 7.0.8.7)
actiontext (= 7.0.8.7)
actionview (= 7.0.8.7)
activejob (= 7.0.8.7)
activemodel (= 7.0.8.7)
activerecord (= 7.0.8.7)
activestorage (= 7.0.8.7)
activesupport (= 7.0.8.7)
rackup (1.0.1)
rack (< 3)
webrick
rails (7.1.5.1)
actioncable (= 7.1.5.1)
actionmailbox (= 7.1.5.1)
actionmailer (= 7.1.5.1)
actionpack (= 7.1.5.1)
actiontext (= 7.1.5.1)
actionview (= 7.1.5.1)
activejob (= 7.1.5.1)
activemodel (= 7.1.5.1)
activerecord (= 7.1.5.1)
activestorage (= 7.1.5.1)
activesupport (= 7.1.5.1)
bundler (>= 1.15.0)
railties (= 7.0.8.7)
railties (= 7.1.5.1)
rails-controller-testing (1.0.5)
actionpack (>= 5.0.1.rc1)
actionview (>= 5.0.1.rc1)
activesupport (>= 5.0.1.rc1)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.1)
loofah (~> 2.21)
@ -1551,13 +1578,14 @@ GEM
rails-i18n (7.0.10)
i18n (>= 0.7, < 2)
railties (>= 6.0.0, < 8)
railties (7.0.8.7)
actionpack (= 7.0.8.7)
activesupport (= 7.0.8.7)
method_source
railties (7.1.5.1)
actionpack (= 7.1.5.1)
activesupport (= 7.1.5.1)
irb
rackup (>= 1.0.0)
rake (>= 12.2)
thor (~> 1.0)
zeitwerk (~> 2.5)
thor (~> 1.0, >= 1.2.2)
zeitwerk (~> 2.6)
rainbow (3.1.1)
rake (13.0.6)
rake-compiler-dock (1.9.1)
@ -1573,6 +1601,8 @@ GEM
msgpack (>= 0.4.3)
optimist (>= 3.0.0)
rchardet (1.8.0)
rdoc (6.13.0)
psych (>= 4.0.0)
re2 (2.15.0)
mini_portile2 (~> 2.8.7)
recaptcha (5.12.3)
@ -1601,6 +1631,8 @@ GEM
redis (>= 4, < 6)
regexp_parser (2.10.0)
regexp_property_values (1.0.0)
reline (0.6.0)
io-console (~> 0.5)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
@ -1739,6 +1771,7 @@ GEM
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
sd_notify (0.1.1)
securerandom (0.4.1)
seed-fu (2.3.9)
activerecord (>= 3.1)
activesupport (>= 3.1)
@ -1844,6 +1877,7 @@ GEM
activesupport
rspec (~> 3.3)
state_machines
stringio (3.1.7)
strings (0.2.1)
strings-ansi (~> 0.2)
unicode-display_width (>= 1.5, < 3.0)
@ -2300,7 +2334,7 @@ DEPENDENCIES
rack-oauth2 (~> 2.2.1)
rack-proxy (~> 0.7.7)
rack-timeout (~> 0.7.0)
rails (~> 7.0.8.7)
rails (~> 7.1.5.1)
rails-controller-testing
rails-i18n (~> 7.0, >= 7.0.9)
rainbow (~> 3.0)

View File

@ -341,7 +341,7 @@
{"name":"io-console","version":"0.8.0","platform":"ruby","checksum":"cd6a9facbc69871d69b2cb8b926fc6ea7ef06f06e505e81a64f14a470fddefa2"},
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"irb","version":"1.15.2","platform":"ruby","checksum":"222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba"},
{"name":"irb","version":"1.15.1","platform":"ruby","checksum":"d9bca745ac4207a8b728a52b98b766ca909b86ff1a504bcde3d6f8c84faae890"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
@ -577,7 +577,7 @@
{"name":"rbs","version":"3.6.1","platform":"ruby","checksum":"ed7273d018556844583d1785ac54194e67eec594d68e317d57fa90ad035532c0"},
{"name":"rbtrace","version":"0.5.1","platform":"ruby","checksum":"e8cba64d462bfb8ba102d7be2ecaacc789247d52ac587d8003549d909cb9c5dc"},
{"name":"rchardet","version":"1.8.0","platform":"ruby","checksum":"693acd5253d5ade81a51940697955f6dd4bb2f0d245bda76a8e23deec70a52c7"},
{"name":"rdoc","version":"6.13.1","platform":"ruby","checksum":"62a0dac99493c94e8eb7a3fb44e55aefcb4cecb119f7991f25bddc5ed8d472f7"},
{"name":"rdoc","version":"6.13.0","platform":"ruby","checksum":"32c2139ae43ed91b7c43032fe5423d21d57718829cc5a11e5c9710d2aa5e0329"},
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-gnu","checksum":"ed3fe87adbc637373268d2a1b69f07def5079535dd961db735fdfac8fa63520f"},
{"name":"re2","version":"2.15.0","platform":"aarch64-linux-musl","checksum":"edf696d3a4587f580828e99cf36b7e04a86e0ebe103f704955b310a3f61e69de"},
{"name":"re2","version":"2.15.0","platform":"arm-linux-gnu","checksum":"dbe53c65859a868b42297939daeb610806ae6b1181ff09d1c454e1cdf86ebbc0"},
@ -606,7 +606,7 @@
{"name":"regexp_parser","version":"2.10.0","platform":"ruby","checksum":"cb6f0ddde88772cd64bff1dbbf68df66d376043fe2e66a9ef77fcb1b0c548c61"},
{"name":"regexp_property_values","version":"1.0.0","platform":"java","checksum":"5e26782b01241616855c4ee7bb8a62fce9387e484f2d3eaf04f2a0633708222e"},
{"name":"regexp_property_values","version":"1.0.0","platform":"ruby","checksum":"162499dc0bba1e66d334273a059f207a61981cc8cc69d2ca743594e7886d080f"},
{"name":"reline","version":"0.6.1","platform":"ruby","checksum":"1afcc9d7cb1029cdbe780d72f2f09251ce46d3780050f3ec39c3ccc6b60675fb"},
{"name":"reline","version":"0.6.0","platform":"ruby","checksum":"57620375dcbe56ec09bac7192bfb7460c716bbf0054dc94345ecaa5438e539d2"},
{"name":"representable","version":"3.2.0","platform":"ruby","checksum":"cc29bf7eebc31653586849371a43ffe36c60b54b0a6365b5f7d95ec34d1ebace"},
{"name":"request_store","version":"1.7.0","platform":"ruby","checksum":"e1b75d5346a315f452242a68c937ef8e48b215b9453a77a6c0acdca2934c88cb"},
{"name":"responders","version":"3.0.1","platform":"ruby","checksum":"613fe28e498987f4feaa3230aa6313ca4bd5f0563a3da83511b0dd6cd8f47292"},

View File

@ -1048,7 +1048,7 @@ GEM
io-console (0.8.0)
io-event (1.9.0)
ipaddress (0.8.3)
irb (1.15.2)
irb (1.15.1)
pp (>= 0.6.0)
rdoc (>= 4.0.0)
reline (>= 0.4.2)
@ -1601,7 +1601,7 @@ GEM
msgpack (>= 0.4.3)
optimist (>= 3.0.0)
rchardet (1.8.0)
rdoc (6.13.1)
rdoc (6.13.0)
psych (>= 4.0.0)
re2 (2.15.0)
mini_portile2 (~> 2.8.7)
@ -1631,7 +1631,7 @@ GEM
redis (>= 4, < 6)
regexp_parser (2.10.0)
regexp_property_values (1.0.0)
reline (0.6.1)
reline (0.6.0)
io-console (~> 0.5)
representable (3.2.0)
declarative (< 0.1.0)

View File

@ -1,47 +0,0 @@
/* eslint-disable no-underscore-dangle,@gitlab/require-i18n-strings,no-console */
function getPersistedCoverage() {
const storedPaths = localStorage.getItem('__coverage_paths__');
if (storedPaths) {
return JSON.parse(storedPaths);
}
return [];
}
function getCoverage() {
if (!window.__coverage__) {
throw new Error(
'Coverage object is missing on the page. Did you install Istanbul babel plugin and enable Webpack?',
);
}
const filePaths = Object.keys(window.__coverage__);
const existingPaths = getPersistedCoverage();
return [...new Set([...existingPaths, ...filePaths])];
}
function persistCoverage(coverage = getCoverage()) {
localStorage.setItem('__coverage_paths__', JSON.stringify(coverage));
console.log(`Coverage paths saved: ${coverage.length} files tracked`);
}
function updateCoverage() {
const coverage = getCoverage();
persistCoverage(coverage);
window.__coverageFilePaths = coverage;
}
window.addEventListener('beforeunload', () => {
updateCoverage();
});
window.__coveragePathsPersistence = {
update: updateCoverage,
getPaths() {
return window.__coverageFilePaths || [];
},
reset() {
localStorage.removeItem('__coverage_paths__');
window.__coverageFilePaths = [];
console.log('Coverage paths reset.');
},
};

View File

@ -23,6 +23,7 @@ import {
WORK_ITEM_TYPE_NAME_EPIC,
NAME_TO_ENUM_MAP,
WIDGET_TYPE_CUSTOM_FIELDS,
WIDGET_TYPE_STATUS,
} from '../constants';
import { findHierarchyWidgetDefinition } from '../utils';
import workItemParticipantsQuery from '../graphql/work_item_participants.query.graphql';
@ -139,6 +140,9 @@ export default {
workItemLabels() {
return this.isWidgetPresent(WIDGET_TYPE_LABELS);
},
workItemStatus() {
return this.isWidgetPresent(WIDGET_TYPE_STATUS);
},
workItemStartAndDueDate() {
return this.isWidgetPresent(WIDGET_TYPE_START_AND_DUE_DATE);
},
@ -188,7 +192,7 @@ export default {
return this.isWidgetPresent(WIDGET_TYPE_CUSTOM_FIELDS)?.customFieldValues;
},
showWorkItemStatus() {
return this.glFeatures.workItemStatusFeatureFlag;
return this.glFeatures.workItemStatusFeatureFlag && this.workItemStatus;
},
},
methods: {

View File

@ -20,12 +20,12 @@ class GroupsController < Groups::ApplicationController
before_action :group, except: [:index, :new, :create]
# Authorize
before_action :authorize_admin_group!, only: [:update, :projects, :transfer, :export, :download_export]
before_action :authorize_admin_group!, only: [:update, :transfer, :export, :download_export]
before_action :authorize_view_edit_page!, only: :edit
before_action :authorize_remove_group!, only: [:destroy, :restore]
before_action :authorize_create_group!, only: [:new]
before_action :group_projects, only: [:projects, :activity, :issues, :merge_requests]
before_action :group_projects, only: [:activity, :issues, :merge_requests]
before_action :event_filter, only: [:activity]
before_action :user_actions, only: [:show]
@ -47,7 +47,7 @@ class GroupsController < Groups::ApplicationController
push_frontend_feature_flag(:mr_approved_filter, type: :ops)
end
skip_cross_project_access_check :index, :new, :create, :edit, :update, :destroy, :projects
skip_cross_project_access_check :index, :new, :create, :edit, :update, :destroy
# When loading show as an atom feed, we render events that could leak cross
# project information
skip_cross_project_access_check :show, if: -> { request.format.html? }
@ -152,10 +152,6 @@ class GroupsController < Groups::ApplicationController
def merge_requests; end
def projects
@projects = @group.projects.with_statistics.page(params[:page])
end
def update
if Groups::UpdateService.new(@group, current_user, group_params).execute
@ -329,7 +325,7 @@ class GroupsController < Groups::ApplicationController
def determine_layout
if [:new, :create].include?(action_name.to_sym)
'dashboard'
elsif [:edit, :update, :projects].include?(action_name.to_sym)
elsif [:edit, :update].include?(action_name.to_sym)
'group_settings'
else
'group'

View File

@ -19,11 +19,8 @@ class Projects::IssuesController < Projects::ApplicationController
before_action :disable_query_limiting, only: [:create_merge_request, :move, :bulk_update]
before_action :check_issues_available!
before_action :issue, unless: ->(c) { ISSUES_EXCEPT_ACTIONS.include?(c.action_name.to_sym) }
before_action :redirect_if_work_item, unless: ->(c) { work_item_redirect_except_actions.include?(c.action_name.to_sym) }
before_action :require_incident_for_incident_routes, only: :show
after_action :log_issue_show, only: :show
before_action :set_issuables_index, if: ->(c) {
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request?
}
@ -31,6 +28,9 @@ class Projects::IssuesController < Projects::ApplicationController
SET_ISSUABLES_INDEX_ONLY_ACTIONS.include?(c.action_name.to_sym) && !index_html_request? && params[:search].present?
}
before_action :redirect_if_work_item, unless: ->(c) { work_item_redirect_except_actions.include?(c.action_name.to_sym) }
before_action :redirect_index_to_work_items, only: :index
# Allow write(create) issue
before_action :authorize_create_issue!, only: [:new, :create]
@ -72,6 +72,8 @@ class Projects::IssuesController < Projects::ApplicationController
push_frontend_feature_flag(:work_items_view_preference, current_user)
end
after_action :log_issue_show, only: :show
around_action :allow_gitaly_ref_name_caching, only: [:discussions]
respond_to :html
@ -474,6 +476,13 @@ class Projects::IssuesController < Projects::ApplicationController
redirect_to project_work_item_path(project, issue.iid, params: request.query_parameters)
end
def redirect_index_to_work_items
return unless index_html_request? && ::Feature.enabled?(:work_item_planning_view, project.group)
params = request.query_parameters.except("type").merge('type[]' => 'issue')
redirect_to project_work_items_path(project, params: params)
end
def require_incident_for_incident_routes
return unless params[:incident_tab].present?
return if issue.work_item_type&.incident?

View File

@ -268,6 +268,7 @@ module ApplicationSettingsHelper
:autocomplete_users_limit,
:autocomplete_users_unauthenticated_limit,
:ci_job_live_trace_enabled,
:ci_partitions_size_limit,
:concurrent_github_import_jobs_limit,
:concurrent_bitbucket_import_jobs_limit,
:concurrent_bitbucket_server_import_jobs_limit,

View File

@ -522,9 +522,11 @@ class ApplicationSetting < ApplicationRecord
if: ->(setting) { setting.external_auth_client_cert.present? }
jsonb_accessor :ci_cd_settings,
ci_job_live_trace_enabled: [:boolean, { default: false }]
ci_job_live_trace_enabled: [:boolean, { default: false }],
ci_partitions_size_limit: [::Gitlab::Database::Type::JsonbInteger.new, { default: 100.gigabytes }]
validate :validate_object_storage_for_live_trace_configuration, if: -> { ci_job_live_trace_enabled? }
validates :ci_partitions_size_limit, presence: true, numericality: { only_integer: true, greater_than: 0 }
validates :default_ci_config_path,
format: { without: %r{(\.{2}|\A/)}, message: N_('cannot include leading slash or directory traversal.') },

View File

@ -48,6 +48,7 @@ module ApplicationSettingImplementation
autocomplete_users_unauthenticated_limit: 100,
ci_job_live_trace_enabled: false,
ci_max_total_yaml_size_bytes: 314572800, # max_yaml_size_bytes * ci_max_includes = 2.megabyte * 150
ci_partitions_size_limit: 100.gigabytes,
commit_email_hostname: default_commit_email_hostname,
container_expiration_policies_enable_historic_entries: false,
container_registry_features: [],

View File

@ -2,9 +2,6 @@
module Ci
class Partition < Ci::ApplicationRecord
MAX_PARTITION_SIZE = 100.gigabytes
GSTG_PARTITION_SIZE = 4.gigabytes
INITIAL_PARTITION_VALUE = 100
LATEST_PARTITION_VALUE = 102
DEFAULT_PARTITION_VALUES = (INITIAL_PARTITION_VALUE..LATEST_PARTITION_VALUE).to_a.freeze
@ -63,7 +60,7 @@ module Ci
end
end
def above_threshold?(threshold)
def above_threshold?(threshold = ::Gitlab::CurrentSettings.ci_partitions_size_limit)
with_ci_connection do
Gitlab::Database::PostgresPartition
.with_parent_tables(parent_table_names)

View File

@ -25,10 +25,7 @@ module Ci
end
def above_threshold?
threshold = Ci::Partition::MAX_PARTITION_SIZE
threshold = Ci::Partition::GSTG_PARTITION_SIZE if Gitlab.staging?
partition.above_threshold?(threshold)
partition.above_threshold?
end
def headroom_available?

View File

@ -24,10 +24,7 @@ module Ci
attr_reader :partition
def above_threshold?
threshold = Ci::Partition::MAX_PARTITION_SIZE
threshold = Ci::Partition::GSTG_PARTITION_SIZE if Gitlab.staging?
partition.above_threshold?(threshold)
partition.above_threshold?
end
def sync_available_partitions_statuses!

View File

@ -46,6 +46,7 @@ module Users
migrate_snippets
migrate_reviews
migrate_releases
migrate_timelogs
end
def post_migrate_records
@ -113,6 +114,10 @@ module Users
batched_migrate(Achievements::UserAchievement, :revoked_by_user_id)
end
def migrate_timelogs
batched_migrate(Timelog, :user_id)
end
# rubocop:disable CodeReuse/ActiveRecord
def batched_migrate(base_scope, column, batch_size: 50)
loop do

View File

@ -0,0 +1,16 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"description": "Application settings for the CI/CD domain",
"type": "object",
"additionalProperties": false,
"properties": {
"ci_job_live_trace_enabled": {
"type": "boolean",
"description": "Enable cloud native architecture for storing job logs."
},
"ci_partitions_size_limit": {
"type": "integer",
"description": "Maximum table size limit for a CI partition used for creating new partitions."
}
}
}

View File

@ -1,52 +0,0 @@
- breadcrumb_title _("Projects")
- page_title _("Projects")
- add_page_specific_style 'page_bundles/projects'
- @force_desktop_expanded_sidebar = true
= render ::Layouts::CrudComponent.new(_('Projects'),
icon: 'project',
count: @projects.size,
options: { class: 'js-search-settings-section' }) do |c|
- c.with_actions do
- if can? current_user, :admin_group, @group
= render Pajamas::ButtonComponent.new(href: new_project_path(namespace_id: @group.id), size: :small) do
= _("New project")
- c.with_body do
%ul.content-list
- @projects.each do |project|
%li.project-row.gl-items-center{ class: '!gl-flex' }
= render Pajamas::AvatarComponent.new(project, alt: project.name, size: 48, class: 'gl-shrink-0 gl-mr-5')
.gl-min-w-0.gl-grow
.title.gl-mr-5
= link_to project_path(project), class: 'js-prefetch-document' do
%span.project-full-name
%span.namespace-name
- if project.namespace
= project.namespace.human_name
\/
%span.project-name
= project.name
= visibility_level_content(project, css_class: 'visibility-icon gl-ml-2', icon_css_class: 'icon', icon_variant: 'subtle')
- if project.description.present?
.description
= markdown_field(project, :description)
= render 'shared/projects/badges', project: project, css_class: 'gl-mr-3'
.stats.gl-text-subtle.gl-shrink-0.gl-hidden.sm:gl-flex.gl-gap-3
= gl_badge_tag storage_counter(project.statistics&.storage_size)
.controls.gl-shrink-0.gl-ml-5
= render Pajamas::ButtonComponent.new(href: project_project_members_path(project),
variant: :link,
button_options: { class: 'gl-mr-2' }) do
= _('View members')
= render Pajamas::ButtonComponent.new(href: edit_project_path(project),
category: :tertiary,
icon: 'pencil',
button_options: { class: 'has-tooltip', title: _('Edit') })
= render 'delete_project_button', project: project
- if @projects.blank?
.nothing-here-block= _("This group has no projects yet")
- c.with_pagination do
= paginate @projects, theme: "gitlab"

View File

@ -65,9 +65,6 @@
= webpack_bundle_tag 'super_sidebar'
- if ENV['BABEL_ENV'] == 'istanbul'
= webpack_bundle_tag 'coverage_persistence'
- if vite_enabled?
= render 'layouts/vite_main'
- else

View File

@ -42,20 +42,4 @@ if (isJest) {
];
}
module.exports = {
presets,
plugins,
sourceType: 'unambiguous',
env: {
istanbul: {
plugins: [
[
'istanbul',
{
extension: ['.js', '.vue', '.mjs', '.cjs'],
},
],
],
},
},
};
module.exports = { presets, plugins, sourceType: 'unambiguous' };

View File

@ -12,7 +12,6 @@ constraints(::Constraints::GroupUrlConstrainer.new) do
get :issues, as: :issues_group_calendar, action: :issues_calendar, constraints: ->(req) { req.format == :ics }
get :issues, as: :issues_group
get :merge_requests, as: :merge_requests_group
get :projects, as: :projects_group, to: redirect('%{id}')
get :details, as: :details_group
get :activity, as: :activity_group
put :transfer, as: :transfer_group

View File

@ -278,7 +278,6 @@ module.exports = {
return {
default: defaultEntries,
sentry: './sentry/index.js',
coverage_persistence: './entrypoints/coverage_persistence.js',
performance_bar: './entrypoints/performance_bar.js',
jira_connect_app: './jira_connect/subscriptions/index.js',
sandboxed_mermaid: './lib/mermaid.js',

View File

@ -969,6 +969,24 @@ To set this limit to 100 KB on a GitLab Self-Managed instance, run the following
Plan.default.actual_limits.update!(ci_job_annotations_size: 100.kilobytes)
```
### Maximum database partition size for CI/CD tables
{{< history >}}
- [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/189131) in GitLab 18.0.
{{< /history >}}
The maximum amount of disk space, in bytes, that can be used by a partition of a partitioned table,
before new partitions are automatically created. Defaults to 100 GB.
You can change this limit by using the [GitLab Rails console](operations/rails_console.md#starting-a-rails-console-session).
To change the limit, update `ci_partitions_size_limit` with the new value. For example, to set it to 20 GB:
```ruby
ApplicationSetting.update(ci_partitions_size_limit: 20.gigabytes)
```
## Instance monitoring and metrics
### Limit inbound incident management alerts

View File

@ -465,9 +465,10 @@ to configure other related settings. These requirements are
| `bulk_import_max_download_file_size` | integer | no | Maximum download file size when importing from source GitLab instances by direct transfer. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/384976) in GitLab 16.3. |
| `can_create_group` | boolean | no | Indicates whether users can create top-level groups. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/367754) in GitLab 15.5. Defaults to `true`. |
| `check_namespace_plan` | boolean | no | Enabling this makes only licensed EE features available to projects if the project namespace's plan includes the feature or if the project is public. Premium and Ultimate only. |
| `ci_job_live_trace_enabled` | boolean | no | Turns on incremental logging for job logs. When turned on, archived job logs are incrementally uploaded to object storage. Object storage must be configured. You can also configure this setting in the [**Admin** area](../administration/settings/continuous_integration.md#incremental-logging). |
| `ci_job_live_trace_enabled` | boolean | no | Turns on incremental logging for job logs. When turned on, archived job logs are incrementally uploaded to object storage. Object storage must be configured. You can also configure this setting in the [**Admin** area](../administration/settings/continuous_integration.md#incremental-logging). |
| `ci_max_total_yaml_size_bytes` | integer | no | The maximum amount of memory, in bytes, that can be allocated for the pipeline configuration, with all included YAML configuration files. |
| `ci_max_includes` | integer | no | The [maximum number of includes](../administration/settings/continuous_integration.md#maximum-includes) per pipeline. Default is `150`. |
| `ci_partitions_size_limit` | integer | no | The maximum amount of disk space, in bytes, that can be used by a database partition for the CI tables before creating new partitions. Default is `100 GB`. |
| `concurrent_github_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the GitHub importer. Default is 1000. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |
| `concurrent_bitbucket_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the Bitbucket Cloud importer. Default is 100. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |
| `concurrent_bitbucket_server_import_jobs_limit` | integer | no | Maximum number of simultaneous import jobs for the Bitbucket Server importer. Default is 100. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/143875) in GitLab 16.11. |

View File

@ -53,22 +53,22 @@ The debug logs are available in the `language_server.log` file. To view this fil
## Required information for support
When creating a support request, provide this information:
When creating a support request, provide the following information:
1. Your current GitLab for Eclipse plugin version.
1. Open the `About Eclipse IDE` popup window.
1. Open the `About Eclipse IDE` dialog.
- On Windows, in your IDE, select **Help > About Eclipse IDE**.
- On MacOS, in your IDE, select **Eclipse > About Eclipse IDE**.
1. On the dialog, select **Installation details**.
1. Locate **GitLab for Eclipse** and copy the **Version** value.
1. Your Eclipse version.
1. Open the `About Eclipse IDE` popup window.
1. Open the `About Eclipse IDE` dialog.
- On Windows, in your IDE, select **Help > About Eclipse IDE**.
- On MacOS, in your IDE, select **Eclipse > About Eclipse IDE**.
1. Your operating system.
1. Are you using `gitlab.com` or a self-managed instance?
1. Are you using a GitLab.com, GitLab Self-Managed, or GitLab Dedicated instance?
1. Are you using a proxy?
1. Are you using a self-signed certificate?
1. The [workspace logs](#locate-the-workspace-log-file).

View File

@ -112,7 +112,7 @@ After a merge request is created, GitLab Duo reviews it unless:
Prerequisites:
- You must have the at least the [Maintainer role](../../permissions.md) in a project.
- You must have at least the [Maintainer role](../../permissions.md) in a project.
To enable `@GitLabDuo` to automatically review merge requests:

View File

@ -28,7 +28,7 @@ which you can customize to meet the specific needs of each project.
## Set up workspace infrastructure
Before you [create a workspace](#create-a-workspace), you must set up your infrastructure only once.
To set up infrastructure for workspaces:
To set up infrastructure for workspaces, regardless of cloud provider, you must:
1. Set up a Kubernetes cluster that the GitLab agent supports.
See the [supported Kubernetes versions](../clusters/agent/_index.md#supported-kubernetes-versions-for-gitlab-features).
@ -41,6 +41,9 @@ To set up infrastructure for workspaces:
1. Optional. [Build and run containers in a workspace](#build-and-run-containers-in-a-workspace).
1. Optional. [Configure support for private container registries](#configure-support-for-private-container-registries).
If you use AWS, you can use our OpenTofu tutorial. For more information, see
[Tutorial: Set up workspaces infrastructure on AWS](set_up_infrastructure.md).
## Create a workspace
{{< history >}}

View File

@ -0,0 +1,294 @@
---
stage: Create
group: Remote Development
info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments
description: Create the infrastructure needed to support GitLab Workspaces for on-demand, cloud-based development environments.
title: 'Tutorial: Set up workspaces infrastructure on AWS'
---
<!-- vale gitlab_base.FutureTense = NO -->
This tutorial guides you through the GitLab workspaces infrastructure setup on AWS using
[OpenTofu](https://opentofu.org/), an open-source fork of Terraform through Infrastructure as Code (IaC).
## Before you begin
To follow this tutorial, you must have:
- An Amazon Web Services (AWS) account.
- A domain name for your workspaces environment.
To set up GitLab workspaces infrastructure:
1. [Fork the repository](#fork-the-repository)
1. [Set up AWS credentials](#set-up-aws-credentials)
1. [Prepare domain and certificates](#prepare-domain-and-certificates)
1. [Create required keys](#create-required-keys)
1. [Configure GitLab OAuth and agent](#configure-gitlab-oauth-and-agent)
1. [Create a token for GitLab Agent for Kubernetes](#create-a-token-for-gitlab-agent-for-kubernetes)
1. [Configure CI/CD variables](#configure-cicd-variables)
1. [Update GitLab agent configuration](#update-gitlab-agent-configuration)
1. [Run the pipeline](#run-the-pipeline)
1. [Configure DNS records](#configure-dns-records)
1. [Authorize the agent](#authorize-the-agent)
1. [Verify your workspace setup](#verify-your-workspace-setup)
## Fork the repository
First, you need to create your own copy of the infrastructure setup repository so that you can
configure it for your environment.
To fork the repository:
1. Go to the [Workspaces Infrastructure Setup AWS](https://gitlab.com/gitlab-org/workspaces/examples/workspaces-infrastructure-setup-aws) repository.
1. Create a fork of the repository. For more information, see [Create a fork](../project/repository/forking_workflow.md#create-a-fork).
## Set up AWS credentials
Next, set up the necessary permissions in AWS so the infrastructure can be properly provisioned.
To set up AWS credentials:
1. Create an [IAM User](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html) or
[IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html).
1. Assign the following permissions:
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ec2:*",
"eks:*",
"elasticloadbalancing:*",
"autoscaling:*",
"cloudwatch:*",
"logs:*",
"kms:DescribeKey",
"kms:TagResource",
"kms:UntagResource",
"kms:ListResourceTags",
"kms:CreateKey",
"kms:CreateAlias",
"kms:ListAliases",
"kms:DeleteAlias",
"iam:AddRoleToInstanceProfile",
"iam:AttachRolePolicy",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:CreateServiceLinkedRole",
"iam:GetRole",
"iam:ListAttachedRolePolicies",
"iam:ListRolePolicies",
"iam:ListRoles",
"iam:PassRole",
"iam:DetachRolePolicy",
"iam:ListInstanceProfilesForRole",
"iam:DeleteRole",
"iam:CreateOpenIDConnectProvider",
"iam:CreatePolicy",
"iam:TagOpenIDConnectProvider",
"iam:GetPolicy",
"iam:GetPolicyVersion",
"iam:GetOpenIDConnectProvider",
"iam:DeleteOpenIDConnectProvider",
"iam:ListPolicyVersions",
"iam:DeletePolicy"
],
"Resource": "*"
}
]
}
```
1. [Create an access key](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html)
for the user or role.
1. Save your access key ID and secret access key. You'll need them when configuring CI/CD variables later.
## Prepare domain and certificates
For your workspaces to be accessible, you'll need a domain and TLS certificates to secure the
connections.
To prepare your domain and certificates:
1. Buy a domain or use an existing domain for your workspaces environment.
1. Create TLS certificates for:
- GitLab Workspaces Proxy Domain. For example, `workspaces.example.dev`.
- GitLab Workspaces Proxy Wildcard Domain. For example, `*.workspaces.example.dev`.
## Create required keys
Now you need to create security keys for authentication and SSH connections.
To create the required keys:
1. Generate a signing key consisting of random letters, numbers, and special characters.
1. Generate an SSH host key:
```shell
ssh-keygen -f ssh-host-key -N '' -t rsa
```
## Configure GitLab OAuth and agent
Next, set up OAuth authentication so users can securely access workspaces.
To configure GitLab OAuth:
1. Go to **User Settings > Applications**.
1. Create a new application with these settings:
- Name: GitLab Workspaces Proxy
- Redirect URI: `https://workspaces.example.dev/auth/callback` (replace with your domain)
- Check the **Trusted** checkbox
- Scopes: `api`, `read_user`, `openid`, `profile`
1. Save the Application ID and Secret.
## Create a token for GitLab Agent for Kubernetes
The GitLab Agent for Kubernetes will connect your AWS Kubernetes cluster to GitLab.
To create a token for the agent:
1. On the left sidebar, select **Operate > Kubernetes clusters**.
1. Select **Connect a cluster (agent)**.
1. Enter a name for your agent (for example, `gitlab-workspaces-agentk-eks`).
1. Select **Register an agent**.
1. Save the token and KAS address for later use.
This token will enable secure communication between GitLab and your Kubernetes cluster.
## Configure CI/CD variables
Now, you need to add the necessary variables to your CI/CD configuration so the infrastructure
pipeline can run.
To configure CI/CD variables:
1. On the left sidebar, select **Settings > CI/CD**.
1. Expand **Variables**.
1. Add the following required variables:
- `AWS_ACCESS_KEY_ID`: Your AWS access key ID
- `AWS_SECRET_ACCESS_KEY`: Your AWS secret access key
- `TF_VAR_agent_token`: GitLab Agent for Kubernetes token
- `TF_VAR_workspaces_proxy_auth_client_id`: OAuth application client ID
- `TF_VAR_workspaces_proxy_auth_client_secret`: OAuth application secret
- `TF_VAR_workspaces_proxy_auth_redirect_uri`: OAuth callback URL
- `TF_VAR_workspaces_proxy_auth_signing_key`: Your generated signing key
- `TF_VAR_workspaces_proxy_domain`: Domain for the workspaces proxy
- `TF_VAR_workspaces_proxy_domain_cert`: TLS certificate for the proxy domain
- `TF_VAR_workspaces_proxy_domain_key`: TLS key for the proxy domain
- `TF_VAR_workspaces_proxy_ssh_host_key`: Your generated SSH host key
- `TF_VAR_workspaces_proxy_wildcard_domain`: Wildcard domain for workspaces
- `TF_VAR_workspaces_proxy_wildcard_domain_cert`: TLS certificate for the wildcard domain
- `TF_VAR_workspaces_proxy_wildcard_domain_key`: TLS key for the wildcard domain
1. Optionally, add any of these variables to customize your deployment:
- `TF_VAR_region`: AWS region.
- `TF_VAR_zones`: AWS availability zones.
- `TF_VAR_name`: Name prefix for resources.
- `TF_VAR_cluster_endpoint_public_access`: Enable public access to cluster endpoint.
- `TF_VAR_instance_type`: EC2 instance type for Kubernetes nodes.
- `TF_VAR_instance_count`: Number of worker nodes.
- `TF_VAR_agent_namespace`: Kubernetes namespace for the agent.
- `TF_VAR_kas_address`: GitLab Kubernetes Agent Server address. Required if on a GitLab Self-Managed instance.
- `TF_VAR_workspaces_proxy_namespace`: Kubernetes namespace for workspaces proxy.
- `TF_VAR_workspaces_proxy_ingress_class_name`: Ingress class name.
- `TF_VAR_ingress_nginx_namespace`: Kubernetes namespace for Ingress-NGINX.
Great job! You've configured all the necessary variables for your infrastructure deployment.
## Update GitLab agent configuration
Now, you need to configure the GitLab agent to support workspaces.
To update the GitLab agent configuration:
1. In your forked repository, open the `.gitlab/agents/gitlab-workspaces-agentk-eks/config.yaml` file.
1. Update the file with the following required fields:
```yaml
remote_development:
enabled: true
dns_zone: "workspaces.example.dev" # Replace with your domain
```
For more configuration options, see [Workspace settings](settings.md).
1. Commit and push these changes to your repository.
## Run the pipeline
It's time to deploy your infrastructure. You'll run the CI/CD pipeline to create all the necessary
resources in AWS.
To run the pipeline:
1. Create a new pipeline in your GitLab project:
1. On the left sidebar, select **Build > Pipelines**.
1. Select **Run pipeline**.
1. Verify the `plan` job succeeds, then manually trigger the `apply` job.
When the OpenTofu code runs, it creates these resources in AWS:
- A Virtual Private Cloud (VPC).
- An Elastic Kubernetes Service (EKS) cluster.
- A GitLab Agent for Kubernetes Helm release.
- A GitLab Workspaces Proxy Helm release.
- An Ingress NGINX Helm release.
Excellent! Your infrastructure is now being deployed. This might take some time to complete.
## Configure DNS records
Now that your infrastructure is deployed, you need to configure DNS records to point to your new
environment.
To configure DNS records:
1. Get the Ingress-NGINX load balancer address from the pipeline output.
1. Create DNS A records that point your domains to this address:
- `workspaces.example.dev` → Load balancer IP address
- `*.workspaces.example.dev` → Load balancer IP address
## Authorize the agent
Next, you'll authorize the GitLab agent to connect to your GitLab instance.
To authorize the agent:
1. On the left sidebar, select **Search or go to** and find your group.
1. Select **Settings > Workspaces**.
1. In the **Group agents** section, select the **All agents** tab.
1. From the list of available agents, find the agent with status **Blocked**, and select **Allow**.
1. On the confirmation dialog, select **Allow agent**.
## Verify your workspace setup
Finally, let's make sure everything is working correctly by creating a test workspace.
To verify your workspace setup:
1. Create a new workspace by following the steps in [Create a workspace](configuration.md#create-a-workspace).
1. Verify that you can access the workspace environment.
1. Interact with the workspace by opening the Web IDE, accessing the terminal, or making changes to project files.
Congratulations! You've successfully set up GitLab workspaces infrastructure on AWS. Your users
can now create development workspace environments for their projects.
If you encounter any issues, check the logs for additional details and refer to
[Troubleshooting workspaces](workspaces_troubleshooting.md) for guidance.
## Related topics
- [Workspaces](_index.md)
- [Configure workspaces](configuration.md)
- [Workspace settings](settings.md)
- [Tutorial: Create a custom workspace image that supports arbitrary user IDs](create_image.md)

View File

@ -136,6 +136,7 @@ module Keeps
change.description = build_description(feature_flag, latest_feature_flag_status)
change.labels = [
'automation:feature-flag-removal',
'maintenance::removal',
'feature flag',
feature_flag.group

View File

@ -139,9 +139,6 @@ module Gitlab
#
# @return [Boolean]
def self.next_rails?
return @next_bundle_gemfile unless @next_bundle_gemfile.nil?
return false unless ENV["BUNDLE_GEMFILE"]
@next_bundle_gemfile = File.exist?(ENV["BUNDLE_GEMFILE"]) && File.basename(ENV["BUNDLE_GEMFILE"]) == "Gemfile.next"
true
end
end

View File

@ -11,7 +11,6 @@ module Sidebars
add_item(general_menu_item)
add_item(integrations_menu_item)
add_item(access_tokens_menu_item)
add_item(group_projects_menu_item)
add_item(repository_menu_item)
add_item(ci_cd_menu_item)
add_item(applications_menu_item)
@ -72,15 +71,6 @@ module Sidebars
)
end
def group_projects_menu_item
::Sidebars::MenuItem.new(
title: _('Projects'),
link: projects_group_path(context.group),
active_routes: { path: 'groups#projects' },
item_id: :group_projects
)
end
def repository_menu_item
::Sidebars::MenuItem.new(
title: _('Repository'),

View File

@ -61802,9 +61802,6 @@ msgstr ""
msgid "This group has no inactive access tokens."
msgstr ""
msgid "This group has no projects yet"
msgstr ""
msgid "This group is linked to a subscription"
msgstr ""
@ -66540,9 +66537,6 @@ msgstr ""
msgid "View log"
msgstr ""
msgid "View members"
msgstr ""
msgid "View merge requests you're involved with from start to finish by highlighting those that Needs Attention and those you are Following."
msgstr ""

View File

@ -71,8 +71,8 @@
"@gitlab/web-ide": "^0.0.1-dev-20250414030534",
"@gleam-lang/highlight.js-gleam": "^1.5.0",
"@mattiasbuelens/web-streams-adapter": "^0.1.0",
"@rails/actioncable": "7.0.807",
"@rails/ujs": "7.0.807",
"@rails/actioncable": "7.1.501",
"@rails/ujs": "7.1.501",
"@sentry/browser": "9.13.0",
"@snowplow/browser-plugin-client-hints": "^3.24.2",
"@snowplow/browser-plugin-form-tracking": "^3.24.2",
@ -269,7 +269,6 @@
"ajv-formats": "^2.1.1",
"axios-mock-adapter": "^1.15.0",
"babel-jest": "^29.7.0",
"babel-plugin-istanbul": "^7.0.0",
"chalk": "^2.4.1",
"chokidar": "^3.5.3",
"crypto": "^1.0.1",

View File

@ -1,16 +0,0 @@
diff --git a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
index d428163..010eaa5 100644
--- a/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
+++ b/node_modules/@rails/ujs/lib/assets/compiled/rails-ujs.js
@@ -281,11 +281,6 @@ Released under the MIT license
try {
response = JSON.parse(response);
} catch (error) {}
- } else if (type.match(/\b(?:java|ecma)script\b/)) {
- script = document.createElement('script');
- script.setAttribute('nonce', cspNonce());
- script.text = response;
- document.head.appendChild(script).parentNode.removeChild(script);
} else if (type.match(/\b(xml|html|svg)\b/)) {
parser = new DOMParser();
type = type.replace(/;.+/, '');

View File

@ -0,0 +1,16 @@
diff --git a/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js b/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
index 035a521..85b7425 100644
--- a/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
+++ b/node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.js
@@ -150,11 +150,6 @@ Released under the MIT license
try {
response = JSON.parse(response);
} catch (error) {}
- } else if (type.match(/\b(?:java|ecma)script\b/)) {
- const script = document.createElement("script");
- script.setAttribute("nonce", cspNonce());
- script.text = response;
- document.head.appendChild(script).parentNode.removeChild(script);
} else if (type.match(/\b(xml|html|svg)\b/)) {
const parser = new DOMParser;
type = type.replace(/;.+/, "");

View File

@ -5,7 +5,7 @@ source 'https://rubygems.org'
gem 'gitlab-qa', '~> 15', '>= 15.4.0', require: 'gitlab/qa'
gem 'gitlab_quality-test_tooling', '~> 2.10.0', require: false
gem 'gitlab-utils', path: '../gems/gitlab-utils'
gem 'activesupport', '~> 7.0.8.7' # This should stay in sync with the root's Gemfile
gem 'activesupport', '~> 7.1.5.1' # This should stay in sync with the root's Gemfile
gem 'allure-rspec', '~> 2.26.0'
gem 'capybara', '~> 3.40.0'
gem 'capybara-screenshot', '~> 1.0.26'

View File

@ -11,7 +11,7 @@ PATH
remote: gems/gitlab-orchestrator
specs:
gitlab-orchestrator (0.0.1)
activesupport (>= 7)
activesupport (>= 7.1.5.1)
rainbow (~> 3.1)
require_all (~> 3.0)
thor (~> 1.3)
@ -22,16 +22,24 @@ PATH
GEM
remote: https://rubygems.org/
specs:
actionview (7.0.8.7)
activesupport (= 7.0.8.7)
actionview (7.1.5.1)
activesupport (= 7.1.5.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.1, >= 1.2.0)
activesupport (7.0.8.7)
erubi (~> 1.11)
rails-dom-testing (~> 2.2)
rails-html-sanitizer (~> 1.6)
activesupport (7.1.5.1)
base64
benchmark (>= 0.3)
bigdecimal
concurrent-ruby (~> 1.0, >= 1.0.2)
connection_pool (>= 2.2.5)
drb
i18n (>= 1.6, < 2)
logger (>= 1.4.2)
minitest (>= 5.1)
mutex_m
securerandom (>= 0.3)
tzinfo (~> 2.0)
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
@ -47,6 +55,7 @@ GEM
tins (~> 1.0)
ast (2.4.2)
base64 (0.2.0)
benchmark (0.4.0)
bigdecimal (3.1.9)
binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1)
@ -66,6 +75,7 @@ GEM
launchy
coderay (1.1.2)
concurrent-ruby (1.2.3)
connection_pool (2.5.0)
crass (1.0.6)
csv (3.3.0)
debug_inspector (1.1.0)
@ -74,6 +84,7 @@ GEM
activesupport (>= 6.1)
diff-lcs (1.3)
domain_name (0.6.20240107)
drb (2.2.1)
erubi (1.12.0)
excon (0.110.0)
factory_bot (6.5.1)
@ -249,8 +260,9 @@ GEM
rack (2.2.10)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rails-dom-testing (2.0.3)
activesupport (>= 4.2.0)
rails-dom-testing (2.2.0)
activesupport (>= 5.0.0)
minitest
nokogiri (>= 1.6)
rails-html-sanitizer (1.6.1)
loofah (~> 2.21)
@ -303,6 +315,7 @@ GEM
sawyer (0.9.2)
addressable (>= 2.3.5)
faraday (>= 0.17.3, < 3)
securerandom (0.4.1)
selenium-webdriver (4.31.0)
base64 (~> 0.2)
logger (~> 1.4)
@ -356,7 +369,7 @@ PLATFORMS
ruby
DEPENDENCIES
activesupport (~> 7.0.8.7)
activesupport (~> 7.1.5.1)
allure-rspec (~> 2.26.0)
capybara (~> 3.40.0)
capybara-screenshot (~> 1.0.26)

View File

@ -2,7 +2,7 @@ PATH
remote: .
specs:
gitlab-orchestrator (0.0.1)
activesupport (>= 7)
activesupport (>= 7.1.5.1)
rainbow (~> 3.1)
require_all (~> 3.0)
thor (~> 1.3)

View File

@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
spec.executables = "orchestrator"
spec.require_paths = ["lib"]
spec.add_dependency "activesupport", ">= 7"
spec.add_dependency "activesupport", ">= 7.1.5.1"
spec.add_dependency "rainbow", "~> 3.1"
spec.add_dependency "require_all", "~> 3.0"
spec.add_dependency "thor", "~> 1.3"

View File

@ -13,6 +13,7 @@ Bundler.require(:default)
require 'securerandom'
require 'pathname'
require 'rainbow/refinement'
require 'active_support'
require 'active_support/core_ext/hash'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/module/delegation'
@ -102,23 +103,3 @@ end
# see: https://github.com/octokit/octokit.rb/issues/1701
Warning.ignore(/To use multipart middleware with Faraday v2\.0/)
require "octokit"
# TODO: Temporary monkeypatch for broadcast logging
# Remove once activesupport is upgraded to 7.1
module Gitlab
module QA
class TestLogger
# Combined logger instance
#
# @param [<Symbol, String>] level
# @param [String] source
# @return [ActiveSupport::Logger]
def self.logger(level: :info, source: 'Gitlab QA', path: 'tmp')
console_log = console_logger(level: level, source: source)
file_log = file_logger(source: source, path: path)
console_log.extend(ActiveSupport::Logger.broadcast(file_log))
end
end
end
end

View File

@ -98,10 +98,6 @@ module QA
enabled?(ENV['COVERBAND_ENABLED'], default: false)
end
def istanbul_coverage_enabled?
ENV['BABEL_ENV'] == 'istanbul'
end
def selective_execution_improved_enabled?
enabled?(ENV['SELECTIVE_EXECUTION_IMPROVED'], default: false)
end

View File

@ -1,5 +1,6 @@
# frozen_string_literal: true
require 'active_support'
require 'active_support/testing/time_helpers'
require 'factory_bot'
@ -25,20 +26,6 @@ RSpec.configure(&:disable_monkey_patching!)
# For JH additionally process when `jh/` exists
require_relative('../../../jh/qa/qa/specs/spec_helper') if GitlabEdition.jh?
front_end_coverage_by_example = {}
def save_front_end_coverage_mapping(map_to_save)
return if map_to_save.empty?
file = "tmp/js-coverage-by-example-#{ENV['CI_JOB_NAME_SLUG'] || 'local'}-#{SecureRandom.hex(6)}.json"
# Write the mapping data
File.write(file, map_to_save.to_json)
QA::Runtime::Logger.info("Saved test coverage mapping data to #{file}")
rescue StandardError => e
QA::Runtime::Logger.error("Failed to save JS coverage mapping data, error: #{e}")
end
RSpec.configure do |config|
config.include ActiveSupport::Testing::TimeHelpers
config.include QA::Support::Matchers::EventuallyMatcher
@ -66,11 +53,6 @@ RSpec.configure do |config|
visit(QA::Runtime::Scenario.gitlab_address) if QA::Runtime::Env.mobile_layout?
# Reset coverage persistence at the start of each test
if Capybara::Session.instance_created? && QA::Runtime::Env.istanbul_coverage_enabled?
Capybara.current_session.execute_script("window.__coveragePathsPersistence.reset()")
end
# Reset fabrication counters tracked in resource base
Thread.current[:api_fabrication] = 0
Thread.current[:browser_ui_fabrication] = 0
@ -96,19 +78,6 @@ RSpec.configure do |config|
QA::Support::PageErrorChecker.log_request_errors(page)
QA::Support::PageErrorChecker.check_page_for_error_code(page) if example.exception
end
# Get coverage paths and store in metadata
if Capybara::Session.instance_created? && QA::Runtime::Env.istanbul_coverage_enabled?
begin
Capybara.current_session.execute_script("window.__coveragePathsPersistence.update()")
coverage_paths = Capybara.current_session.evaluate_script("window.__coveragePathsPersistence.getPaths()")
QA::Runtime::Logger.debug("Coverage paths count: #{coverage_paths.length}")
example.metadata[:coverage_paths] = coverage_paths
front_end_coverage_by_example[example.metadata[:location]] = coverage_paths
rescue StandardError => e
QA::Runtime::Logger.warn("Failed to collect coverage paths: #{e.message}")
end
end
end
config.append_after do |example|
@ -127,9 +96,8 @@ RSpec.configure do |config|
end
config.after(:suite) do |suite|
# Write all test created resources to JSON file
QA::Tools::TestResourceDataProcessor.write_to_file(suite.reporter.failed_examples.any?)
save_front_end_coverage_mapping(front_end_coverage_by_example) if QA::Runtime::Env.istanbul_coverage_enabled?
end
config.expect_with :rspec do |expectations|

View File

@ -2,6 +2,6 @@
RSpec.describe QA::Runtime::Logger do
it 'returns logger instance' do
expect(described_class.logger).to be_an_instance_of(ActiveSupport::Logger)
expect(described_class.logger).to be_an_instance_of(ActiveSupport::BroadcastLogger)
end
end

View File

@ -37,11 +37,23 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
end
context 'when GitLab issues enabled' do
it 'renders the "index" template' do
it 'redirects to work items index page' do
get :index, params: { namespace_id: project.namespace, project_id: project }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template(:index)
expect(response).to redirect_to(project_work_items_path(project, 'type[]' => 'issue'))
end
context 'when work_item_planning_view: false' do
before do
stub_feature_flags(work_item_planning_view: false)
end
it 'renders the "index" template' do
get :index, params: { namespace_id: project.namespace, project_id: project }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to render_template(:index)
end
end
end
@ -77,14 +89,26 @@ RSpec.describe Projects::IssuesController, :request_store, feature_category: :te
project.add_developer(user)
end
it_behaves_like 'set sort order from user preference' do
let(:sorting_param) { 'updated_asc' }
end
it "returns index" do
it 'redirects to work items index page' do
get :index, params: { namespace_id: project.namespace, project_id: project }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to redirect_to(project_work_items_path(project, 'type[]' => 'issue'))
end
context 'when work_item_planning_view: false' do
before do
stub_feature_flags(work_item_planning_view: false)
end
it "returns index" do
get :index, params: { namespace_id: project.namespace, project_id: project }
expect(response).to have_gitlab_http_status(:ok)
end
it_behaves_like 'set sort order from user preference' do
let(:sorting_param) { 'updated_asc' }
end
end
it "returns 301 if request path doesn't match project path" do

View File

@ -11,6 +11,11 @@ RSpec.describe 'Abuse reports', :js, feature_category: :insider_threat do
let_it_be(:issue) { create(:issue, project: project, author: abusive_user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(reporter1)
end

View File

@ -12,6 +12,13 @@ RSpec.describe 'Breadcrumbs schema markup', :aggregate_failures, feature_categor
let_it_be(:wiki_home_page) { create(:wiki_page, project: project, title: 'home') }
let_it_be(:wiki_sub_page) { create(:wiki_page, project: project, title: 'home/subpage') }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
it 'generates the breadcrumb schema for user projects' do
visit project_url(project)

View File

@ -34,6 +34,10 @@ RSpec.describe 'Registration enabled callout', feature_category: :system_access
end
it 'does not display callout on pages other than root, admin, or dashboard' do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
visit project_issues_path(project)
expect(page).not_to have_content callout_title

View File

@ -13,6 +13,11 @@ RSpec.describe 'Canonical link', feature_category: :workspaces do
let_it_be(:project_request) { project_url(project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
end

View File

@ -19,6 +19,11 @@ RSpec.describe 'Dashboard Issues filtering', :js, feature_category: :team_planni
let_it_be(:label2) { create(:label, title: 'bug') }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.labels << label
project2.labels << label2
project.add_maintainer(user)

View File

@ -7,6 +7,11 @@ RSpec.describe 'Group empty states', feature_category: :groups_and_projects do
let(:user) { create(:group_member, :developer, user: create(:user), group: group).user }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
end

View File

@ -1,30 +0,0 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'User browse group projects page', feature_category: :groups_and_projects do
let(:user) { create :user }
let(:group) { create :group }
context 'when user is owner' do
before do
group.add_owner(user)
end
context 'when user signed in' do
before do
sign_in(user)
end
context 'when group has archived project', :js do
let!(:project) { create :project, :archived, namespace: group }
it 'redirects to the groups overview page' do
visit projects_group_path(group)
expect(page).to have_current_path(group_path(group))
end
end
end
end
end

View File

@ -22,6 +22,11 @@ RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_pro
let!(:issue) { create(:issue, author: user, assignees: [assignee], project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_developer(user)
end

View File

@ -22,6 +22,11 @@ RSpec.describe 'Incident details', :js, feature_category: :incident_management d
end
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(developer)
end

View File

@ -12,6 +12,11 @@ RSpec.describe "User views incident", feature_category: :incident_management do
let(:incident) { create(:incident, project: project, description: description, author: author) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
visit(incident_project_issues_path(project, incident))

View File

@ -9,6 +9,11 @@ RSpec.describe 'issuable list', :js, feature_category: :team_planning do
issuable_types = [:issue, :merge_request]
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_member(user, :developer)
sign_in(user)
issuable_types.each { |type| create_issuables(type) }

View File

@ -13,6 +13,13 @@ RSpec.describe 'Sort Issuable List', feature_category: :team_planning do
let(:first_updated_issuable) { issuables.order_updated_asc.first }
let(:last_updated_issuable) { issuables.order_updated_desc.first }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'for merge requests' do
include MergeRequestHelpers

View File

@ -19,6 +19,11 @@ RSpec.describe 'Issue rebalancing', feature_category: :team_planning do
before do
sign_in(user)
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
stub_feature_flags(block_issue_repositioning: true)
end

View File

@ -12,6 +12,11 @@ RSpec.describe 'Issues csv', :js, feature_category: :team_planning do
let!(:issue) { create(:issue, project: project, author: user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
visit project_issues_path(project)
end

View File

@ -9,6 +9,13 @@ RSpec.describe 'Dropdown assignee', :js, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
describe 'behavior' do
before do
project.add_maintainer(user)

View File

@ -10,6 +10,11 @@ RSpec.describe 'Dropdown author', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -10,6 +10,11 @@ RSpec.describe 'Dropdown base', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -11,6 +11,11 @@ RSpec.describe 'Dropdown emoji', :js, feature_category: :team_planning do
let_it_be(:award_emoji_star) { create(:award_emoji, name: 'star', user: user, awardable: issue) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
create_list(:award_emoji, 2, user: user, name: AwardEmoji::THUMBS_UP)
create_list(:award_emoji, 1, user: user, name: AwardEmoji::THUMBS_DOWN)

View File

@ -10,6 +10,11 @@ RSpec.describe 'Dropdown hint', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
end

View File

@ -11,6 +11,11 @@ RSpec.describe 'Dropdown label', :js, feature_category: :team_planning do
let_it_be(:label) { create(:label, project: project, title: 'bug-label') }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -12,6 +12,11 @@ RSpec.describe 'Dropdown milestone', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -12,6 +12,11 @@ RSpec.describe 'Dropdown release', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -19,6 +19,11 @@ RSpec.describe 'Filter issues', :js, feature_category: :team_planning do
end
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
create(:issue, project: project, author: user2, title: "Bug report 1")

View File

@ -13,6 +13,11 @@ RSpec.describe 'Recent searches', :js, feature_category: :team_planning do
let(:project_1_local_storage_key) { "#{project_1.full_path}-issue-recent-searches" }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
# Visit any fast-loading page so we can clear local storage without a DOM exception
visit '/404'
remove_recent_searches

View File

@ -10,6 +10,11 @@ RSpec.describe 'Search bar', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)

View File

@ -15,6 +15,11 @@ RSpec.describe 'Visual tokens', :js, feature_category: :team_planning do
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_member(user, :maintainer)
project.add_member(user_rock, :maintainer)
sign_in(user)

View File

@ -4,6 +4,11 @@ require 'spec_helper'
RSpec.describe 'Group label on issue', :with_license, feature_category: :team_planning do
it 'renders link to the project issues page', :js do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
group = create(:group)
project = create(:project, :public, namespace: group)
feature = create(:group_label, group: group, title: 'feature')

View File

@ -24,6 +24,13 @@ RSpec.describe 'Incident Detail', :js, feature_category: :team_planning do
let_it_be(:alert) { create(:alert_management_alert, project: project, payload: payload, started_at: started_at) }
let_it_be(:incident) { create(:incident, project: project, description: 'hello', alert_management_alert: alert) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'when user displays the incident' do
before do
project.add_developer(user)

View File

@ -9,6 +9,13 @@ RSpec.describe 'Issue Detail', :js, feature_category: :team_planning do
let(:issue) { create(:issue, project: project, author: user) }
let(:incident) { create(:incident, project: project, author: user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'when user displays the issue' do
before do
visit project_issue_path(project, issue)

View File

@ -9,6 +9,13 @@ RSpec.describe 'Project Issues RSS', :js, feature_category: :team_planning do
let_it_be(:path) { project_issues_path(project) }
let_it_be(:issue) { create(:issue, project: project, assignees: [user]) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'when signed in' do
let_it_be(:user) { create(:user) }

View File

@ -9,6 +9,11 @@ RSpec.describe 'Service Desk Issue Tracker', :js, feature_category: :service_des
let_it_be(:support_bot) { Users::Internal.support_bot }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
# The following two conditions equate to ServiceDesk.supported == true
allow(Gitlab::Email::IncomingEmail).to receive(:enabled?).and_return(true)
allow(Gitlab::Email::IncomingEmail).to receive(:supports_wildcard?).and_return(true)

View File

@ -15,6 +15,13 @@ RSpec.describe 'Issues > Labels bulk assignment', feature_category: :team_planni
let(:issue_1_selector) { "#issuable_#{issue1.id}" }
let(:issue_2_selector) { "#issuable_#{issue2.id}" }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'as an allowed user', :js do
before do
project.add_maintainer(user)

View File

@ -10,6 +10,11 @@ RSpec.describe 'Multiple issue updating from issues#index', :js, feature_categor
let!(:user) { create(:user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_maintainer(user)
sign_in(user)
end

View File

@ -7,6 +7,11 @@ RSpec.describe 'Issues > User creates issue by email', feature_category: :team_p
let_it_be(:project) { create(:project, :public) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
project.add_developer(user)

View File

@ -8,6 +8,13 @@ RSpec.describe "User creates issue", feature_category: :team_planning do
let_it_be(:project) { create(:project_empty_repo, :public) }
let_it_be(:user) { create(:user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context "when unauthenticated" do
before do
sign_out(:user)

View File

@ -7,6 +7,11 @@ RSpec.describe 'User filters issues', :js, feature_category: :team_planning do
let_it_be(:project) { create(:project_empty_repo, :public) }
before do
# TODO: When removing the feature flag,
# we won't need these tests for issues, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
%w[foobar barbaz].each do |title|
create(
:issue,

View File

@ -8,6 +8,11 @@ RSpec.describe 'Issues > User resets their incoming email token', feature_catego
let_it_be(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
stub_incoming_email_setting(enabled: true, address: "p+%{key}@gl.ab")
project.add_maintainer(user)
sign_in(user)

View File

@ -8,6 +8,11 @@ RSpec.describe 'New issue breadcrumb', :js, feature_category: :team_planning do
let(:user) { project.creator }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
visit(new_project_issue_path(project))
end

View File

@ -6,6 +6,13 @@ RSpec.describe 'Issues > User sees empty state', :js, feature_category: :team_pl
let_it_be(:project) { create(:project, :public) }
let_it_be(:user) { project.creator }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
shared_examples_for 'empty state with filters' do
it 'user sees empty state with filters' do
create(:issue, author: user, project: project)

View File

@ -17,6 +17,11 @@ RSpec.describe "User sorts issues", feature_category: :team_planning do
let_it_be(:later_due_milestone) { create(:milestone, project: project, due_date: '2013-12-12') }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
create_list(:award_emoji, 2, :upvote, awardable: issue1)
create_list(:award_emoji, 2, :downvote, awardable: issue2)
create(:award_emoji, :downvote, awardable: issue1)

View File

@ -10,6 +10,13 @@ RSpec.describe "User views issues", feature_category: :team_planning do
let_it_be(:user) { create(:user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
shared_examples "opens issue from list" do
it "opens issue" do
click_link(issue.title)

View File

@ -21,6 +21,11 @@ RSpec.describe 'Labels Hierarchy', :js, feature_category: :team_planning do
let!(:project_label_1) { create(:label, project: project_1, title: 'Label_4') }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
grandparent.add_owner(user)
sign_in(user)

View File

@ -17,6 +17,11 @@ RSpec.describe 'User sorts merge requests', :js, feature_category: :code_review_
let_it_be(:project) { create(:project, :public, group: group) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
visit(project_merge_requests_path(project))

View File

@ -10,6 +10,11 @@ RSpec.describe "User views milestone", feature_category: :team_planning do
let_it_be(:labels) { create_list(:label, 2, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
end

View File

@ -9,6 +9,11 @@ RSpec.describe 'Monitor dropdown sidebar', :js, feature_category: :shared do
let(:role) { nil }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
project.add_role(user, role) if role
sign_in(user)

View File

@ -13,6 +13,13 @@ RSpec.describe 'Issue prioritization', feature_category: :team_planning do
let(:label_4) { create(:label, title: 'label_4', project: project, priority: 4) }
let(:label_5) { create(:label, title: 'label_5', project: project) } # no priority
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
# According to https://gitlab.com/gitlab-org/gitlab-foss/issues/14189#note_4360653
context 'when issues have one label', :js do
it 'are sorted properly' do

View File

@ -39,6 +39,11 @@ RSpec.describe 'Task Lists', :js, feature_category: :team_planning do
end
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
sign_in(user)
end

View File

@ -0,0 +1,54 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe 'Redirect from issues', :js, feature_category: :team_planning do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:project) { create(:project, :public, group: group, developers: [user]) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
context 'for signed in user' do
before do
sign_in(user)
end
context 'when work_item_planning_view feature flag if disabled' do
before do
stub_feature_flags(work_item_planning_view: false)
end
it 'do not redirect to work items', :aggregate_failures do
visit project_issues_path(project)
expect(page).to have_current_path(project_issues_path(project))
end
end
context 'when work_item_planning_view feature flag if enabled' do
before do
stub_feature_flags(work_item_planning_view: true)
end
it 'redirects to work items', :aggregate_failures do
visit project_issues_path(project)
expect(page).to have_current_path(project_work_items_path(project, 'type[]': 'issue'))
end
context 'and the original request has a sorting parameter' do
it 'redirects to work items', :aggregate_failures do
visit project_issues_path(project, sort: 'updated_desc')
expect(page).to have_current_path(project_work_items_path(project, 'type[]': 'issue', sort: 'updated_desc'))
end
end
end
end
end

View File

@ -23,6 +23,13 @@ RSpec.describe 'Work item detail', :js, feature_category: :team_planning do
let(:list_path) { project_issues_path(project) }
let(:work_items_path) { project_work_item_path(project, work_item.iid) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
shared_examples 'change type action is not displayed' do
it 'change type action is not displayed' do
click_button _('More actions'), match: :first

View File

@ -1517,6 +1517,8 @@ export const workItemResponseFactory = ({
descriptionHtml = '<p data-sourcepos="1:1-1:19" dir="auto">some <strong>great</strong> text</p>',
developmentWidgetPresent = false,
customFieldsWidgetPresent = true,
statusWidgetPresent = false,
statusWidgetValues = null,
customFieldValues = null,
movedToWorkItemUrl = null,
duplicatedToWorkItemUrl = null,
@ -1864,6 +1866,13 @@ export const workItemResponseFactory = ({
customFieldsWidgetPresent
? customFieldsWidgetResponseFactory(customFieldValues)
: { type: 'MOCK TYPE' },
statusWidgetPresent
? {
__typename: 'WorkItemWidgetStatus',
status: statusWidgetValues,
type: 'STATUS',
}
: { type: 'MOCK TYPE' },
],
},
},
@ -5932,6 +5941,7 @@ export const createWorkItemQueryResponse = (widgets = []) => ({
},
{
type: 'STATUS',
status: null,
__typename: 'WorkItemWidgetStatus',
},
{
@ -6013,6 +6023,11 @@ export const createWorkItemQueryResponse = (widgets = []) => ({
},
__typename: 'WorkItemWidgetWeight',
},
{
__typename: 'WorkItemWidgetStatus',
status: null,
type: 'STATUS',
},
...widgets,
],
__typename: 'WorkItem',

View File

@ -6,6 +6,13 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
let(:label) { build_stubbed(:label) }
let(:label2) { build_stubbed(:label) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
describe '#users_dropdown_label' do
let(:user) { build_stubbed(:user) }
let(:user2) { build_stubbed(:user) }

View File

@ -10,6 +10,13 @@ RSpec.describe IssuesHelper, feature_category: :team_planning do
let_it_be(:project) { create(:project) }
let_it_be_with_reload(:issue) { create(:issue, project: project) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
describe '#award_user_list' do
it 'returns a comma-separated list of the first X users' do
user = build_stubbed(:user, name: 'Joe')

View File

@ -11,6 +11,13 @@ RSpec.describe Projects::AlertManagementHelper do
let(:project_path) { project.full_path }
let(:project_id) { project.id }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
describe '#alert_management_data' do
let(:user_can_enable_alert_management) { true }
let(:setting_path) { project_settings_operations_path(project, anchor: 'js-alert-management-settings') }

View File

@ -8,6 +8,13 @@ RSpec.describe Projects::ErrorTrackingHelper do
let(:project) { build_stubbed(:project) }
let(:current_user) { build_stubbed(:user) }
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
describe '#error_tracking_data' do
let(:can_enable_error_tracking) { true }
let(:setting_path) { project_settings_operations_path(project) }

View File

@ -19,6 +19,11 @@ RSpec.describe Projects::IncidentsHelper do
end
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
allow(helper).to receive(:current_user).and_return(user)
allow(helper).to receive(:can?)
.with(user, :create_incident, project)

View File

@ -6,6 +6,13 @@ RSpec.describe SearchHelper, feature_category: :global_search do
include MarkupHelper
include BadgesHelper
before do
# TODO: When removing the feature flag,
# we won't need the tests for the issues listing page, since we'll be using
# the work items listing page.
stub_feature_flags(work_item_planning_view: false)
end
# Override simple_sanitize for our testing purposes
def simple_sanitize(str)
str

Some files were not shown because too many files have changed in this diff Show More