diff --git a/build/lint-locale-usage/allowed-masked-usage.txt b/build/lint-locale-usage/allowed-masked-usage.txt index cfab25a5fd..ca899c7d38 100644 --- a/build/lint-locale-usage/allowed-masked-usage.txt +++ b/build/lint-locale-usage/allowed-masked-usage.txt @@ -6,13 +6,6 @@ translation_meta.test # this also gets instantiated as a Messenger once repo.migrate.migrating_failed.error -# models/asymkey/gpg_key_object_verification.go: $ObjectVerification.Reason -# unfortunately, it is non-trivial to parse all the occurences -gpg.error.extract_sign -gpg.error.failed_retrieval_gpg_keys -gpg.error.generate_hash -gpg.error.no_committer_account - # models/system/notice.go: func (n *Notice) TrStr() string admin.notices.type_1 admin.notices.type_2 diff --git a/build/lint-locale-usage/bin/handle-go.go b/build/lint-locale-usage/bin/handle-go.go index b1757fa0fc..ffa6b13165 100644 --- a/build/lint-locale-usage/bin/handle-go.go +++ b/build/lint-locale-usage/bin/handle-go.go @@ -15,6 +15,7 @@ import ( "strings" llu "forgejo.org/build/lint-locale-usage" + lluAsymKey "forgejo.org/models/asymkey/lint-locale-usage" lluUnit "forgejo.org/models/unit/lint-locale-usage" lluMigrate "forgejo.org/services/migrations/lint-locale-usage" ) @@ -71,6 +72,8 @@ func HandleGoFile(handler llu.Handler, fname string, src any) error { case *ast.CompositeLit: if strings.HasSuffix(fname, "models/unit/unit.go") { lluUnit.HandleCompositeUnit(handler, fset, n2) + } else if strings.Contains(fname, "models/asymkey/") { + lluAsymKey.HandleCompositeErrorReason(handler, fset, n2) } case *ast.FuncDecl: diff --git a/models/asymkey/lint-locale-usage/llu.go b/models/asymkey/lint-locale-usage/llu.go new file mode 100644 index 0000000000..256b5ca12b --- /dev/null +++ b/models/asymkey/lint-locale-usage/llu.go @@ -0,0 +1,33 @@ +// Copyright 2026 The Forgejo Authors. All rights reserved. +// SPDX-License-Identifier: MIT + +package lintLocaleUsage + +import ( + "go/ast" + "go/token" + + llu "forgejo.org/build/lint-locale-usage" +) + +// special case: models/asymkey/*.go, +// +// handle &ObjectVerification{...} +func HandleCompositeErrorReason(handler llu.Handler, fset *token.FileSet, n *ast.CompositeLit) { + ident, ok := n.Type.(*ast.Ident) + if !ok || ident.Name != "ObjectVerification" { + return + } + + // fields are normally named + for _, i := range n.Elts { + if kve, ok := i.(*ast.KeyValueExpr); ok { + ident, ok = kve.Key.(*ast.Ident) + if ok && ident.Name == "Reason" { + handler.HandleGoTrArgument(fset, kve.Value, "") + } + } else { + handler.OnWarning(fset, i.Pos(), "unable to parse ObjectVerification field assignment") + } + } +}