Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-04-18 21:12:14 +00:00
parent 5f176a4c91
commit f13c38c456
47 changed files with 324 additions and 176 deletions

View File

@ -18,7 +18,7 @@ variables:
# Helm chart ref used by test-on-cng pipeline
GITLAB_HELM_CHART_REF: "074bb942c9c65613c2576ce418f59b8577fff37c"
# Specific ref for cng-mirror project to trigger builds for
GITLAB_CNG_MIRROR_REF: "a200886cbfb7e1f5a7642838f8f8fac9f26c6a97"
GITLAB_CNG_MIRROR_REF: "4be44c2267f0c2322d6efbe98a664b418ff1a22c"
# Makes sure some of the common scripts from pipeline-common use bundler to execute commands
RUN_WITH_BUNDLE: "true"
# Makes sure reporting script defined in .gitlab-qa-report from pipeline-common is executed from correct folder

View File

@ -2163,7 +2163,6 @@ Gitlab/BoundedContexts:
- 'ee/app/graphql/ee/resolvers/board_item_filterable.rb'
- 'ee/app/graphql/ee/resolvers/bulk_labels_resolver.rb'
- 'ee/app/graphql/ee/resolvers/group_issues_resolver.rb'
- 'ee/app/graphql/ee/resolvers/groups_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues/base_parent_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues/base_resolver.rb'
- 'ee/app/graphql/ee/resolvers/issues_resolver.rb'

View File

@ -62,7 +62,6 @@ RSpec/BeEq:
- 'ee/spec/helpers/ee/groups/group_members_helper_spec.rb'
- 'ee/spec/helpers/ee/groups_helper_spec.rb'
- 'ee/spec/helpers/ee/merge_requests_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/protected_branches_helper_spec.rb'
- 'ee/spec/helpers/ee/security_orchestration_helper_spec.rb'
- 'ee/spec/helpers/ee/users/callouts_helper_spec.rb'

View File

@ -32,7 +32,6 @@ RSpec/FactoryBot/AvoidCreate:
- 'ee/spec/helpers/ee/issues_helper_spec.rb'
- 'ee/spec/helpers/ee/labels_helper_spec.rb'
- 'ee/spec/helpers/ee/lock_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/namespaces_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb'
- 'ee/spec/helpers/ee/projects/pipeline_helper_spec.rb'
@ -207,7 +206,6 @@ RSpec/FactoryBot/AvoidCreate:
- 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb'
- 'ee/spec/views/projects/security/policies/index.html.haml_spec.rb'
- 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- 'ee/spec/views/registrations/groups/new.html.haml_spec.rb'
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
- 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'

View File

@ -354,7 +354,6 @@ RSpec/FeatureCategory:
- 'ee/spec/helpers/ee/hooks_helper_spec.rb'
- 'ee/spec/helpers/ee/labels_helper_spec.rb'
- 'ee/spec/helpers/ee/lock_helper_spec.rb'
- 'ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- 'ee/spec/helpers/ee/operations_helper_spec.rb'
- 'ee/spec/helpers/ee/profiles_helper_spec.rb'
- 'ee/spec/helpers/ee/projects/incidents_helper_spec.rb'
@ -1021,7 +1020,6 @@ RSpec/FeatureCategory:
- 'ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/merge_requests/_merge_request_approvals.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb'
- 'ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb'
- 'ee/spec/views/shared/_kerberos_clone_button.html.haml_spec.rb'
- 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb'

View File

@ -23,5 +23,6 @@ reporters:
formatter:
rubocop: # formatting
require_paths: []
plugins: []
plugins:
- solargraph-rspec
max_files: 20000

View File

@ -478,7 +478,9 @@ gem 'warning', '~> 1.5.0', feature_category: :shared
group :development do
gem 'lefthook', '~> 1.11.0', require: false, feature_category: :tooling
gem 'rubocop', feature_category: :tooling
gem 'solargraph', '~> 0.47.2', require: false, feature_category: :shared
gem 'solargraph', '~> 0.54.0', require: false, feature_category: :shared
gem 'solargraph-rspec', '~> 0.5.1', require: false, feature_category: :shared
gem 'letter_opener_web', '~> 3.0.0', feature_category: :shared
gem 'lookbook', '~> 2.3', feature_category: :shared

View File

