Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gitlab-container-registry for 
openSUSE:Factory checked in at 2026-01-28 15:13:23
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gitlab-container-registry (Old)
 and      /work/SRC/openSUSE:Factory/.gitlab-container-registry.new.1928 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gitlab-container-registry"

Wed Jan 28 15:13:23 2026 rev:20 rq:1329613 version:4.35.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gitlab-container-registry/gitlab-container-registry.changes
      2026-01-17 14:56:58.992777295 +0100
+++ 
/work/SRC/openSUSE:Factory/.gitlab-container-registry.new.1928/gitlab-container-registry.changes
    2026-01-28 15:16:45.405996192 +0100
@@ -1,0 +2,24 @@
+Wed Jan 28 06:29:28 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 4.35.0:
+  * Features
+    - add support for CNCF WASM OCI Artifact media types (26155a8)
+    - registry: add demo gcstats command with mock data (e928759)
+    - registry: enable REGISTRY_FF_ENFORCE_LOCKFILES by default
+      (150b68b)
+  * Dependencies
+    - chore: gitlab.com/gitlab org/api/client/.go/1.x bump
+    - build(deps): update module
+      github.com/azure/azure-sdk-for-go/sdk/storage/azblob to
+      v1.6.4
+    - build(deps): update module
+      github.com/aws/aws-sdk-go-v2/service/s3 to v1.95.1
+    - build(deps): update module
+      github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign to
+      v1.9.17
+    - build(deps): update module cloud.google.com/go/storage to
+      v1.59.1
+    - build(deps): update module
+      github.com/aws/aws-sdk-go-v2/config to v1.32.7
+
+-------------------------------------------------------------------

Old:
----
  gitlab-container-registry-4.34.0.obscpio

New:
----
  gitlab-container-registry-4.35.0.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gitlab-container-registry.spec ++++++
--- /var/tmp/diff_new_pack.aTvWK8/_old  2026-01-28 15:16:48.110108744 +0100
+++ /var/tmp/diff_new_pack.aTvWK8/_new  2026-01-28 15:16:48.122109244 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           gitlab-container-registry
-Version:        4.34.0
+Version:        4.35.0
 Release:        0
 Summary:        The GitLab Container Registry
 License:        Apache-2.0

++++++ _service ++++++
--- /var/tmp/diff_new_pack.aTvWK8/_old  2026-01-28 15:16:48.450122896 +0100
+++ /var/tmp/diff_new_pack.aTvWK8/_new  2026-01-28 15:16:48.478124062 +0100
@@ -3,7 +3,7 @@
     <param 
name="url">https://gitlab.com/gitlab-org/container-registry.git</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v4.34.0-gitlab</param>
+    <param name="revision">v4.35.0-gitlab</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)-gitlab</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.aTvWK8/_old  2026-01-28 15:16:48.510125394 +0100
+++ /var/tmp/diff_new_pack.aTvWK8/_new  2026-01-28 15:16:48.550127059 +0100
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.com/gitlab-org/container-registry.git</param>
-              <param 
name="changesrevision">88b11c2ebc83268af944962a048f923b3fc26ade</param></service></servicedata>
+              <param 
name="changesrevision">2f3393f74d4eaea8b06f9ff153bc3907c4a31783</param></service></servicedata>
 (No newline at EOF)
 

