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