@ -138,7 +138,6 @@
{"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"},
{"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"},
{"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"},
{"name":"e2mmap","version":"0.1.0","platform":"ruby","checksum":"45ee6bba2d97a7d91ee0885774261feee87e28c598355df31e93b56196ec0f59"},
{"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"},
{"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"},
{"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"},
@ -340,8 +339,8 @@
{"name":"io-event","version":"1.9.0","platform":"ruby","checksum":"4c262b6610ad643a2be75e892135aca4fa67edc67d1944c0ae6b6e5dd73f4fc1"},
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.5.6","platform":"java","checksum":"3262aea433861fec3179184e9adc1933cca8bc15665957a143b56816f1a22f74"},
{"name":"jaro_winkler","version":"1.5.6","platform":"ruby","checksum":"007db7805527ada1cc12f2547676181d63b0a504ec4dd7a9a2eb2424521ccd81"},
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
{"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"},
{"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"},
{"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"},
@ -442,6 +441,7 @@
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},
{"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"},
{"name":"observer","version":"0.1.2","platform":"ruby","checksum":"d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac"},
{"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"},
{"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"},
{"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"},
@ -601,7 +601,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"},
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"},
{"name":"reverse_markdown","version":"2.1.1","platform":"ruby","checksum":"b2206466b682ac1177b6b8ec321d00a84fca02d096c5d676a7a0cc5838dc0701"},
{"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
@ -698,7 +698,8 @@
{"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"},
{"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"},
{"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"},
{"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"},
{"name":"solargraph","version":"0.54.0","platform":"ruby","checksum":"3fd13f381e6428b3c593716ee6d3d5aa802ac647b8b13692d760ab7ac3e1fdc1"},
{"name":"solargraph-rspec","version":"0.5.1","platform":"ruby","checksum":"0dfc9124f17b23e95c30acb82c1f799c865408a56b17099b2d6d7b23a76bface"},
{"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"},
{"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"},
{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"},
@ -797,5 +798,6 @@
{"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"},
{"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"},
{"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"},
{"name":"yard-solargraph","version":"0.1.0","platform":"ruby","checksum":"a19a4619c942181a618fb9458970a9d2534cf7fda69fc43949629a7948a5930e"},
{"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"}
]

View File

@ -579,7 +579,6 @@ GEM
zeitwerk (~> 2.6)
dumb_delegator (1.0.0)
duo_api (1.4.0)
e2mmap (0.1.0)
ed25519 (1.3.0)
elasticsearch (7.17.11)
elasticsearch-api (= 7.17.11)
@ -1043,7 +1042,7 @@ GEM
jaeger-client (1.1.0)
opentracing (~> 0.3)
thrift
jaro_winkler (1.5.6)
jaro_winkler (1.6.0)
jira-ruby (2.3.0)
activesupport
atlassian-jwt
@ -1232,6 +1231,7 @@ GEM
rack (>= 1.2, < 4)
snaky_hash (~> 2.0)
version_gem (~> 1.1)
observer (0.1.2)
octokit (9.2.0)
faraday (>= 1, < 3)
sawyer (~> 0.9)
@ -1609,7 +1609,7 @@ GEM
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
retriable (3.1.2)
reverse_markdown (1.4.0)
reverse_markdown (2.1.1)
nokogiri
rexml (3.4.1)
rinku (2.0.0)
@ -1788,21 +1788,27 @@ GEM
hashie
version_gem (~> 1.1)
snowplow-tracker (0.8.0)
solargraph (0.47.2)
solargraph (0.54.0)
backport (~> 1.2)
benchmark
bundler (>= 1.17.2)
bundler (~> 2.0)
diff-lcs (~> 1.4)
e2mmap
jaro_winkler (~> 1.5)
jaro_winkler (~> 1.6)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1)
logger (~> 1.6)
observer (~> 0.1)
ostruct (~> 0.6)
parser (~> 3.0)
reverse_markdown (>= 1.0.5, < 3)
rubocop (>= 0.52)
rbs (~> 3.3)
reverse_markdown (>= 2.0, < 4)
rubocop (~> 1.38)
thor (~> 1.0)
tilt (~> 2.0)
yard (~> 0.9, >= 0.9.24)
yard-solargraph (~> 0.1)
solargraph-rspec (0.5.1)
solargraph (~> 0.52, >= 0.52.0)
sorbet-runtime (0.5.11647)
spamcheck (1.3.3)
grpc (~> 1.63)
@ -2000,6 +2006,8 @@ GEM
nokogiri (~> 1.8)
yajl-ruby (1.4.3)
yard (0.9.37)
yard-solargraph (0.1.0)
yard (~> 0.9)
zeitwerk (2.6.7)
PLATFORMS
@ -2331,7 +2339,8 @@ DEPENDENCIES
simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.5)
snowplow-tracker (~> 0.8.0)
solargraph (~> 0.47.2)
solargraph (~> 0.54.0)
solargraph-rspec (~> 0.5.1)
spamcheck (~> 1.3.0)
spring (~> 4.3.0)
spring-commands-rspec (~> 1.0.4)

View File

