• v0.6.29 bded36b969

    v0.6.29 Stable

    pipeline-bot released this 2026-07-28 14:58:40 +00:00 | 18 commits to trunk since this release

    Fixed

    • Never evict every team member when spec.members is omitted.
      ForgejoTeam.spec.members is +optional with omitempty, so a CR that leaves
      the field out decodes to Members == nil — a legal shape meaning "I am not
      managing membership". The removal sweep treated that nil as an authoritative
      empty desired set and called RemoveTeamMember for 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 went Ready=True. A nil spec.members now 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)

    • 68890d07b40f fix(team): omitted spec.members must not evict every team member
    Downloads
  • v0.6.28 396d6e79d5

    v0.6.28 Stable

    pipeline-bot released this 2026-07-27 23:41:29 +00:00 | 20 commits to trunk since this release

    Fixed

    • 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 (GetRepo 200) 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 except spec.importSource.branch off a
      canonical repository. Because the GitMirror XRD defaults branch to main,
      every mirrored repository was affected: an adopting reconcile of
      seanfarm-gitops would have deleted the protected trunk integration branch,
      and one of sean/linux every open feature branch. Branch selection is now
      gated on a new status.importedByThisResource, set only where the operator
      invokes Forgejo's migrate API, so adoption and status loss both settle as
      Succeeded without mutating the repository. The 0.6.26 steady-state test did
      not catch this: it kept Succeeded across 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 zero lastMigrationAttempt
      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)

    • 6a06eb2e0aa3 fix(repository): bound and redact status.migrationFailureMessage
    • 7046913985e3 fix(repository): gate destructive import steps on ownership evidence
    Downloads
  • v0.6.27 229a34dc44

    v0.6.27 Stable

    pipeline-bot released this 2026-07-24 09:50:29 +00:00 | 25 commits to trunk since this release

    Tests

    • 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 selected trunk branch, and confirms later Forgejo-native branches
      survive steady-state reconciliation.

    Included changes (v0.6.26 -> v0.6.27)

    • 70dcc304459e test(repository): exercise real cold-seed lifecycle
    Downloads
  • v0.6.26 ef5a14ea9a

    v0.6.26 Stable

    pipeline-bot released this 2026-07-24 07:50:01 +00:00 | 29 commits to trunk since this release

    Fixed

    • Keep repository imports Running until Forgejo reports written refs; when
      importSource.branch is 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-shot importSource immutable
      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)

    • 727d408a4046 chore(quality): clear static analysis backlog
    • e92174d9349f fix(security): upgrade reachable vulnerable dependencies
    • cfa2de5ee93a fix(repository): enforce one-shot import contract
    Downloads
  • v0.6.25 8f9257126a

    v0.6.25 Stable

    pipeline-bot released this 2026-07-23 13:15:36 +00:00 | 35 commits to trunk since this release

    Fixed

    • ForgejoPushMirror now 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 watches spec.authSecretRef, so remote credential rotations
      reconcile immediately rather than waiting for the periodic resync.

    Changed

    • Bump libseanfarm-operator v0.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)

    • aa71e915b4a2 chore(deps): bump libseanfarm-operator to v0.4.13
    • 0368fe93e3a5 fix(pushmirror): converge configuration and credentials
    Downloads
  • v0.6.24 9c7648107b

    v0.6.24 Stable

    pipeline-bot released this 2026-07-21 09:47:33 +00:00 | 40 commits to trunk since this release

    Changed

    • Incremental release.

    Included changes (v0.6.23 -> v0.6.24)

    • b78767bb97cc chore: remove confirmed-dead code (dead-code hunt)
    Downloads
  • v0.6.23 147c9464ef

    v0.6.23 Stable

    pipeline-bot released this 2026-07-17 13:15:56 +00:00 | 44 commits to trunk since this release

    Added

    • 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 format X.Y.Z+gitea-A.B.C — verified live
      as 15.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)

    • 2c953784de45 test(forgejo16): guard operator clears SDK gates against Forgejo 16 version string
    Downloads
  • v0.6.22 01e091b21a

    v0.6.22 Stable

    pipeline-bot released this 2026-07-17 11:17:45 +00:00 | 48 commits to trunk since this release

    Changed

    • Bump libseanfarm-operator v0.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.mk scaffolding: 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 over reconcile.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)

    • 5fbc1c0f3a9b chore(scaffolding): adopt operator.mk + httpkit/secret helpers (lib v0.4.12)
    • aac3ec29790c chore(deps): bump libseanfarm-operator v0.4.11 -> v0.4.12 (lib-autobump)
    Downloads
  • v0.6.21 3a25a131af

    v0.6.21 Stable

    pipeline-bot released this 2026-07-16 16:19:20 +00:00 | 54 commits to trunk since this release

    Added

    • 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-operator v0.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)

    • 3af756e0aa6f feat(metrics): enable libseanfarm reconcile.Metrics
    • 4fe32d0e1349 chore(deps): bump libseanfarm-operator v0.4.10 -> v0.4.11 (lib-autobump)
    Downloads
  • v0.6.20 ace66ef5be

    v0.6.20 Stable

    pipeline-bot released this 2026-07-15 18:09:24 +00:00 | 60 commits to trunk since this release

    Changed

    • Bump libseanfarm-operator v0.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)

    • 4ecf252b4894 chore(deps): bump libseanfarm-operator v0.4.9 -> v0.4.10 + suite onto reconcile/testkit
    Downloads