-
v0.6.29 Stable
released this
2026-07-28 14:58:40 +00:00 | 18 commits to trunk since this releaseFixed
- Never evict every team member when
spec.membersis omitted.
ForgejoTeam.spec.membersis+optionalwithomitempty, so a CR that leaves
the field out decodes toMembers == nil— a legal shape meaning "I am not
managing membership". The removal sweep treated that nil as an authoritative
empty desired set and calledRemoveTeamMemberfor every existing member,
silently evicting all users from the org team and revoking the repo access it
granted them. Nothing surfaced the damage: each removal logged as a success and
the CR still wentReady=True. A nilspec.membersnow skips the sweep
entirely; an explicitly-empty list ([]) is still a real assertion of "no
members" and removes everyone, so authoritative membership is unchanged for
every CR that actually sets the field.
Included changes (v0.6.28 -> v0.6.29)
68890d07b40ffix(team): omitted spec.members must not evict every team member
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads
- Never evict every team member when
-
v0.6.28 Stable
released this
2026-07-27 23:41:29 +00:00 | 20 commits to trunk since this releaseFixed
- Bound and redact
status.migrationFailureMessage. The field was assigned
the raw migrate error, and the shared harness's 512-byte truncation applies to
condition messages and Events, not to status fields a controller assigns
itself — so an arbitrarily large third-party error body landed verbatim on the
object. The gitea SDK renders the response body into that error, and Forgejo
is free to quote submitted fields back in its message, so the credentials the
migrate request carried are now redacted by exact value (we hold them at the
call site) before the message is truncated to 512 bytes. Ordinary errors pass
through unchanged; the field is a diagnostic first.
Fixed
- Never prune branches off a repository this resource did not import. The
branch-selection finalizer added in 0.6.26 ran whenever
status.importPhase != "Succeeded", which is also what a CR reads when it
ADOPTS a pre-existing populated repository (GetRepo200) or when its status
is lost to an etcd restore, a CR recreate, or a conflicted status write. In
those states it deleted every branch exceptspec.importSource.branchoff a
canonical repository. Because the GitMirror XRD defaultsbranchtomain,
every mirrored repository was affected: an adopting reconcile of
seanfarm-gitopswould have deleted the protectedtrunkintegration branch,
and one ofsean/linuxevery open feature branch. Branch selection is now
gated on a newstatus.importedByThisResource, set only where the operator
invokes Forgejo's migrate API, so adoption and status loss both settle as
Succeededwithout mutating the repository. The 0.6.26 steady-state test did
not catch this: it keptSucceededacross reconciles, so it never exercised
the two states that arm the pruner. - Never delete an empty repository this resource did not create. The
empty-repository retry deletes before re-migrating, and its 60-minute cooldown
cannot hold back a CR whose status was wiped — a zerolastMigrationAttempt
reads as "no attempt recorded", not "not ours", so the delete fired on the
first reconcile. It is now gated on the same ownership evidence; an empty
repository we did not import is reported not-ready and left alone.
Included changes (v0.6.27 -> v0.6.28)
6a06eb2e0aa3fix(repository): bound and redact status.migrationFailureMessage7046913985e3fix(repository): gate destructive import steps on ownership evidence
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
2 downloads
- Bound and redact
-
v0.6.27 Stable
released this
2026-07-24 09:50:29 +00:00 | 25 commits to trunk since this releaseTests
- Add a real Forgejo 16 cold-seed integration test that imports the public
Codeberg backup, proves Ready stays false until refs are verified, retains
only the selectedtrunkbranch, and confirms later Forgejo-native branches
survive steady-state reconciliation.
Included changes (v0.6.26 -> v0.6.27)
70dcc304459etest(repository): exercise real cold-seed lifecycle
Downloads
-
Source code (ZIP)
2 downloads
-
Source code (TAR.GZ)
1 download
- Add a real Forgejo 16 cold-seed integration test that imports the public
-
v0.6.26 Stable
released this
2026-07-24 07:50:01 +00:00 | 29 commits to trunk since this releaseFixed
- Keep repository imports
Runninguntil Forgejo reports written refs; when
importSource.branchis set, verify it, make it the default, and prune the
other one-shot imported branch refs before reporting Ready. Reject non-zero
depth, which Forgejo's migrate API cannot honor, instead of silently
promising a shallow import, and make the one-shotimportSourceimmutable
so post-seed edits cannot silently claim an action the controller will not run. - Upgrade reachable
x/crypto,x/net,x/text, and OpenTelemetry SDK
dependencies to patched releases.
Changed
- Clear the golangci-lint backlog and add focused repository-import contract
coverage for branch selection, missing branches, and truthful import status.
Included changes (v0.6.25 -> v0.6.26)
727d408a4046chore(quality): clear static analysis backloge92174d9349ffix(security): upgrade reachable vulnerable dependenciescfa2de5ee93afix(repository): enforce one-shot import contract
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Keep repository imports
-
v0.6.25 Stable
released this
2026-07-23 13:15:36 +00:00 | 35 commits to trunk since this releaseFixed
ForgejoPushMirrornow converges mutable interval/sync settings and rotated
remote credentials instead of treating any same-URL mirror as current. Because
Forgejo exposes no push-mirror edit endpoint, reconciliation creates the desired
replacement before pruning stale mirrors, preserving the off-cluster backup leg.
The controller also watchesspec.authSecretRef, so remote credential rotations
reconcile immediately rather than waiting for the periodic resync.
Changed
- Bump
libseanfarm-operatorv0.4.12 → v0.4.13 so best-effort progress and
failure conditions survive routine Kubernetes status-update conflicts.
Included changes (v0.6.24 -> v0.6.25)
aa71e915b4a2chore(deps): bump libseanfarm-operator to v0.4.130368fe93e3a5fix(pushmirror): converge configuration and credentials
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.6.24 Stable
released this
2026-07-21 09:47:33 +00:00 | 40 commits to trunk since this releaseChanged
- Incremental release.
Included changes (v0.6.23 -> v0.6.24)
b78767bb97ccchore: remove confirmed-dead code (dead-code hunt)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v0.6.23 Stable
released this
2026-07-17 13:15:56 +00:00 | 44 commits to trunk since this releaseAdded
- Forgejo 16 compatibility regression guard (
forgejo16_compat_test.go): asserts the
operator's auto-probing client clears its highest SDK version gate (tag protection,
≥1.23.0) against the Forgejo version-string formatX.Y.Z+gitea-A.B.C— verified live
as15.0.3+gitea-1.22.0. go-version reads the Forgejo product core (15/16/…) and ignores
the+gitea-build metadata, so a Forgejo major bump only moves the compared version up.
The test goes red if a future SDK bump raises a gate above the advertised core, or if
Forgejo drops the product core from its version string. No operator code change needed for
Forgejo 16.
Included changes (v0.6.22 -> v0.6.23)
2c953784de45test(forgejo16): guard operator clears SDK gates against Forgejo 16 version string
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Forgejo 16 compatibility regression guard (
-
v0.6.22 Stable
released this
2026-07-17 11:17:45 +00:00 | 48 commits to trunk since this releaseChanged
- Bump
libseanfarm-operatorv0.4.11 -> v0.4.12 (lib-autobump: rides the shared-library release train; the envtest release gate validates the suite against it on the next ship). - Adopt the lib's canonical
operator.mkscaffolding: vendor it and shrink the Makefile to project vars + repo-specific targets (build/docker/e2e/deploy) — the shared dev-loop targets and tool pins (manifests/generate/fmt/vet/test/lint*, Dependencies) now come from the include, re-synced by the lib-bump autoland on every lib release. - Migrate hand-rolled HTTP/secret helpers onto libseanfarm-operator v0.4.12:
hashSecret->reconcile.HashValue,getAuthTokenFromSecret-> thin wrapper overreconcile.SecretValue, and the endpoint-keyed gitea client cache +sharedTransport->httpkit.CredentialCache+httpkit.ClusterCATransport(same pooling tuning, extracted from this operator; CA trust inert on the plaintext in-cluster endpoint).
Included changes (v0.6.21 -> v0.6.22)
5fbc1c0f3a9bchore(scaffolding): adopt operator.mk + httpkit/secret helpers (lib v0.4.12)aac3ec29790cchore(deps): bump libseanfarm-operator v0.4.11 -> v0.4.12 (lib-autobump)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Bump
-
v0.6.21 Stable
released this
2026-07-16 16:19:20 +00:00 | 54 commits to trunk since this releaseAdded
- Operator metrics via libseanfarm reconcile.Metrics: reconcile counts/durations +
status-write outcomes per controller — first custom metrics for this operator
(forgejo_operator_reconcile_total,forgejo_operator_reconcile_duration_seconds,
forgejo_operator_status_update_total).
Changed
- Bump
libseanfarm-operatorv0.4.10 -> v0.4.11 (lib-autobump: rides the shared-library release train; the envtest release gate validates the suite against it on the next ship).
Included changes (v0.6.20 -> v0.6.21)
3af756e0aa6ffeat(metrics): enable libseanfarm reconcile.Metrics4fe32d0e1349chore(deps): bump libseanfarm-operator v0.4.10 -> v0.4.11 (lib-autobump)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Operator metrics via libseanfarm reconcile.Metrics: reconcile counts/durations +
-
v0.6.20 Stable
released this
2026-07-15 18:09:24 +00:00 | 60 commits to trunk since this releaseChanged
- Bump
libseanfarm-operatorv0.4.9 -> v0.4.10; envtest suite bootstrap now rides
reconcile/testkit.StartEnvtest(shared bring-up + binary discovery) instead of the
copy-pasted ~120-line suite scaffold.
Included changes (v0.6.19 -> v0.6.20)
4ecf252b4894chore(deps): bump libseanfarm-operator v0.4.9 -> v0.4.10 + suite onto reconcile/testkit
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Bump