@ -138,7 +138,6 @@
{"name":"dry-types","version":"1.7.1","platform":"ruby","checksum":"12165841145a18dd22151f143707b90c8093f71e5ae06ee0f2301f5321f8cdb8"},
{"name":"dumb_delegator","version":"1.0.0","platform":"ruby","checksum":"ff5e411816d2d8ad8e260b269e712ae3839dddb0f9f8e18d3b1a3fe08f6d2e94"},
{"name":"duo_api","version":"1.4.0","platform":"ruby","checksum":"06a6b406184e6e4b14af7389ac3990e667fb8509a1feba7de3af2f78d98c0877"},
{"name":"e2mmap","version":"0.1.0","platform":"ruby","checksum":"45ee6bba2d97a7d91ee0885774261feee87e28c598355df31e93b56196ec0f59"},
{"name":"ed25519","version":"1.3.0","platform":"java","checksum":"8e5d2f8a5325c7a463d61d1a48406ce54074c610f3dccd889e6532c9527a3894"},
{"name":"ed25519","version":"1.3.0","platform":"ruby","checksum":"514a5584f84d39daac568a17ec93a4e7261e140c52c562ed8c382c18456e627d"},
{"name":"elasticsearch","version":"7.17.11","platform":"ruby","checksum":"ed080f085d939f21d07f424ebcea95326e4bdb5f770a8f33aac699374f2ffc86"},
@ -343,8 +342,8 @@
{"name":"ipaddress","version":"0.8.3","platform":"ruby","checksum":"85640c4f9194c26937afc8c78e3074a8e7c97d5d1210358d1440f01034d006f5"},
{"name":"irb","version":"1.15.2","platform":"ruby","checksum":"222f32952e278da34b58ffe45e8634bf4afc2dc7aa9da23fed67e581aa50fdba"},
{"name":"jaeger-client","version":"1.1.0","platform":"ruby","checksum":"cb5e9b9bbee6ee8d6a82d03d947a5b04543d8c0a949c22e484254f18d8a458a8"},
{"name":"jaro_winkler","version":"1.5.6","platform":"java","checksum":"3262aea433861fec3179184e9adc1933cca8bc15665957a143b56816f1a22f74"},
{"name":"jaro_winkler","version":"1.5.6","platform":"ruby","checksum":"007db7805527ada1cc12f2547676181d63b0a504ec4dd7a9a2eb2424521ccd81"},
{"name":"jaro_winkler","version":"1.6.0","platform":"java","checksum":"6cbb36eb4c2649834124d8b92957e577890e8157dd41be8252fde5b02b63b42b"},
{"name":"jaro_winkler","version":"1.6.0","platform":"ruby","checksum":"8b081ab4ba7da5d16b438e62c4be58b87724bfeeb1527e62603f05ab0a2cc424"},
{"name":"jira-ruby","version":"2.3.0","platform":"ruby","checksum":"abf26e6bff4a8ea40bae06f7df6276a5776905c63fb2070934823ca54f62eb62"},
{"name":"jmespath","version":"1.6.2","platform":"ruby","checksum":"238d774a58723d6c090494c8879b5e9918c19485f7e840f2c1c7532cf84ebcb1"},
{"name":"js_regex","version":"3.8.0","platform":"ruby","checksum":"7934bcdd5a0e6d5af4a520288fd4684a02a472ae55831d9178ccaf82356344b5"},
@ -445,6 +444,7 @@
{"name":"numerizer","version":"0.2.0","platform":"ruby","checksum":"e58076d5ee5370417b7e52d9cb25836d62acd1b8d9a194c308707986c1705d7b"},
{"name":"oauth","version":"0.5.6","platform":"ruby","checksum":"4085fe28e0c5e2434135e00a6555294fd2a4ff96a98d1bdecdcd619fc6368dff"},
{"name":"oauth2","version":"2.0.9","platform":"ruby","checksum":"b21f9defcf52dc1610e0dfab4c868342173dcd707fd15c777d9f4f04e153f7fb"},
{"name":"observer","version":"0.1.2","platform":"ruby","checksum":"d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac"},
{"name":"octokit","version":"9.2.0","platform":"ruby","checksum":"4fa47ff35ce654127edf2c836ab9269bcc8829f5542dc1e86871f697ce7f4316"},
{"name":"ohai","version":"18.1.18","platform":"ruby","checksum":"42ee8196945cb935fdeec93ba7aaee757d1d552f7b933912a1f25863c3cc1ff0"},
{"name":"oj","version":"3.16.10","platform":"ruby","checksum":"7f26bed974e331e16d579b470b0865010757f6fe6ee30ea9b67df653fbe13d7c"},
@ -611,7 +611,7 @@
{"name":"rest-client","version":"2.1.0","platform":"x86-mingw32","checksum":"fb543caf36cb555c05c6186aeb1273c6a1b059896e4cfd394e7269b20c40ca01"},
{"name":"rest-client","version":"2.1.0","platform":"x86-mswin32","checksum":"a35a3bb8d16ca39d110a946a2c805267f98ce07a0ae890e4512a45eadea47a6e"},
{"name":"retriable","version":"3.1.2","platform":"ruby","checksum":"0a5a5d0ca4ba61a76fb31a17ab8f7f80281beb040c329d34dfc137a1398688e0"},
{"name":"reverse_markdown","version":"1.4.0","platform":"ruby","checksum":"a3305da1509ac8388fa84a28745621113e121383402a2e8e9350ba649034e870"},
{"name":"reverse_markdown","version":"2.1.1","platform":"ruby","checksum":"b2206466b682ac1177b6b8ec321d00a84fca02d096c5d676a7a0cc5838dc0701"},
{"name":"rexml","version":"3.4.1","platform":"ruby","checksum":"c74527a9a0a04b4ec31dbe0dc4ed6004b960af943d8db42e539edde3a871abca"},
{"name":"rinku","version":"2.0.0","platform":"ruby","checksum":"3e695aaf9f24baba3af45823b5c427b58a624582132f18482320e2737f9f8a85"},
{"name":"rotp","version":"6.3.0","platform":"ruby","checksum":"75d40087e65ed0d8022c33055a6306c1c400d1c12261932533b5d6cbcd868854"},
@ -709,7 +709,8 @@
{"name":"slack-messenger","version":"2.3.6","platform":"ruby","checksum":"58581e587debcbb769336cc7ebe4eb6ae411947fccf347e967a17ac9813e66d8"},
{"name":"snaky_hash","version":"2.0.0","platform":"ruby","checksum":"fe8b2e39e8ff69320f7812af73ea06401579e29ff1734a7009567391600687de"},
{"name":"snowplow-tracker","version":"0.8.0","platform":"ruby","checksum":"7ba6f4f1443a829845fd28e63eda72d9d3d247f485310ddcccaebbc52b734a38"},
{"name":"solargraph","version":"0.47.2","platform":"ruby","checksum":"87ca4b799b9155c2c31c15954c483e952fdacd800f52d6709b901dd447bcac6a"},
{"name":"solargraph","version":"0.54.0","platform":"ruby","checksum":"3fd13f381e6428b3c593716ee6d3d5aa802ac647b8b13692d760ab7ac3e1fdc1"},
{"name":"solargraph-rspec","version":"0.5.1","platform":"ruby","checksum":"0dfc9124f17b23e95c30acb82c1f799c865408a56b17099b2d6d7b23a76bface"},
{"name":"sorbet-runtime","version":"0.5.11647","platform":"ruby","checksum":"64b65112f2e6a5323310ca9ac0d7d9a6be63aade5a62a6225fe066042ff4fdb6"},
{"name":"spamcheck","version":"1.3.3","platform":"ruby","checksum":"3a29ba9dfcd59543d88054d38c657f79e0a6cf44d763df08ad47680abed50ec7"},
{"name":"spring","version":"4.3.0","platform":"ruby","checksum":"0aaaf3bcce38e8528275854881d1922660d76cbd19a9a3af4a419d95b7fe7122"},
@ -810,5 +811,6 @@
{"name":"xpath","version":"3.2.0","platform":"ruby","checksum":"6dfda79d91bb3b949b947ecc5919f042ef2f399b904013eb3ef6d20dd3a4082e"},
{"name":"yajl-ruby","version":"1.4.3","platform":"ruby","checksum":"8c974d9c11ae07b0a3b6d26efea8407269b02e4138118fbe3ef0d2ec9724d1d2"},
{"name":"yard","version":"0.9.37","platform":"ruby","checksum":"a6e910399e78e613f80ba9add9ba7c394b1a935f083cccbef82903a3d2a26992"},
{"name":"yard-solargraph","version":"0.1.0","platform":"ruby","checksum":"a19a4619c942181a618fb9458970a9d2534cf7fda69fc43949629a7948a5930e"},
{"name":"zeitwerk","version":"2.6.7","platform":"ruby","checksum":"61767a6158480df290d0d2a3fd860d8ba3a28ba113837668ee94b657716a1409"}
]

View File

