feat(build): improve lint-locale-usage further #8736

Merged
Gusted merged 16 commits from fogti/llu-unused into forgejo 2025-08-27 23:47:39 +02:00 AGit
Member
No description provided.
fogti force-pushed fogti/llu-unused from 99f49f7836
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m57s
testing / backend-checks (pull_request) Failing after 3m24s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 5m25s
to ec67cce73c
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 4m53s
2025-07-31 14:49:51 +02:00
Compare
fogti force-pushed fogti/llu-unused from ec67cce73c
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 4m53s
to f95da43c9b
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m17s
testing / backend-checks (pull_request) Successful in 3m23s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m36s
testing / test-unit (pull_request) Successful in 7m28s
testing / test-remote-cacher (redis) (pull_request) Successful in 1m55s
testing / test-remote-cacher (valkey) (pull_request) Successful in 1m55s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m1s
testing / test-remote-cacher (redict) (pull_request) Successful in 1m59s
testing / test-e2e (pull_request) Successful in 20m55s
testing / test-mysql (pull_request) Successful in 22m11s
testing / test-sqlite (pull_request) Successful in 25m33s
testing / test-pgsql (pull_request) Successful in 29m46s
testing / security-check (pull_request) Successful in 1m36s
2025-07-31 15:00:00 +02:00
Compare
Author
Member

okay, this still needs a test label. it's overall done tho.

okay, this still needs a test label. it's overall done tho.
Author
Member

List of changes:

  • also print out list of all unused msgids
  • handle models/unit/unit.go, which stores msgids in $Unit.NameKey
  • handle .locale.Tr in templates
  • handle simple dynamically constructed Tr("msgid-prefix." + SomeFunctionCall()) things

(the first was actually necessary in order to find more structures which I overlooked)

List of changes: * also print out list of all unused msgids * handle `models/unit/unit.go`, which stores msgids in `$Unit.NameKey` * handle `.locale.Tr` in templates * handle simple dynamically constructed `Tr("msgid-prefix." + SomeFunctionCall())` things (the first was actually necessary in order to find more structures which I overlooked)
Author
Member

What's the purpose of $Unit.DescKey? Like, it appears to be a msgid, but I can't find any usage sites.

In 8760af752a, there existed a usage site, but it vanished sometime...

What's the purpose of `$Unit.DescKey`? Like, it appears to be a msgid, but I can't find any usage sites. In 8760af752ab, there existed a usage site, but it vanished sometime...
fogti changed title from feat(build): lint-locale-usage should handle .locale.Tr and Unit{...} to WIP: feat(build): improve lint-locale-usage further 2025-07-31 23:08:11 +02:00
Author
Member

This is now basically done, but it needs to be very thoroughly checked, in particular, all changes in /options (locale files) need to be thoroughly audited to ensure that we don't throw away any necessary translation strings.

This is now basically done, *but* it needs to be very thoroughly checked, in particular, all changes in `/options` (locale files) need to be thoroughly audited to ensure that we don't throw away any necessary translation strings.
fogti requested review from 0ko 2025-08-01 02:25:14 +02:00
@ -0,0 +51,4 @@
repo.issues.ref_pull_from
repo.issues.ref_reopening_from
# templates/repo/issue/view_content/comments.tmpl: ctx.Locale.Tr (printf "projects.type-%d.display_name" .OldProject.Type)
Author
Member