++++++ gitlab-container-registry-4.34.0.obscpio -> 
gitlab-container-registry-4.35.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.34.0/CHANGELOG.md 
new/gitlab-container-registry-4.35.0/CHANGELOG.md
--- old/gitlab-container-registry-4.34.0/CHANGELOG.md   2026-01-15 
22:18:28.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/CHANGELOG.md   2026-01-27 
19:32:41.000000000 +0100
@@ -1,3 +1,12 @@
+## 
[4.35.0](https://gitlab.com/gitlab-org/container-registry/compare/v4.34.0-gitlab...v4.35.0)
 (2026-01-27)
+
+
+### Features
+
+* add support for CNCF WASM OCI Artifact media types 
([26155a8](https://gitlab.com/gitlab-org/container-registry/commit/26155a8a07030ff8d6218f272c9f278ed05c2e0d))
+* **registry:** add demo gcstats command with mock data 
([e928759](https://gitlab.com/gitlab-org/container-registry/commit/e92875956d3b4c9ae24e9ab51e59854d0ccd53ac))
+* **registry:** enable REGISTRY_FF_ENFORCE_LOCKFILES by default 
([150b68b](https://gitlab.com/gitlab-org/container-registry/commit/150b68bac49e09990e5beae6c6aeb94cadb35337))
+
 ## 
[4.34.0](https://gitlab.com/gitlab-org/container-registry/compare/v4.33.0-gitlab...v4.34.0)
 (2026-01-14)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/main.go 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/main.go
--- old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/main.go     
2026-01-15 22:18:28.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/main.go     
2026-01-27 19:32:41.000000000 +0100
@@ -47,13 +47,13 @@
 
 // gitlabAPI is a minimal interface over the GitLab client used for 
testability.
 type gitlabAPI interface {
-       ListProjectIssues(projectID int, opts *gitlab.ListProjectIssuesOptions) 
([]*gitlab.Issue, *gitlab.Response, error)
-       CreateIssue(projectID int, opts *gitlab.CreateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error)
-       UpdateIssue(projectID, issueIID int, opts *gitlab.UpdateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error)
-       ListIssueNotes(projectID, issueIID int, opts 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error)
-       CreateIssueNote(projectID, issueIID int, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error)
+       ListProjectIssues(projectID int64, opts 
*gitlab.ListProjectIssuesOptions) ([]*gitlab.Issue, *gitlab.Response, error)
+       CreateIssue(projectID int64, opts *gitlab.CreateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error)
+       UpdateIssue(projectID, issueIID int64, opts *gitlab.UpdateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error)
+       ListIssueNotes(projectID, issueIID int64, opts 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error)
+       CreateIssueNote(projectID, issueIID int64, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error)
        // Pipelines
-       GetPipelineTestReport(projectID, pipelineID int, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error)
+       GetPipelineTestReport(projectID, pipelineID int64, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error)
 }
 
 // realGitLab wraps the official client to implement gitlabAPI.
@@ -61,27 +61,27 @@
        cli *gitlab.Client
 }
 
-func (r realGitLab) ListProjectIssues(projectID int, opts 
*gitlab.ListProjectIssuesOptions) ([]*gitlab.Issue, *gitlab.Response, error) {
+func (r realGitLab) ListProjectIssues(projectID int64, opts 
*gitlab.ListProjectIssuesOptions) ([]*gitlab.Issue, *gitlab.Response, error) {
        return r.cli.Issues.ListProjectIssues(projectID, opts)
 }
 
-func (r realGitLab) CreateIssue(projectID int, opts 
*gitlab.CreateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
+func (r realGitLab) CreateIssue(projectID int64, opts 
*gitlab.CreateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
        return r.cli.Issues.CreateIssue(projectID, opts)
 }
 
-func (r realGitLab) UpdateIssue(projectID, issueIID int, opts 
*gitlab.UpdateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
+func (r realGitLab) UpdateIssue(projectID, issueIID int64, opts 
*gitlab.UpdateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
        return r.cli.Issues.UpdateIssue(projectID, issueIID, opts)
 }
 
-func (r realGitLab) ListIssueNotes(projectID, issueIID int, opts 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error) {
+func (r realGitLab) ListIssueNotes(projectID, issueIID int64, opts 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error) {
        return r.cli.Notes.ListIssueNotes(projectID, issueIID, opts)
 }
 
-func (r realGitLab) CreateIssueNote(projectID, issueIID int, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error) {
+func (r realGitLab) CreateIssueNote(projectID, issueIID int64, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error) {
        return r.cli.Notes.CreateIssueNote(projectID, issueIID, opts)
 }
 
-func (r realGitLab) GetPipelineTestReport(projectID, pipelineID int, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
+func (r realGitLab) GetPipelineTestReport(projectID, pipelineID int64, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
        return r.cli.Pipelines.GetPipelineTestReport(projectID, pipelineID, 
opts...)
 }
 
@@ -115,7 +115,7 @@
        projectID := mustEnv("CI_PROJECT_ID")
        workingDir := mustEnv("CI_PROJECT_DIR")
        // Convert project ID to integer for SDK usage
-       projectIDInt, err := strconv.Atoi(projectID)
+       projectIDInt, err := strconv.ParseInt(projectID, 10, 0)
        if err != nil {
                logf("invalid project id: %v", err)
                os.Exit(1)
@@ -126,14 +126,14 @@
        if issueProjectID == "" {
                issueProjectID = projectID
        }
-       issuePID, err := strconv.Atoi(issueProjectID)
+       issuePID, err := strconv.ParseInt(issueProjectID, 10, 0)
        if err != nil {
                logf("invalid project id: %v", err)
                os.Exit(1)
        }
        pipelineID := mustEnv("CI_PIPELINE_ID")
        // Convert pipeline ID to integer for SDK usage
-       pipelineIDInt, err := strconv.Atoi(pipelineID)
+       pipelineIDInt, err := strconv.ParseInt(pipelineID, 10, 0)
        if err != nil {
                logf("invalid pipeline id: %v", err)
                os.Exit(1)
@@ -220,7 +220,7 @@
 // processFailures contains the core logic for processing failures into issues
 // and updating existing issues with new occurrences and sending slack 
notifications.
 // It returns the number of created and updated issues.
-func processFailures(cli gitlabAPI, notifier slackNotifier, issuePID int, 
failures []report.Failure, ref, sha, pipelineID, pipelineURL string) (int, int) 
{
+func processFailures(cli gitlabAPI, notifier slackNotifier, issuePID int64, 
failures []report.Failure, ref, sha, pipelineID, pipelineURL string) (int, int) 
{
        created := 0
        updated := 0
        for _, c := range failures {
@@ -271,7 +271,7 @@
                                Title:       gitlab.Ptr(title),
                                Description: gitlab.Ptr(desc),
                                Labels:      &lo,
-                               Weight:      gitlab.Ptr(1),
+                               Weight:      gitlab.Ptr(int64(1)),
                        }
                        is, _, err := cli.CreateIssue(issuePID, cio)
                        if err != nil {
@@ -376,7 +376,7 @@
 }
 
 // bucketForCount maps an occurrence count to a label used for triage buckets.
-func bucketForCount(n int) string {
+func bucketForCount(n int64) string {
        switch {
        case n <= 3:
                return "flaky-occurrences::1-3"
@@ -391,7 +391,7 @@
 
 // findIssueByExactTitle searches issues by title in the target project and
 // returns an exact-match issue if found (opened first, then closed).
-func findIssueByExactTitle(cli gitlabAPI, projectID int, title string) 
(*gitlab.Issue, error) {
+func findIssueByExactTitle(cli gitlabAPI, projectID int64, title string) 
(*gitlab.Issue, error) {
        if is, err := searchTitleByState(cli, projectID, title, "opened"); err 
!= nil || is != nil {
                return is, err
        }
@@ -399,8 +399,8 @@
 }
 
 // searchTitleByState searches issues by title in the target project and 
returns an exact-match issue if found.
-func searchTitleByState(cli gitlabAPI, projectID int, title, state string) 
(*gitlab.Issue, error) {
-       page := 1
+func searchTitleByState(cli gitlabAPI, projectID int64, title, state string) 
(*gitlab.Issue, error) {
+       var page int64 = 1
        for {
                issues, resp, err := cli.ListProjectIssues(projectID, 
&gitlab.ListProjectIssuesOptions{
                        Search: gitlab.Ptr(title),
@@ -427,9 +427,9 @@
 
 // countOccurrences counts how many tracker comments were previously added to
 // the issue by scanning for the "FLAKE_OCCURRENCE:" marker.
-func countOccurrences(cli gitlabAPI, projectID, issueIID int) (int, error) {
-       page := 1
-       total := 0
+func countOccurrences(cli gitlabAPI, projectID, issueIID int64) (int64, error) 
{
+       var page int64 = 1
+       var total int64
        for {
                notes, resp, err := cli.ListIssueNotes(projectID, issueIID, 
&gitlab.ListIssueNotesOptions{
                        ListOptions: gitlab.ListOptions{PerPage: 100, Page: 
page},
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/main_test.go 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/main_test.go
--- 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/main_test.go    
    2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/main_test.go    
    2026-01-27 19:32:41.000000000 +0100
@@ -46,7 +46,7 @@
 }
 
 func TestBucketForCount_Ranges(t *testing.T) {
-       cases := map[int]string{
+       cases := map[int64]string{
                1:   "flaky-occurrences::1-3",
                3:   "flaky-occurrences::1-3",
                4:   "flaky-occurrences::4-10",
@@ -108,7 +108,7 @@
 
 type fakeGitLab struct {
        issues         []*gitlab.Issue
-       notes          map[int][]*gitlab.Note
+       notes          map[int64][]*gitlab.Note
        pipelineReport *gitlab.PipelineTestReport
 
        // error injection toggles
@@ -140,14 +140,14 @@
 }
 
 func newFakeGitLab() *fakeGitLab {
-       return &fakeGitLab{notes: make(map[int][]*gitlab.Note)}
+       return &fakeGitLab{notes: make(map[int64][]*gitlab.Note)}
 }
 
-func (f *fakeGitLab) nextIID() int {
-       return len(f.issues) + 1
+func (f *fakeGitLab) nextIID() int64 {
+       return int64(len(f.issues) + 1)
 }
 
-func (f *fakeGitLab) ListProjectIssues(_ int, opts 
*gitlab.ListProjectIssuesOptions) ([]*gitlab.Issue, *gitlab.Response, error) {
+func (f *fakeGitLab) ListProjectIssues(_ int64, opts 
*gitlab.ListProjectIssuesOptions) ([]*gitlab.Issue, *gitlab.Response, error) {
        f.listIssuesCalls++
        if f.errOnListIssues {
                return nil, nil, fmt.Errorf("list issues error")
@@ -169,7 +169,7 @@
        return out, &gitlab.Response{CurrentPage: 1, TotalPages: 1}, nil
 }
 
-func (f *fakeGitLab) CreateIssue(_ int, opts *gitlab.CreateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error) {
+func (f *fakeGitLab) CreateIssue(_ int64, opts *gitlab.CreateIssueOptions) 
(*gitlab.Issue, *gitlab.Response, error) {
        f.createIssueCalls++
        if f.errOnCreateIssue {
                return nil, nil, fmt.Errorf("create issue error")
@@ -186,7 +186,7 @@
        return is, &gitlab.Response{}, nil
 }
 
-func (f *fakeGitLab) UpdateIssue(_, issueIID int, opts 
*gitlab.UpdateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
+func (f *fakeGitLab) UpdateIssue(_, issueIID int64, opts 
*gitlab.UpdateIssueOptions) (*gitlab.Issue, *gitlab.Response, error) {
        f.updateIssueCalls++
        if f.errOnUpdateIssue {
                return nil, nil, fmt.Errorf("update issue error")
@@ -213,7 +213,7 @@
        return is, &gitlab.Response{}, nil
 }
 
-func (f *fakeGitLab) ListIssueNotes(_, issueIID int, _ 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error) {
+func (f *fakeGitLab) ListIssueNotes(_, issueIID int64, _ 
*gitlab.ListIssueNotesOptions) ([]*gitlab.Note, *gitlab.Response, error) {
        f.listNotesCalls++
        if f.errOnListNotes {
                return nil, nil, fmt.Errorf("list notes error")
@@ -221,7 +221,7 @@
        return f.notes[issueIID], &gitlab.Response{CurrentPage: 1, TotalPages: 
1}, nil
 }
 
-func (f *fakeGitLab) CreateIssueNote(_, issueIID int, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error) {
+func (f *fakeGitLab) CreateIssueNote(_, issueIID int64, opts 
*gitlab.CreateIssueNoteOptions) (*gitlab.Note, *gitlab.Response, error) {
        f.createNoteCalls++
        if f.errOnCreateNote {
                return nil, nil, fmt.Errorf("create note error")
@@ -231,7 +231,7 @@
        return n, &gitlab.Response{}, nil
 }
 
-func (f *fakeGitLab) GetPipelineTestReport(_, _ int, _ 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
+func (f *fakeGitLab) GetPipelineTestReport(_, _ int64, _ 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
        return f.pipelineReport, &gitlab.Response{}, nil
 }
 
@@ -312,7 +312,7 @@
        is, _, err := fcli.CreateIssue(1, &gitlab.CreateIssueOptions{
                Title:  gitlab.Ptr("[Flaky] pkg.TestTop/Leaf"),
                Labels: (*gitlab.LabelOptions)(&[]string{"flaky::test"}),
-               Weight: gitlab.Ptr(1),
+               Weight: gitlab.Ptr(int64(1)),
        })
        require.NoError(t, err)
        _, _, err = fcli.CreateIssueNote(1, is.IID, 
&gitlab.CreateIssueNoteOptions{Body: gitlab.Ptr("FLAKE_OCCURRENCE:\n- ...")})
@@ -326,7 +326,7 @@
        require.Equal(t, 0, created)
        require.Equal(t, 1, updated)
        require.Contains(t, fcli.issues[0].Labels, "flaky-occurrences::1-3")
-       require.GreaterOrEqual(t, fcli.issues[0].Weight, 2)
+       require.GreaterOrEqual(t, fcli.issues[0].Weight, int64(2))
        require.Len(t, fcli.notes[is.IID], 2)
        require.Empty(t, sn.msgs)
 }
@@ -337,7 +337,7 @@
        _, _, err := fcli.CreateIssue(1, &gitlab.CreateIssueOptions{
                Title:  gitlab.Ptr("[Flaky] pkg.TestTop/Leaf"),
                Labels: (*gitlab.LabelOptions)(&[]string{"flaky::test"}),
-               Weight: gitlab.Ptr(1),
+               Weight: gitlab.Ptr(int64(1)),
        })
        require.NoError(t, err)
        // Manually mark closed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/report/report.go
 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/report/report.go
--- 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/report/report.go
    2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/report/report.go
    2026-01-27 19:32:41.000000000 +0100
@@ -20,10 +20,10 @@
 
 // PipelinesClient abstracts the pipelines API used to fetch test reports.
 type PipelinesClient interface {
-       GetPipelineTestReport(projectID, pipelineID int, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error)
+       GetPipelineTestReport(projectID, pipelineID int64, opts 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error)
 }
 
-func FetchFailures(cli PipelinesClient, projectID, pipelineID int) ([]Failure, 
error) {
+func FetchFailures(cli PipelinesClient, projectID, pipelineID int64) 
([]Failure, error) {
        tr, _, err := cli.GetPipelineTestReport(projectID, pipelineID)
        if err != nil {
                return nil, err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/report/report_test.go
 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/report/report_test.go
--- 
old/gitlab-container-registry-4.34.0/cmd/internal/flake-tracker/report/report_test.go
       2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/cmd/internal/flake-tracker/report/report_test.go
       2026-01-27 19:32:41.000000000 +0100
@@ -192,7 +192,7 @@
        err    error
 }
 
-func (f *fakePipelinesClient) GetPipelineTestReport(_, _ int, _ 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
+func (f *fakePipelinesClient) GetPipelineTestReport(_, _ int64, _ 
...gitlab.RequestOptionFunc) (*gitlab.PipelineTestReport, *gitlab.Response, 
error) {
        return f.report, &gitlab.Response{}, f.err
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/release-cli/client/client.go 
new/gitlab-container-registry-4.35.0/cmd/internal/release-cli/client/client.go
--- 
old/gitlab-container-registry-4.34.0/cmd/internal/release-cli/client/client.go  
    2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/cmd/internal/release-cli/client/client.go  
    2026-01-27 19:32:41.000000000 +0100
@@ -48,7 +48,7 @@
        return commit, err
 }
 
-func (g *Client) CreateMergeRequest(projectID int, sourceBranch 
*gitlab.Branch, description, targetBranch, title string, labels 
*gitlab.LabelOptions, reviwerIDs []int) (*gitlab.MergeRequest, error) {
+func (g *Client) CreateMergeRequest(projectID int, sourceBranch 
*gitlab.Branch, description, targetBranch, title string, labels 
*gitlab.LabelOptions, reviwerIDs []int64) (*gitlab.MergeRequest, error) {
        mr, _, err := g.client.MergeRequests.CreateMergeRequest(projectID, 
&gitlab.CreateMergeRequestOptions{
                SourceBranch: gitlab.Ptr(sourceBranch.Name),
                TargetBranch: &targetBranch,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/cmd/internal/release-cli/utils/parser.go 
new/gitlab-container-registry-4.35.0/cmd/internal/release-cli/utils/parser.go
--- 
old/gitlab-container-registry-4.34.0/cmd/internal/release-cli/utils/parser.go   
    2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/cmd/internal/release-cli/utils/parser.go   
    2026-01-27 19:32:41.000000000 +0100
@@ -6,12 +6,12 @@
        "strings"
 )
 
-func ParseReviewerIDs(input string) []int {
+func ParseReviewerIDs(input string) []int64 {
        idStrings := strings.Split(input, ",")
-       reviewerIDs := make([]int, 0, len(idStrings))
+       reviewerIDs := make([]int64, 0, len(idStrings))
 
        for _, idString := range idStrings {
-               id, err := strconv.Atoi(strings.TrimSpace(idString))
+               id, err := strconv.ParseInt(strings.TrimSpace(idString), 10, 0)
                if err != nil {
                        log.Printf("Failed to assign reviwers to the MR: %v", 
err)
                        return nil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/docs/supported-media-types.md 
new/gitlab-container-registry-4.35.0/docs/supported-media-types.md
--- old/gitlab-container-registry-4.34.0/docs/supported-media-types.md  
2026-01-15 22:18:28.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/docs/supported-media-types.md  
2026-01-27 19:32:41.000000000 +0100
@@ -20,6 +20,7 @@
 | `application/vnd.zarf.config.v1+json`                                     |
 | `application/vnd.wasm.content.layer.v1+wasm`                              |
 | `application/vnd.wasm.config.v1+json`                                     |
+| `application/vnd.wasm.config.v0+json`                                     |
 | `application/vnd.vivsoft.enbuild.config.v1+json`                          |
 | `application/vnd.unknown.config.v1+json`                                  |
 | `application/vnd.timoni.content.v1.tar+gzip`                              |
@@ -105,6 +106,7 @@
 | `application/vnd.acme.rocket.docs.layer.v1+tar`                           |
 | `application/vnd.acme.rocket.config`                                      |
 | `application/tar+gzip`                                                    |
+| `application/wasm`                                                        |
 | `application/spdx+json`                                                   |
 | `application/sap-cnudie+tar`                                              |
 | `application/octet-stream`                                                |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.34.0/go.mod 
new/gitlab-container-registry-4.35.0/go.mod
--- old/gitlab-container-registry-4.34.0/go.mod 2026-01-15 22:18:28.000000000 
+0100
+++ new/gitlab-container-registry-4.35.0/go.mod 2026-01-27 19:32:41.000000000 
+0100
@@ -4,20 +4,20 @@
 
 require (
        cloud.google.com/go/compute/metadata v0.9.0
-       cloud.google.com/go/storage v1.59.0
+       cloud.google.com/go/storage v1.59.1
        github.com/Azure/azure-sdk-for-go v68.0.0+incompatible
        github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0
        github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1
-       github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3
+       github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
        github.com/DATA-DOG/go-sqlmock v1.5.2
        github.com/Shopify/toxiproxy/v2 v2.12.0
        github.com/alicebob/miniredis/v2 v2.35.0
        github.com/aws/aws-sdk-go v1.55.5
        github.com/aws/aws-sdk-go-v2 v1.41.1
-       github.com/aws/aws-sdk-go-v2/config v1.32.6
-       github.com/aws/aws-sdk-go-v2/credentials v1.19.6
-       github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.16
-       github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0
+       github.com/aws/aws-sdk-go-v2/config v1.32.7
+       github.com/aws/aws-sdk-go-v2/credentials v1.19.7
+       github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.17
+       github.com/aws/aws-sdk-go-v2/service/s3 v1.95.1
        github.com/aws/smithy-go v1.24.0
        github.com/benbjohnson/clock v1.3.5
        github.com/bsm/redislock v0.9.4
@@ -52,7 +52,7 @@
        github.com/testcontainers/testcontainers-go/modules/postgres v0.40.0
        github.com/trim21/go-redis-prometheus v0.0.0
        github.com/vmihailenco/msgpack/v5 v5.4.1
-       gitlab.com/gitlab-org/api/client-go v0.161.1
+       gitlab.com/gitlab-org/api/client-go v1.18.0
        gitlab.com/gitlab-org/labkit v1.34.0
        go.uber.org/automaxprocs v1.6.0
        go.uber.org/mock v0.6.0
@@ -89,19 +89,19 @@
        
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping
 v0.54.0 // indirect
        github.com/Microsoft/go-winio v0.6.2 // indirect
        github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 // indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect
        github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.17 // indirect
        github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 
// indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.8 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.17 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/clipperhouse/displaywidth v0.6.0 // indirect
@@ -137,7 +137,7 @@
        github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
        github.com/golang/mock v1.6.0 // indirect
        github.com/golang/protobuf v1.5.4 // indirect
-       github.com/google/go-querystring v1.1.0 // indirect
+       github.com/google/go-querystring v1.2.0 // indirect
        github.com/google/pprof v0.0.0-20210804190019-f964ff605595 // indirect
        github.com/google/s2a-go v0.1.9 // indirect
        github.com/google/uuid v1.6.0 // indirect
@@ -213,7 +213,7 @@
        go.opentelemetry.io/otel/trace v1.38.0 // indirect
        go.yaml.in/yaml/v2 v2.4.2 // indirect
        go.yaml.in/yaml/v3 v3.0.4 // indirect
-       golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
+       golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
        golang.org/x/sys v0.39.0 // indirect
        golang.org/x/term v0.38.0 // indirect
        golang.org/x/text v0.32.0 // indirect
@@ -221,6 +221,6 @@
        google.golang.org/genproto/googleapis/api 
v0.0.0-20251111163417-95abcf5c77ba // indirect
        google.golang.org/genproto/googleapis/rpc 
v0.0.0-20251111163417-95abcf5c77ba // indirect
        google.golang.org/grpc v1.76.0 // indirect
-       google.golang.org/protobuf v1.36.10 // indirect
+       google.golang.org/protobuf v1.36.11 // indirect
        gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.34.0/go.sum 
new/gitlab-container-registry-4.35.0/go.sum
--- old/gitlab-container-registry-4.34.0/go.sum 2026-01-15 22:18:28.000000000 
+0100
+++ new/gitlab-container-registry-4.35.0/go.sum 2026-01-27 19:32:41.000000000 
+0100
@@ -60,8 +60,8 @@
 cloud.google.com/go/storage v1.6.0/go.mod 
h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
 cloud.google.com/go/storage v1.8.0/go.mod 
h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 cloud.google.com/go/storage v1.10.0/go.mod 
h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
-cloud.google.com/go/storage v1.59.0 
h1:9p3yDzEN9Vet4JnbN90FECIw6n4FCXcKBK1scxtQnw8=
-cloud.google.com/go/storage v1.59.0/go.mod 
h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI=
+cloud.google.com/go/storage v1.59.1 
h1:DXAZLcTimtiXdGqDSnebROVPd9QvRsFVVlptz02Wk58=
+cloud.google.com/go/storage v1.59.1/go.mod 
h1:cMWbtM+anpC74gn6qjLh+exqYcfmB9Hqe5z6adx+CLI=
 cloud.google.com/go/trace v1.11.6 
h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=
 cloud.google.com/go/trace v1.11.6/go.mod 
h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=
 dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
@@ -81,8 +81,8 @@
 github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod 
h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI=
 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage 
v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage 
v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
-github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3 
h1:ZJJNFaQ86GVKQ9ehwqyAFE6pIfyicpuJ8IkVaPBc6/4=
-github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.3/go.mod 
h1:URuDvhmATVKqHBH9/0nOiNKk0+YcwfQ3WkK5PqHKxc8=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4 
h1:jWQK1GI+LeGGUKBADtcH2rRqPxYB1Ljwms5gFA2LqrM=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4/go.mod 
h1:8mwH4klAm9DUgR2EEHyEEAQlRDvLPyg5fQry3y+cDew=
 github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c 
h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg=
 github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod 
h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
 github.com/Azure/go-autorest v14.2.0+incompatible 
h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
@@ -150,40 +150,40 @@
 github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod 
h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 
h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod 
h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
-github.com/aws/aws-sdk-go-v2/config v1.32.6 
h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
-github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod 
h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.6 
h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod 
h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
-github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.16 
h1:gMZxhZbwNZ06M8mZuPtm8il4ja1tPdHpmR/06BPsiVs=
-github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.16/go.mod 
h1:C/AfwxExIK+HNxIMNGEya+HbSWbYAjc1UZpOEqXuE6E=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 
h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16/go.mod 
h1:wOOsYuxYuB/7FlnVtzeBYRcjSRtQpAW0hCP7tIULMwo=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16 
h1:rgGwPzb82iBYSvHMHXc8h9mRoOUBZIGFgKb9qniaZZc=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.16/go.mod 
h1:L/UxsGeKpGoIj6DxfhOWHWQ/kGKcd4I1VncE4++IyKA=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16 
h1:1jtGzuV7c82xnqOVfx2F0xmJcOw5374L7N6juGW6x6U=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.16/go.mod 
h1:M2E5OQf+XLe+SZGmmpaI2yy+J326aFf6/+54PoxSANc=
+github.com/aws/aws-sdk-go-v2/config v1.32.7 
h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY=
+github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod 
h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.7 
h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod 
h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw=
+github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.17 
h1:iRqLbnl8UR32Nw4FbVf0qgr74Xt9iPGsYj+zRhMYpTI=
+github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.17/go.mod 
h1:EHSHwRRQKu2SAtC0Ac7nFF1cXnUTsr6ZHlq7KTTzfY8=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 
h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod 
h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 
h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod 
h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 
h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod 
h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 
h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk=
 github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod 
h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16 
h1:CjMzUs78RDDv4ROu3JnJn/Ig1r6ZD7/T2DXLLRpejic=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.16/go.mod 
h1:uVW4OLBqbJXSHJYA9svT9BluSvvwbzLQ2Crf6UPzR3c=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.17 
h1:JqcdRG//czea7Ppjb+g/n4o8i/R50aTBHkA7vu0lK+k=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.17/go.mod 
h1:CO+WeGmIdj/MlPel2KwID9Gt7CNq4M65HUfBW97liM0=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 
h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E=
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod 
h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7 
h1:DIBqIrJ7hv+e4CmIk2z3pyKT+3B6qVMgRsawHiR3qso=
-github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.7/go.mod 
h1:vLm00xmBke75UmpNvOcZQ/Q30ZFjbczeLFqGx5urmGo=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16 
h1:oHjJHeUy0ImIV0bsrX0X91GkV5nJAyv1l1CC9lnO0TI=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.16/go.mod 
h1:iRSNGgOYmiYwSCXxXaKb9HfOEj40+oTKn8pTxMlYkRM=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 
h1:NSbvS17MlI2lurYgXnCOLvCFX38sBW4eiVER7+kkgsU=
-github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod 
h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0 
h1:MIWra+MSq53CFaXXAywB2qg9YvVZifkk6vEGl/1Qor0=
-github.com/aws/aws-sdk-go-v2/service/s3 v1.95.0/go.mod 
h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 
h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod 
h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 
h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod 
h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 
h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12/go.mod 
h1:GQ73XawFFiWxyWXMHWfhiomvP3tXtdNar/fi8z18sx0=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 
h1:SciGFVNZ4mHdm7gpD1dgZYnCuVdX1s+lFTg4+4DOy70=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.5/go.mod 
h1:iW40X4QBmUxdP+fZNOpfmkdMZqsovezbAeO+Ubiv2pk=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.8 
h1:Z5EiPIzXKewUQK0QTMkutjiaPVeVYXX7KIqhXu/0fXs=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.8/go.mod 
h1:FsTpJtvC4U1fyDXk7c71XoDv3HlRm8V3NiYLeYLh5YE=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 
h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod 
h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.17 
h1:bGeHBsGZx0Dvu/eJC0Lh9adJa3M1xREcndxLNZlve2U=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.17/go.mod 
h1:dcW24lbU0CzHusTE8LLHhRLI42ejmINN8Lcr22bwh/g=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.95.1 
h1:C2dUPSnEpy4voWFIq3JNd8gN0Y5vYGDo44eUE58a/p8=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.95.1/go.mod 
h1:5jggDlZ2CLQhwJBiZJb4vfk4f0GxWdEDruWKEJ1xOdo=
+github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 
h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y=
+github.com/aws/aws-sdk-go-v2/service/signin v1.0.5/go.mod 
h1:k029+U8SY30/3/ras4G/Fnv/b88N4mAfliNn08Dem4M=
+github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 
h1:v6EiMvhEYBoHABfbGB4alOYmCIrcgyPPiBE1wZAEbqk=
+github.com/aws/aws-sdk-go-v2/service/sso v1.30.9/go.mod 
h1:yifAsgBxgJWn3ggx70A3urX2AN49Y5sJTD1UQFlfqBw=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 
h1:gd84Omyu9JLriJVCbGApcLzVR3XtmC4ZDPcAI6Ftvds=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13/go.mod 
h1:sTGThjphYE4Ohw8vJiRStAcu3rbjtXRsdNB0TvZ5wwo=
+github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 
h1:5fFjR/ToSOzB2OQ/XqWpZBmNvmP/pJ1jOWYlFDJTjRQ=
+github.com/aws/aws-sdk-go-v2/service/sts v1.41.6/go.mod 
h1:qgFDZQSD/Kys7nJnVqYlWKnh0SSdMjAi0uSwON4wgYQ=
 github.com/aws/smithy-go v1.24.0 
h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk=
 github.com/aws/smithy-go v1.24.0/go.mod 
h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0=
 github.com/benbjohnson/clock v1.3.5 
h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
@@ -406,10 +406,11 @@
 github.com/google/go-cmp v0.5.4/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.6/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 github.com/google/go-cmp v0.7.0/go.mod 
h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
-github.com/google/go-querystring v1.1.0 
h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
-github.com/google/go-querystring v1.1.0/go.mod 
h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
+github.com/google/go-querystring v1.2.0 
h1:yhqkPbu2/OH+V9BfpCVPZkNmUXhb2gBxJArfhIxNtP0=
+github.com/google/go-querystring v1.2.0/go.mod 
h1:8IFJqpSRITyJ8QhQ13bmbeMBDfmeEJZD5A0egEOmkqU=
 github.com/google/gofuzz v1.0.0/go.mod 
h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible 
h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
 github.com/google/martian v2.1.0+incompatible/go.mod 
h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
@@ -829,8 +830,8 @@
 github.com/yusufpapurcu/wmi v1.2.4/go.mod 
h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
 github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
 github.com/zeebo/errs v1.4.0/go.mod 
h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
-gitlab.com/gitlab-org/api/client-go v0.161.1 
h1:XX0EtVGL6cGEdNy9xnJ96CSciIzjCwAVsayItHY1YyU=
-gitlab.com/gitlab-org/api/client-go v0.161.1/go.mod 
h1:YqKcnxyV9OPAL5U99mpwBVEgBPz1PK/3qwqq/3h6bao=
+gitlab.com/gitlab-org/api/client-go v1.18.0 
h1:U3CbrRB0DqgOQ60ss8SJ2At3JHf+7QZJGaIUBkJiD9Y=
+gitlab.com/gitlab-org/api/client-go v1.18.0/go.mod 
h1:ctGKgv9bErQHO0NOrfhoyFtKMAkBhUE7y53F2xHFAkE=
 gitlab.com/gitlab-org/go/reopen v1.0.0 
h1:6BujZ0lkkjGIejTUJdNO1w56mN1SI10qcVQyQlOPM+8=
 gitlab.com/gitlab-org/go/reopen v1.0.0/go.mod 
h1:D6OID8YJDzEVZNYW02R/Pkj0v8gYFSIhXFTArAsBQw8=
 gitlab.com/gitlab-org/labkit v1.34.0 
h1:wJrUZdfxbZrA9+qvnpk5gYJtceW+p7ceSJSg1BPZWTs=
@@ -913,8 +914,8 @@
 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod 
h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod 
h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod 
h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 
h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod 
h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 
h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
+golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod 
h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod 
h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod 
h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod 
h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -1314,8 +1315,8 @@
 google.golang.org/protobuf v1.26.0-rc.1/go.mod 
h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 google.golang.org/protobuf v1.27.1/go.mod 
h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.36.10 
h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
-google.golang.org/protobuf v1.36.10/go.mod 
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+google.golang.org/protobuf v1.36.11 
h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
+google.golang.org/protobuf v1.36.11/go.mod 
h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod 
h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod 
h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/internal/feature/feature.go 
new/gitlab-container-registry-4.35.0/internal/feature/feature.go
--- old/gitlab-container-registry-4.34.0/internal/feature/feature.go    
2026-01-15 22:18:28.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/internal/feature/feature.go    
2026-01-27 19:32:41.000000000 +0100
@@ -53,7 +53,7 @@
 // take care to manage their state when appropreate. This feature, when 
enabled, should only prevent the registry
 // from taking action based on the state of existing lockfiles.
 var EnforceLockfiles = Feature{
-       defaultEnabled: false,
+       defaultEnabled: true,
        EnvVariable:    "REGISTRY_FF_ENFORCE_LOCKFILES",
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/gcstats.go 
new/gitlab-container-registry-4.35.0/registry/datastore/gcstats.go
--- old/gitlab-container-registry-4.34.0/registry/datastore/gcstats.go  
1970-01-01 01:00:00.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/registry/datastore/gcstats.go  
2026-01-27 19:32:41.000000000 +0100
@@ -0,0 +1,205 @@
+package datastore
+
+import "time"
+
+// GCStats holds garbage collection statistics for both blob and manifest 
queues.
+type GCStats struct {
+       Blobs     BlobQueueStats     `json:"blobs"`
+       Manifests ManifestQueueStats `json:"manifests"`
+}
+
+// ReviewTask contains common fields shared across all GC task samples.
+type ReviewTask struct {
+       ReviewAfter time.Time     `json:"review_after"`
+       ReviewCount int           `json:"review_count,omitempty"`
+       Event       string        `json:"event"`
+       Overdue     time.Duration `json:"overdue,omitempty"`
+}
+
+// BlobQueueStats holds statistics for the blob review queue.
+type BlobQueueStats struct {
+       PendingRemoval BlobPendingStats   `json:"pending_removal"`
+       LongOverdue    BlobOverdueStats   `json:"long_overdue"`
+       HighRetry      BlobHighRetryStats `json:"high_retry"`
+}
+
+// BlobPendingStats holds count and samples for blobs pending removal.
+type BlobPendingStats struct {
+       Count   int                 `json:"count"`
+       Samples []BlobPendingSample `json:"samples"`
+}
+
+// BlobOverdueStats holds count and samples for long overdue blob tasks.
+type BlobOverdueStats struct {
+       Count   int                 `json:"count"`
+       Samples []BlobOverdueSample `json:"samples"`
+}
+
+// BlobHighRetryStats holds count and samples for high retry blob tasks.
+type BlobHighRetryStats struct {
+       Count   int                   `json:"count"`
+       Samples []BlobHighRetrySample `json:"samples"`
+}
+
+// BlobPendingSample represents a blob task pending removal.
+type BlobPendingSample struct {
+       Digest string `json:"digest"`
+       ReviewTask
+}
+
+// BlobOverdueSample represents a long overdue blob task.
+type BlobOverdueSample struct {
+       Digest string `json:"digest"`
+       ReviewTask
+}
+
+// BlobHighRetrySample represents a blob task with high retry count.
+type BlobHighRetrySample struct {
+       Digest string `json:"digest"`
+       ReviewTask
+}
+
+// ManifestQueueStats holds statistics for the manifest review queue.
+type ManifestQueueStats struct {
+       PendingRemoval ManifestPendingStats   `json:"pending_removal"`
+       LongOverdue    ManifestOverdueStats   `json:"long_overdue"`
+       HighRetry      ManifestHighRetryStats `json:"high_retry"`
+}
+
+// ManifestPendingStats holds count and samples for manifests pending removal.
+type ManifestPendingStats struct {
+       Count   int                     `json:"count"`
+       Samples []ManifestPendingSample `json:"samples"`
+}
+
+// ManifestOverdueStats holds count and samples for long overdue manifest 
tasks.
+type ManifestOverdueStats struct {
+       Count   int                     `json:"count"`
+       Samples []ManifestOverdueSample `json:"samples"`
+}
+
+// ManifestHighRetryStats holds count and samples for high retry manifest 
tasks.
+type ManifestHighRetryStats struct {
+       Count   int                       `json:"count"`
+       Samples []ManifestHighRetrySample `json:"samples"`
+}
+
+// ManifestPendingSample represents a manifest task pending removal.
+type ManifestPendingSample struct {
+       RepositoryID int64 `json:"repository_id"`
+       ManifestID   int64 `json:"manifest_id"`
+       ReviewTask
+}
+
+// ManifestOverdueSample represents a long overdue manifest task.
+type ManifestOverdueSample struct {
+       RepositoryID int64 `json:"repository_id"`
+       ManifestID   int64 `json:"manifest_id"`
+       ReviewTask
+}
+
+// ManifestHighRetrySample represents a manifest task with high retry count.
+type ManifestHighRetrySample struct {
+       RepositoryID int64 `json:"repository_id"`
+       ManifestID   int64 `json:"manifest_id"`
+       ReviewTask
+}
+
+// GetMockGCStats returns mock GC statistics for development and testing.
+// TODO: Replace with real database queries.
+func GetMockGCStats(limit int) GCStats {
+       now := time.Now().UTC()
+
+       // Mock blob pending samples
+       blobPendingSamples := []BlobPendingSample{
+               {Digest: 
"sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22e", ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-2 * time.Hour), Event: "blob_upload"}},
+               {Digest: 
"sha256:b4f5e6d7c8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(-4 * time.Hour), Event: 
"manifest_delete"}},
+               {Digest: 
"sha256:c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(-6 * time.Hour), Event: 
"layer_delete"}},
+       }
+
+       // Mock blob overdue samples
+       blobOverdueSamples := []BlobOverdueSample{
+               {Digest: 
"sha256:d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(-5 * 24 * time.Hour), Event: 
"blob_upload", Overdue: 4 * 24 * time.Hour}},
+               {Digest: 
"sha256:e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(-3 * 24 * time.Hour), Event: 
"layer_delete", Overdue: 2 * 24 * time.Hour}},
+       }
+
+       // Mock blob high retry samples
+       blobHighRetrySamples := []BlobHighRetrySample{
+               {Digest: 
"sha256:f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(1 * time.Hour), ReviewCount: 15, 
Event: "blob_upload"}},
+               {Digest: 
"sha256:a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7", 
ReviewTask: ReviewTask{ReviewAfter: now.Add(2 * time.Hour), ReviewCount: 12, 
Event: "manifest_delete"}},
+       }
+
+       // Mock manifest pending samples
+       manifestPendingSamples := []ManifestPendingSample{
+               {RepositoryID: 1001, ManifestID: 12345, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-1 * time.Hour), Event: "tag_delete"}},
+               {RepositoryID: 1002, ManifestID: 67890, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-3 * time.Hour), Event: "manifest_upload"}},
+               {RepositoryID: 1003, ManifestID: 11111, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-5 * time.Hour), Event: "tag_switch"}},
+               {RepositoryID: 2001, ManifestID: 22222, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-7 * time.Hour), Event: 
"manifest_list_delete"}},
+       }
+
+       // Mock manifest overdue samples
+       manifestOverdueSamples := []ManifestOverdueSample{
+               {RepositoryID: 3001, ManifestID: 33333, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-4 * 24 * time.Hour), Event: "tag_delete", 
Overdue: 3 * 24 * time.Hour}},
+               {RepositoryID: 3002, ManifestID: 44444, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(-2 * 24 * time.Hour), Event: "manifest_delete", 
Overdue: 1 * 24 * time.Hour}},
+       }
+
+       // Mock manifest high retry samples
+       manifestHighRetrySamples := []ManifestHighRetrySample{
+               {RepositoryID: 4001, ManifestID: 55555, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(30 * time.Minute), ReviewCount: 18, Event: 
"tag_delete"}},
+               {RepositoryID: 4002, ManifestID: 66666, ReviewTask: 
ReviewTask{ReviewAfter: now.Add(45 * time.Minute), ReviewCount: 11, Event: 
"manifest_upload"}},
+       }
+
+       // Apply limit to samples consistently
+       // limit <= 0 means no limit (show all samples)
+       if limit > 0 {
+               if limit < len(blobPendingSamples) {
+                       blobPendingSamples = blobPendingSamples[:limit]
+               }
+               if limit < len(blobOverdueSamples) {
+                       blobOverdueSamples = blobOverdueSamples[:limit]
+               }
+               if limit < len(blobHighRetrySamples) {
+                       blobHighRetrySamples = blobHighRetrySamples[:limit]
+               }
+               if limit < len(manifestPendingSamples) {
+                       manifestPendingSamples = manifestPendingSamples[:limit]
+               }
+               if limit < len(manifestOverdueSamples) {
+                       manifestOverdueSamples = manifestOverdueSamples[:limit]
+               }
+               if limit < len(manifestHighRetrySamples) {
+                       manifestHighRetrySamples = 
manifestHighRetrySamples[:limit]
+               }
+       }
+
+       return GCStats{
+               Blobs: BlobQueueStats{
+                       PendingRemoval: BlobPendingStats{
+                               Count:   42,
+                               Samples: blobPendingSamples,
+                       },
+                       LongOverdue: BlobOverdueStats{
+                               Count:   5,
+                               Samples: blobOverdueSamples,
+                       },
+                       HighRetry: BlobHighRetryStats{
+                               Count:   2,
+                               Samples: blobHighRetrySamples,
+                       },
+               },
+               Manifests: ManifestQueueStats{
+                       PendingRemoval: ManifestPendingStats{
+                               Count:   128,
+                               Samples: manifestPendingSamples,
+                       },
+                       LongOverdue: ManifestOverdueStats{
+                               Count:   8,
+                               Samples: manifestOverdueSamples,
+                       },
+                       HighRetry: ManifestHighRetryStats{
+                               Count:   3,
+                               Samples: manifestHighRetrySamples,
+                       },
+               },
+       }
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/migrations/premigrations/20260124100000_add_cncf_wasm_media_types.go
 
new/gitlab-container-registry-4.35.0/registry/datastore/migrations/premigrations/20260124100000_add_cncf_wasm_media_types.go
--- 
old/gitlab-container-registry-4.34.0/registry/datastore/migrations/premigrations/20260124100000_add_cncf_wasm_media_types.go
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/registry/datastore/migrations/premigrations/20260124100000_add_cncf_wasm_media_types.go
        2026-01-27 19:32:41.000000000 +0100
@@ -0,0 +1,34 @@
+package premigrations
+
+import (
+       "github.com/docker/distribution/registry/datastore/migrations"
+       migrate "github.com/rubenv/sql-migrate"
+)
+
+func init() {
+       m := &migrations.Migration{
+               Migration: &migrate.Migration{
+                       Id: "20260124100000_add_cncf_wasm_media_types",
+                       Up: []string{
+                               `INSERT INTO media_types (media_type)
+                                       VALUES
+                                               
('application/vnd.wasm.config.v0+json'),
+                                               ('application/wasm')
+                               EXCEPT
+                               SELECT
+                                       media_type
+                               FROM
+                                       media_types`,
+                       },
+                       Down: []string{
+                               `DELETE FROM media_types
+                                       WHERE media_type IN (
+                                               
'application/vnd.wasm.config.v0+json',
+                                               'application/wasm'
+                                       )`,
+                       },
+               },
+       }
+
+       migrations.AppendPreMigration(m)
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_FullImport_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_FullImport_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
--- 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_FullImport_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
    2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_FullImport_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
    2026-01-27 19:32:41.000000000 +0100
@@ -1 +1 @@
-[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":105,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":105}]
\ No newline at end of file
+[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":107,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":107}]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_ImportAllRepositories_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_ImportAllRepositories_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
--- 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_ImportAllRepositories_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
 2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_ImportAllRepositories_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
 2026-01-27 19:32:41.000000000 +0100
@@ -1 +1 @@
-[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":106,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":106}]
\ No newline at end of file
+[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":108,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":108}]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
--- 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
  2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownLayerMediaTypeWithDynamicMediaTypes/layers.golden
  2026-01-27 19:32:41.000000000 +0100
@@ -1 +1 @@
-[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":104,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":104}]
\ No newline at end of file
+[{"id":1,"top_level_namespace_id":1,"repository_id":1,"manifest_id":1,"size":760854,"created_at":"2020-04-15T12:04:28.95584","media_type_id":106,"digest":"\\x01e2334dd9fee4b77e48a8f2d793904118a3acf26f1f2e72a3d79c6cae993e07f0","media_type_id_convert_to_bigint":106}]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownManifestConfigMediaTypeWithDynamicMediaTypes/manifests.golden
 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownManifestConfigMediaTypeWithDynamicMediaTypes/manifests.golden
--- 
old/gitlab-container-registry-4.34.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownManifestConfigMediaTypeWithDynamicMediaTypes/manifests.golden
      2026-01-15 22:18:28.000000000 +0100
+++ 
new/gitlab-container-registry-4.35.0/registry/datastore/testdata/golden/TestImporter_PreImportAll_UnknownManifestConfigMediaTypeWithDynamicMediaTypes/manifests.golden
      2026-01-27 19:32:41.000000000 +0100
@@ -14,4 +14,4 @@
       }
    ]
 }
-,"media_type_id":3,"configuration_media_type_id":107,"configuration_media_type_id_convert_to_bigint":107,"configuration_payload":{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"ArgsEscaped":true,"Image":"sha256:b0acc7ebf5092fcdd0fe097448529147e6619bd051f03ccf25b29bcae87e783f","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"f7e67f16a539f8bbf53aae18cdb5f8c53e6a56930e7660010d9396ae77f7acfa","container_config":{"Hostname":"f7e67f16a539","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop)
 ","CMD [\"sh\"]"],"ArgsEscaped":true,"Image":"sh
 
a256:b0acc7ebf5092fcdd0fe097448529147e6619bd051f03ccf25b29bcae87e783f","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2020-04-14T19:19:53.590635493Z","docker_version":"18.09.7","history":[{"created":"2020-04-14T19:19:53.444488372Z","created_by":"/bin/sh
 -c #(nop) ADD 
file:09a89925137e1b768ef1f0e7d1d7325eb2b4f1a0895b3aa8dfc98b0c75f3f507 in / 
"},{"created":"2020-04-14T19:19:53.590635493Z","created_by":"/bin/sh -c #(nop)  
CMD 
[\"sh\"]","empty_layer":true}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:5b0d2d635df829f65d0ffb45eab2c3124a470c4f385d6602bda0c21c5248bcab"]}},"configuration_blob_digest":"01be5888e67be651f1fbb59006f0fd791b44ed3fceaa6323ab4e37d5928874345a","non_conformant":false,"non_distributable_layers":false}]
\ No newline at end of file
+,"media_type_id":3,"configuration_media_type_id":109,"configuration_media_type_id_convert_to_bigint":109,"configuration_payload":{"architecture":"amd64","config":{"Hostname":"","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["sh"],"ArgsEscaped":true,"Image":"sha256:b0acc7ebf5092fcdd0fe097448529147e6619bd051f03ccf25b29bcae87e783f","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":null},"container":"f7e67f16a539f8bbf53aae18cdb5f8c53e6a56930e7660010d9396ae77f7acfa","container_config":{"Hostname":"f7e67f16a539","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"Tty":false,"OpenStdin":false,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["/bin/sh","-c","#(nop)
 ","CMD [\"sh\"]"],"ArgsEscaped":true,"Image":"sh
 
a256:b0acc7ebf5092fcdd0fe097448529147e6619bd051f03ccf25b29bcae87e783f","Volumes":null,"WorkingDir":"","Entrypoint":null,"OnBuild":null,"Labels":{}},"created":"2020-04-14T19:19:53.590635493Z","docker_version":"18.09.7","history":[{"created":"2020-04-14T19:19:53.444488372Z","created_by":"/bin/sh
 -c #(nop) ADD 
file:09a89925137e1b768ef1f0e7d1d7325eb2b4f1a0895b3aa8dfc98b0c75f3f507 in / 
"},{"created":"2020-04-14T19:19:53.590635493Z","created_by":"/bin/sh -c #(nop)  
CMD 
[\"sh\"]","empty_layer":true}],"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:5b0d2d635df829f65d0ffb45eab2c3124a470c4f385d6602bda0c21c5248bcab"]}},"configuration_blob_digest":"01be5888e67be651f1fbb59006f0fd791b44ed3fceaa6323ab4e37d5928874345a","non_conformant":false,"non_distributable_layers":false}]
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.34.0/registry/root.go 
new/gitlab-container-registry-4.35.0/registry/root.go
--- old/gitlab-container-registry-4.34.0/registry/root.go       2026-01-15 
22:18:28.000000000 +0100
+++ new/gitlab-container-registry-4.35.0/registry/root.go       2026-01-27 
19:32:41.000000000 +0100
@@ -1,6 +1,7 @@
 package registry
 
 import (
+       "encoding/json"
        "errors"
        "fmt"
        "io"
@@ -82,6 +83,10 @@
        BBMCmd.AddCommand(BBMRunCmd)
        BBMRunCmd.Flags().VarP(nullableInt{&maxBBMJobRetry}, "max-job-retry", 
"r", "Set the maximum number of job retry attempts (default 2, must be between 
1 and 10)")
 
+       GCStatsCmd.Flags().StringVarP(&gcStatsFormat, "format", "f", "table", 
"output format: 'table' or 'json'")
+       GCStatsCmd.Flags().IntVarP(&gcStatsLimit, "limit", "l", 10, "maximum 
number of sample entries to display per category, pass 0 to show all entries")
+       DBCmd.AddCommand(GCStatsCmd)
+
        RootCmd.SetFlagErrorFunc(func(c *cobra.Command, err error) error {
                return fmt.Errorf("%w\n\n%s", err, c.UsageString())
        })
@@ -111,6 +116,8 @@
        stats                bool
        preImportSkipCutoff  time.Duration
        logDir               string
+       gcStatsFormat        string
+       gcStatsLimit         int
 )
 
 var parallelwalkKey = "parallelwalk"
@@ -868,3 +875,174 @@
                return nil
        },
 }
+
+// GCStatsCmd is the `gc-stats` sub-command of `database` that shows GC queue 
statistics.
+var GCStatsCmd = &cobra.Command{
+       Use:   "gc-stats <config>",
+       Short: "Show online garbage collection queue statistics",
+       Long: `Show online garbage collection queue statistics.
+
+Displays health metrics for the blob and manifest GC review queues, including:
+- Tasks pending removal (ready for GC review)
+- Long overdue tasks (pending longer than configured delay)
+- High retry tasks (>10 review attempts, may indicate issues)`,
+       RunE: func(_ *cobra.Command, args []string) error {
+               _, err := resolveConfiguration(args, 
configuration.WithoutStorageValidation())
+               if err != nil {
+                       return fmt.Errorf("configuration error: %w", err)
+               }
+
+               // TODO: Replace mock data with real database queries
+               stats := datastore.GetMockGCStats(gcStatsLimit)
+
+               switch gcStatsFormat {
+               case "json":
+                       return outputGCStatsJSON(stats)
+               case "table":
+                       return outputGCStatsTable(stats)
+               default:
+                       return fmt.Errorf("invalid format %q: must be 'table' 
or 'json'", gcStatsFormat)
+               }
+       },
+}
+
+func outputGCStatsJSON(stats datastore.GCStats) error {
+       encoder := json.NewEncoder(os.Stdout)
+       encoder.SetIndent("", "  ")
+       return encoder.Encode(stats)
+}
+
+func outputGCStatsTable(stats datastore.GCStats) error {
+       // Blob Queue Statistics
+       _, _ = fmt.Println("=== DEMO ONLY ===")
+       _, _ = fmt.Println("=== Blob Review Queue ===")
+       _, _ = fmt.Println("=== DEMO ONLY ===")
+       _, _ = fmt.Println()
+
+       // Pending Removal
+       _, _ = fmt.Printf("Tasks Pending Removal: %d\n", 
stats.Blobs.PendingRemoval.Count)
+       _, _ = fmt.Println("Tasks ready for GC review (review_after has 
passed).")
+       _, _ = fmt.Println()
+       if len(stats.Blobs.PendingRemoval.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Digest", "Review After", "Event"})
+               for _, s := range stats.Blobs.PendingRemoval.Samples {
+                       if err := table.Append([]string{s.Digest, 
formatTime(s.ReviewAfter), s.Event}); err != nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+       _, _ = fmt.Println()
+
+       // Long Overdue
+       _, _ = fmt.Printf("Long Overdue Tasks: %d\n", 
stats.Blobs.LongOverdue.Count)
+       _, _ = fmt.Println("Tasks pending longer than configured delay - may 
need attention.")
+       _, _ = fmt.Println()
+       if len(stats.Blobs.LongOverdue.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Digest", "Review After", "Event", 
"Overdue"})
+               for _, s := range stats.Blobs.LongOverdue.Samples {
+                       if err := table.Append([]string{s.Digest, 
formatTime(s.ReviewAfter), s.Event, formatOverdue(s.Overdue)}); err != nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+       _, _ = fmt.Println()
+
+       // High Retry
+       _, _ = fmt.Printf("High Retry Tasks: %d\n", stats.Blobs.HighRetry.Count)
+       _, _ = fmt.Println("Tasks with >10 review attempts - may indicate 
persistent issues.")
+       _, _ = fmt.Println()
+       if len(stats.Blobs.HighRetry.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Digest", "Review After", "Event", 
"Retries"})
+               for _, s := range stats.Blobs.HighRetry.Samples {
+                       if err := table.Append([]string{s.Digest, 
formatTime(s.ReviewAfter), s.Event, fmt.Sprintf("%d", s.ReviewCount)}); err != 
nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+       _, _ = fmt.Println()
+
+       // Manifest Queue Statistics
+       _, _ = fmt.Println("=== DEMO ONLY ===")
+       _, _ = fmt.Println("=== Manifest Review Queue ===")
+       _, _ = fmt.Println("=== DEMO ONLY ===")
+       _, _ = fmt.Println()
+
+       // Pending Removal
+       _, _ = fmt.Printf("Tasks Pending Removal: %d\n", 
stats.Manifests.PendingRemoval.Count)
+       _, _ = fmt.Println("Tasks ready for GC review (review_after has 
passed).")
+       _, _ = fmt.Println()
+       if len(stats.Manifests.PendingRemoval.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Repository ID", "Manifest ID", "Review 
After", "Event"})
+               for _, s := range stats.Manifests.PendingRemoval.Samples {
+                       if err := table.Append([]string{fmt.Sprintf("%d", 
s.RepositoryID), fmt.Sprintf("%d", s.ManifestID), formatTime(s.ReviewAfter), 
s.Event}); err != nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+       _, _ = fmt.Println()
+
+       // Long Overdue
+       _, _ = fmt.Printf("Long Overdue Tasks: %d\n", 
stats.Manifests.LongOverdue.Count)
+       _, _ = fmt.Println("Tasks pending longer than configured delay - may 
need attention.")
+       _, _ = fmt.Println()
+       if len(stats.Manifests.LongOverdue.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Repository ID", "Manifest ID", "Review 
After", "Event", "Overdue"})
+               for _, s := range stats.Manifests.LongOverdue.Samples {
+                       if err := table.Append([]string{fmt.Sprintf("%d", 
s.RepositoryID), fmt.Sprintf("%d", s.ManifestID), formatTime(s.ReviewAfter), 
s.Event, formatOverdue(s.Overdue)}); err != nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+       _, _ = fmt.Println()
+
+       // High Retry
+       _, _ = fmt.Printf("High Retry Tasks: %d\n", 
stats.Manifests.HighRetry.Count)
+       _, _ = fmt.Println("Tasks with >10 review attempts - may indicate 
persistent issues.")
+       _, _ = fmt.Println()
+       if len(stats.Manifests.HighRetry.Samples) > 0 {
+               table := tablewriter.NewWriter(os.Stdout)
+               table.Header([]string{"Repository ID", "Manifest ID", "Review 
After", "Event", "Retries"})
+               for _, s := range stats.Manifests.HighRetry.Samples {
+                       if err := table.Append([]string{fmt.Sprintf("%d", 
s.RepositoryID), fmt.Sprintf("%d", s.ManifestID), formatTime(s.ReviewAfter), 
s.Event, fmt.Sprintf("%d", s.ReviewCount)}); err != nil {
+                               return fmt.Errorf("appending table row: %w", 
err)
+                       }
+               }
+               if err := table.Render(); err != nil {
+                       return fmt.Errorf("rendering table: %w", err)
+               }
+       }
+
+       return nil
+}
+
+// formatTime formats a time.Time for table display.
+func formatTime(t time.Time) string {
+       return t.Format("2006-01-02 15:04:05")
+}
+
+// formatOverdue formats a duration as "Xd Yh" for table display.
+func formatOverdue(d time.Duration) string {
+       days := int(d.Hours()) / 24
+       hours := int(d.Hours()) % 24
+       return fmt.Sprintf("%dd %dh", days, hours)
+}

++++++ gitlab-container-registry.obsinfo ++++++
--- /var/tmp/diff_new_pack.aTvWK8/_old  2026-01-28 15:16:51.594253763 +0100
+++ /var/tmp/diff_new_pack.aTvWK8/_new  2026-01-28 15:16:51.598253931 +0100
@@ -1,5 +1,5 @@
 name: gitlab-container-registry
-version: 4.34.0
-mtime: 1768511908
-commit: 88b11c2ebc83268af944962a048f923b3fc26ade
+version: 4.35.0
+mtime: 1769538761
+commit: 2f3393f74d4eaea8b06f9ff153bc3907c4a31783
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/gitlab-container-registry/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.gitlab-container-registry.new.1928/vendor.tar.gz 
differ: char 16, line 1

Reply via email to