@ -591,7 +591,6 @@ GEM
zeitwerk (~> 2.6)
dumb_delegator (1.0.0)
duo_api (1.4.0)
e2mmap (0.1.0)
ed25519 (1.3.0)
elasticsearch (7.17.11)
elasticsearch-api (= 7.17.11)
@ -1060,7 +1059,7 @@ GEM
jaeger-client (1.1.0)
opentracing (~> 0.3)
thrift
jaro_winkler (1.5.6)
jaro_winkler (1.6.0)
jira-ruby (2.3.0)
activesupport
atlassian-jwt
@ -1249,6 +1248,7 @@ GEM
rack (>= 1.2, < 4)
snaky_hash (~> 2.0)
version_gem (~> 1.1)
observer (0.1.2)
octokit (9.2.0)
faraday (>= 1, < 3)
sawyer (~> 0.9)
@ -1641,7 +1641,7 @@ GEM
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
retriable (3.1.2)
reverse_markdown (1.4.0)
reverse_markdown (2.1.1)
nokogiri
rexml (3.4.1)
rinku (2.0.0)
@ -1821,21 +1821,27 @@ GEM
hashie
version_gem (~> 1.1)
snowplow-tracker (0.8.0)
solargraph (0.47.2)
solargraph (0.54.0)
backport (~> 1.2)
benchmark
bundler (>= 1.17.2)
bundler (~> 2.0)
diff-lcs (~> 1.4)
e2mmap
jaro_winkler (~> 1.5)
jaro_winkler (~> 1.6)
kramdown (~> 2.3)
kramdown-parser-gfm (~> 1.1)
logger (~> 1.6)
observer (~> 0.1)
ostruct (~> 0.6)
parser (~> 3.0)
reverse_markdown (>= 1.0.5, < 3)
rubocop (>= 0.52)
rbs (~> 3.3)
reverse_markdown (>= 2.0, < 4)
rubocop (~> 1.38)
thor (~> 1.0)
tilt (~> 2.0)
yard (~> 0.9, >= 0.9.24)
yard-solargraph (~> 0.1)
solargraph-rspec (0.5.1)
solargraph (~> 0.52, >= 0.52.0)
sorbet-runtime (0.5.11647)
spamcheck (1.3.3)
grpc (~> 1.63)
@ -2034,6 +2040,8 @@ GEM
nokogiri (~> 1.8)
yajl-ruby (1.4.3)
yard (0.9.37)
yard-solargraph (0.1.0)
yard (~> 0.9)
zeitwerk (2.6.7)
PLATFORMS
@ -2365,7 +2373,8 @@ DEPENDENCIES
simplecov-lcov (~> 0.8.0)
slack-messenger (~> 2.3.5)
snowplow-tracker (~> 0.8.0)
solargraph (~> 0.47.2)
solargraph (~> 0.54.0)
solargraph-rspec (~> 0.5.1)
spamcheck (~> 1.3.0)
spring (~> 4.3.0)
spring-commands-rspec (~> 1.0.4)

View File