tbh, such dynamic msgid constructions are a pretty bad idea (both because they're basically impossible to lint, and hard to understand what exactly they mean)

tbh, such dynamic msgid constructions are a pretty bad idea (both because they're basically impossible to lint, and hard to understand what exactly they mean)
fogti marked this conversation as resolved
Author
Member

This is intertwined enough that I think it makes sense to squash this...

This is intertwined enough that I think it makes sense to squash this...
fogti force-pushed fogti/llu-unused from 0844216eb2
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 52s
testing / backend-checks (pull_request) Successful in 3m3s
Integration tests for the release process / release-simulation (pull_request) Successful in 5m36s
testing / test-unit (pull_request) Successful in 6m20s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m27s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m26s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m26s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m29s
testing / test-e2e (pull_request) Successful in 21m56s
testing / test-mysql (pull_request) Successful in 23m21s
testing / test-sqlite (pull_request) Successful in 29m9s
testing / test-pgsql (pull_request) Successful in 33m44s
testing / security-check (pull_request) Successful in 1m44s
to 0cfc8a77c1
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m28s
testing / backend-checks (pull_request) Successful in 4m2s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m51s
testing / test-unit (pull_request) Successful in 7m5s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m21s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m2s
testing / test-remote-cacher (garnet) (pull_request) Successful in 1m59s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m10s
testing / test-e2e (pull_request) Successful in 22m55s
testing / test-mysql (pull_request) Successful in 24m1s
testing / test-sqlite (pull_request) Successful in 28m15s
testing / test-pgsql (pull_request) Successful in 32m6s
testing / security-check (pull_request) Successful in 1m0s
2025-08-01 10:43:52 +02:00
Compare
fogti changed title from WIP: feat(build): improve lint-locale-usage further to feat(build): improve lint-locale-usage further 2025-08-01 12:18:59 +02:00
fogti requested review from Gusted 2025-08-01 12:19:02 +02:00
fogti force-pushed fogti/llu-unused from 0ce5c0e8f2
Some checks failed
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m20s
testing / backend-checks (pull_request) Failing after 1m59s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
requirements / merge-conditions (pull_request) Failing after 2s
Integration tests for the release process / release-simulation (pull_request) Successful in 4m59s
to cbc2ac36ea
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m10s
testing / backend-checks (pull_request) Successful in 3m13s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m1s
testing / test-unit (pull_request) Successful in 6m15s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m7s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m7s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m7s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m7s
testing / test-e2e (pull_request) Successful in 17m1s
testing / test-mysql (pull_request) Successful in 18m26s
testing / test-sqlite (pull_request) Successful in 22m48s
testing / test-pgsql (pull_request) Successful in 26m3s
testing / security-check (pull_request) Successful in 50s
2025-08-01 12:21:49 +02:00
Compare
@ -93,7 +93,6 @@
"moderation.reporting_failed": "Unable to submit the new abuse report: %v",
"moderation.reported_thank_you": "Thank you for your report. The administration has been made aware of it.",
"mail.actions.successful_run_after_failure_subject": "Workflow %[1]s recovered in repository %[2]s",
"mail.actions.not_successful_run_subject": "Workflow %[1]s failed in repository %[2]s",
Owner

I think this should have been used in the following code

subject = locale.TrString("mail.actions.not_successful_run", run.Title, run.Repo.FullName())

CC @christopher-besch

I think this should have been used in the following code https://codeberg.org/forgejo/forgejo/src/commit/648a75e687445f441e7233b51a505706e083b1e1/services/mailer/mail_actions.go#L56 CC @christopher-besch
fogti marked this conversation as resolved
Owner
WIP https://pad.gusted.xyz/s/YbAZQyU7W
Author
Member

@Gusted Thank you!

@Gusted Thank you!
fogti force-pushed fogti/llu-unused from cbc2ac36ea
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m10s
testing / backend-checks (pull_request) Successful in 3m13s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m1s
testing / test-unit (pull_request) Successful in 6m15s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m7s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m7s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m7s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m7s
testing / test-e2e (pull_request) Successful in 17m1s
testing / test-mysql (pull_request) Successful in 18m26s
testing / test-sqlite (pull_request) Successful in 22m48s
testing / test-pgsql (pull_request) Successful in 26m3s
testing / security-check (pull_request) Successful in 50s
to 2d01911207
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
testing / frontend-checks (pull_request) Successful in 1m41s
issue-labels / release-notes (pull_request_target) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 6m23s
testing / backend-checks (pull_request) Successful in 4m38s
testing / test-unit (pull_request) Successful in 8m5s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m8s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m10s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m10s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m10s
testing / test-e2e (pull_request) Failing after 11m52s
testing / test-mysql (pull_request) Successful in 22m30s
testing / test-sqlite (pull_request) Successful in 26m54s
testing / test-pgsql (pull_request) Successful in 29m54s
testing / security-check (pull_request) Successful in 57s
2025-08-03 13:52:21 +02:00
Compare
@ -54,3 +54,3 @@
subject = locale.TrString("mail.actions.successful_run_after_failure_subject", run.Title, run.Repo.FullName())
} else {
subject = locale.TrString("mail.actions.not_successful_run", run.Title, run.Repo.FullName())
subject = locale.TrString("mail.actions.not_successful_run_subject", run.Title, run.Repo.FullName())
Author
Member

Mistake introduced in 386e7f8208

cc @christopher-besch

Mistake introduced in https://codeberg.org/forgejo/forgejo/commit/386e7f82086454a2fc18bf4ff667560a5dd3c981 cc @christopher-besch
fogti force-pushed fogti/llu-unused from 2d01911207
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
testing / frontend-checks (pull_request) Successful in 1m41s
issue-labels / release-notes (pull_request_target) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 6m23s
testing / backend-checks (pull_request) Successful in 4m38s
testing / test-unit (pull_request) Successful in 8m5s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m8s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m10s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m10s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m10s
testing / test-e2e (pull_request) Failing after 11m52s
testing / test-mysql (pull_request) Successful in 22m30s
testing / test-sqlite (pull_request) Successful in 26m54s
testing / test-pgsql (pull_request) Successful in 29m54s
testing / security-check (pull_request) Successful in 57s
to 68159a247c
Some checks failed
requirements / merge-conditions (pull_request) Failing after 4s
testing / frontend-checks (pull_request) Successful in 1m31s
testing / backend-checks (pull_request) Successful in 5m30s
issue-labels / release-notes (pull_request_target) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 7m27s
testing / test-unit (pull_request) Successful in 6m38s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m4s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m3s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m3s
testing / test-remote-cacher (redict) (pull_request) Successful in 1m43s
testing / test-e2e (pull_request) Successful in 18m14s
testing / test-mysql (pull_request) Successful in 19m36s
testing / test-sqlite (pull_request) Successful in 23m0s
testing / test-pgsql (pull_request) Successful in 27m8s
testing / security-check (pull_request) Successful in 57s
2025-08-03 14:03:49 +02:00
Compare
Author
Member

I think I should put my own INI-parser into this in order to get location information for lines, to then pass those lines to git blame -L to find out where it came from, semi-automatically...

I think the best way to do that would be to fork https://pkg.go.dev/gopkg.in/ini.v1 to add location tracking.

I think I should put my own INI-parser into this in order to get location information for lines, to then pass those lines to `git blame -L` to find out where it came from, semi-automatically... I think the best way to do that would be to fork https://pkg.go.dev/gopkg.in/ini.v1 to add location tracking.
@ -0,0 +58,4 @@
# modules/migration/messenger.go: invocations of Messenger
# services/migrations/migrate.go: messenger(...)
# *: repo.migrate.*.description (unknown where they come from)
repo.migrate.
Author
Member

I couldn't really determine where they come from, the migration code is pretty convoluted in regards to msgid construction.

I couldn't really determine where they come from, the migration code is pretty convoluted in regards to msgid construction.
fogti marked this conversation as resolved
@ -0,0 +19,4 @@
arg, err := strconv.Unquote(argLit.Value)
if err == nil {
// found interesting strings
if strings.HasSuffix(arg, ".") || strings.HasSuffix(arg, "_") {
Author
Member

TODO: if ending in a _, remove the last component.

TODO: if ending in a `_`, remove the last component.
fogti marked this conversation as resolved
fogti force-pushed fogti/llu-unused from 7cac681aa2
Some checks failed
requirements / merge-conditions (pull_request) Failing after 4s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m32s
testing / backend-checks (pull_request) Failing after 1m59s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 5m49s
to 875c343f5e
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m12s
testing / backend-checks (pull_request) Successful in 3m33s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m27s
testing / test-unit (pull_request) Successful in 6m44s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m17s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m17s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m17s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m14s
testing / test-e2e (pull_request) Successful in 19m20s
testing / test-mysql (pull_request) Successful in 19m19s
testing / test-sqlite (pull_request) Successful in 23m43s
testing / test-pgsql (pull_request) Successful in 26m57s
testing / security-check (pull_request) Successful in 53s
2025-08-04 00:48:48 +02:00
Compare
Author
Member

In the last commit, I renamed repo.tree_path_not_found_ to repo.tree_path_not_found..

I think the same should be done for repo.settings.web_hook_name_. (I haven't done that yet because it would be way more disruptive due to affecting more translation strings)

In the last commit, I renamed `repo.tree_path_not_found_` to `repo.tree_path_not_found.`. I think the same should be done for `repo.settings.web_hook_name_`. (I haven't done that yet because it would be way more disruptive due to affecting more translation strings)
@ -0,0 +96,4 @@
# modules/migration/messenger.go: invocations of Messenger
# services/migrations/migrate.go: messenger(...)
# *: repo.migrate.*.description (unknown where they come from)
Owner

Could you elaborate on your comment here?

Could you elaborate on your comment here?
Author
Member

there are many entries repo.migrate.$VENDOR.description, and I have no exact idea where those message ids get used in the source code.

there are many entries `repo.migrate.$VENDOR.description`, and I have no exact idea where those message ids get used in the source code.
Author
Member

Removing that line yields:

templates/repo/migrate/migrate.tmpl:19:31:	missing msgid prefix: repo.migrate
=== unused msgids (16): ===
- repo.migrate.codebase.description
- repo.migrate.forgejo.description
- repo.migrate.git.description
- repo.migrate.gitbucket.description
- repo.migrate.gitea.description
- repo.migrate.github.description
- repo.migrate.gitlab.description
- repo.migrate.gogs.description
- repo.migrate.migrating_git
- repo.migrate.migrating_issues
- repo.migrate.migrating_labels
- repo.migrate.migrating_milestones
- repo.migrate.migrating_pulls
- repo.migrate.migrating_releases
- repo.migrate.migrating_topics
- repo.migrate.onedev.description
Removing that line yields: ``` templates/repo/migrate/migrate.tmpl:19:31: missing msgid prefix: repo.migrate === unused msgids (16): === - repo.migrate.codebase.description - repo.migrate.forgejo.description - repo.migrate.git.description - repo.migrate.gitbucket.description - repo.migrate.gitea.description - repo.migrate.github.description - repo.migrate.gitlab.description - repo.migrate.gogs.description - repo.migrate.migrating_git - repo.migrate.migrating_issues - repo.migrate.migrating_labels - repo.migrate.migrating_milestones - repo.migrate.migrating_pulls - repo.migrate.migrating_releases - repo.migrate.migrating_topics - repo.migrate.onedev.description ```
Owner

{{ctx.Locale.Tr (printf "repo.migrate.%s.description" .Name)}}

https://codeberg.org/forgejo/forgejo/src/commit/4eac7adcc994ebffa96659f503dcee2c1d13bf07/templates/repo/migrate/migrate.tmpl#L19
fogti marked this conversation as resolved
@ -125,3 +72,1 @@
if gotUnexpectedInvoke != nil {
handler.OnUnexpectedInvoke(fset, funSel.Sel.NamePos, funSel.Sel.Name, *gotUnexpectedInvoke)
}
type StringTrieMap map[string]StringTrie
Owner

It's up to you if you want to incorporate this hack, but technically the standard library offers a trie and we already use this in

Lines 133 to 186 in 72bac98
Preview has been truncated
type rememberSecondWriteWriter struct {
pos int
idx int
end int
writecount int
}
func (n *rememberSecondWriteWriter) Write(p []byte) (int, error) {
n.writecount++
if n.writecount == 2 {
n.idx = n.pos
n.end = n.pos + len(p)
n.pos += len(p)
return len(p), io.EOF
}
n.pos += len(p)
return len(p), nil
}
func (n *rememberSecondWriteWriter) WriteString(s string) (int, error) {
n.writecount++
if n.writecount == 2 {
n.idx = n.pos
n.end = n.pos + len(s)
n.pos += len(s)
return len(s), io.EOF
}
n.pos += len(s)
return len(s), nil
}
// FindEmojiSubmatchIndex returns index pair of longest emoji in a string
func FindEmojiSubmatchIndex(s string) []int {
loadMap()
secondWriteWriter := rememberSecondWriteWriter{}
// A faster and clean implementation would copy the trie tree formation in strings.NewReplacer but
// we can be lazy here.
//
// The implementation of strings.Replacer.WriteString is such that the first index of the emoji
// submatch is simply the second thing that is written to WriteString in the writer.
//
// Therefore we can simply take the index of the second write as our first emoji
//
// FIXME: just copy the trie implementation from strings.NewReplacer
_, _ = emptyReplacer.WriteString(&secondWriteWriter, s)
// if we wrote less than twice then we never "replaced"
if secondWriteWriter.writecount < 2 {
return nil

It's up to you if you want to incorporate this hack, but technically the standard library offers a trie and we already use this in https://codeberg.org/forgejo/forgejo/src/commit/72bac983657c561b0318d908ecbaae3959d7a81e/modules/emoji/emoji.go#L133-L186
Author
Member

Albeit there is an implementation of a trie in the standard library (strings). But as already noted in the source code snippet given above, it doesn't appear to be independently usable (especially because we strictly need to match the start of the string).

Albeit there is an implementation of a trie in the standard library (`strings`). But as already noted in the source code snippet given above, it doesn't appear to be independently usable (especially because we strictly need to match the start of the string).
Gusted marked this conversation as resolved
@ -334,17 +231,59 @@ func main() {
gotAnyMsgidError := false
for _, arg := range os.Args[1:] {
Owner

What do you think about using flag for this?

What do you think about using [`flag`](https://pkg.go.dev/flag) for this?
Author
Member

Probably a good idea, I'll try.

Probably a good idea, I'll try.
fogti marked this conversation as resolved
fogti force-pushed fogti/llu-unused from 425a6e496d
Some checks failed
requirements / merge-conditions (pull_request) Failing after 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 56s
testing / backend-checks (pull_request) Successful in 2m52s
Integration tests for the release process / release-simulation (pull_request) Successful in 5m32s
testing / test-unit (pull_request) Successful in 5m29s
testing / test-remote-cacher (redis) (pull_request) Successful in 1m55s
testing / test-remote-cacher (valkey) (pull_request) Successful in 1m53s
testing / test-remote-cacher (garnet) (pull_request) Successful in 1m53s
testing / test-remote-cacher (redict) (pull_request) Successful in 1m54s
testing / test-e2e (pull_request) Successful in 15m44s
testing / test-mysql (pull_request) Successful in 17m8s
testing / test-sqlite (pull_request) Successful in 21m43s
testing / test-pgsql (pull_request) Successful in 24m56s
testing / security-check (pull_request) Successful in 49s
to 0c18f6a8ed
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m8s
testing / backend-checks (pull_request) Successful in 2m46s
Integration tests for the release process / release-simulation (pull_request) Successful in 5m48s
testing / test-unit (pull_request) Successful in 5m44s
testing / test-remote-cacher (redis) (pull_request) Successful in 1m51s
testing / test-remote-cacher (valkey) (pull_request) Successful in 1m50s
testing / test-remote-cacher (garnet) (pull_request) Successful in 1m51s
testing / test-remote-cacher (redict) (pull_request) Successful in 1m52s
testing / test-e2e (pull_request) Successful in 15m26s
testing / test-mysql (pull_request) Successful in 17m18s
testing / test-sqlite (pull_request) Successful in 22m21s
testing / test-pgsql (pull_request) Failing after 25m29s
testing / security-check (pull_request) Has been skipped
2025-08-08 18:26:09 +02:00
Compare
Author
Member

No clue why the frontend-check fails when trying to sleep enough.

No clue why the frontend-check fails when trying to sleep enough.
Owner

Seen that CI failure a few times before.. you can ignore it.

Seen that CI failure a few times before.. you can ignore it.
Owner

Hiya, it took a bit of time but all removed translations are now checked (and recorded in the shared pad) and there's no false positives. I will try to review the Go code later this week (feel free to ping me next week if I forget).

Hiya, it took a bit of time but all removed translations are now checked (and recorded in the shared pad) and there's no false positives. I will try to review the Go code later this week (feel free to ping me next week if I forget).
Author
Member

@Gusted ping

@Gusted ping
fogti force-pushed fogti/llu-unused from 4c9142eea5
Some checks failed
requirements / merge-conditions (pull_request) Failing after 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Failing after 33s
testing / backend-checks (pull_request) Successful in 3m16s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Successful in 5m21s
to bed330fcb2
Some checks failed
testing / frontend-checks (pull_request) Successful in 59s
testing / backend-checks (pull_request) Failing after 2m9s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Failing after 19m15s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / backporting (pull_request_target) Has been skipped
issue-labels / cascade (pull_request_target) Has been skipped
issue-labels / release-notes (pull_request_target) Has been skipped
2025-08-19 16:35:00 +02:00
Compare
Gusted left a comment
Owner

I am not able to spot anything incorrect with the correctness of the code, so I'm mainly focusing on the readability of the code. As this is a linter, that deserves some extra attention.

I am not able to spot anything incorrect with the correctness of the code, so I'm mainly focusing on the readability of the code. As this is a linter, that deserves some extra attention.
@ -0,0 +61,4 @@
matches := false
matchInsPrefix := ""
var multimatches *token.Pos
if cg == nil {
Owner

This can be done as first check.

This can be done as first check.
fogti marked this conversation as resolved
@ -0,0 +72,4 @@
multimatches = &comment.Slash
}
matches = true
} else if after, found := strings.CutPrefix(ctxt, commentPrefix+"Suffix "); found {
Owner

Good use on strings.CutPrefix :)

Good use on `strings.CutPrefix` :)
fogti marked this conversation as resolved
@ -0,0 +73,4 @@
}
matches = true
} else if after, found := strings.CutPrefix(ctxt, commentPrefix+"Suffix "); found {
if matches {
Owner

It's good, but feels like it can be simplified:

var matches []token.Pos
[...]
matches = append(matches, comment.Slash)
[...]
if len(matches) > 1 {
	handler.OnWarning([...])
}
It's good, but feels like it can be simplified: ```go var matches []token.Pos [...] matches = append(matches, comment.Slash) [...] if len(matches) > 1 { handler.OnWarning([...]) } ````
fogti marked this conversation as resolved
@ -0,0 +112,4 @@
ast.Inspect(node, func(n ast.Node) bool {
// search for function calls of the form `anything.Tr(any-string-lit, ...)`
if call, ok := n.(*ast.CallExpr); ok && len(call.Args) >= 1 {
Owner

The if else calls don't make it really easy to read what's going on, I think it would make sense to do switch on type.

switch n := n.(type) {
case *ast.CallExpr:
	if len(n.Args) == 0 {
		return true
	}
case *ast.CompositeLit:
case *ast.FuncDecl:
[...]
}

Inferring types in Go never makes for good looking code.

The if else calls don't make it really easy to read what's going on, I think it would make sense to do switch on type. ```go switch n := n.(type) { case *ast.CallExpr: if len(n.Args) == 0 { return true } case *ast.CompositeLit: case *ast.FuncDecl: [...] } ``` Inferring types in Go never makes for good looking code.
fogti marked this conversation as resolved
@ -0,0 +123,4 @@
return true
}
var gotUnexpectedInvoke *int
Owner

Do you think the optional module could be used instead of a pointer?

Do you think the [`optional`](https://codeberg.org/forgejo/forgejo/src/branch/forgejo/modules/optional/option.go) module could be used instead of a pointer?
Author
Member

it could be, but I didn't want to pull in another module for something so trivial (and pretty common in Go code as well)

it could be, but I didn't want to pull in another module for something so trivial (and pretty common in Go code as well)
Author
Member

actually, I'm surprised that optional implements that feature via a slice instead of just a pointer (one needs nil checks anyways, what's the point?).

actually, I'm surprised that `optional` implements that feature via a slice instead of just a pointer (one needs `nil` checks anyways, what's the point?).
Owner

Likely because of some early generics limitations.

Likely because of some early generics limitations.
Gusted marked this conversation as resolved
@ -0,0 +126,4 @@
var gotUnexpectedInvoke *int
for _, argNum := range ltf {
if len(call.Args) < int(argNum+1) {
Owner

len(call.Args) <= int(argNum)? Not sure if this should be modified as I expect such condition to not include the equal case and rather be len(call.Args) < int(argNum).

`len(call.Args) <= int(argNum)`? Not sure if this should be modified as I expect such condition to not include the equal case and rather be `len(call.Args) < int(argNum)`.
Author
Member

note that call.Args[int(argNum)] is used below, and argNum == 0 holds e.g. for .Tr

note that `call.Args[int(argNum)]` is used below, and `argNum == 0` holds e.g. for `.Tr`
Gusted marked this conversation as resolved
@ -0,0 +144,4 @@
}
// special case: models/unit/unit.go
if strings.HasSuffix(fname, "unit.go") && ident.Name == "Unit" && len(composite.Elts) == 6 {
Owner

len(composite.Elts) == 6 could change in the future and this check wouldn't throw a warning about it, I think it should give a warning or otherwise error.

`len(composite.Elts) == 6` could change in the future and this check wouldn't throw a warning about it, I think it should give a warning or otherwise error.
fogti marked this conversation as resolved
@ -0,0 +173,4 @@
ast.Inspect(function.Body, func(n ast.Node) bool {
// search for return stmts
// TODO: what about nested functions?
Owner

This specifically targets functions with llu:returnsTrKey right? I think you can say that this is disallowed and if there in the future a need arise it can be reevaluated.

This specifically targets functions with `llu:returnsTrKey` right? I think you can say that this is disallowed and if there in the future a need arise it can be reevaluated.
Author
Member

I did add a note about this to the usage/help text.

I did add a note about this to the usage/help text.
Gusted marked this conversation as resolved
@ -127,2 +73,3 @@
}
type StringTrieMap map[string]StringTrie
func (m *StringTrieMap) Matches(key []string) bool {
Owner

Similar to the other comment, I think you can drop the pointer as maps are already reference types in Go.

Similar to the other comment, I think you can drop the pointer as maps are already reference types in Go.
fogti marked this conversation as resolved
@ -257,3 +114,1 @@
tmpl := template.New(fname)
tmpl.Funcs(fjTemplates.NewFuncMap())
tmplParsed, err := tmpl.Parse(tmplContent2)
func ParseAllowedMaskedUsages(fname string, usedMsgids *container.Set[string], allowedMaskedPrefixes *StringTrieMap, chkMsgid func(msgid string) bool) error {
Owner

Maps are pass-by-reference, there's no need to pass pointers around to maps to my understanding. I think this also could slightly simplify the code as you don't have to dereference them.

Maps are pass-by-reference, there's no need to pass pointers around to maps to my understanding. I think this also could slightly simplify the code as you don't have to dereference them.
fogti marked this conversation as resolved
@ -264,0 +140,4 @@
Err: errors.New(line),
}
}
(*usedMsgids)[line] = struct{}{}
Owner

usedMsgids.Add(line) (once the map is no longer a pointer).

`usedMsgids.Add(line)` (once the map is no longer a pointer).
fogti marked this conversation as resolved
@ -340,2 +304,4 @@
gotAnyMsgidError = true
fmt.Printf("%s:\tmissing msgid: %s\n", fset.Position(pos).String(), msgid)
} else {
usedMsgids[msgid] = struct{}{}
Owner

I see this is already done further up in this function, but it's nicer to do it via usedMsgids.Add(msgid) to avoid the struct{}{} hack.

I see this is already done further up in this function, but it's nicer to do it via `usedMsgids.Add(msgid)` to avoid the `struct{}{}` hack.
fogti marked this conversation as resolved
fogti force-pushed fogti/llu-unused from bed330fcb2
Some checks failed
testing / frontend-checks (pull_request) Successful in 59s
testing / backend-checks (pull_request) Failing after 2m9s
testing / test-unit (pull_request) Has been skipped
testing / test-e2e (pull_request) Has been skipped
testing / test-mysql (pull_request) Has been skipped
testing / test-pgsql (pull_request) Has been skipped
testing / test-sqlite (pull_request) Has been skipped
testing / test-remote-cacher (redis) (pull_request) Has been skipped
testing / test-remote-cacher (valkey) (pull_request) Has been skipped
testing / test-remote-cacher (garnet) (pull_request) Has been skipped
testing / test-remote-cacher (redict) (pull_request) Has been skipped
testing / security-check (pull_request) Has been skipped
Integration tests for the release process / release-simulation (pull_request) Failing after 19m15s
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / backporting (pull_request_target) Has been skipped
issue-labels / cascade (pull_request_target) Has been skipped
issue-labels / release-notes (pull_request_target) Has been skipped
to 9449f9f84c
All checks were successful
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 59s
testing / backend-checks (pull_request) Successful in 3m31s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m26s
testing / test-unit (pull_request) Successful in 6m33s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m39s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m44s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m44s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m48s
testing / test-e2e (pull_request) Successful in 19m13s
testing / test-mysql (pull_request) Successful in 20m29s
testing / test-sqlite (pull_request) Successful in 28m41s
testing / test-pgsql (pull_request) Successful in 34m50s
testing / security-check (pull_request) Successful in 1m49s
2025-08-27 00:01:02 +02:00
Compare
fix(build): Fix simple code smells in lint-locale-usage
Some checks failed
requirements / merge-conditions (pull_request) Successful in 1s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m18s
testing / backend-checks (pull_request) Successful in 3m57s
Integration tests for the release process / release-simulation (pull_request) Successful in 6m50s
testing / test-unit (pull_request) Successful in 8m15s
testing / test-remote-cacher (redis) (pull_request) Successful in 3m20s
testing / test-remote-cacher (valkey) (pull_request) Successful in 3m20s
testing / test-remote-cacher (garnet) (pull_request) Successful in 3m23s
testing / test-remote-cacher (redict) (pull_request) Successful in 3m21s
testing / test-e2e (pull_request) Failing after 15m55s
testing / test-mysql (pull_request) Successful in 28m59s
testing / test-sqlite (pull_request) Successful in 33m42s
testing / test-pgsql (pull_request) Successful in 40m19s
testing / security-check (pull_request) Successful in 1m46s
b945d6af5a
chore(build): use switch statement instead of if chain for type switch in lint-locale-usage
All checks were successful
requirements / merge-conditions (pull_request) Successful in 2s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 1m47s
testing / backend-checks (pull_request) Successful in 6m35s
Integration tests for the release process / release-simulation (pull_request) Successful in 7m47s
testing / test-unit (pull_request) Successful in 9m11s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m18s
testing / test-e2e (pull_request) Successful in 25m7s
testing / test-mysql (pull_request) Successful in 26m40s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m28s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m29s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m40s
testing / test-sqlite (pull_request) Successful in 31m14s
testing / test-pgsql (pull_request) Successful in 34m47s
testing / security-check (pull_request) Successful in 1m8s
0078709e4b
fix(build): lint-locale-usage should handle unexpected argument count for 'Unit'
Some checks failed
requirements / merge-conditions (pull_request) Successful in 3s
issue-labels / release-notes (pull_request_target) Has been skipped
testing / frontend-checks (pull_request) Successful in 2m17s
Integration tests for the release process / release-simulation (pull_request) Successful in 8m10s
testing / backend-checks (pull_request) Successful in 6m59s
testing / test-unit (pull_request) Successful in 7m26s
testing / test-remote-cacher (redis) (pull_request) Successful in 2m38s
testing / test-remote-cacher (valkey) (pull_request) Successful in 2m43s
testing / test-e2e (pull_request) Failing after 24m18s
testing / test-remote-cacher (garnet) (pull_request) Successful in 2m36s
testing / test-remote-cacher (redict) (pull_request) Successful in 2m24s
testing / test-mysql (pull_request) Successful in 24m20s
testing / test-sqlite (pull_request) Successful in 25m36s
testing / test-pgsql (pull_request) Successful in 29m49s
testing / security-check (pull_request) Successful in 1m2s
issue-labels / backporting (pull_request_target) Has been skipped
milestone / set (pull_request_target) Successful in 4s
00aa614cd7
Author
Member

I think the current state is good enough.

I think the current state is good enough.
Gusted approved these changes 2025-08-27 22:54:04 +02:00
Gusted left a comment
Owner

Thank you!

Thank you!
Gusted merged commit f447661345 into forgejo 2025-08-27 23:47:39 +02:00
Member

great work, @fogti! 🎊

great work, @fogti! 🎊
Member

When running make test-sqlite, I notice quite some error messages which seem to be linked to the translation keys removed by this PR:

=== TestCodeOwner/Forked_repository (tests/integration/codeowner_test.go:83)
testlogger.go:recordError() FATAL ERROR: log.Error has been called: // TestCodeOwner/Forked_repository
	"2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact\"",
// TestCodeOwner/Forked_repository
	"2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact_tooltip\"",
// TestCodeOwner/Forked_repository
	"2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact\"",
// TestCodeOwner/Forked_repository
	"2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.union_tooltip\"",
// TestCodeOwner/Forked_repository
	"2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.union\"",

I imagine those are due to the leftover translation keys in languages other than English? It doesn't look like Weblate is taking care of removing those automatically, is it? #9013

Those errors do not seem to make the overall test process fail, but I would still find it more convenient if they could go away, as they make it harder to look for actual errors.

When running `make test-sqlite`, I notice quite some error messages which seem to be linked to the translation keys removed by this PR: ``` === TestCodeOwner/Forked_repository (tests/integration/codeowner_test.go:83) testlogger.go:recordError() FATAL ERROR: log.Error has been called: // TestCodeOwner/Forked_repository "2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact\"", // TestCodeOwner/Forked_repository "2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact_tooltip\"", // TestCodeOwner/Forked_repository "2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.exact\"", // TestCodeOwner/Forked_repository "2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.union_tooltip\"", // TestCodeOwner/Forked_repository "2025/08/28 11:07:15 .../i18n/localestore.go:233:TrString() [E] Missing translation \"search.union\"", ``` I imagine those are due to the leftover translation keys in languages other than English? It doesn't look like Weblate is taking care of removing those automatically, is it? https://codeberg.org/forgejo/forgejo/pulls/9013 Those errors do not seem to make the overall test process fail, but I would still find it more convenient if they could go away, as they make it harder to look for actual errors.
Contributor

They are displayed for analysis because logs are not supposed to display errors during test runs but they do no fail tests. They can either be fixed, silenced or ignored. I'm not sure which way is best for these ones but @0ko will know.

They are displayed for analysis because logs are not supposed to display errors during test runs but they do no fail tests. They can either be fixed, silenced or ignored. I'm not sure which way is best for these ones but @0ko will know.
Owner

@wetneb you found a bug introduced in this PR! These strings weren't supposed to be deleted and now show up on main repo screen. We need to get them back..

I imagine those are due to the leftover translation keys in languages other than English?

No, it is because a template requested these keys and got nothing.

It doesn't look like Weblate is taking care of removing those automatically, is it?

Specifically in INI, it doesn't, but cleanups happen: #9011.

@wetneb you found a bug introduced in this PR! These strings weren't supposed to be deleted and now show up on main repo screen. We need to get them back.. > I imagine those are due to the leftover translation keys in languages other than English? No, it is because a template requested these keys and got nothing. > It doesn't look like Weblate is taking care of removing those automatically, is it? Specifically in INI, it doesn't, but cleanups happen: #9011.
Owner

This bug would have been caught by testlogger but it is currently disabled (#2942).

Looking at action logs, there are no other strings that weren't supposed to be removed, at least among the ones seen on pages visited by integration tests.

This bug would have been caught by testlogger but it is currently disabled (https://codeberg.org/forgejo/forgejo/pulls/2942). Looking at [action logs](https://codeberg.org/forgejo/forgejo/actions/runs/98429/jobs/9#jobstep-5-159), there are no other strings that weren't supposed to be removed, at least among the ones seen on pages visited by integration tests.
Author
Member

oh, sorry, should've double-checked that cddf608cb9 didn't remove (all) references to the search.* strings.

oh, sorry, should've double-checked that https://codeberg.org/forgejo/forgejo/commit/cddf608cb93771568ddb53ee973031a0eb171271 didn't remove (all) references to the `search.*` strings.
@ -1192,1 +1159,3 @@
tree_path_not_found_tag = Path %[1]s doesn't exist in tag %[2]s
tree_path_not_found.commit = Path %[1]s doesn't exist in commit %[2]s
tree_path_not_found.branch = Path %[1]s doesn't exist in branch %[2]s
tree_path_not_found.tag = Path %[1]s doesn't exist in tag %[2]s
Owner

I should have paid better attention, but this had deleted existing translations. Some are already re-made, but for unmaintained locales I'll try to recover them with the existing tooling after #9041 is unblocked.

I should have paid better attention, but this had deleted existing translations. Some are already re-made, but for unmaintained locales I'll try to recover them with the existing tooling after https://codeberg.org/forgejo/forgejo/pulls/9041 is unblocked.
Owner

Done in #9041.

Done in https://codeberg.org/forgejo/forgejo/pulls/9041.
0ko marked this conversation as resolved
Gusted referenced this pull request from a commit 2025-10-25 23:35:04 +02:00
Gusted referenced this pull request from a commit 2025-10-26 07:14:57 +01:00
Gusted referenced this pull request from a commit 2025-11-03 03:11:25 +01:00
Gusted referenced this pull request from a commit 2025-11-11 07:18:51 +01:00
Gusted referenced this pull request from a commit 2025-11-21 07:30:22 +01:00
Gusted referenced this pull request from a commit 2025-12-09 01:10:51 +01:00
Gusted referenced this pull request from a commit 2025-12-22 01:49:08 +01:00
Gusted referenced this pull request from a commit 2026-01-13 19:44:17 +01:00
Gusted referenced this pull request from a commit 2026-01-15 19:23:33 +01:00
Gusted referenced this pull request from a commit 2026-01-17 22:47:28 +01:00
Gusted referenced this pull request from a commit 2026-01-20 15:59:45 +01:00
Gusted referenced this pull request from a commit 2026-01-26 00:45:48 +01:00
Gusted referenced this pull request from a commit 2026-01-27 20:15:31 +01:00
Gusted referenced this pull request from a commit 2026-01-28 14:25:59 +01:00
Gusted referenced this pull request from a commit 2026-02-08 01:18:03 +01:00
Gusted referenced this pull request from a commit 2026-02-25 01:19:20 +01:00
Sign in to join this conversation.
No reviewers
No labels
arch
riscv64
backport/v1.19
backport/v1.20
backport/v1.21/forgejo
backport/v10.0/forgejo
backport/v11.0/forgejo
backport/v12.0/forgejo
backport/v13.0/forgejo
backport/v14.0/forgejo
backport/v7.0/forgejo
backport/v8.0/forgejo
backport/v9.0/forgejo
breaking
bug
bug
confirmed
bug
duplicate
bug
needs-more-info
bug
new-report
bug
reported-upstream
code/actions
code/api
code/auth
code/auth/faidp
code/auth/farp
code/email
code/federation
code/git
code/migrations
code/packages
code/wiki
database
MySQL
database
PostgreSQL
database
SQLite
dependency-upgrade
dependency
certmagic
dependency
chart.js
dependency
Chi
dependency
Chroma
dependency
citation.js
dependency
codespell
dependency
css-loader
dependency
devcontainers
dependency
dropzone
dependency
editorconfig-checker
dependency
elasticsearch
dependency
enmime
dependency
F3
dependency
ForgeFed
dependency
garage
dependency
Git
dependency
git-backporting
dependency
Gitea
dependency
gitignore
dependency
go-ap
dependency
go-enry
dependency
go-gitlab
dependency
Go-org
dependency
go-rpmutils
dependency
go-sql-driver mysql
dependency
go-swagger
dependency
go-version
dependency
go-webauthn
dependency
gocron
dependency
Golang
dependency
goldmark
dependency
goquery
dependency
Goth
dependency
grpc-go
dependency
happy-dom
dependency
Helm
dependency
image-spec
dependency
jsonschema
dependency
KaTeX
dependency
lint
dependency
MariaDB
dependency
Mermaid
dependency
minio-go
dependency
misspell
dependency
Monaco
dependency
PDFobject
dependency
playwright
dependency
postcss
dependency
postcss-plugins
dependency
pprof
dependency
prometheus client_golang
dependency
protobuf
dependency
relative-time-element
dependency
renovate
dependency
reply
dependency
ssh
dependency
swagger-ui
dependency
tailwind
dependency
temporal-polyfill
dependency
terminal-to-html
dependency
tests-only
dependency
text-expander-element
dependency
urfave
dependency
vfsgen
dependency
vite
dependency
Woodpecker CI
dependency
x tools
dependency
XORM
Discussion
duplicate
enhancement/feature
forgejo/accessibility
forgejo/branding
forgejo/ci
forgejo/commit-graph
forgejo/documentation
forgejo/furnace cleanup
forgejo/i18n
forgejo/interop
forgejo/moderation
forgejo/privacy
forgejo/release
forgejo/scaling
forgejo/security
forgejo/ui
Gain
High
Gain
Nice to have
Gain
Undefined
Gain
Very High
good first issue
i18n/backport-stable
impact
large
impact
medium
impact
small
impact
unknown
Incompatible license
issue
closed
issue
do-not-exist-yet
issue
open
manual test
Manually tested during feature freeze
OS
FreeBSD
OS
Linux
OS
macOS
OS
Windows
problem
QA
regression
release blocker
Release Cycle
Feature Freeze
release-blocker
v7.0
release-blocker
v7.0.1
release-blocker
v7.0.2
release-blocker
v7.0.3
release-blocker
v7.0.4
release-blocker
v8.0.0
release-blocker/v9.0.0
run-all-playwright-tests
run-end-to-end-tests
test
manual
test
needed
test
needs-help
test
not-needed
test
present
untested
User research - time-tracker
valuable code
worth a release-note
User research - Accessibility
User research - Blocked
User research - Community
User research - Config (instance)
User research - Errors
User research - Filters
User research - Future backlog
User research - Git workflow
User research - Labels
User research - Moderation
User research - Needs input
User research - Notifications/Dashboard
User research - Rendering
User research - Repo creation
User research - Repo units
User research - Security
User research - Settings (in-app)
No milestone
No project
No assignees
6 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
forgejo/forgejo!8736
No description provided.