From 8f39099353eb6fd170538b39e5a69be9e02cacea Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 22 May 2025 03:07:28 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- GITALY_SERVER_VERSION | 2 +- Gemfile | 2 +- Gemfile.checksum | 4 +- Gemfile.lock | 6 +- Gemfile.next.checksum | 4 +- Gemfile.next.lock | 6 +- app/models/ci/build.rb | 1 + app/models/ci/build_name.rb | 1 + .../projects/pages/_pages_settings.html.haml | 13 ++- .../truncate_build_names.yml | 9 ++ config/initializers/1_settings.rb | 4 + .../NonStandardListDashes.yml | 0 doc/api/openapi/openapi_v2.yaml | 86 ++++++++++++++++--- doc/api/repositories.md | 50 +++++++++-- .../vulnerabilities/validity_check.md | 10 ++- lib/api/entities/repository_health.rb | 83 +++++++++++++++--- locale/gitlab.pot | 10 ++- spec/models/ci/build_spec.rb | 8 ++ .../delete_non_latest_diffs_service_spec.rb | 9 +- 19 files changed, 252 insertions(+), 56 deletions(-) create mode 100644 config/feature_flags/gitlab_com_derisk/truncate_build_names.yml rename doc/.vale/{gitlab_docs => gitlab_base}/NonStandardListDashes.yml (100%) diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 98eca256cdd..a677319275d 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -21e32d23ed544799646143bc9b8e7347d728af37 +883a25c9dcb385e77767f555b5a9b7a153e02f3f diff --git a/Gemfile b/Gemfile index 790634b1952..ad0845ce71a 100644 --- a/Gemfile +++ b/Gemfile @@ -635,7 +635,7 @@ gem 'ssh_data', '~> 1.3', feature_category: :shared gem 'spamcheck', '~> 1.3.0', feature_category: :insider_threat # Gitaly GRPC protocol definitions -gem 'gitaly', '~> 17.8.0', feature_category: :gitaly +gem 'gitaly', '~> 17.11.2', feature_category: :gitaly # KAS GRPC protocol definitions gem 'gitlab-kas-grpc', '~> 17.11.0', feature_category: :deployment_management diff --git a/Gemfile.checksum b/Gemfile.checksum index fa2a18f6df3..a83d73edd1e 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -215,7 +215,7 @@ {"name":"gettext","version":"3.5.1","platform":"ruby","checksum":"03ec7f71ea7e2cf1fdcd5e08682e98b81601922fdbee890b7bc6f63b0e1a512a"}, {"name":"gettext_i18n_rails","version":"1.13.0","platform":"ruby","checksum":"d4a4739d928b6ce52a2d694d33a831dcb06c7c8e197b3172fc73dfaa20ac8ee6"}, {"name":"git","version":"1.19.1","platform":"ruby","checksum":"b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70"}, -{"name":"gitaly","version":"17.8.4","platform":"ruby","checksum":"196d9735a83f8a7d396baa216b979eb0c801622d8b7573f90010338d5b0c7b4f"}, +{"name":"gitaly","version":"17.11.2","platform":"ruby","checksum":"32266469296345187d16ab3cfa3da849338817987b722a46eed4309ee18f996e"}, {"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"}, {"name":"gitlab-chronic","version":"0.10.6","platform":"ruby","checksum":"a244d11a1396d2aac6ae9b2f326adf1605ec1ad20c29f06e8b672047d415a9ac"}, {"name":"gitlab-cloud-connector","version":"1.12.0","platform":"ruby","checksum":"b1eb7b0f5cb6633929681904d92771b387ec126b02319cd6cb62dd04bd5750af"}, @@ -282,7 +282,7 @@ {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-darwin","checksum":"9dd1a8fde13e2b2f399cd9df95bc72851e28a71a70211145f02ec32f0569cd1c"}, {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-linux","checksum":"f4bf387f7aa782377ca3ac6ef3ff612867dfe8d061fd31f756082038f37df727"}, {"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"}, -{"name":"googleapis-common-protos-types","version":"1.19.0","platform":"ruby","checksum":"aecb76ca5326f8bcc47ab083259bbc4971d07e87f56808af7e210669d9765694"}, +{"name":"googleapis-common-protos-types","version":"1.20.0","platform":"ruby","checksum":"5e374b06bcfc7e13556e7c0d87b99f1fa3d42de6396a1de3d8fc13aefb4dd07f"}, {"name":"googleauth","version":"1.8.1","platform":"ruby","checksum":"814adadaaa1221dce72a67131e3ecbd6d23491a161ec84fb15fd353b87d8c9e7"}, {"name":"gpgme","version":"2.0.24","platform":"ruby","checksum":"53eccd7042abb4fd5c78f30bc9ed075b1325e6450eab207f2f6a1e7e28ae3b64"}, {"name":"grape","version":"2.0.0","platform":"ruby","checksum":"3aeff94c17e84ccead4ff98833df691e7da0c108878cc128ca31f80c1047494a"}, diff --git a/Gemfile.lock b/Gemfile.lock index 8a0775e7d3e..340f4b961fa 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -737,7 +737,7 @@ GEM git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) - gitaly (17.8.4) + gitaly (17.11.2) grpc (~> 1.0) gitlab (4.19.0) httparty (~> 0.20) @@ -919,7 +919,7 @@ GEM google-protobuf (~> 3.14) googleapis-common-protos-types (~> 1.2) grpc (~> 1.27) - googleapis-common-protos-types (1.19.0) + googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) @@ -2153,7 +2153,7 @@ DEPENDENCIES gettext (~> 3.5, >= 3.5.1) gettext_i18n_rails (~> 1.13.0) git (~> 1.8) - gitaly (~> 17.8.0) + gitaly (~> 17.11.2) gitlab-active-context! gitlab-backup-cli! gitlab-chronic (~> 0.10.5) diff --git a/Gemfile.next.checksum b/Gemfile.next.checksum index fa2a18f6df3..a83d73edd1e 100644 --- a/Gemfile.next.checksum +++ b/Gemfile.next.checksum @@ -215,7 +215,7 @@ {"name":"gettext","version":"3.5.1","platform":"ruby","checksum":"03ec7f71ea7e2cf1fdcd5e08682e98b81601922fdbee890b7bc6f63b0e1a512a"}, {"name":"gettext_i18n_rails","version":"1.13.0","platform":"ruby","checksum":"d4a4739d928b6ce52a2d694d33a831dcb06c7c8e197b3172fc73dfaa20ac8ee6"}, {"name":"git","version":"1.19.1","platform":"ruby","checksum":"b0a422d9f6517353c48a330d6114de4db9e0c82dbe7202964a1d9f1fbc827d70"}, -{"name":"gitaly","version":"17.8.4","platform":"ruby","checksum":"196d9735a83f8a7d396baa216b979eb0c801622d8b7573f90010338d5b0c7b4f"}, +{"name":"gitaly","version":"17.11.2","platform":"ruby","checksum":"32266469296345187d16ab3cfa3da849338817987b722a46eed4309ee18f996e"}, {"name":"gitlab","version":"4.19.0","platform":"ruby","checksum":"3f645e3e195dbc24f0834fbf83e8ccfb2056d8e9712b01a640aad418a6949679"}, {"name":"gitlab-chronic","version":"0.10.6","platform":"ruby","checksum":"a244d11a1396d2aac6ae9b2f326adf1605ec1ad20c29f06e8b672047d415a9ac"}, {"name":"gitlab-cloud-connector","version":"1.12.0","platform":"ruby","checksum":"b1eb7b0f5cb6633929681904d92771b387ec126b02319cd6cb62dd04bd5750af"}, @@ -282,7 +282,7 @@ {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-darwin","checksum":"9dd1a8fde13e2b2f399cd9df95bc72851e28a71a70211145f02ec32f0569cd1c"}, {"name":"google-protobuf","version":"3.25.7","platform":"x86_64-linux","checksum":"f4bf387f7aa782377ca3ac6ef3ff612867dfe8d061fd31f756082038f37df727"}, {"name":"googleapis-common-protos","version":"1.4.0","platform":"ruby","checksum":"da2380fb5ab1563580816c74e8d684ac17512c3654c829a3ee84f6d6139de382"}, -{"name":"googleapis-common-protos-types","version":"1.19.0","platform":"ruby","checksum":"aecb76ca5326f8bcc47ab083259bbc4971d07e87f56808af7e210669d9765694"}, +{"name":"googleapis-common-protos-types","version":"1.20.0","platform":"ruby","checksum":"5e374b06bcfc7e13556e7c0d87b99f1fa3d42de6396a1de3d8fc13aefb4dd07f"}, {"name":"googleauth","version":"1.8.1","platform":"ruby","checksum":"814adadaaa1221dce72a67131e3ecbd6d23491a161ec84fb15fd353b87d8c9e7"}, {"name":"gpgme","version":"2.0.24","platform":"ruby","checksum":"53eccd7042abb4fd5c78f30bc9ed075b1325e6450eab207f2f6a1e7e28ae3b64"}, {"name":"grape","version":"2.0.0","platform":"ruby","checksum":"3aeff94c17e84ccead4ff98833df691e7da0c108878cc128ca31f80c1047494a"}, diff --git a/Gemfile.next.lock b/Gemfile.next.lock index 8a0775e7d3e..340f4b961fa 100644 --- a/Gemfile.next.lock +++ b/Gemfile.next.lock @@ -737,7 +737,7 @@ GEM git (1.19.1) addressable (~> 2.8) rchardet (~> 1.8) - gitaly (17.8.4) + gitaly (17.11.2) grpc (~> 1.0) gitlab (4.19.0) httparty (~> 0.20) @@ -919,7 +919,7 @@ GEM google-protobuf (~> 3.14) googleapis-common-protos-types (~> 1.2) grpc (~> 1.27) - googleapis-common-protos-types (1.19.0) + googleapis-common-protos-types (1.20.0) google-protobuf (>= 3.18, < 5.a) googleauth (1.8.1) faraday (>= 0.17.3, < 3.a) @@ -2153,7 +2153,7 @@ DEPENDENCIES gettext (~> 3.5, >= 3.5.1) gettext_i18n_rails (~> 1.13.0) git (~> 1.8) - gitaly (~> 17.8.0) + gitaly (~> 17.11.2) gitlab-active-context! gitlab-backup-cli! gitlab-chronic (~> 0.10.5) diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 3093408f33b..3e71a4991ed 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -216,6 +216,7 @@ module Ci scope :with_pipeline_source_type, ->(pipeline_source_type) { joins(:pipeline).where(pipeline: { source: pipeline_source_type }) } scope :created_after, ->(time) { where(arel_table[:created_at].gt(time)) } + scope :created_before, ->(time) { where(arel_table[:created_at].lt(time)) } scope :updated_after, ->(time) { where(arel_table[:updated_at].gt(time)) } scope :for_project_ids, ->(project_ids) { where(project_id: project_ids) } diff --git a/app/models/ci/build_name.rb b/app/models/ci/build_name.rb index 39eef648f8e..8626d1ba1aa 100644 --- a/app/models/ci/build_name.rb +++ b/app/models/ci/build_name.rb @@ -4,6 +4,7 @@ module Ci class BuildName < Ci::ApplicationRecord include PgFullTextSearchable include Ci::Partitionable + include EachBatch MAX_JOB_NAME_LENGTH = 255 diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml index 0d3a4224e6f..38e68b935ff 100644 --- a/app/views/projects/pages/_pages_settings.html.haml +++ b/app/views/projects/pages/_pages_settings.html.haml @@ -9,16 +9,21 @@ label_options: { class: 'label-bold' } - docs_link_start = "".html_safe - link_end = ''.html_safe - %p.gl-pl-6 - = s_("GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}").html_safe % { docs_link_start: docs_link_start, link_end: link_end } + %p.gl-text-subtle.gl-pl-6 + = s_("GitLabPages|When enabled, all access to domains will use HTTPS with %{redirect_code} redirects. Requires valid certificates for all domains. %{docs_link_start}How does HTTPS redirection work?%{link_end}").html_safe % { docs_link_start: docs_link_start, link_end: link_end, redirect_code: tag.code('301') } .form-group = f.fields_for :project_setting do |settings| = settings.gitlab_ui_checkbox_component :pages_unique_domain_enabled, s_('GitLabPages|Use unique domain'), label_options: { class: 'label-bold' } - %p.gl-pl-6 - = s_("GitLabPages|When enabled, a unique domain is generated to access pages.").html_safe + - docs_link_start = "".html_safe + - link_end = ''.html_safe + %p.gl-text-subtle.gl-pl-6 + = s_("GitLabPages|When enabled, adds a unique identifier to your domain (for example: %{domain}). When disabled, uses your namespace (username/group name) as the domain (for example: %{unique_domain}). %{docs_link_start}How do Pages URLs work?%{link_end}").html_safe % { docs_link_start: docs_link_start, + link_end: link_end, + domain: tag.code('my-website-123456.gitlab.io'), + unique_domain: tag.code('testuser.gitlab.io/my-website') } - if Gitlab.config.pages.custom_domain_mode || Gitlab.config.pages.external_http || Gitlab.config.pages.external_https - if @project.pages_domains.present? diff --git a/config/feature_flags/gitlab_com_derisk/truncate_build_names.yml b/config/feature_flags/gitlab_com_derisk/truncate_build_names.yml new file mode 100644 index 00000000000..fca99b599cb --- /dev/null +++ b/config/feature_flags/gitlab_com_derisk/truncate_build_names.yml @@ -0,0 +1,9 @@ +--- +name: truncate_build_names +feature_issue_url: https://gitlab.com/groups/gitlab-org/-/epics/16853 +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/188496 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/536667 +milestone: '18.0' +group: group::pipeline execution +type: gitlab_com_derisk +default_enabled: false diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index d23d184286b..e03dea42e5b 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -1067,6 +1067,10 @@ Gitlab.ee do Settings.cron_jobs['delete_pipl_users_worker']['cron'] ||= '0 8 * * *' Settings.cron_jobs['delete_pipl_users_worker']['job_class'] = 'ComplianceManagement::Pipl::DeletePiplUsersWorker' + + Settings.cron_jobs['cleanup_build_name_worker'] ||= {} + Settings.cron_jobs['cleanup_build_name_worker']['cron'] ||= '0 1 * * *' + Settings.cron_jobs['cleanup_build_name_worker']['job_class'] = 'Ci::CleanupBuildNameWorker' end Gitlab.jh do diff --git a/doc/.vale/gitlab_docs/NonStandardListDashes.yml b/doc/.vale/gitlab_base/NonStandardListDashes.yml similarity index 100% rename from doc/.vale/gitlab_docs/NonStandardListDashes.yml rename to doc/.vale/gitlab_base/NonStandardListDashes.yml diff --git a/doc/api/openapi/openapi_v2.yaml b/doc/api/openapi/openapi_v2.yaml index 1b4ca07bf71..fb36f26fdd1 100644 --- a/doc/api/openapi/openapi_v2.yaml +++ b/doc/api/openapi/openapi_v2.yaml @@ -62249,11 +62249,24 @@ definitions: size: type: integer format: int32 - description: Repository size in bytes. references: "$ref": "#/definitions/API_Entities_RepositoryHealth_References" objects: "$ref": "#/definitions/API_Entities_RepositoryHealth_Objects" + commit_graph: + "$ref": "#/definitions/API_Entities_RepositoryHealth_CommitGraph" + bitmap: + "$ref": "#/definitions/API_Entities_RepositoryHealth_Bitmap" + multi_pack_index: + "$ref": "#/definitions/API_Entities_RepositoryHealth_MultiPackIndex" + multi_pack_index_bitmap: + "$ref": "#/definitions/API_Entities_RepositoryHealth_Bitmap" + alternates: + type: object + is_object_pool: + type: boolean + last_full_repack: + "$ref": "#/definitions/API_Entities_RepositoryHealth_LastFullRepack" updated_at: type: string format: date-time @@ -62265,36 +62278,87 @@ definitions: loose_count: type: integer format: int32 - description: Number of loose references in the repository. packed_size: type: integer format: int32 - description: Size in bytes of packed references in the repository. reference_backend: type: string - description: Type of backend used to store references. Either 'REFERENCE_BACKEND_REFTABLE' - or 'REFERENCE_BACKEND_FILES'. API_Entities_RepositoryHealth_Objects: type: object properties: size: type: integer format: int32 - description: Size in bytes of all objects in the repository. recent_size: type: integer format: int32 - description: Size in bytes of all recent objects in the repository. Recent - objects are those which are reachable. stale_size: type: integer format: int32 - description: Size in bytes of all stale objects in the repository. Stale objects - are those which are unreachable and may be deleted during housekeeping. keep_size: type: integer format: int32 - description: Size in bytes of all packfiles with the .keep extension. + packfile_count: + type: integer + format: int32 + reverse_index_count: + type: integer + format: int32 + cruft_count: + type: integer + format: int32 + keep_count: + type: integer + format: int32 + loose_objects_count: + type: integer + format: int32 + stale_loose_objects_count: + type: integer + format: int32 + loose_objects_garbage_count: + type: integer + format: int32 + API_Entities_RepositoryHealth_CommitGraph: + type: object + properties: + commit_graph_chain_length: + type: integer + format: int32 + has_bloom_filters: + type: boolean + has_generation_data: + type: boolean + has_generation_data_overflow: + type: boolean + API_Entities_RepositoryHealth_Bitmap: + type: object + properties: + has_hash_cache: + type: boolean + has_lookup_table: + type: boolean + version: + type: integer + format: int32 + API_Entities_RepositoryHealth_MultiPackIndex: + type: object + properties: + packfile_count: + type: integer + format: int32 + version: + type: integer + format: int32 + API_Entities_RepositoryHealth_LastFullRepack: + type: object + properties: + seconds: + type: integer + format: int32 + nanos: + type: integer + format: int32 API_Entities_Contributor: type: object properties: diff --git a/doc/api/repositories.md b/doc/api/repositories.md index 3470942dee7..edca2b51625 100644 --- a/doc/api/repositories.md +++ b/doc/api/repositories.md @@ -536,6 +536,7 @@ Example response, with line breaks added for readability: - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/182220) in GitLab 17.10. Guarded behind the [project_repositories_health](https://gitlab.com/gitlab-org/gitlab/-/issues/521115) feature flag. +- New fields [added](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/191263) in GitLab 18.1. {{< /history >}} @@ -562,22 +563,55 @@ Example response: ```json { - "size": 42002816, + "size": 2619748827, "references": { - "loose_count": 3, - "packed_size": 315703, + "loose_count": 13, + "packed_size": 333978, "reference_backend": "REFERENCE_BACKEND_FILES" }, "objects": { - "size": 39651458, - "recent_size": 39461265, - "stale_size": 190193, - "keep_size": 0 + "size": 2180475409, + "recent_size": 2180453999, + "stale_size": 21410, + "keep_size": 0, + "packfile_count": 1, + "reverse_index_count": 1, + "cruft_count": 0, + "keep_count": 0, + "loose_objects_count": 36, + "stale_loose_objects_count": 36, + "loose_objects_garbage_count": 0 }, - "updated_at": "2025-02-26T03:42:13.015Z" + "commit_graph": { + "commit_graph_chain_length": 1, + "has_bloom_filters": true, + "has_generation_data": true, + "has_generation_data_overflow": false + }, + "bitmap": null, + "multi_pack_index": { + "packfile_count": 1, + "version": 1 + }, + "multi_pack_index_bitmap": { + "has_hash_cache": true, + "has_lookup_table": true, + "version": 1 + }, + "alternates": null, + "is_object_pool": false, + "last_full_repack": { + "seconds": 1745892013, + "nanos": 0 + }, + "updated_at": "2025-05-14T02:31:08.022Z" } ``` +For a description of each field in the response, see the +[`RepositoryInfoResponse`](https://gitlab.com/gitlab-org/gitaly/blob/fcb986a6482f82b088488db3ed7ca35adfa42fdc/proto/repository.proto#L444) +protobuf message. + ## Related topics - User documentation for [changelogs](../user/project/changelogs.md) diff --git a/doc/user/application_security/vulnerabilities/validity_check.md b/doc/user/application_security/vulnerabilities/validity_check.md index 481523d3a6f..6a5fc9bbb8b 100644 --- a/doc/user/application_security/vulnerabilities/validity_check.md +++ b/doc/user/application_security/vulnerabilities/validity_check.md @@ -28,6 +28,10 @@ This feature is available for testing, but not ready for production use. {{< /alert >}} + +For a demonstration, see [Validity Checks Demo](https://www.youtube.com/watch?v=h0jR0CGNOhI). + + GitLab validity checks determines whether a secret, like an access token, is active. A secret is active when: @@ -50,9 +54,9 @@ To enable validity checks for a project: - Contact your GitLab representative and ask them to enable validity checks. -If validity checks are enabled, when the `secret_detection` CI/CD job is complete, -GitLab checks the status of detected secrets. The statuses are displayed on the -**Findings** page of the vulnerability report. +If validity checks are enabled, GitLab checks the status of detected secrets when the `secret_detection` +CI/CD job is complete. To view a secret's status, view the vulnerability details page. To update the +status of a secret, for example after revoking it, re-run the `secret_detection` CI/CD job. ### Coverage diff --git a/lib/api/entities/repository_health.rb b/lib/api/entities/repository_health.rb index c3c738a510c..465dc2eb136 100644 --- a/lib/api/entities/repository_health.rb +++ b/lib/api/entities/repository_health.rb @@ -2,36 +2,93 @@ module API module Entities - # rubocop:disable Layout/LineLength -- `desc` is too long class RepositoryHealth < Grape::Entity class References < Grape::Entity expose :loose_count, - documentation: { type: 'integer', desc: 'Number of loose references in the repository.' } + documentation: { type: 'integer' } expose :packed_size, - documentation: { type: 'integer', desc: 'Size in bytes of packed references in the repository.' } + documentation: { type: 'integer' } expose :reference_backend, - documentation: { type: 'string', - desc: "Type of backend used to store references. Either 'REFERENCE_BACKEND_REFTABLE' or 'REFERENCE_BACKEND_FILES'." } + documentation: { type: 'string' } end class Objects < Grape::Entity expose :size, - documentation: { type: 'integer', desc: 'Size in bytes of all objects in the repository.' } + documentation: { type: 'integer' } expose :recent_size, - documentation: { type: 'integer', - desc: 'Size in bytes of all recent objects in the repository. Recent objects are those which are reachable.' } + documentation: { type: 'integer' } expose :stale_size, - documentation: { type: 'integer', - desc: 'Size in bytes of all stale objects in the repository. Stale objects are those which are unreachable and may be deleted during housekeeping.' } + documentation: { type: 'integer' } expose :keep_size, - documentation: { type: 'integer', desc: 'Size in bytes of all packfiles with the .keep extension.' } + documentation: { type: 'integer' } + expose :packfile_count, + documentation: { type: 'integer' } + expose :reverse_index_count, + documentation: { type: 'integer' } + expose :cruft_count, + documentation: { type: 'integer' } + expose :keep_count, + documentation: { type: 'integer' } + expose :loose_objects_count, + documentation: { type: 'integer' } + expose :stale_loose_objects_count, + documentation: { type: 'integer' } + expose :loose_objects_garbage_count, + documentation: { type: 'integer' } end - expose :size, documentation: { type: 'integer', desc: 'Repository size in bytes.' } + class CommitGraph < Grape::Entity + expose :commit_graph_chain_length, + documentation: { type: 'integer' } + expose :has_bloom_filters, + documentation: { type: 'boolean' } + expose :has_generation_data, + documentation: { type: 'boolean' } + expose :has_generation_data_overflow, + documentation: { type: 'boolean' } + end + + class MultiPackIndex < Grape::Entity + expose :packfile_count, + documentation: { type: 'integer' } + expose :version, + documentation: { type: 'integer' } + end + + class Bitmap < Grape::Entity + expose :has_hash_cache, + documentation: { type: 'boolean' } + expose :has_lookup_table, + documentation: { type: 'boolean' } + expose :version, + documentation: { type: 'integer' } + end + + class AlternatesInfo < Grape::Entity + expose :object_directories, + documentation: { type: 'array', items: { type: 'string' } } + expose :last_modified, + documentation: { type: 'dateTime', example: '2025-02-24T09:05:50.355Z' } + end + + class LastFullRepack < Grape::Entity + expose :seconds, + documentation: { type: 'integer' } + expose :nanos, + documentation: { type: 'integer' } + end + + expose :size, documentation: { type: 'integer' } expose :references, using: References expose :objects, using: Objects + expose :commit_graph, using: CommitGraph + expose :bitmap, using: Bitmap + expose :multi_pack_index, using: MultiPackIndex + expose :multi_pack_index_bitmap, using: Bitmap + expose :alternates, documentation: { type: 'object', example: nil } + expose :is_object_pool, documentation: { type: 'boolean' } + expose :last_full_repack, using: LastFullRepack expose :updated_at, documentation: { type: 'dateTime', example: '2025-02-24T09:05:50.355Z' } end - # rubocop:enable Layout/LineLength end end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 4cd9c7be7ef..c269cb2ffad 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -28453,10 +28453,10 @@ msgstr "" msgid "GitLabPages|Waiting for the Pages Pipeline to complete…" msgstr "" -msgid "GitLabPages|When enabled, a unique domain is generated to access pages." +msgid "GitLabPages|When enabled, adds a unique identifier to your domain (for example: %{domain}). When disabled, uses your namespace (username/group name) as the domain (for example: %{unique_domain}). %{docs_link_start}How do Pages URLs work?%{link_end}" msgstr "" -msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}" +msgid "GitLabPages|When enabled, all access to domains will use HTTPS with %{redirect_code} redirects. Requires valid certificates for all domains. %{docs_link_start}How does HTTPS redirection work?%{link_end}" msgstr "" msgid "GitLabPages|When enabled, all projects in the group and its subgroups become visible only to members." @@ -39553,12 +39553,18 @@ msgstr "" msgid "ModelSelection|An error occurred while loading the AI feature settings. Please try again." msgstr "" +msgid "ModelSelection|An error occurred while updating the feature setting. Please try again." +msgstr "" + msgid "ModelSelection|Manage GitLab Duo by configuring and assigning models to AI-native features." msgstr "" msgid "ModelSelection|Model Selection" msgstr "" +msgid "ModelSelection|Successfully updated %{mainFeature} / %{title}" +msgstr "" + msgid "Modified" msgstr "" diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index 2c30cb4ae3c..88cf876ec3c 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -116,6 +116,14 @@ RSpec.describe Ci::Build, feature_category: :continuous_integration, factory_def end end + describe 'created_before' do + subject { described_class.created_before(1.day.ago) } + + it 'returns the builds created before the given time' do + is_expected.to contain_exactly(old_build) + end + end + describe 'updated_after' do subject { described_class.updated_after(1.day.ago) } diff --git a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb index 7ce2317918d..e766225804d 100644 --- a/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb +++ b/spec/services/merge_requests/delete_non_latest_diffs_service_spec.rb @@ -15,11 +15,11 @@ RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_s 3.times { merge_request.create_merge_request_diff } merge_request.create_merge_head_diff merge_request.reset + merge_request.merge_request_diffs.reload end - it 'schedules non-latest merge request diffs removal', - quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/426807' do - diffs = merge_request.merge_request_diffs + it 'schedules non-latest merge request diffs removal' do + diffs = merge_request.merge_request_diffs.order(:id) expect(diffs.count).to eq(4) @@ -37,6 +37,7 @@ RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_s it 'schedules no removal if it is already cleaned' do merge_request.merge_request_diffs.each(&:clean!) + merge_request.merge_request_diffs.reload expect(DeleteDiffFilesWorker).not_to receive(:bulk_perform_in) @@ -45,6 +46,7 @@ RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_s it 'schedules no removal if it is empty' do merge_request.merge_request_diffs.each { |diff| diff.update!(state: :empty) } + merge_request.merge_request_diffs.reload expect(DeleteDiffFilesWorker).not_to receive(:bulk_perform_in) @@ -57,6 +59,7 @@ RSpec.describe MergeRequests::DeleteNonLatestDiffsService, :clean_gitlab_redis_s .merge_request_diffs .where.not(id: merge_request.latest_merge_request_diff_id) .destroy_all + merge_request.merge_request_diffs.reload # rubocop: enable Cop/DestroyAll expect(DeleteDiffFilesWorker).not_to receive(:bulk_perform_in)