@ -1,10 +1,8 @@
<script>
import { GlIcon, GlTooltipDirective } from '@gitlab/ui';
import { findAwardEmojiWidget } from '~/work_items/utils';
import { i18n } from '../constants';
import { findAwardEmojiWidget, findDevelopmentWidget } from '~/work_items/utils';
export default {
i18n,
components: {
GlIcon,
},
@ -18,6 +16,12 @@ export default {
},
},
computed: {
closingMergeRequestsCount() {
return (
this.issue.mergeRequestsCount ||
findDevelopmentWidget(this.issue)?.closingMergeRequests.count
);
},
downvotes() {
return this.issue.downvotes || findAwardEmojiWidget(this.issue)?.downvotes;
},
@ -34,7 +38,7 @@ export default {
v-if="upvotes"
v-gl-tooltip
class="gl-hidden sm:gl-block"
:title="$options.i18n.upvotes"
:title="__('Upvotes')"
data-testid="issuable-upvotes"
>
<gl-icon name="thumb-up" />
@ -44,21 +48,21 @@ export default {
v-if="downvotes"
v-gl-tooltip
class="gl-hidden sm:gl-block"
:title="$options.i18n.downvotes"
:title="__('Downvotes')"
data-testid="issuable-downvotes"
>
<gl-icon name="thumb-down" />
{{ downvotes }}
</li>
<li
v-if="issue.mergeRequestsCount"
v-if="closingMergeRequestsCount"
v-gl-tooltip
class="gl-hidden sm:gl-block"
:title="__('Related merge requests')"
data-testid="merge-requests"
>
<gl-icon name="merge-request" />
{{ issue.mergeRequestsCount }}
{{ closingMergeRequestsCount }}
</li>
<slot></slot>
</ul>

View File

@ -4,7 +4,11 @@ import { STATUS_CLOSED } from '~/issues/constants';
import { humanTimeframe, isInPast, localeDateFormat, newDate } from '~/lib/utils/datetime_utility';
import { __ } from '~/locale';
import { STATE_CLOSED } from '~/work_items/constants';
import { findMilestoneWidget, findStartAndDueDateWidget } from '~/work_items/utils';
import {
findMilestoneWidget,
findStartAndDueDateWidget,
findTimeTrackingWidget,
} from '~/work_items/utils';
import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue';
import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue';
@ -55,7 +59,11 @@ export default {
return findStartAndDueDateWidget(this.issue)?.startDate;
},
timeEstimate() {
return this.issue.humanTimeEstimate || this.issue.timeStats?.humanTimeEstimate;
return (
this.issue.humanTimeEstimate ||
this.issue.timeStats?.humanTimeEstimate ||
findTimeTrackingWidget(this.issue)?.humanReadableAttributes.timeEstimate
);
},
},
};

View File

@ -105,13 +105,11 @@ export const i18n = {
closedMoved: CLOSED_MOVED,
confidentialNo: __('No'),
confidentialYes: __('Yes'),
downvotes: __('Downvotes'),
errorFetchingCounts: __('An error occurred while getting issue counts'),
errorFetchingIssues: __('An error occurred while loading issues'),
issueRepositioningMessage: __(
'Issues are being rebalanced at the moment, so manual reordering is disabled.',
),
upvotes: __('Upvotes'),
titles: __('Titles'),
descriptions: __('Descriptions'),
subscribedExplicitly: __('Explicitly subscribed'),

View File

@ -239,7 +239,7 @@ export default {
</p>
</div>
<div class="gl-flex gl-items-center gl-gap-3" data-testid="crud-actions">
<slot name="actions" :show-form="showForm"></slot>
<slot name="actions" :show-form="showForm" :is-form-visible="isFormVisible"></slot>
<gl-button
v-if="toggleText && !isFormUsedAndVisible"
size="small"

View File

@ -8,13 +8,13 @@ export default {
};
const data = () => ({
selected: ['option', 'option-two'],
checked: ['option', 'option-two'],
});
const Template = () => ({
components: { MultipleChoiceSelector, MultipleChoiceSelectorItem, GlBadge, GlIcon },
data,
template: `<multiple-choice-selector :selected="selected">
template: `<multiple-choice-selector v-model="checked">
<multiple-choice-selector-item value="option" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item>
<multiple-choice-selector-item value="option-two" title="Option name" description="This is a description for this option. Descriptions are optional." :disabled="false"></multiple-choice-selector-item>
<multiple-choice-selector-item value="option-3" description="This is a description for this option. Descriptions are optional." :disabled="false">

View File

@ -2,25 +2,27 @@
import { GlFormCheckboxGroup } from '@gitlab/ui';
export default {
name: 'MultipleChoiceSelector',
components: { GlFormCheckboxGroup },
props: {
selected: {
type: Array,
required: true,
},
model: {
prop: 'checked',
event: 'input',
},
data() {
return {
selectedOptions: this.selected,
};
props: {
checked: {
type: Array,
required: false,
default: () => [],
},
},
};
</script>
<template>
<gl-form-checkbox-group
v-model="selectedOptions"
:checked="checked"
class="multiple-choice-selector gl-border gl-block gl-rounded-base"
@input="$emit('input', $event)"
>
<slot></slot>
</gl-form-checkbox-group>

View File

@ -403,6 +403,7 @@ export default {
<gl-icon
v-if="issuable.hidden"
v-gl-tooltip
class="gl-mr-2"
name="spam"
:title="hiddenIssuableTitle"
:aria-label="__('Hidden')"

View File

@ -1,6 +1,5 @@
fragment BaseWorkItemWidgets on WorkItemWidget {
... on WorkItemWidgetAssignees {
type
assignees {
nodes {
id
@ -12,8 +11,16 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
}
}
}
... on WorkItemWidgetAwardEmoji {
upvotes
downvotes
}
... on WorkItemWidgetDevelopment {
closingMergeRequests {
count
}
}
... on WorkItemWidgetLabels {
type
allowsScopedLabels
labels {
nodes {
@ -25,7 +32,6 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
}
}
... on WorkItemWidgetMilestone {
type
milestone {
id
dueDate
@ -35,13 +41,12 @@ fragment BaseWorkItemWidgets on WorkItemWidget {
}
}
... on WorkItemWidgetStartAndDueDate {
type
dueDate
startDate
}
... on WorkItemWidgetAwardEmoji {
type
upvotes
downvotes
... on WorkItemWidgetTimeTracking {
humanReadableAttributes {
timeEstimate
}
}
}

View File

@ -75,6 +75,7 @@ query getWorkItems(
}
nodes {
id
iid
author {
id
avatarUrl
@ -84,10 +85,9 @@ query getWorkItems(
webPath
}
closedAt
userDiscussionsCount
confidential
createdAt
iid
hidden
namespace {
id
fullPath
@ -96,6 +96,7 @@ query getWorkItems(
state
title
updatedAt
userDiscussionsCount
webUrl
widgets {
type
@ -146,6 +147,7 @@ query getWorkItems(
}
nodes {
id
iid
author {
id
avatarUrl
@ -155,10 +157,9 @@ query getWorkItems(
webPath
}
closedAt
userDiscussionsCount
confidential
createdAt
iid
hidden
namespace {
id
fullPath
@ -167,6 +168,7 @@ query getWorkItems(
state
title
updatedAt
userDiscussionsCount
webUrl
widgets {
type

View File

@ -31,6 +31,7 @@ import {
DEFAULT_PAGE_SIZE_CHILD_ITEMS,
STATE_CLOSED,
NAME_TO_ENUM_MAP,
WIDGET_TYPE_DEVELOPMENT,
} from './constants';
export const isAssigneesWidget = (widget) => widget.type === WIDGET_TYPE_ASSIGNEES;
@ -51,6 +52,9 @@ export const findCurrentUserTodosWidget = (workItem) =>
export const findDescriptionWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESCRIPTION);
export const findDevelopmentWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DEVELOPMENT);
export const findDesignsWidget = (workItem) =>
workItem?.widgets?.find((widget) => widget.type === WIDGET_TYPE_DESIGNS);

View File

@ -37,6 +37,7 @@ module Admin
feature_category :pages, [:lets_encrypt_terms_of_service]
feature_category :observability, [:reset_error_tracking_access_token]
feature_category :global_search, [:search]
feature_category :environment_management, [:usage_quotas]
VALID_SETTING_PANELS = %w[general repository
ci_cd reporting metrics_and_profiling

View File

@ -46,6 +46,10 @@ module Resolvers
Unauthenticated requests always return all public groups. The `owned_only` argument takes precedence.
DESC
argument :marked_for_deletion_on, ::Types::DateType,
required: false,
description: 'Date when the group was marked for deletion.'
private
def resolve_groups(parent_path: nil, **args)

View File

@ -7,8 +7,4 @@ module WikiPageVersionHelper
user = wiki_page_version.author
user.nil? ? "mailto:#{wiki_page_version.author_email}" : Gitlab::UrlBuilder.build(user)
end
def wiki_page_version_author_avatar(wiki_page_version)
image_tag(avatar_icon_for_email(wiki_page_version.author_email, 24), class: "avatar s24 float-none !gl-mr-0")
end
end

View File

@ -5,26 +5,26 @@ module Namespaces
extend ActiveSupport::Concern
def adjourned_deletion?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
adjourned_deletion_configured?
end
def adjourned_deletion_configured?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
return false if try(:personal?)
deletion_adjourned_period > 0
end
def marked_for_deletion?
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
return false unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
marked_for_deletion_on.present?
end
def self_or_ancestor_marked_for_deletion
return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
return self if marked_for_deletion?
ancestors(hierarchy_order: :asc).joins(:deletion_schedule).first

View File

@ -45,7 +45,7 @@ module Groups # rubocop:disable Gitlab/BoundedContexts -- existing top-level mod
end
def feature_downtiered?
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
end
end
end

View File

@ -49,7 +49,7 @@ module Projects
end
def feature_downtiered?
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
end
end
end

View File

@ -1,3 +1,3 @@
- return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :wip)
- return unless Feature.enabled?(:downtier_delayed_deletion, :instance, type: :gitlab_com_derisk)
#js-admin-deletion-protection-settings{ data: deletion_protection_data }

View File

@ -0,0 +1 @@
= render 'admin/usage_quotas/index'

View File

@ -0,0 +1,7 @@
- content_for :usage_quotas_subtitle do
= s_('UsageQuota|Usage of shared resources across the projects in your instance')
- content_for :usage_quotas_tabs do
#js-pipeline-usage-app
= render 'shared/usage_quotas/index'

View File

@ -1,8 +0,0 @@
---
name: pipeline_subscriptions_vue
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/139405
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/434831
milestone: '16.7'
type: development
group: group::pipeline execution
default_enabled: false

View File

@ -2,8 +2,8 @@
name: downtier_delayed_deletion
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/526403
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/185850
rollout_issue_url:
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/536634
milestone: '17.11'
group: group::authorization
type: wip
type: gitlab_com_derisk
default_enabled: false

View File

@ -168,7 +168,7 @@ namespace :admin do
put :reset_health_check_token
put :reset_error_tracking_access_token
put :clear_repository_check_states
match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, :search, via: [:get, :patch]
match :general, :integrations, :repository, :ci_cd, :reporting, :metrics_and_profiling, :network, :preferences, :search, :usage_quotas, via: [:get, :patch]
get :lets_encrypt_terms_of_service
get :slack_app_manifest_download, format: :json
get :slack_app_manifest_share

View File

@ -1055,17 +1055,17 @@ paths:
description: Only include top-level groups
type: boolean
required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query
name: repository_storage
description: Filter by repository storage used by the group
type: string
required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query
name: page
description: Current page number
@ -1794,17 +1794,17 @@ paths:
description: Only include top-level groups
type: boolean
required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query
name: repository_storage
description: Filter by repository storage used by the group
type: string
required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query
name: page
description: Current page number
@ -1931,17 +1931,17 @@ paths:
description: Only include top-level groups
type: boolean
required: false
- in: query
name: marked_for_deletion_on
description: Return groups that are marked for deletion on this date
type: string
format: date
required: false
- in: query
name: repository_storage
description: Filter by repository storage used by the group
type: string
required: false
- in: query
name: marked_for_deletion_on
description: Date when the group was marked for deletion
type: string
format: date
required: false
- in: query
name: page
description: Current page number

View File

@ -32,6 +32,7 @@ module API
optional :sort, type: String, values: %w[asc desc], default: 'asc', desc: 'Sort by asc (ascending) or desc (descending)'
optional :min_access_level, type: Integer, values: Gitlab::Access.all_values, desc: 'Minimum access level of authenticated user'
optional :top_level_only, type: Boolean, desc: 'Only include top-level groups'
optional :marked_for_deletion_on, type: Date, desc: 'Return groups that are marked for deletion on this date'
use :optional_group_list_params_ee
use :pagination
end
@ -60,7 +61,7 @@ module API
[:all_available,
:custom_attributes,
:owned, :min_access_level,
:include_parent_descendants, :search, :visibility, :archived]
:include_parent_descendants, :search, :visibility, :archived, :marked_for_deletion_on]
end
# This is a separate method so that EE can extend its behaviour, without

View File

@ -3681,9 +3681,6 @@ msgstr ""
msgid "Add new key"
msgstr ""
msgid "Add new pipeline subscription"
msgstr ""
msgid "Add new pipeline trigger token"
msgstr ""
@ -20855,9 +20852,6 @@ msgstr ""
msgid "Delete source branch when merge request is accepted."
msgstr ""
msgid "Delete subscription"
msgstr ""
msgid "Delete table"
msgstr ""
@ -30802,6 +30796,9 @@ msgstr ""
msgid "Horizontal rule"
msgstr ""
msgid "Hosted runner usage"
msgstr ""
msgid "Hostname"
msgstr ""
@ -40370,9 +40367,6 @@ msgstr ""
msgid "No project selected"
msgstr ""
msgid "No project subscribes to the pipelines in this project."
msgstr ""
msgid "No projects"
msgstr ""
@ -44556,7 +44550,7 @@ msgstr ""
msgid "PipelineSubscriptions|Subscription for this project will be removed. Do you want to continue?"
msgstr ""
msgid "PipelineSubscriptions|Subscription successfully added."
msgid "PipelineSubscriptions|Subscription successfully created."
msgstr ""
msgid "PipelineSubscriptions|Subscription successfully deleted."
@ -58932,9 +58926,6 @@ msgstr ""
msgid "Subscribed to notifications."
msgstr ""
msgid "Subscribed to this project"
msgstr ""
msgid "Subscribes to notifications."
msgstr ""
@ -58950,9 +58941,6 @@ msgstr ""
msgid "Subscription deletion failed."
msgstr ""
msgid "Subscription for %{subscription} will be removed. Do you want to continue?"
msgstr ""
msgid "Subscription for this instance cannot be synchronized. Contact GitLab customer support to obtain a license."
msgstr ""
@ -61990,9 +61978,6 @@ msgstr ""
msgid "This project is mirrored from %{link}."
msgstr ""
msgid "This project is not subscribed to any project pipelines."
msgstr ""
msgid "This project is pending deletion, and will be deleted on %{date}. Repository and other project resources are read-only."
msgstr ""
@ -64611,12 +64596,18 @@ msgstr ""
msgid "Usage"
msgstr ""
msgid "Usage Quotas"
msgstr ""
msgid "Usage breakdown"
msgstr ""
msgid "Usage statistics"
msgstr ""
msgid "Usage this month"
msgstr ""
msgid "Usage trends"
msgstr ""
@ -64695,9 +64686,18 @@ msgstr ""
msgid "UsageQuota|Excess storage usage"
msgstr ""
msgid "UsageQuota|Filter by runner"
msgstr ""
msgid "UsageQuota|Filter chart by year"
msgstr ""
msgid "UsageQuota|Filter charts by year"
msgstr ""
msgid "UsageQuota|Filter list by month"
msgstr ""
msgid "UsageQuota|Filter projects data by month"
msgstr ""
@ -64713,6 +64713,12 @@ msgstr ""
msgid "UsageQuota|Group settings %{gt} Usage quotas"
msgstr ""
msgid "UsageQuota|Hosted runner duration"
msgstr ""
msgid "UsageQuota|Hosted runner pipeline duration by month"
msgstr ""
msgid "UsageQuota|How are limits applied?"
msgstr ""
@ -64746,6 +64752,9 @@ msgstr ""
msgid "UsageQuota|Month"
msgstr ""
msgid "UsageQuota|Namespace"
msgstr ""
msgid "UsageQuota|Namespace entities"
msgstr ""
@ -64800,12 +64809,18 @@ msgstr ""
msgid "UsageQuota|Shared bits of code and text."
msgstr ""
msgid "UsageQuota|Something went wrong while fetching compute usage"
msgstr ""
msgid "UsageQuota|Something went wrong while fetching pipeline statistics"
msgstr ""
msgid "UsageQuota|Something went wrong while fetching project storage statistics"
msgstr ""
msgid "UsageQuota|Something went wrong while fetching runner filters"
msgstr ""
msgid "UsageQuota|Something went wrong while loading Usage Quotas Tabs."
msgstr ""
@ -64878,6 +64893,9 @@ msgstr ""
msgid "UsageQuota|Usage by month"
msgstr ""
msgid "UsageQuota|Usage by namespace"
msgstr ""
msgid "UsageQuota|Usage by project"
msgstr ""
@ -64890,6 +64908,9 @@ msgstr ""
msgid "UsageQuota|Usage of resources across your projects"
msgstr ""
msgid "UsageQuota|Usage of shared resources across the projects in your instance"
msgstr ""
msgid "UsageQuota|User settings %{gt} Usage quotas"
msgstr ""
@ -72042,6 +72063,9 @@ msgstr ""
msgid "milestone should belong either to a project or a group."
msgstr ""
msgid "minutes"
msgstr ""
msgid "missing"
msgstr ""

View File

@ -7,7 +7,7 @@
require 'parallel'
require 'rainbow'
UNUSED_METHODS = 57
UNUSED_METHODS = 56
print_output = %w[true 1].include? ENV["REPORT_ALL_UNUSED_METHODS"]

View File

@ -1,6 +1,7 @@
import { GlIcon } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import IssueCardStatistics from '~/issues/list/components/issue_card_statistics.vue';
import { WIDGET_TYPE_AWARD_EMOJI, WIDGET_TYPE_DEVELOPMENT } from '~/work_items/constants';
describe('IssueCardStatistics CE component', () => {
let wrapper;
@ -59,14 +60,18 @@ describe('IssueCardStatistics CE component', () => {
});
describe('with work item object', () => {
it('renders upvotes and downvotes', () => {
it('renders upvotes, downvotes, and closing merge requests', () => {
const issue = {
widgets: [{ type: 'AWARD_EMOJI', downvotes: '4', upvotes: '8' }],
widgets: [
{ type: WIDGET_TYPE_AWARD_EMOJI, downvotes: '4', upvotes: '8' },
{ type: WIDGET_TYPE_DEVELOPMENT, closingMergeRequests: { count: 3 } },
],
};
mountComponent(issue);
expect(findDownvotes().text()).toBe('4');
expect(findUpvotes().text()).toBe('8');
expect(findMergeRequests().text()).toBe('3');
});
});
});

View File

@ -1,18 +1,25 @@
import { GlIcon } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import { useFakeDate } from 'helpers/fake_date';
import { STATUS_CLOSED } from '~/issues/constants';
import IssueCardTimeInfo from '~/issues/list/components/issue_card_time_info.vue';
import IssuableMilestone from '~/vue_shared/issuable/list/components/issuable_milestone.vue';
import { WIDGET_TYPE_MILESTONE, WIDGET_TYPE_START_AND_DUE_DATE } from '~/work_items/constants';
import {
WIDGET_TYPE_MILESTONE,
WIDGET_TYPE_START_AND_DUE_DATE,
WIDGET_TYPE_TIME_TRACKING,
} from '~/work_items/constants';
import WorkItemAttribute from '~/vue_shared/components/work_item_attribute.vue';
describe('CE IssueCardTimeInfo component', () => {
useFakeDate(2020, 11, 11); // 2020 Dec 11
let wrapper;
const issueObject = ({ milestoneStartDate, milestoneDueDate, dueDate, state } = {}) => ({
const issueObject = ({
milestoneStartDate,
milestoneDueDate,
dueDate,
state,
timeEstimate,
} = {}) => ({
milestone: {
dueDate: milestoneDueDate,
startDate: milestoneStartDate,
@ -20,7 +27,7 @@ describe('CE IssueCardTimeInfo component', () => {
webPath: '/milestone/webPath',
},
dueDate,
humanTimeEstimate: '1w',
humanTimeEstimate: timeEstimate,
state,
});
@ -30,6 +37,7 @@ describe('CE IssueCardTimeInfo component', () => {
startDate,
dueDate,
state,
timeEstimate,
} = {}) => ({
state,
widgets: [
@ -47,6 +55,12 @@ describe('CE IssueCardTimeInfo component', () => {
dueDate,
startDate,
},
{
type: WIDGET_TYPE_TIME_TRACKING,
humanReadableAttributes: {
timeEstimate,
},
},
],
});
@ -93,7 +107,7 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when in the past', () => {
describe('when issue is open', () => {
it('renders in red with overdue icon', () => {
wrapper = mountComponent({ issue: object({ dueDate: '2020-10-10' }) });
wrapper = mountComponent({ issue: object({ dueDate: '2020-01-01' }) });
expect(findDueDateIcon().props()).toMatchObject({
variant: 'danger',
name: 'calendar-overdue',
@ -104,7 +118,7 @@ describe('CE IssueCardTimeInfo component', () => {
describe('when issue is closed', () => {
it('does not render in red with overdue icon', () => {
wrapper = mountComponent({
issue: object({ dueDate: '2020-10-10', state: STATUS_CLOSED }),
issue: object({ dueDate: '2020-01-01', state: STATUS_CLOSED }),
});
expect(findDueDateIcon().props()).toMatchObject({
@ -137,14 +151,16 @@ describe('CE IssueCardTimeInfo component', () => {
});
});
});
});
it('renders time estimate', () => {
wrapper = mountComponent();
const timeEstimate = wrapper.findByTestId('time-estimate');
describe('time estimate', () => {
it('renders time estimate', () => {
wrapper = mountComponent({ issue: object({ timeEstimate: '1w' }) });
const timeEstimate = wrapper.findByTestId('time-estimate');
expect(findWorkItemAttribute().props('title')).toBe('1w');
expect(findWorkItemAttribute().props('tooltipText')).toBe('Estimate');
expect(timeEstimate.findComponent(GlIcon).props('name')).toBe('timer');
expect(findWorkItemAttribute().props('title')).toBe('1w');
expect(findWorkItemAttribute().props('tooltipText')).toBe('Estimate');
expect(timeEstimate.findComponent(GlIcon).props('name')).toBe('timer');
});
});
});
});

View File

@ -5,16 +5,12 @@ import MultipleChoiceSelector from '~/vue_shared/components/multiple_choice_sele
describe('MultipleChoiceSelector', () => {
let wrapper;
const defaultPropsData = {
selected: ['option'],
};
function createComponent({ propsData = {} } = {}) {
function createComponent({ props, ...options } = {}) {
wrapper = shallowMount(MultipleChoiceSelector, {
propsData: {
...defaultPropsData,
...propsData,
...props,
},
...options,
});
}
@ -25,4 +21,34 @@ describe('MultipleChoiceSelector', () => {
expect(findCheckboxGroup().exists()).toBe(true);
});
it('checks options', () => {
createComponent({
props: {
checked: ['my-option', 'my-option-2'],
},
});
expect(findCheckboxGroup().attributes('checked')).toEqual('my-option,my-option-2');
});
it('emits checked options', () => {
createComponent();
findCheckboxGroup().vm.$emit('input', ['my-option-2']);
expect(wrapper.emitted()).toEqual({
input: [[['my-option-2']]],
});
});
it('renders slot', () => {
createComponent({
slots: {
default: 'content',
},
});
expect(wrapper.html()).toContain('content');
});
});

View File

@ -5403,6 +5403,7 @@ export const groupWorkItemsQueryResponse = {
closedAt: '',
confidential: true,
createdAt: '2020-01-23T12:34:56Z',
hidden: true,
namespace: {
id: 'full-path-epic-id',
fullPath: 'full-path',
@ -5457,6 +5458,7 @@ export const groupWorkItemsQueryResponse = {
closedAt: '',
confidential: true,
createdAt: '2020-01-23T12:34:56Z',
hidden: true,
namespace: {
id: 'full-path-epic-id',
fullPath: 'full-path',

View File

@ -130,5 +130,24 @@ RSpec.describe Resolvers::GroupsResolver, feature_category: :groups_and_projects
end
end
end
context 'with marked_for_deletion_on filter', :freeze_time do
let_it_be(:marked_for_deletion_on) { Date.yesterday }
let_it_be(:group_marked_for_deletion) do
create(:group_with_deletion_schedule, marked_for_deletion_on: marked_for_deletion_on, owners: user)
end
context 'when a group has been marked for deletion on the given date' do
let(:params) { { marked_for_deletion_on: marked_for_deletion_on } }
it { is_expected.to contain_exactly(group_marked_for_deletion) }
end
context 'when no groups have been marked for deletion on the given date' do
let(:params) { { marked_for_deletion_on: (marked_for_deletion_on - 2.days) } }
it { is_expected.to be_empty }
end
end
end
end

View File

@ -29,18 +29,4 @@ RSpec.describe WikiPageVersionHelper, feature_category: :wiki do
end
end
end
describe '#wiki_page_version_author_avatar' do
let(:commit) { commit_with_user }
subject { helper.wiki_page_version_author_avatar(wiki_page_version) }
it 'returns the user avatar', :aggregate_failures do
avatar = Nokogiri::HTML.parse(subject)
expect(avatar.css('img')[0].attr('class')).to eq('avatar s24 float-none !gl-mr-0 lazy')
expect(avatar.css('img')[0].attr('data-src')).not_to be_empty
expect(avatar.css('img')[0].attr('src')).not_to be_empty
end
end
end

View File

@ -1018,6 +1018,31 @@ RSpec.describe API::Groups, :with_current_organization, feature_category: :group
end
end
end
context 'when using the marked_for_deletion_on filter' do
let_it_be(:group_with_deletion_on) { create(:group_with_deletion_schedule, name: "group_with_deletion_on", marked_for_deletion_on: Date.parse('2024-01-01'), owners: user1) }
let_it_be(:group_without_deletion) { create(:group, name: "group_without_deletion", owners: user1) }
let(:response_groups) { json_response.map { |group| group['id'] } }
it 'returns groups marked for deletion on the specified date' do
get api("/groups", user1), params: { marked_for_deletion_on: Date.parse('2024-01-01') }
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(response_groups).to contain_exactly(group_with_deletion_on.id)
expect(json_response.map { |group| group["marked_for_deletion_on"] }).to contain_exactly(Date.parse('2024-01-01').iso8601)
end
it 'returns all groups when marked_for_deletion_on is not specified' do
get api("/groups", user1)
expect(response).to have_gitlab_http_status(:ok)
expect(response).to include_pagination_headers
expect(json_response).to be_an Array
expect(response_groups).to contain_exactly(group1.id, group_with_deletion_on.id, group_without_deletion.id)
end
end
end
describe 'PUT /groups/:id' do

View File

@ -667,7 +667,6 @@
- './ee/spec/helpers/ee/labels_helper_spec.rb'
- './ee/spec/helpers/ee/lock_helper_spec.rb'
- './ee/spec/helpers/ee/namespaces_helper_spec.rb'
- './ee/spec/helpers/ee/namespace_user_cap_reached_alert_helper_spec.rb'
- './ee/spec/helpers/ee/operations_helper_spec.rb'
- './ee/spec/helpers/ee/personal_access_tokens_helper_spec.rb'
- './ee/spec/helpers/ee/profiles_helper_spec.rb'
@ -2311,7 +2310,6 @@
- './ee/spec/views/projects/security/policies/index.html.haml_spec.rb'
- './ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb'
- './ee/spec/views/projects/settings/merge_requests/_merge_request_status_checks_settings.html.haml_spec.rb'
- './ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb'
- './ee/spec/views/registrations/groups/new.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan_actions.html.haml_spec.rb'
- './ee/spec/views/shared/billings/_billing_plan.html.haml_spec.rb'

View File

@ -100,6 +100,7 @@ RSpec.describe Tooling::Danger::FeatureFlag, feature_category: :tooling do
let(:yaml) do
{
'name' => name,
'description' => 'feature flag description',
'default_enabled' => default_enabled,
'feature_issue_url' => feature_issue_url,
'rollout_issue_url' => rollout_issue_url,

View File

@ -20,6 +20,7 @@ module Tooling
:path,
:lines,
:name,
:description,
:feature_issue_url,
:introduced_by_url,
:rollout_issue_url,