From 152b4760dcae60885731a6c2e1a707c48465710b Mon Sep 17 00:00:00 2001 From: Anbraten <6918444+anbraten@users.noreply.github.com> Date: Fri, 9 Jan 2026 14:53:14 +0100 Subject: [PATCH 001/117] Correctly update repo permissions (#5928) --- server/api/login.go | 1 - server/api/repo.go | 11 +++++++---- server/model/perm.go | 1 - server/router/middleware/session/repo.go | 1 - server/store/datastore/feed_test.go | 8 ++++---- server/store/datastore/permission.go | 17 ++++++++--------- server/store/datastore/permission_test.go | 11 ++++------- server/store/datastore/repo_test.go | 12 ++++++------ 8 files changed, 29 insertions(+), 33 deletions(-) diff --git a/server/api/login.go b/server/api/login.go index ed777297f..ef9df7be5 100644 --- a/server/api/login.go +++ b/server/api/login.go @@ -334,7 +334,6 @@ func updateRepoPermissions(c *gin.Context, user *model.User, _store store.Store, log.Debug().Msgf("synced user permission for user %s and repo %s", user.Login, dbRepo.FullName) perm := forgeRepo.Perm - perm.Repo = dbRepo perm.RepoID = dbRepo.ID perm.UserID = user.ID perm.Synced = time.Now().Unix() diff --git a/server/api/repo.go b/server/api/repo.go index ef07bbb1d..fb29aeb55 100644 --- a/server/api/repo.go +++ b/server/api/repo.go @@ -191,7 +191,6 @@ func PostRepo(c *gin.Context) { repo.Perm.Synced = time.Now().Unix() repo.Perm.UserID = user.ID repo.Perm.RepoID = repo.ID - repo.Perm.Repo = repo err = _store.PermUpsert(repo.Perm) if err != nil { c.String(http.StatusInternalServerError, err.Error()) @@ -559,6 +558,9 @@ func MoveRepo(c *gin.Context) { return } repo.Perm = from.Perm + repo.Perm.Synced = time.Now().Unix() + repo.Perm.UserID = user.ID + repo.Perm.RepoID = repo.ID errStore = _store.PermUpsert(repo.Perm) if errStore != nil { _ = c.AbortWithError(http.StatusInternalServerError, errStore) @@ -714,9 +716,10 @@ func repairRepo(c *gin.Context, repo *model.Repo, updatePermissions bool) error } if updatePermissions { - repo.Perm.Pull = from.Perm.Pull - repo.Perm.Push = from.Perm.Push - repo.Perm.Admin = from.Perm.Admin + repo.Perm = from.Perm + repo.Perm.Synced = time.Now().Unix() + repo.Perm.UserID = repoUser.ID + repo.Perm.RepoID = repo.ID if err := _store.PermUpsert(repo.Perm); err != nil { return err } diff --git a/server/model/perm.go b/server/model/perm.go index a746c8241..06cb2f765 100644 --- a/server/model/perm.go +++ b/server/model/perm.go @@ -19,7 +19,6 @@ package model type Perm struct { UserID int64 `json:"-" xorm:"UNIQUE(s) INDEX NOT NULL 'user_id'"` RepoID int64 `json:"-" xorm:"UNIQUE(s) INDEX NOT NULL 'repo_id'"` - Repo *Repo `json:"-" xorm:"-"` Pull bool `json:"pull" xorm:"pull"` Push bool `json:"push" xorm:"push"` Admin bool `json:"admin" xorm:"admin"` diff --git a/server/router/middleware/session/repo.go b/server/router/middleware/session/repo.go index 55e5e620a..519b462f4 100644 --- a/server/router/middleware/session/repo.go +++ b/server/router/middleware/session/repo.go @@ -128,7 +128,6 @@ func SetPerm() gin.HandlerFunc { log.Debug().Msgf("synced user permission for %s %s", user.Login, repo.FullName) _repo.ForgeID = user.ForgeID perm = _repo.Perm - perm.Repo = repo perm.RepoID = repo.ID perm.UserID = user.ID perm.Synced = time.Now().Unix() diff --git a/server/store/datastore/feed_test.go b/server/store/datastore/feed_test.go index 9f26b2289..705603c06 100644 --- a/server/store/datastore/feed_test.go +++ b/server/store/datastore/feed_test.go @@ -43,7 +43,7 @@ func TestGetPipelineQueue(t *testing.T) { assert.NoError(t, store.CreateRepo(repo1)) for _, perm := range []*model.Perm{ - {UserID: user.ID, Repo: repo1, Push: true, Admin: false}, + {UserID: user.ID, RepoID: repo1.ID, Push: true, Admin: false}, } { assert.NoError(t, store.PermUpsert(perm)) } @@ -111,7 +111,7 @@ func TestUserFeed(t *testing.T) { assert.NoError(t, store.CreateRepo(repo2)) for _, perm := range []*model.Perm{ - {UserID: user.ID, Repo: repo1, Push: true, Admin: false}, + {UserID: user.ID, RepoID: repo1.ID, Push: true, Admin: false}, } { assert.NoError(t, store.PermUpsert(perm)) } @@ -167,8 +167,8 @@ func TestRepoListLatest(t *testing.T) { assert.NoError(t, store.CreateRepo(repo3)) for _, perm := range []*model.Perm{ - {UserID: user.ID, Repo: repo1, Push: true, Admin: false}, - {UserID: user.ID, Repo: repo2, Push: true, Admin: true}, + {UserID: user.ID, RepoID: repo1.ID, Push: true, Admin: false}, + {UserID: user.ID, RepoID: repo2.ID, Push: true, Admin: true}, } { assert.NoError(t, store.PermUpsert(perm)) } diff --git a/server/store/datastore/permission.go b/server/store/datastore/permission.go index 6bbf3dc1c..51a42a2de 100644 --- a/server/store/datastore/permission.go +++ b/server/store/datastore/permission.go @@ -16,6 +16,7 @@ package datastore import ( "fmt" + "time" "xorm.io/builder" "xorm.io/xorm" @@ -45,17 +46,12 @@ func (s storage) PermUpsert(perm *model.Perm) error { } func (s storage) permUpsert(sess *xorm.Session, perm *model.Perm) error { - if perm.RepoID == 0 && perm.Repo == nil { + if perm.RepoID == 0 { return fmt.Errorf("could not determine repo for permission: %v", perm) } - // lookup repo based on name or forge ID if possible - if perm.RepoID == 0 && perm.Repo != nil { - r, err := s.getRepoNameFallback(sess, perm.Repo.ForgeID, perm.Repo.ForgeRemoteID, perm.Repo.FullName) - if err != nil { - return err - } - perm.RepoID = r.ID + if perm.UserID == 0 { + return fmt.Errorf("could not determine user for permission: %v", perm) } exist, err := sess.Where(userIDAndRepoIDCond(perm)).Exist(new(model.Perm)) @@ -64,9 +60,12 @@ func (s storage) permUpsert(sess *xorm.Session, perm *model.Perm) error { } if exist { + perm.Updated = time.Now().Unix() _, err = sess.Where(userIDAndRepoIDCond(perm)).AllCols().Update(perm) } else { - // only Insert set auto created ID back to object + // insert will set auto created ID back to perm object + perm.Created = time.Now().Unix() + perm.Updated = perm.Created _, err = sess.Insert(perm) } return err diff --git a/server/store/datastore/permission_test.go b/server/store/datastore/permission_test.go index f048bcb6f..392865780 100644 --- a/server/store/datastore/permission_test.go +++ b/server/store/datastore/permission_test.go @@ -41,7 +41,6 @@ func TestPermFind(t *testing.T) { &model.Perm{ UserID: user.ID, RepoID: repo.ID, - Repo: repo, Pull: true, Push: false, Admin: false, @@ -74,7 +73,6 @@ func TestPermUpsert(t *testing.T) { &model.Perm{ UserID: user.ID, RepoID: repo.ID, - Repo: repo, Pull: true, Push: false, Admin: false, @@ -97,7 +95,6 @@ func TestPermUpsert(t *testing.T) { &model.Perm{ UserID: user.ID, RepoID: repo.ID, - Repo: repo, Pull: true, Push: true, Admin: true, @@ -135,8 +132,8 @@ func TestPermPruneDeleteAll(t *testing.T) { assert.NoError(t, store.CreateRepo(repo1)) assert.NoError(t, store.CreateRepo(repo2)) - assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo1.ID, Repo: repo1, Pull: true})) - assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo2.ID, Repo: repo2, Pull: true})) + assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo1.ID, Pull: true})) + assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo2.ID, Pull: true})) _, err := store.PermFind(user, repo1) assert.NoError(t, err) @@ -174,8 +171,8 @@ func TestPermPruneKeepOne(t *testing.T) { assert.NoError(t, store.CreateRepo(repo1)) assert.NoError(t, store.CreateRepo(repo2)) - assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo1.ID, Repo: repo1, Pull: true})) - assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo2.ID, Repo: repo2, Pull: true})) + assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo1.ID, Pull: true})) + assert.NoError(t, store.PermUpsert(&model.Perm{UserID: user.ID, RepoID: repo2.ID, Pull: true})) _, err := store.PermFind(user, repo1) assert.NoError(t, err) diff --git a/server/store/datastore/repo_test.go b/server/store/datastore/repo_test.go index edc05b817..8ff01e5cb 100644 --- a/server/store/datastore/repo_test.go +++ b/server/store/datastore/repo_test.go @@ -146,8 +146,8 @@ func TestRepoList(t *testing.T) { assert.NoError(t, store.CreateRepo(repo3)) for _, perm := range []*model.Perm{ - {UserID: user.ID, Repo: repo1}, - {UserID: user.ID, Repo: repo2}, + {UserID: user.ID, RepoID: repo1.ID}, + {UserID: user.ID, RepoID: repo2.ID}, } { assert.NoError(t, store.PermUpsert(perm)) } @@ -234,10 +234,10 @@ func TestOwnedRepoList(t *testing.T) { assert.NoError(t, store.CreateRepo(repo4)) for _, perm := range []*model.Perm{ - {UserID: user.ID, Repo: repo1, Push: true, Admin: false}, - {UserID: user.ID, Repo: repo2, Push: false, Admin: true}, - {UserID: user.ID, Repo: repo3}, - {UserID: user.ID, Repo: repo4}, + {UserID: user.ID, RepoID: repo1.ID, Push: true, Admin: false}, + {UserID: user.ID, RepoID: repo2.ID, Push: false, Admin: true}, + {UserID: user.ID, RepoID: repo3.ID}, + {UserID: user.ID, RepoID: repo4.ID}, } { assert.NoError(t, store.PermUpsert(perm)) } From cca4acaf46ca6919ac10f919aef7ab075a6d0d5f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 01:51:45 +0100 Subject: [PATCH 002/117] chore(deps): update docker.io/woodpeckerci/plugin-editorconfig-checker docker tag to v0.3.3 (#5934) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .woodpecker/static.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/static.yaml b/.woodpecker/static.yaml index d6b48144a..d46741e9a 100644 --- a/.woodpecker/static.yaml +++ b/.woodpecker/static.yaml @@ -3,7 +3,7 @@ when: steps: - name: lint-editorconfig - image: docker.io/woodpeckerci/plugin-editorconfig-checker:0.3.2 + image: docker.io/woodpeckerci/plugin-editorconfig-checker:0.3.3 depends_on: [] when: - event: pull_request From fb568db326d066e362877d362063c6af8b0052fe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 01:53:20 +0100 Subject: [PATCH 003/117] chore(deps): update dependency @types/node to v24.10.5 (#5933) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index 3746a2bd4..c7a139ed4 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -56,7 +56,7 @@ importers: version: 4.7.0(prettier@3.7.4) '@types/node': specifier: ^24.0.0 - version: 24.10.4 + version: 24.10.5 '@types/react': specifier: ^19.2.0 version: 19.2.7 @@ -102,7 +102,7 @@ importers: version: 2.0.7 '@types/node': specifier: ^24.0.0 - version: 24.10.4 + version: 24.10.5 axios: specifier: ^1.7.9 version: 1.13.2 @@ -2033,8 +2033,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@24.10.4': - resolution: {integrity: sha512-vnDVpYPMzs4wunl27jHrfmwojOGKya0xyM3sH+UE5iv5uPS6vX7UIoh6m+vQc5LGBq52HBKPIn/zcSZVzeDEZg==} + '@types/node@24.10.5': + resolution: {integrity: sha512-tPacJqtEN9wmsHA9YKHxDQlODhoUN3SFQV8kCiWc4oCV1QjbigUNHH8xH3KAyM963jGRCmeDGsBl4ePSgsFivA==} '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -8184,7 +8184,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8731,20 +8731,20 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.7 - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/debug@4.1.12': dependencies: @@ -8768,7 +8768,7 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -8796,7 +8796,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/istanbul-lib-coverage@2.0.6': {} @@ -8822,11 +8822,11 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/node@17.0.45': {} - '@types/node@24.10.4': + '@types/node@24.10.5': dependencies: undici-types: 7.16.0 @@ -8865,16 +8865,16 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/send@1.2.1': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/serve-index@1.9.4': dependencies: @@ -8883,12 +8883,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/stylis@4.2.5': {} @@ -8901,7 +8901,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 '@types/yargs-parser@21.0.3': {} @@ -10037,7 +10037,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 require-like: 0.1.2 eventemitter3@4.0.7: {} @@ -10736,7 +10736,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.4 + '@types/node': 24.10.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -10744,13 +10744,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.10.4 + '@types/node': 24.10.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 From 019c2484331b58f1628f33c7131c5e0028180d04 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 06:37:26 +0100 Subject: [PATCH 004/117] chore(deps): update dependency @types/node to v24.10.6 (#5935) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 46 ++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index c7a139ed4..4abfe7d6a 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -56,7 +56,7 @@ importers: version: 4.7.0(prettier@3.7.4) '@types/node': specifier: ^24.0.0 - version: 24.10.5 + version: 24.10.6 '@types/react': specifier: ^19.2.0 version: 19.2.7 @@ -102,7 +102,7 @@ importers: version: 2.0.7 '@types/node': specifier: ^24.0.0 - version: 24.10.5 + version: 24.10.6 axios: specifier: ^1.7.9 version: 1.13.2 @@ -2033,8 +2033,8 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@24.10.5': - resolution: {integrity: sha512-tPacJqtEN9wmsHA9YKHxDQlODhoUN3SFQV8kCiWc4oCV1QjbigUNHH8xH3KAyM963jGRCmeDGsBl4ePSgsFivA==} + '@types/node@24.10.6': + resolution: {integrity: sha512-B8h60xgJMR/xmgyX9fncRzEW9gCxoJjdenUhke2v1JGOd/V66KopmWrLPXi5oUI4VuiGK+d+HlXJjDRZMj21EQ==} '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -8184,7 +8184,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8731,20 +8731,20 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/bonjour@3.5.13': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/connect-history-api-fallback@1.5.4': dependencies: '@types/express-serve-static-core': 4.19.7 - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/debug@4.1.12': dependencies: @@ -8768,7 +8768,7 @@ snapshots: '@types/express-serve-static-core@4.19.7': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 @@ -8796,7 +8796,7 @@ snapshots: '@types/http-proxy@1.17.17': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/istanbul-lib-coverage@2.0.6': {} @@ -8822,11 +8822,11 @@ snapshots: '@types/node-forge@1.3.14': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/node@17.0.45': {} - '@types/node@24.10.5': + '@types/node@24.10.6': dependencies: undici-types: 7.16.0 @@ -8865,16 +8865,16 @@ snapshots: '@types/sax@1.2.7': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/send@1.2.1': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/serve-index@1.9.4': dependencies: @@ -8883,12 +8883,12 @@ snapshots: '@types/serve-static@1.15.10': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/send': 0.17.6 '@types/sockjs@0.3.36': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/stylis@4.2.5': {} @@ -8901,7 +8901,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 '@types/yargs-parser@21.0.3': {} @@ -10037,7 +10037,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 require-like: 0.1.2 eventemitter3@4.0.7: {} @@ -10736,7 +10736,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.5 + '@types/node': 24.10.6 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -10744,13 +10744,13 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 24.10.5 + '@types/node': 24.10.6 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 From e1877200a56cce8d573cb6b218f7fc9751a81483 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 06:39:53 +0100 Subject: [PATCH 005/117] chore(deps): update docker.io/woodpeckerci/plugin-docker-buildx docker tag to v6.0.4 (#5936) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .woodpecker/docker.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/docker.yaml b/.woodpecker/docker.yaml index 3f6348056..26ebd4ffe 100644 --- a/.woodpecker/docker.yaml +++ b/.woodpecker/docker.yaml @@ -2,7 +2,7 @@ variables: - &golang_image 'docker.io/golang:1.25' - &node_image 'docker.io/node:24-alpine' - &xgo_image 'docker.io/techknowlogick/xgo:go-1.25.x' - - &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:6.0.3' + - &buildx_plugin 'docker.io/woodpeckerci/plugin-docker-buildx:6.0.4' - &platforms_release 'linux/arm/v6,linux/arm/v7,linux/arm64/v8,linux/386,linux/amd64,linux/ppc64le,linux/riscv64,linux/s390x,freebsd/arm64,freebsd/amd64,openbsd/arm64,openbsd/amd64' - &platforms_server 'linux/arm/v7,linux/arm64/v8,linux/amd64,linux/ppc64le,linux/riscv64' - &platforms_preview 'linux/amd64' From d5daabd0692bdca0a91bb1cc333f7f0424307413 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:07:45 +0100 Subject: [PATCH 006/117] chore(deps): update docker.io/woodpeckerci/plugin-ready-release-go docker tag to v3.4.1 (#5937) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .woodpecker/release-helper.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/release-helper.yaml b/.woodpecker/release-helper.yaml index 62766dc34..252bb159c 100644 --- a/.woodpecker/release-helper.yaml +++ b/.woodpecker/release-helper.yaml @@ -6,7 +6,7 @@ when: steps: - name: release-helper - image: docker.io/woodpeckerci/plugin-ready-release-go:3.4.0 + image: docker.io/woodpeckerci/plugin-ready-release-go:3.4.1 settings: release_branch: ${CI_COMMIT_BRANCH} forge_type: github From d554141d163ffe257f4701640faf1d1199eb62e5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 10 Jan 2026 10:09:42 +0100 Subject: [PATCH 007/117] chore(deps): update docker.io/woodpeckerci/plugin-surge-preview docker tag to v1.4.2 (#5938) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .woodpecker/docs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.woodpecker/docs.yaml b/.woodpecker/docs.yaml index 583b18e36..c041bf9d0 100644 --- a/.woodpecker/docs.yaml +++ b/.woodpecker/docs.yaml @@ -79,7 +79,7 @@ steps: - event: manual - name: deploy-preview - image: docker.io/woodpeckerci/plugin-surge-preview:1.4.1 + image: docker.io/woodpeckerci/plugin-surge-preview:1.4.2 settings: path: 'docs/build/' surge_token: From 8db8f49d166a890f830f99df5899dbc87010d1ca Mon Sep 17 00:00:00 2001 From: qwerty287 <80460567+qwerty287@users.noreply.github.com> Date: Sat, 10 Jan 2026 13:06:27 +0100 Subject: [PATCH 008/117] Allow to add a note to secrets (#5898) Co-authored-by: 6543 <6543@obermui.de> --- cmd/server/openapi/docs.go | 35 +++++++++++++++++++++-- server/api/global_secret.go | 16 +++++++---- server/api/org_secret.go | 18 +++++++----- server/api/repo_secret.go | 18 +++++++----- server/model/secret.go | 10 +++++++ web/src/assets/locales/en.json | 1 + web/src/components/secrets/SecretEdit.vue | 4 +++ web/src/components/secrets/SecretList.vue | 2 +- web/src/lib/api/types/secret.ts | 1 + woodpecker-go/woodpecker/types.go | 1 + 10 files changed, 82 insertions(+), 24 deletions(-) diff --git a/cmd/server/openapi/docs.go b/cmd/server/openapi/docs.go index b86e7cd2b..6511f81d3 100644 --- a/cmd/server/openapi/docs.go +++ b/cmd/server/openapi/docs.go @@ -1729,7 +1729,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/Secret" + "$ref": "#/definitions/SecretPatch" } } ], @@ -3921,7 +3921,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/Secret" + "$ref": "#/definitions/SecretPatch" } } ], @@ -4113,7 +4113,7 @@ const docTemplate = `{ "in": "body", "required": true, "schema": { - "$ref": "#/definitions/Secret" + "$ref": "#/definitions/SecretPatch" } } ], @@ -5456,6 +5456,9 @@ const docTemplate = `{ "name": { "type": "string" }, + "note": { + "type": "string" + }, "org_id": { "type": "integer" }, @@ -5467,6 +5470,32 @@ const docTemplate = `{ } } }, + "SecretPatch": { + "type": "object", + "properties": { + "events": { + "type": "array", + "items": { + "$ref": "#/definitions/WebhookEvent" + } + }, + "images": { + "type": "array", + "items": { + "type": "string" + } + }, + "name": { + "type": "string" + }, + "note": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, "StatusValue": { "type": "string", "enum": [ diff --git a/server/api/global_secret.go b/server/api/global_secret.go index 1bcc6a825..abea683ff 100644 --- a/server/api/global_secret.go +++ b/server/api/global_secret.go @@ -89,6 +89,7 @@ func PostGlobalSecret(c *gin.Context) { Value: in.Value, Events: in.Events, Images: in.Images, + Note: in.Note, } if err := secret.Validate(); err != nil { c.String(http.StatusBadRequest, "Error inserting global secret. %s", err) @@ -110,13 +111,13 @@ func PostGlobalSecret(c *gin.Context) { // @Produce json // @Success 200 {object} Secret // @Tags Secrets -// @Param Authorization header string true "Insert your personal access token" default(Bearer ) -// @Param secret path string true "the secret's name" -// @Param secretData body Secret true "the secret's data" +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param secret path string true "the secret's name" +// @Param secretData body SecretPatch true "the secret's data" func PatchGlobalSecret(c *gin.Context) { name := c.Param("secret") - in := new(model.Secret) + in := new(model.SecretPatch) err := c.Bind(in) if err != nil { c.String(http.StatusBadRequest, "Error parsing secret. %s", err) @@ -129,8 +130,8 @@ func PatchGlobalSecret(c *gin.Context) { handleDBError(c, err) return } - if in.Value != "" { - secret.Value = in.Value + if in.Value != nil && *in.Value != "" { + secret.Value = *in.Value } if in.Events != nil { secret.Events = in.Events @@ -138,6 +139,9 @@ func PatchGlobalSecret(c *gin.Context) { if in.Images != nil { secret.Images = in.Images } + if in.Note != nil { + secret.Note = *in.Note + } if err := secret.Validate(); err != nil { c.String(http.StatusBadRequest, "Error updating global secret. %s", err) diff --git a/server/api/org_secret.go b/server/api/org_secret.go index 47b9dfc53..6c08a3e23 100644 --- a/server/api/org_secret.go +++ b/server/api/org_secret.go @@ -99,6 +99,7 @@ func PostOrgSecret(c *gin.Context) { Value: in.Value, Events: in.Events, Images: in.Images, + Note: in.Note, } if err := secret.Validate(); err != nil { c.String(http.StatusUnprocessableEntity, "Error inserting org %q secret. %s", org.ID, err) @@ -120,15 +121,15 @@ func PostOrgSecret(c *gin.Context) { // @Produce json // @Success 200 {object} Secret // @Tags Organization secrets -// @Param Authorization header string true "Insert your personal access token" default(Bearer ) -// @Param org_id path string true "the org's id" -// @Param secret path string true "the secret's name" -// @Param secretData body Secret true "the update secret data" +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param org_id path string true "the org's id" +// @Param secret path string true "the secret's name" +// @Param secretData body SecretPatch true "the update secret data" func PatchOrgSecret(c *gin.Context) { org := session.Org(c) name := c.Param("secret") - in := new(model.Secret) + in := new(model.SecretPatch) if err := c.Bind(in); err != nil { c.String(http.StatusBadRequest, "Error parsing secret. %s", err) return @@ -140,8 +141,8 @@ func PatchOrgSecret(c *gin.Context) { handleDBError(c, err) return } - if in.Value != "" { - secret.Value = in.Value + if in.Value != nil && *in.Value != "" { + secret.Value = *in.Value } if in.Events != nil { secret.Events = in.Events @@ -149,6 +150,9 @@ func PatchOrgSecret(c *gin.Context) { if in.Images != nil { secret.Images = in.Images } + if in.Note != nil { + secret.Note = *in.Note + } if err := secret.Validate(); err != nil { c.String(http.StatusUnprocessableEntity, "Error updating org %q secret. %s", org.ID, err) diff --git a/server/api/repo_secret.go b/server/api/repo_secret.go index 59c73b4ff..6fe06bd9b 100644 --- a/server/api/repo_secret.go +++ b/server/api/repo_secret.go @@ -71,6 +71,7 @@ func PostSecret(c *gin.Context) { Value: in.Value, Events: in.Events, Images: in.Images, + Note: in.Note, } if err := secret.Validate(); err != nil { c.String(http.StatusUnprocessableEntity, "Error inserting secret. %s", err) @@ -92,17 +93,17 @@ func PostSecret(c *gin.Context) { // @Produce json // @Success 200 {object} Secret // @Tags Repository secrets -// @Param Authorization header string true "Insert your personal access token" default(Bearer ) -// @Param repo_id path int true "the repository id" -// @Param secretName path string true "the secret name" -// @Param secret body Secret true "the secret itself" +// @Param Authorization header string true "Insert your personal access token" default(Bearer ) +// @Param repo_id path int true "the repository id" +// @Param secretName path string true "the secret name" +// @Param secret body SecretPatch true "the secret itself" func PatchSecret(c *gin.Context) { var ( repo = session.Repo(c) name = c.Param("secret") ) - in := new(model.Secret) + in := new(model.SecretPatch) err := c.Bind(in) if err != nil { c.String(http.StatusBadRequest, "Error parsing secret. %s", err) @@ -115,8 +116,8 @@ func PatchSecret(c *gin.Context) { handleDBError(c, err) return } - if in.Value != "" { - secret.Value = in.Value + if in.Value != nil && *in.Value != "" { + secret.Value = *in.Value } if in.Events != nil { secret.Events = in.Events @@ -124,6 +125,9 @@ func PatchSecret(c *gin.Context) { if in.Images != nil { secret.Images = in.Images } + if in.Note != nil { + secret.Note = *in.Note + } if err := secret.Validate(); err != nil { c.String(http.StatusUnprocessableEntity, "Error updating secret. %s", err) diff --git a/server/model/secret.go b/server/model/secret.go index e510f65b4..7ca81ac46 100644 --- a/server/model/secret.go +++ b/server/model/secret.go @@ -52,6 +52,7 @@ type Secret struct { Value string `json:"value,omitempty" xorm:"TEXT 'value'"` Images []string `json:"images" xorm:"json 'images'"` Events []WebhookEvent `json:"events" xorm:"json 'events'"` + Note string `json:"note" xorm:"note"` } // @name Secret // TableName return database table name for xorm. @@ -129,6 +130,7 @@ func (s *Secret) Copy() *Secret { Name: s.Name, Images: s.Images, Events: sortEvents(s.Events), + Note: s.Note, } } @@ -136,3 +138,11 @@ func sortEvents(wel WebhookEventList) WebhookEventList { sort.Sort(wel) return wel } + +type SecretPatch struct { + Name *string `json:"name" ` + Value *string `json:"value,omitempty" ` + Images []string `json:"images" ` + Events []WebhookEvent `json:"events" ` + Note *string `json:"note" ` +} // @name SecretPatch diff --git a/web/src/assets/locales/en.json b/web/src/assets/locales/en.json index 2426835d2..b46f815a3 100644 --- a/web/src/assets/locales/en.json +++ b/web/src/assets/locales/en.json @@ -465,6 +465,7 @@ "show": "Show secrets", "name": "Name", "value": "Value", + "note": "Note", "delete_confirm": "Do you really want to delete this secret?", "deleted": "Secret deleted", "created": "Secret created", diff --git a/web/src/components/secrets/SecretEdit.vue b/web/src/components/secrets/SecretEdit.vue index ee6c518bd..2716d1ebb 100644 --- a/web/src/components/secrets/SecretEdit.vue +++ b/web/src/components/secrets/SecretEdit.vue @@ -41,6 +41,10 @@ + + + +