@@ -849,8 +849,8 @@ mail@domain.com
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -876,8 +876,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -905,8 +905,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -934,8 +934,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -963,8 +963,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -992,8 +992,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1022,8 +1022,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1052,8 +1052,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1082,8 +1082,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1112,8 +1112,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1143,8 +1143,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
@@ -1174,8 +1174,8 @@ space
-
-
+
+ https://example.com/user/repo/compare/88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb#hash
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare https://example.com/user/repo/commit/88fc37a3c0a4dda553bdcfc80c178a58247f42fb
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c
new file mode 100644
index 0000000000..1ab268b76c
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/0b/b53b56d70d253ce75c257d3cd6334a41ef2b6c differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec
new file mode 100644
index 0000000000..c8b99f906b
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/18/9739e1c2a6cdb8ee094ba1ef8a2e40cf65b2ec differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5
new file mode 100644
index 0000000000..f799e8a988
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2a/4032b49cff56d6d4921133e087d9dc0341a2c5 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157
new file mode 100644
index 0000000000..7f4c451d00
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2d/2f8eaa17b17359ee1c73222065575d50d9a157 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd
new file mode 100644
index 0000000000..fc97712911
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/b9577a8e940a0a84a789cdd4a45d0f172e3fdd differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2
new file mode 100644
index 0000000000..e230df1343
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/2f/f8eb63aad050c3f20e9cb27090ab7378267ab2 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65
new file mode 100644
index 0000000000..1493caa3df
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/35/75ed7948fe86ab56b0a76f796f7995222bec65 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043
new file mode 100644
index 0000000000..3e9c0c0d8b
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/3c/95f14e5a0ab2c5ba9ee9a47ddc261af4968043 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca
new file mode 100644
index 0000000000..78189a52f6
--- /dev/null
+++ b/modules/markup/tests/repo/repo1_filepreview/objects/3e/2a4f1b9a15ffa15ea7ffdc06acd302442b3eca
@@ -0,0 +1 @@
+xANร0EY๛ณGB;a U=D9=&ฺูำr} 7่๊ญำำ๋ๅาB^ฌดคyY8ฯ:AX}RืXkฮsญ"๎;u์Fบฎ9x สEdะ%อ~**Z฿3\บูvํ๔9ะ>n8fxk๛=[9K%L>ฎ๔ู๊{ง7รs;aีv4hXO๛Hทิี๛๐`Kั
\ No newline at end of file
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573 b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573
new file mode 100644
index 0000000000..d781d4d248
--- /dev/null
+++ b/modules/markup/tests/repo/repo1_filepreview/objects/72/1f0ce13d83f93d431b849a554a62948b85f573
@@ -0,0 +1 @@
+xK1@]็ต$ฟJฅaๆzJRม@w+ุ้s๕ฎโ๑เๅฒดึร่"@VL&J3%f-ัGDาq2>F็jBOEนห:ภgร\1คฆ๊ฆkภ๊ชEM6Dิ,ลธ\โวธ:\6้พOlmศฉญ;ฯญ|!GไEฃ6Zซz๒Yฅฮฒ
จmธwูยi.x-oณ๒"๚Lฬ
\ No newline at end of file
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27
new file mode 100644
index 0000000000..7b926dc0d8
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e0a44ea5761c9055995db18019e459576b3b27 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e
new file mode 100644
index 0000000000..0bbca73af2
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/72/e1c77b65c7baa0e848557089148833fb54705e differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77
new file mode 100644
index 0000000000..0ea93376dc
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8a/3b1881b5c4e7dc2be7ee1c0f37f93ffbb5ff77 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e
new file mode 100644
index 0000000000..394a7bb50d
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/8b/ccd5176c25898b57da2551e076f769054e0d8e differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f
new file mode 100644
index 0000000000..ab36311f6f
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/95/31b649823095acf5d79ab9e4f8b8d86046352f differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8
new file mode 100644
index 0000000000..59afaebf4a
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ac/769ab4baa91060a4c2f828f53e6c3cc2f708f8 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf
new file mode 100644
index 0000000000..3de089bf6a
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c5/3110b1957cefc56c4b2d879476ddbe905980bf differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510
new file mode 100644
index 0000000000..af5b784773
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/8762531dd068cd818300a5f5c7dca5da79b510 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be
new file mode 100644
index 0000000000..9fc2b7c312
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/c9/913120ed2c1e27c1d7752ecdb7a504dc7cf6be differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084
new file mode 100644
index 0000000000..ef73ed1791
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/e7/99b34ea867a0364d0df33f382562db9ff39084 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d
new file mode 100644
index 0000000000..5515b07d4a
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/ee/b243c3395e1921c5d90e73bd739827251fc99d differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8
new file mode 100644
index 0000000000..2e15b4fb0a
Binary files /dev/null and b/modules/markup/tests/repo/repo1_filepreview/objects/f7/0f10e4db19068f79bc43844b49f3eece45c4e8 differ
diff --git a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master
index df25bf45f0..709cffca17 100644
--- a/modules/markup/tests/repo/repo1_filepreview/refs/heads/master
+++ b/modules/markup/tests/repo/repo1_filepreview/refs/heads/master
@@ -1 +1 @@
-4c1aaf56bcb9f39dcf65f3f250726850aed13cd6
+eeb243c3395e1921c5d90e73bd739827251fc99d
diff --git a/modules/setting/service.go b/modules/setting/service.go
index 9807f33352..7a907023c4 100644
--- a/modules/setting/service.go
+++ b/modules/setting/service.go
@@ -140,6 +140,11 @@ func CompileEmailGlobList(sec ConfigSection, keys ...string) (globs []glob.Glob)
return globs
}
+// LoadServiceSetting loads the service settings
+func LoadServiceSetting() {
+ loadServiceFrom(CfgProvider)
+}
+
func loadServiceFrom(rootCfg ConfigProvider) {
sec := rootCfg.Section("service")
Service.ActiveCodeLives = sec.Key("ACTIVE_CODE_LIVE_MINUTES").MustInt(180)
diff --git a/modules/templates/util_avatar.go b/modules/templates/util_avatar.go
index afc1091516..a468361101 100644
--- a/modules/templates/util_avatar.go
+++ b/modules/templates/util_avatar.go
@@ -34,7 +34,7 @@ func AvatarHTML(src string, size int, class, name string) template.HTML {
name = "avatar"
}
- return template.HTML(``)
+ return template.HTML(``)
}
// Avatar renders user avatars. args: user, size (int), class (string)
diff --git a/modules/templates/util_render_test.go b/modules/templates/util_render_test.go
index 3479d94039..028cd2ba76 100644
--- a/modules/templates/util_render_test.go
+++ b/modules/templates/util_render_test.go
@@ -194,8 +194,8 @@ func TestRenderMarkdownToHtml(t *testing.T) {
remote link
-
-
+
+88fc37a3c0...12fc37a3c0 (hash)
com 88fc37a3c0a4dda553bdcfc80c178a58247f42fb...12fc37a3c0a4dda553bdcfc80c178a58247f42fb pare
88fc37a3c0
diff --git a/modules/translation/i18n/i18n_test.go b/modules/translation/i18n/i18n_test.go
index 41f85931aa..66f5d5c402 100644
--- a/modules/translation/i18n/i18n_test.go
+++ b/modules/translation/i18n/i18n_test.go
@@ -158,6 +158,7 @@ commits = fallback value for commits
found := lang1.HasKey("no-such")
assert.False(t, found)
+ assert.EqualValues(t, "no-such", lang1.TrString("no-such"))
require.NoError(t, ls.Close())
}
diff --git a/modules/translation/i18n/localestore.go b/modules/translation/i18n/localestore.go
index e80b2592ae..a38e967838 100644
--- a/modules/translation/i18n/localestore.go
+++ b/modules/translation/i18n/localestore.go
@@ -225,9 +225,9 @@ func (l *locale) TrString(trKey string, trArgs ...any) string {
format = msg
} else {
// First fallback: old-style translation
- idx, ok := l.store.trKeyToIdxMap[trKey]
+ idx, foundIndex := l.store.trKeyToIdxMap[trKey]
found := false
- if ok {
+ if foundIndex {
if msg, ok := l.idxToMsgMap[idx]; ok {
format = msg // use the found translation
found = true
@@ -239,7 +239,7 @@ func (l *locale) TrString(trKey string, trArgs ...any) string {
if defaultLang, ok := l.store.localeMap[l.store.defaultLang]; ok {
if msg := defaultLang.LookupNewStyleMessage(trKey); msg != "" {
format = msg
- } else {
+ } else if foundIndex {
// Third fallback: old-style default language
if msg, ok := defaultLang.idxToMsgMap[idx]; ok {
format = msg
diff --git a/modules/util/slice.go b/modules/util/slice.go
index 9c878c24be..80c8e62f6f 100644
--- a/modules/util/slice.go
+++ b/modules/util/slice.go
@@ -4,7 +4,6 @@
package util
import (
- "cmp"
"slices"
"strings"
)
@@ -47,13 +46,6 @@ func SliceRemoveAll[T comparable](slice []T, target T) []T {
return slices.DeleteFunc(slice, func(t T) bool { return t == target })
}
-// Sorted returns the sorted slice
-// Note: The parameter is sorted inline.
-func Sorted[S ~[]E, E cmp.Ordered](values S) S {
- slices.Sort(values)
- return values
-}
-
// TODO: Replace with "maps.Values" once available, current it only in golang.org/x/exp/maps but not in standard library
func ValuesOfMap[K comparable, V any](m map[K]V) []V {
values := make([]V, 0, len(m))
diff --git a/options/locale/locale_cs-CZ.ini b/options/locale/locale_cs-CZ.ini
index 2c47093cea..f5b6540023 100644
--- a/options/locale/locale_cs-CZ.ini
+++ b/options/locale/locale_cs-CZ.ini
@@ -680,6 +680,8 @@ Location = Umรญstฤnรญ
To = Nรกzev vฤtve
Biography = ลฝivotopis
AccessToken = Pลรญstupovรฝ token
+username_claiming_cooldown = Uลพivatelskรฉ jmรฉno nelze zรญskat, protoลพe jeลกtฤ neskonฤila doba jeho platnosti. Pลฏjde jej zรญskat %[1]s.
+email_domain_is_not_allowed = Domรฉna uลพivatelskรฉ e-mailovรฉ adresy %s je v rozporu se seznamem EMAIL_DOMAIN_ALLOWLIST nebo EMAIL_DOMAIN_BLOCKLIST. Ujistฤte se, ลพe je vaลกe adresa sprรกvnฤ nastavena.
[user]
change_avatar=Zmฤnit vรกลก avatarโฆ
@@ -804,7 +806,7 @@ old_password=Stรกvajรญcรญ heslo
new_password=Novรฉ heslo
retype_new_password=Potvrzenรญ novรฉho hesla
password_incorrect=Zadanรฉ heslo nenรญ sprรกvnรฉ.
-change_password_success=Vaลกe heslo bylo aktualizovรกno. Od teฤ se pลihlaลกujte novรฝm heslem.
+change_password_success=Vaลกe heslo bylo aktualizovรกno. Od nynฤjลกka pouลพรญvejte kpลihlรกลกenรญ novรฉ heslo.
password_change_disabled=Externฤ ovฤลovanรญ uลพivatelรฉ nemohou aktualizovat svรฉ heslo prostลednictvรญm webovรฉho rozhranรญ Forgejo.
emails=E-mailovรฉ adresy
@@ -1056,6 +1058,8 @@ language.description = Tento jazyk bude uloลพen do vaลกeho รบฤtu a po pลihlรก
language.localization_project = Pomozte nรกm s pลekladem Forgejo do vaลกeho jazyka! Vรญce informacรญ.
user_block_yourself = Nemลฏลพete zablokovat sami sebe.
pronouns_custom_label = Vlastnรญ zรกjmena
+change_username_redirect_prompt.with_cooldown.few = Starรฉ uลพivatelskรฉ jmรฉno bude dostupnรฉ ostatnรญm po %[1]d dnech. Do tรฉ doby budete moci svรฉ starรฉ uลพivatelskรฉ jmรฉno znovu zรญskat.
+change_username_redirect_prompt.with_cooldown.one = Starรฉ uลพivatelskรฉ jmรฉno bude dostupnรฉ ostatnรญm po %[1]d dni. Do tรฉ doby budete moci svรฉ starรฉ uลพivatelskรฉ jmรฉno znovu zรญskat.
[repo]
new_repo_helper=Repozitรกล obsahuje vลกechny soubory projektu, vฤetnฤ historie revizรญ. Uลพ jej hostujete jinde? Migrovat repozitรกล.
@@ -3001,6 +3005,8 @@ teams.invite.by=Pozvรกnรญ od %s
teams.invite.description=Pro pลipojenรญ k tรฝmu kliknฤte na tlaฤรญtko nรญลพe.
follow_blocked_user = Tuto organizaci nemลฏลพete sledovat, protoลพe jste v nรญ zablokovรกni.
open_dashboard = Otevลรญt nรกstฤnku
+settings.change_orgname_redirect_prompt.with_cooldown.one = Starรฉ uลพivatelskรฉ jmรฉno bude dostupnรฉ ostatnรญm po %[1]d dni. Do tรฉ doby budete moci svรฉ starรฉ uลพivatelskรฉ jmรฉno znovu zรญskat.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Starรฉ uลพivatelskรฉ jmรฉno bude dostupnรฉ ostatnรญm po %[1]d dnech. Do tรฉ doby budete moci svรฉ starรฉ uลพivatelskรฉ jmรฉno znovu zรญskat.
[admin]
dashboard=Pลehled
diff --git a/options/locale/locale_da.ini b/options/locale/locale_da.ini
index 2df385460b..a08fcaf8bc 100644
--- a/options/locale/locale_da.ini
+++ b/options/locale/locale_da.ini
@@ -629,6 +629,8 @@ password_special_one = Mindst รฉt specialtegn (tegnsรฆtning, parenteser, anfรธrs
unsupported_login_type = Login typen understรธttes ikke for at slette kontoen.
cannot_add_org_to_team = En organisation kan ikke tilfรธjes som et holdmedlem.
must_use_public_key = Nรธglen du har angivet er en privat nรธgle. Lad vรฆre med at uploade din private nรธgle nogen steder. Brug din offentlige nรธgle i stedet.
+username_claiming_cooldown = Brugernavnet kan ikke gรธres krav pรฅ, fordi dets nedkรธlingsperiode endnu ikke er forbi. Det kan gรธres krav pรฅ %[1]s.
+email_domain_is_not_allowed = Domรฆnet for brugerens e-mailadresse %s er i konflikt med EMAIL_DOMAIN_ALLOWLIST eller EMAIL_DOMAIN_BLOCKLIST. Sรธrg for, at du har indstillet e-mailadressen korrekt.
[user]
change_avatar = Skift din avatarโฆ
@@ -782,7 +784,7 @@ uploaded_avatar_is_too_big = Den uploadede filstรธrrelse (%d KiB) overstiger den
email_deletion_desc = E-mailadressen og relaterede oplysninger vil blive fjernet fra din konto. Git commits af denne e-mailadresse forbliver uรฆndret. Fortsรฆtte?
choose_new_avatar = Vรฆlg ny avatar
update_avatar = Opdater avatar
-change_password_success = Din adgangskode er blevet opdateret. Log ind med din nye adgangskode fra nu af.
+change_password_success = Din adgangskode er blevet opdateret. Fra nu af skal du bruge din nye adgangskode til at logge ind.
add_email = Tilfรธj e-mailadresse
add_openid = Tilfรธj OpenID URI
add_email_confirmation_sent = En bekrรฆftelses-e-mail er blevet sendt til "%s". For at bekrรฆfte din e-mailadresse, tjek venligst din indbakke og fรธlg det medfรธlgende link inden for de nรฆste %s.
@@ -972,6 +974,8 @@ delete_with_all_comments = Din konto er yngre end %s. For at undgรฅ spรธgelsesko
delete_account_title = Slet brugerkonto
user_block_yourself = Du kan ikke blokere dig selv.
pronouns_custom_label = Brugerdefinerede stedord
+change_username_redirect_prompt.with_cooldown.one = Det gamle brugernavn vil vรฆre tilgรฆngeligt for alle efter en nedkรธlingsperiode pรฅ %[1]d dag, du kan stadig krรฆve det gamle brugernavn tilbage i nedkรธlingsperioden.
+change_username_redirect_prompt.with_cooldown.few = Det gamle brugernavn vil vรฆre tilgรฆngeligt for alle efter en nedkรธlingsperiode pรฅ %[1]d dage, du kan stadig krรฆve det gamle brugernavn tilbage i nedkรธlingsperioden.
[repo]
rss.must_be_on_branch = Du skal vรฆre pรฅ en gren for at have et RSS-feed.
@@ -1761,6 +1765,28 @@ pulls.compare_changes = Ny pull-anmodning
issues.summary_card_alt = Oversigtskort over et problem med titlen "%s" i depotet %s
pulls.edit.already_changed = Kunne ikke gemme รฆndringer af pull-anmodningen. Det ser ud til, at indholdet allerede er blevet รฆndret af en anden bruger. Opdater siden, og prรธv at redigere igen for at undgรฅ at overskrive deres รฆndringer
pulls.sign_in_require = Log ind for at oprette en ny pull-anmodning.
+pulls.allow_edits_from_maintainers = Tillad redigeringer fra vedligeholdere
+pulls.allow_edits_from_maintainers_desc = Brugere med skriveadgang til basisgrenen kan ogsรฅ trykke til denne gren
+pulls.allow_edits_from_maintainers_err = Opdatering mislykkedes
+pulls.compare_base = flet ind i
+pulls.compare_compare = pull fra
+pulls.switch_comparison_type = Skift sammenligningstype
+pulls.switch_head_and_base = Skift hoved og base
+pulls.filter_branch = Filter gren
+pulls.compare_changes_desc = Vรฆlg den gren, der skal flettes ind i, og den gren, der skal trรฆkkes fra.
+pulls.has_viewed_file = Set
+pulls.has_changed_since_last_review = รndret siden din sidste gennemgang
+pulls.no_results = Ingen resultater fundet.
+pulls.show_all_commits = Vis alle commits
+pulls.show_changes_since_your_last_review = Vis รฆndringer siden din sidste gennemgang
+pulls.showing_only_single_commit = Viser kun รฆndringer af commit %[1]s
+pulls.showing_specified_commit_range = Viser kun รฆndringer mellem %[1]s..%[2]s
+pulls.select_commit_hold_shift_for_range = Vรฆlg commit. Hold Shift + klik for at vรฆlge et omrรฅde
+pulls.review_only_possible_for_full_diff = Gennemgang er kun mulig, nรฅr du ser den fulde diff
+pulls.filter_changes_by_commit = Filtrer efter commit
+pulls.expand_files = Udvid alle filer
+pulls.collapse_files = Skjul alle filer
+pulls.viewed_files_label = %[1]d / %[2]d filer set
[notification]
watching = Overvรฅger
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index f5e0d314ae..28e0016348 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -681,6 +681,8 @@ Website = Webseite
Location = Ort
To = Branchname
AccessToken = Zugangstoken
+username_claiming_cooldown = Der Benutzername kann nicht beansprucht werden, weil seine Schutzzeit noch nicht vorbei ist. Er kann am %[1]s beansprucht werden.
+email_domain_is_not_allowed = Die Domain der E-Mail-Adresse des Benutzers %s steht in Konflikt mit EMAIL_DOMAIN_ALLOWLIST oder EMAIL_DOMAIN_BLOCKLIST. Bitte stelle sicher, dass du die E-Mail-Adresse richtig gesetzt hast.
[user]
@@ -806,7 +808,7 @@ old_password=Aktuelles Passwort
new_password=Neues Passwort
retype_new_password=Neues Passwort bestรคtigen
password_incorrect=Das aktuelle Passwort ist falsch.
-change_password_success=Dein Passwort wurde aktualisiert. Bitte verwende dieses beim nรคchsten Einloggen.
+change_password_success=Dein Passwort wurde aktualisiert. Verwende ab jetzt dein neues Passwort zum Einloggen.
password_change_disabled=Benutzer, die nicht von Forgejo verwaltet werden, kรถnnen ihr Passwort im Web-Interface nicht รคndern.
emails=E-Mail-Adressen
@@ -1058,6 +1060,8 @@ language.localization_project = Hilf uns, Forgejo in deine Sprache zu รผbersetze
language.description = Diese Sprache wird in deinem Konto gespeichert und standardmรครig nach dem Anmelden benutzt.
user_block_yourself = Du kannst dich nicht selbst blockieren.
pronouns_custom_label = Individuelle Pronomen
+change_username_redirect_prompt.with_cooldown.one = Der alte Benutzername ist nach einer Schutzzeit von einem Tag wieder fรผr alle Verfรผgbar. Du kannst den alten Benutzername wรคhrend dieser Schutzzeit erneut beanspruchen.
+change_username_redirect_prompt.with_cooldown.few = Der alte Benutzername ist nach einer Schutzzeit von %[1]d Tagen wieder fรผr alle Verfรผgbar. Du kannst den alten Benutzername wรคhrend dieser Schutzzeit erneut beanspruchen.
[repo]
owner=Besitzer
@@ -3004,6 +3008,8 @@ teams.invite.by=Von %s eingeladen
teams.invite.description=Bitte klicke auf die folgende Schaltflรคche, um dem Team beizutreten.
follow_blocked_user = Du kannst dieser Organisation nicht folgen, weil diese Organisation dich blockiert hat.
open_dashboard = รbersicht รถffnen
+settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Benutzername ist nach einer Schutzzeit von einem Tag wieder fรผr alle Verfรผgbar. Du kannst den alten Benutzername wรคhrend dieser Schutzzeit erneut beanspruchen.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Benutzername ist nach einer Schutzzeit von %[1]d Tagen wieder fรผr alle Verfรผgbar. Du kannst den alten Benutzername wรคhrend dieser Schutzzeit erneut beanspruchen.
[admin]
dashboard=รbersicht
@@ -3109,7 +3115,7 @@ dashboard.sync_branch.started=Synchronisierung der Branches gestartet
dashboard.rebuild_issue_indexer=Issue-Indexer neu bauen
users.user_manage_panel=Benutzerkonten verwalten
-users.new_account=Benutzerkonto erstellen
+users.new_account=Benutzeraccount erstellen
users.name=Benutzername
users.full_name=Vollstรคndiger Name
users.activated=Aktiviert
@@ -3579,7 +3585,7 @@ comment_pull=`hat den Pull-Request %[3]s#%[2]s kommentiert`
merge_pull_request=`fรผhrte Pull-Request %[3]s#%[2]s zusammen`
auto_merge_pull_request=`fรผhrte Pull-Request %[3]s#%[2]s automatisch zusammen`
transfer_repo=hat Repository %s รผbertragen zu %s
-push_tag=Tag %[3]s nach %[4]s wurde gepusht
+push_tag=hat Tag %[3]s auf %[4]s gepusht
delete_tag=hat Tag %[2]s in %[3]s gelรถscht
delete_branch=hat Branch %[2]s in %[3]s gelรถscht
compare_branch=Vergleichen
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 2c7dbe69ad..166616ba91 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -644,6 +644,7 @@ team_name_been_taken = The team name is already taken.
team_no_units_error = Allow access to at least one repository section.
email_been_used = The email address is already used.
email_invalid = The email address is invalid.
+email_domain_is_not_allowed = The domain of the user's email address %s conflicts with EMAIL_DOMAIN_ALLOWLIST or EMAIL_DOMAIN_BLOCKLIST. Make sure you have set the email address correctly.
openid_been_used = The OpenID address "%s" is already used.
username_password_incorrect = Username or password is incorrect.
password_complexity = Password does not pass complexity requirements:
@@ -819,7 +820,7 @@ old_password = Current password
new_password = New password
retype_new_password = Confirm new password
password_incorrect = The current password is incorrect.
-change_password_success = Your password has been updated. Sign in using your new password from now on.
+change_password_success = Your password has been updated. From now on, use your new password to sign in.
password_change_disabled = Non-local users cannot update their password through the Forgejo web interface.
manage_emails = Manage email addresses
@@ -1192,6 +1193,7 @@ archive.title = This repository is archived. You can view files and clone it, bu
archive.title_date = This repository has been archived on %s. You can view files and clone it, but cannot push or open issues or pull requests.
archive.issue.nocomment = This repository is archived. You cannot comment on issues.
archive.pull.nocomment = This repository is archived. You cannot comment on pull requests.
+archive.pull.noreview = This repository is archived. You cannot review pull requests.
form.reach_limit_of_creation_1 = The owner has already reached the limit of %d repository.
form.reach_limit_of_creation_n = The owner has already reached the limit of %d repositories.
@@ -1430,6 +1432,7 @@ editor.user_no_push_to_branch = User cannot push to branch
editor.require_signed_commit = Branch requires a signed commit
editor.cherry_pick = Cherry-pick %s onto:
editor.revert = Revert %s onto:
+editor.commit_email = Commit email
commits.desc = Browse source code change history.
commits.commits = Commits
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index ec0239648c..abdadc6c66 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -56,7 +56,7 @@ mirror=Rรฉplica
new_repo=Nuevo repositorio
new_migrate=Nueva migraciรณn
new_mirror=Nueva rรฉplica
-new_fork=Nuevo fork de repositorio
+new_fork=Nueva bifurcaciรณn del repositorio
new_org=Nueva organizaciรณn
new_project=Nuevo proyecto
new_project_column=Nueva columna
@@ -75,7 +75,7 @@ collaborative=Colaborativo
forks=Forks
activities=Actividades
-pull_requests=Pull requests
+pull_requests=Solicitudes de incorporaciรณn de cambios
issues=Incidencias
milestones=Hitos
@@ -156,8 +156,8 @@ invalid_data = Datos invรกlidos: %v
confirm_delete_artifact = ยฟEstรกs seguro de que deseas eliminar el artefacto "%s"?
more_items = Mas cosas
copy_generic = Copiar al portapapeles
-filter.not_fork = No forks
-filter.is_fork = Forks
+filter.not_fork = No hay bifurcaciones
+filter.is_fork = Bifurcaciones
test = Test
error413 = Has agotado tu cuota.
new_repo.title = Nuevo repositorio
@@ -397,8 +397,8 @@ code_search_results=Resultados de bรบsqueda para ยซ%sยป
code_last_indexed_at=Indexado por รบltima vez %s
relevant_repositories_tooltip=Repositorios que son bifurcaciones o que no tienen ningรบn tema, ningรบn icono, y ninguna descripciรณn estรกn ocultos.
relevant_repositories=Solo se muestran repositorios relevantes, mostrar resultados sin filtrar.
-forks_few = %d forks
-forks_one = %d fork
+forks_few = %d bifurcaciones
+forks_one = %d bifurcaciรณn
stars_few = %d estrellas
stars_one = %d estrella
@@ -1070,10 +1070,10 @@ visibility=Visibilidad
visibility_description=Sรณlo el propietario o los miembros de la organizaciรณn -si tienen derechos- podrรกn verlo.
visibility_helper=Hacer el repositorio privado
visibility_helper_forced=El administrador de su sitio obliga a nuevos repositorios a ser privados.
-visibility_fork_helper=(Cambiar esto afectarรก a la visibilidad de todos los forks.)
+visibility_fork_helper=(Cambiar esto afectarรก a la visibilidad de todas las bifurcaciones.)
clone_helper=ยฟNecesita ayuda para clonar? Visite Ayuda.
-fork_repo=Hacer fork del repositorio
-fork_from=Crear un fork desde
+fork_repo=Hacer una bifurcaciรณn del repositorio
+fork_from=Crear una bifurcaciรณn desde
already_forked=Ya ha forkeado %s
fork_to_different_account=Forkear a una cuenta diferente
fork_visibility_helper=La visibilidad de un repositorio del cual se ha hecho fork no puede ser cambiada.
@@ -3852,7 +3852,7 @@ search = Buscar...
type_tooltip = Tipo de bรบsqueda
project_kind = Buscar proyectos...
branch_kind = Buscar ramas...
-commit_kind = Buscar commits...
+commit_kind = Buscar confirmaciones...
repo_kind = Buscar repositorios...
user_kind = Buscar usuarios...
org_kind = Buscar organizaciones...
diff --git a/options/locale/locale_et.ini b/options/locale/locale_et.ini
index 26621dd16b..e54ceadbb5 100644
--- a/options/locale/locale_et.ini
+++ b/options/locale/locale_et.ini
@@ -108,7 +108,7 @@ never = Mitte kunagi
unknown = Teadmata
rss_feed = RSS infovoog
confirm_delete_artifact = Kas oled kindel et soovite artefakti "%s" kustutada?
-pin =
+pin =
artifacts = Artefaktid
archived = Arhiveeritud
concept_system_global = รlemaailmne
diff --git a/options/locale/locale_fi-FI.ini b/options/locale/locale_fi-FI.ini
index dd1f97bd00..84940f5e45 100644
--- a/options/locale/locale_fi-FI.ini
+++ b/options/locale/locale_fi-FI.ini
@@ -1756,7 +1756,7 @@ issues.close = Sulje ongelma
issues.no_content = Ei kuvausta.
pulls.reject_count_1 = %d muutospyyntรถ
pulls.update_branch_success = Haarapรคivitys onnistui
-milestones.completeness = %d%% valmiina
+milestones.completeness = %d% % valmiina
contributors.contribution_type.additions = Lisรคykset
contributors.contribution_type.deletions = Poistot
settings.webhook_deletion_success = Webkoukku on poistettu.
@@ -2088,6 +2088,9 @@ new_from_template_description = Voit valita olemassa olevan repon mallipohjan ja
new_advanced = Lisรคasetukset
new_advanced_expand = Laajenna napsauttamalla
template_description = Repojen mallipohjat mahdollistavat uusien repojen luomisen halutulla hakemistorakenteella, tiedostoilla ja valinnaisilla asetuksilla.
+settings.enter_repo_name = Kirjoita omistajan ja repon nimi tรคsmรคlleen kuten esitetty:
+settings.confirmation_string = Vahvistusteksti
+settings.delete_notices_2 = - Tรคmรค toiminto poistaa pysyvรคsti repon %s mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset.
@@ -2578,6 +2581,12 @@ commit_repo = tyรถnsi haaraan %[3]s repossa
create_issue = `avasi ongelman %[3]s#%[2]s`
reopen_issue = `avasi uudelleen ongelman %[3]s#%[2]s`
create_pull_request = `loi vetopyynnรถn %[3]s#%[2]s`
+reopen_pull_request = `avasi uudelleen vetopyynnรถn %[3]s#%[2]s`
+close_pull_request = `sulki vetopyynnรถn %[3]s#%[2]s`
+comment_issue = `kommentoi ongelmaa %[3]s#%[2]s`
+close_issue = `sulki ongelman %[3]s#%[2]s`
+merge_pull_request = `yhdisti vetopyynnรถn %[3]s#%[2]s`
+comment_pull = `kommentoi vetopyyntรถรค %[3]s#%[2]s`
[tool]
now=nyt
@@ -2624,6 +2633,7 @@ error.not_signed_commit=Kommitti ei ole allekirjoitettu
error.extract_sign = Allekirjoituksen purkaminen epรคonnistui
default_key = Allekirjoitettu oletusavaimella
error.failed_retrieval_gpg_keys = Ei saatu yhtรคkรครคn kommitin tekijรคn tiliin liitettyรค avainta
+error.generate_hash = Tiivisteen luominen kommitista epรคonnistui
[units]
unit = Yksikkรถ
@@ -2765,6 +2775,11 @@ alpine.registry.info = Valitse $branch ja $repository alla olevasta listasta.
container.images.title = Levykuvat
owner.settings.cargo.initialize = Alusta indeksi
owner.settings.cargo.initialize.description = Erityinen Git-repoindeksi vaaditaan Cargo-rekisterin kรคyttรคmiseksi. Tรคmรคn valinnan kรคyttรคminen luo (tarvittaessa uudelleen) repon ja mรครคrittรครค sen asetukset automaattisesti.
+settings.link.error = Repositorion linkin pรคivittรคminen epรคonnistui.
+alt.repository.multiple_groups = Tรคmรค paketti on saatavilla useissa ryhmissรค.
+alt.repository.architectures = Arkkitehtuurit
+alt.install = Asenna paketti
+alt.registry.install = Asenna paketti suorittamalla komento:
[secrets]
creation.failed = Salaisuuden lisรครคminen epรคonnistui.
diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini
index 07372944bb..dea74a642c 100644
--- a/options/locale/locale_fil.ini
+++ b/options/locale/locale_fil.ini
@@ -640,6 +640,8 @@ AccessToken = Token ng pag-access
Biography = Byograpya
Location = Lokasyon
visit_rate_limit = Natugunan ang limitasyon sa rate ng malayuang pagbisita.
+username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maari itong i-claim sa %[1]s.
+email_domain_is_not_allowed = Sumasalungat ang domain ng email address ng user %s sa EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Siguraduhing natakda mo ang email address nang tama.
[user]
joined_on = Sumali noong %s
@@ -784,7 +786,7 @@ old_password = Kasalukuyang password
new_password = Bagong password
retype_new_password = Kumpirmahin ang bagong password
password_incorrect = Mali ang kasalukuyang password.
-change_password_success = Na-update na ang iyong password. Mag-sign in gamit ng bagong password simula ngayon.
+change_password_success = Na-update na ang iyong password. Simula ngayon, gamitin ang iyong bagong password para mag-sign in.
password_change_disabled = Hindi mababago ng mga di-lokal na gumagamit ang kanilang password sa pamamagitan ng Forgejo web interface.
emails = Mga email address
manage_emails = Ipamahala ang mga email address
@@ -999,6 +1001,8 @@ language.description = Mase-save ang wika sa iyong account at gagamitin bilang d
language.localization_project = Tulungan kaming isalin ang Forgejo sa iyong wika! Matuto pa.
pronouns_custom_label = Mga pasadyang pronoun
user_block_yourself = Hindi mo maaring harangan ang sarili mo.
+change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
+change_username_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
[repo]
template_description = Ang mga template na repositoryo ay pinapayagan ang mga gumagamit na mag-generate ng mga bagong repositoryo na may magkatulad na istraktura ng direktoryo, mga file, at opsyonal na mga setting.
@@ -2911,7 +2915,7 @@ dashboard.delete_old_system_notices = Burahin ang lahat ng mga lumang paunawa ng
dashboard.gc_lfs = I-garbage collect ang mga LFS meta object
dashboard.stop_zombie_tasks = Itigil ang mga zombie action task
users.user_manage_panel = Ipamahala ang mga user account
-users.new_account = Gumawa ng User Account
+users.new_account = Gumawa ng user account
users.auth_login_name = Pangalan ng sign-in authentication
users.password_helper = Iwanang walang laman ang password upang panatilihing hindi nabago.
users.max_repo_creation = Pinakamataas na numero ng mga repositoryo
@@ -3394,6 +3398,8 @@ teams.owners_permission_desc = Ang mga owner ay may punong access sa lah
teams.add_nonexistent_repo = Hindi pa umiiral ang repositoryo na sinusubukan mong idagdag. Mangyaring gawin iyan muna.
teams.all_repositories = Lahat ng mga repositoryo
teams.all_repositories_helper = Ang koponan ay may access sa lahat ng mga repositoryo. Ang pagpili nito ay idadagdag ang lahat ng mga umiiral na repositoryo sa koponan.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
+settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
[packages]
@@ -3571,7 +3577,7 @@ alt.registry = I-setup ang registry na ito mula sa command line:
alt.registry.install = Para i-install ang package na ito, patakbuhin ang sumusunod na command:
alt.install = I-install ang package
alt.setup = Idagdag ang repositoryo sa listahan ng mga nakakonektang repositoryo (piliin ang kinakailangang architechture sa halip ng '_arch_'):
-alt.repository = Info ng Repositoryo
+alt.repository = Info ng repositoryo
alt.repository.architectures = Mga architechture
alt.repository.multiple_groups = Available ang package na ito sa iba't ibang grupo.
@@ -3693,7 +3699,7 @@ approve_pull_request = `inaprubahan ang %[3]s#%[2]s`
review_dismissed_reason = Dahilan:
compare_branch = Ikumpara
reject_pull_request = `nagmungkahi ng mga pagbabago para sa %[3]s#%[2]s`
-rename_repo = pinalitan ang pangalan ng repositoryo mula %[1]s sa %[3]#
+rename_repo = pinalitan ang pangalan ng repositoryo mula %[1]s sa %[3]s
close_issue = `sinara ang isyu na %[3]s#%[2]s`
review_dismissed = `na-dismiss ang pagsusuri mula %[4]s para sa %[3]s#%[2]s`
close_pull_request = `sinara ang hiling sa paghila na %[3]s#%[2]s`
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index f67b11dc04..7924c6eea4 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -680,6 +680,7 @@ Biography = Biographie
Website = Site web
Location = Emplacement
To = Nom de la branche
+email_domain_is_not_allowed = Le domaine %s du courriel utilisateur entre en conflit avec EMAIL_DOMAIN_ALLOWLIST ou EMAIL_DOMAIN_BLOCKLIST. Veuillez vous assurer le courriel est renseignรฉ.
[user]
change_avatar=Changer votre avatarโฆ
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index 829459f202..1b0001d44b 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -75,7 +75,7 @@ mirrors=Spoguฤผglabฤtavas
collaborative=Lฤซdzdarboลกanฤs
forks=Atzarojumi
-activities=Aktivitฤte
+activities=Darbฤซbas
pull_requests=Izmaiลu pieprasฤซjumi
issues=Pieteikumi
milestones=Atskaites punkti
@@ -678,6 +678,8 @@ Biography = Dzฤซves un darbฤซbas apraksts
Website = Tฤซmekฤผvietne
AccessToken = Piekฤผuves pilnvara
To = Zara nosaukums
+username_claiming_cooldown = ล o lietotฤjvฤrdu vฤl nevar izmantot, jo tฤ noilgums vฤl nav beidzies. To varฤs izmantot %[1]s.
+email_domain_is_not_allowed = Lietotฤja e-pasta adreses %s domฤna vฤrds ir pretrunฤt ar EMAIL_DOMAIN_ALLOWLIST vai EMAIL_DOMAIN_BLOCKLIST. Jฤpฤrliecinฤs, ka e-pasta adrese ir norฤdฤซta pareizi.
[user]
@@ -695,7 +697,7 @@ following_few=%d seko
follow=Sekot
unfollow=Nesekot
user_bio=Biogrฤfija
-disabled_public_activity=ล is lietotฤjs ir atslฤdzies iespฤju aplลซkot tฤ aktivitฤti.
+disabled_public_activity=ล is lietotฤjs ir atspฤjojis darbฤซbu redzamฤซbu visiem.
email_visibility.limited=E-pasta adrese ir redzama visiem autentificฤtajiem lietotฤjiem
email_visibility.private=E-pasta adrese ir redzama tikai administratoriem
show_on_map=Rฤdฤซt ลกo vietu kartฤ
@@ -803,7 +805,7 @@ old_password=Paลกreizฤjฤ parole
new_password=Jaunฤ parole
retype_new_password=Apstiprinฤt jauno paroli
password_incorrect=Ievadฤซta nepareiza paลกreizฤjฤ parole.
-change_password_success=Parole tika sekmฤซgi nomainฤซta. Turpmฤk jฤpiesakฤs ar savu jauno paroli.
+change_password_success=Parole tika atjauninฤta. Turpmฤk jฤizmanto sava jaunฤ parole, lai pieteiktos.
password_change_disabled=ฤrฤjie lietotฤji nevar mainฤซt savu paroli Forgejo tฤซmekฤผa saskarnฤ.
emails=E-pasta adreses
@@ -904,7 +906,7 @@ added_on=Pievienots %s
valid_until_date=Derฤซgs lฤซdz %s
valid_forever=Derฤซgs mลซลพฤซgi
last_used=Pฤdฤjo reizi izmantota
-no_activity=Nav nesenas aktivitฤtes
+no_activity=Nav nesenu darbฤซbu
can_read_info=Lasฤซt
can_write_info=Rakstฤซt
key_state_desc=ล ฤซ atslฤga ir izmantota pฤdฤjo 7 dienu laikฤ
@@ -1055,6 +1057,8 @@ additional_repo_units_hint_description = Attฤlot norฤdi "Iespฤjot vฤl" glab
language.description = ล ฤซ valoda tiks saglabฤta kontฤ un pฤc pieteikลกanฤs tiks izmantota kฤ noklusฤjuma.
user_block_yourself = Nevar liegt sevi.
pronouns_custom_label = Pielฤgoti vietniekvฤrdi
+change_username_redirect_prompt.with_cooldown.one = Vecais lietotฤjvฤrds bลซs pieejams visiem pฤc noilguma, kas ir %[1]d diena. ล ajฤ laikฤ ir iespฤjams to atkal sฤkt izmantot.
+change_username_redirect_prompt.with_cooldown.few = Vecais lietotฤjvฤrds bลซs pieejams visiem pฤc noilguma, kas ir %[1]d dienas. ล ajฤ laikฤ ir iespฤjams to atkal sฤkt izmantot.
[repo]
new_repo_helper=Glabฤtava satur visas projekta datnes, tajฤ skaitฤ izmaiลu vฤsturi. Jau tiek izmantota kaut kur citur? Pฤrcelt glabฤtavu.
@@ -1652,7 +1656,7 @@ issues.save=Saglabฤt
issues.label_title=Nosaukums
issues.label_description=Apraksts
issues.label_color=Krฤsa
-issues.label_exclusive=Ekskluzฤซvs
+issues.label_exclusive=Seviลกฤทa
issues.label_archive=Arhivฤt iezฤซmi
issues.label_archived_filter=Rฤdฤซt arhivฤtฤs iezฤซmes
issues.label_archive_tooltip=Arhivฤtฤs iezฤซmes pฤc noklusฤjuma netiek iekฤผautas ieteikumos, kad meklฤ pฤc iezฤซmes.
@@ -2033,7 +2037,7 @@ wiki.last_updated=Pฤdฤjo reizi labota %s
wiki.page_name_desc=Jฤievada ลกฤซs vikivietnes lapas nosaukums. Daลพi ฤซpaลกie nosaukumi ir: "Home", "_Sidebar" un "_Footer".
wiki.original_git_entry_tooltip=Rฤdฤซt sฤkotnฤjo Git datni, nevis izmantot draudzฤซgo saiti.
-activity=Aktivitฤte
+activity=Notikumi
activity.period.filter_label=Laika periods:
activity.period.daily=1 diena
activity.period.halfweekly=3 dienas
@@ -2999,6 +3003,8 @@ teams.invite.by=Uzaicinฤja %s
teams.invite.description=Lลซgums nospiest zemฤk esoลกo pogu, lai pievienotos komandai.
open_dashboard = Atvฤrt pฤrskata paneli
follow_blocked_user = Tu nevari sekot ลกai apvienฤซbai, jo tฤ ir liegusi Tevi.
+settings.change_orgname_redirect_prompt.with_cooldown.one = Vecais lietotฤjvฤrds bลซs pieejams visiem pฤc noilguma, kas ir %[1]d diena. ล ajฤ laikฤ ir iespฤjams to atkal sฤkt izmantot.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Vecais lietotฤjvฤrds bลซs pieejams visiem pฤc noilguma, kas ir %[1]d dienas. ล ajฤ laikฤ ir iespฤjams to atkal sฤkt izmantot.
[admin]
dashboard=Pฤrskata panelis
@@ -3761,7 +3767,7 @@ settings.link.select=Atlasฤซt glabฤtavu
settings.link.button=Atjauninฤt glabฤtavas saiti
settings.link.success=Glabฤtavas saite tika sekmฤซgi atjauninฤta.
settings.link.error=Neizdevฤs atjauninฤt glabฤtavas saiti.
-settings.delete=Dzฤst pakotni
+settings.delete=Izdzฤst pakotni
settings.delete.description=Pakotne tiks neatgriezeniski izdzฤsta.
settings.delete.notice=Tiks izdzฤsta pakotne %s (%s). ล ฤซ darbฤซba ir neatgriezeniska. Tieลกฤm turpinฤt?
settings.delete.success=Pakotne tika izdzฤsta.
diff --git a/options/locale/locale_nb_NO.ini b/options/locale/locale_nb_NO.ini
index 18c9835df0..2c8b5cfc64 100644
--- a/options/locale/locale_nb_NO.ini
+++ b/options/locale/locale_nb_NO.ini
@@ -1,5 +1,5 @@
[common]
-enable_javascript = Denne nettsiden behรธver JavaScript.
+enable_javascript = Denne nettsiden krever JavaScript.
toc = Innholdsfortegnelse
licenses = Lisenser
return_to_forgejo = Tilbake til Forgejo
@@ -126,6 +126,13 @@ webauthn_sign_in = Trykk pรฅ knappen pรฅ sikkerhetsnรธkkelen din. Dersom nรธkkel
copy_path = Kopier sti
webauthn_error_unable_to_process = Tjeneren kunne ikke behandle forespรธrselen din.
webauthn_error_empty = Du mรฅ gi nรธkkelen et navn.
+toggle_menu = ร pne/lukke meny
+twofa_scratch = To-faktor skrapekode
+webauthn_press_button = Vennligst trykk pรฅ knappen pรฅ sikkerhetsnรธkkelenโฆ
+webauthn_error_duplicated = Sikkerhetsnรธkkelen er ikke tillatt for denne forespรธrselen. Vennligst sรธrg for at nรธkkelen ikke allerede er registrert.
+webauthn_error_timeout = Et tidsavbrudd oppsto fรธr nรธkkelen din kunne leses. Vennligst last inn siden pรฅ nytt og prรธv igjen.
+new_fork = Ny fork av repository
+collaborative = Samarbeidende
[search]
search = Sรธk...
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 30d2c0ebdf..ac34b83f4e 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -681,6 +681,8 @@ To = Branch naam
Website = Website
AccessToken = Toegangstoken
Pronouns = Voornaamwoorden
+username_claiming_cooldown = De gebruikersnaam kan niet opgeรซist worden, omdat de afkoelperiode nog niet voorbij is. Hij kan worden opgeรซist op %[1]s.
+email_domain_is_not_allowed = Het domein van het e-mailadres van de gebruiker %s is in strijd met EMAIL_DOMAIN_ALLOWLIST of EMAIL_DOMAIN_BLOCKLIST. Controleer of u het e-mailadres correct hebt ingesteld.
[user]
@@ -1058,6 +1060,8 @@ language.description = Deze taal wordt opgeslagen in uw account en wordt als sta
language.localization_project = Help ons Forgejo in uw taal te vertalen! Leer meer.
user_block_yourself = U kunt niet zichzelf blokkeren.
pronouns_custom_label = Aangepaste voornaamwoorden
+change_username_redirect_prompt.with_cooldown.few = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
+change_username_redirect_prompt.with_cooldown.one = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
[repo]
owner=Eigenaar
@@ -2863,6 +2867,7 @@ summary_card_alt = Overzichtskaart van repository %s
release.summary_card_alt = Samenvattende kaart van een release met de titel "%s" in repository %s
issues.reaction.alt_remove = Verwijder %[1]s reactie van bericht.
issues.reaction.alt_many = %[1]s en %[2]d meer gereageerd %[3]s.
+editor.commit_email = Commit e-mail
@@ -3001,6 +3006,8 @@ settings.visibility.limited = Beperkt (alleen zichtbaar voor ingelogde gebruiker
teams.add_nonexistent_repo = De repository die u probeert toe te voegen bestaat niet, maak deze eerst aan alstublieft.
teams.all_repositories_write_permission_desc = Dit team verleent Schrijf permissies tot alle repositories: leden kunnen lezen en pushen naar repositories.
open_dashboard = Open dashboard
+settings.change_orgname_redirect_prompt.with_cooldown.one = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dag. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
+settings.change_orgname_redirect_prompt.with_cooldown.few = De oude gebruikersnaam zal voor iedereen beschikbaar zijn na een afkoelperiode van %[1]d dagen. U kunt de oude gebruikersnaam nog steeds opeisen tijdens de afkoelperiode.
[admin]
dashboard=Overzicht
@@ -3083,7 +3090,7 @@ dashboard.gc_times=GC verwerkingen
dashboard.delete_old_system_notices=Verwijder alle oude systeemmededelingen uit de database
users.user_manage_panel=Gebruikersaccounts beheren
-users.new_account=Nieuw account aanmaken
+users.new_account=Gebruikersaccount aanmaken
users.name=Gebruikersnaam
users.full_name=Volledige naam
users.activated=Geactiveerd
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index f6cf73620c..5f4ebe389a 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -680,6 +680,8 @@ required_prefix = A entrada deve comeรงar com "%s"
FullName = Nome completo
Description = Descriรงรฃo
unset_password = O usuรกrio de login nรฃo definiu a senha.
+username_claiming_cooldown = Este nome de usuรกrio nรฃo pode ser registrado porque o perรญodo de espera ainda nรฃo acabou. Ele poderรก ser registrado em %[1]s.
+email_domain_is_not_allowed = O domรญnio do endereรงo de email da conta %s estรก em conflito com EMAIL_DOMAIN_ALLOWLIST ou EMAIL_DOMAIN_BLOCKLIST. Certifique-se de que vocรช colocou o endereรงo de email correto.
[user]
@@ -805,7 +807,7 @@ old_password=Senha atual
new_password=Nova senha
retype_new_password=Confirme a nova senha
password_incorrect=A senha atual estรก incorreta.
-change_password_success=Sua senha foi atualizada. Acesse usando sua nova senha de agora em diante.
+change_password_success=Sua senha foi atualizada. A partir de agora, use sua nova senha para acessar sua conta.
password_change_disabled=Contas nรฃo-locais nรฃo podem alterar sua senha atravรฉs da interface web do Forgejo.
emails=Endereรงos de e-mail
@@ -1057,6 +1059,8 @@ language.localization_project = Ajude-nos a traduzir Forgejo para o seu idioma!
language.description = Essa lรญngua serรก salva em sua conta e serรก usada como padrรฃo apรณs vocรช iniciar a sessรฃo.
user_block_yourself = Vocรช nรฃo pode se bloquear.
pronouns_custom_label = Pronomes personalizados
+change_username_redirect_prompt.with_cooldown.one = O nome de usuรกrio antigo ficarรก disponรญvel para qualquer pessoa apรณs um perรญodo de espera de %[1]d dia, vocรช ainda pode recuperar o nome de usuรกrio antigo durante este perรญodo de espera.
+change_username_redirect_prompt.with_cooldown.few = O nome de usuรกrio antigo ficarรก disponรญvel para qualquer pessoa apรณs um perรญodo de espera de %[1]d dias, vocรช ainda pode recuperar o nome de usuรกrio antigo durante este perรญodo de espera.
[repo]
owner=Proprietรกrio
@@ -2619,7 +2623,7 @@ tag.create_tag_from=`Criar nova tag a partir de "%s"`
tag.create_success=Tag "%s" criada.
-topic.manage_topics=Gerenciar Tรณpicos
+topic.manage_topics=Gerenciar tรณpicos
topic.done=Feito
topic.count_prompt=Vocรช nรฃo pode selecionar mais de 25 tรณpicos
@@ -3000,6 +3004,8 @@ open_dashboard = Abrir painel
settings.change_orgname_prompt = Obs.: Alterar o nome de uma organizaรงรฃo resultarรก na alteraรงรฃo do URL dela e disponibilizarรก o nome antigo para uso.
follow_blocked_user = Nรฃo foi possรญvel seguir esta organizaรงรฃo porque ela bloqueou-o(a).
form.name_pattern_not_allowed = O padrรฃo "%s" nรฃo รฉ permitido no nome de uma organizaรงรฃo.
+settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de usuรกrio antigo ficarรก disponรญvel para qualquer pessoa apรณs um perรญodo de espera de %[1]d dia, vocรช ainda pode recuperar o nome de usuรกrio antigo durante este perรญodo de espera.
+settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de usuรกrio antigo ficarรก disponรญvel para qualquer pessoa apรณs um perรญodo de espera de %[1]d dias, vocรช ainda pode recuperar o nome de usuรกrio antigo durante este perรญodo de espera.
[admin]
dashboard=Painel
@@ -3820,6 +3826,13 @@ owner.settings.cargo.initialize.description = ร necessรกrio um repositรณrio Git
owner.settings.chef.keypair.description = ร necessรกrio um par de chaves para autenticar no registro Chef. Se vocรช jรก gerou um par de chaves, gere um novo par e descarte o antigo.
container.images.title = Imagens
search_in_external_registry = Buscar em %s
+alt.registry.install = Para instalar o pacote, execute o seguinte comando:
+alt.registry = Configurar este registro da linha de comando:
+alt.install = Instalar pacote
+alt.repository = Informaรงรฃo do repositรณrio
+alt.repository.architectures = Arquiteturas
+alt.repository.multiple_groups = Este pacote estรก disponรญvel em mรบltiplos grupos.
+alt.setup = Adicionar um repositรณrio ร lista de repositรณrios conectados (escolha a arquitetura necessรกria em vez de '_arch_'):
[secrets]
secrets=Segredos
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index ca1199dd54..d00c5810d4 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -681,6 +681,8 @@ AccessToken = Cรณdigo de acesso
FullName = Nome completo
Description = Descriรงรฃo
Pronouns = Pronomes
+username_claiming_cooldown = O nome de utilizador nรฃo pode ser reivindicado, porque o perรญodo de espera do mesmo ainda nรฃo terminou. Pode ser reivindicado em %[1]s.
+email_domain_is_not_allowed = O domรญnio do endereรงo de email %s do utilizador entra em conflito com EMAIL_DOMAIN_ALLOWLIST ou EMAIL_DOMAIN_BLOCKLIST. Certifique-se de que definiu corretamente o endereรงo de email.
[user]
change_avatar=Mude o seu avatarโฆ
@@ -805,7 +807,7 @@ old_password=Senha corrente
new_password=Nova senha
retype_new_password=Confirme a nova senha
password_incorrect=A senha corrente estรก errada.
-change_password_success=A sua senha foi substituรญda. Inicie a sessรฃo com a nova senha a partir de agora.
+change_password_success=A sua senha foi atualizada. A partir de agora, utilize a sua nova senha para iniciar sessรฃo.
password_change_disabled=Os utilizadores nรฃo-locais nรฃo podem alterar a sua senha atravรฉs da interface web do Forgejo.
emails=Endereรงos de email
@@ -1057,6 +1059,8 @@ language.description = Este idioma vai ser guardado na sua conta e ser usado com
language.localization_project = Ajude-nos a traduzir o Forgejo para o seu idioma! Saiba mais.
pronouns_custom_label = Pronomes personalizados
user_block_yourself = Nรฃo se pode bloquear a si prรณprio.
+change_username_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estarรก disponรญvel para todos apรณs um perรญodo de espera de %[1]d dia, podendo ainda reivindicar o nome de utilizador antigo durante o perรญodo de espera.
+change_username_redirect_prompt.with_cooldown.few = O nome de utilizador antigo ficarรก disponรญvel para todos apรณs um perรญodo de espera de %[1]d dias, podendo ainda reivindicar o nome de utilizador antigo durante o perรญodo de espera.
[repo]
new_repo_helper=Um repositรณrio contรฉm todos os ficheiros do trabalho, incluindo o histรณrico das revisรตes. Jรก tem um hospedado noutro sรญtio? Migre o repositรณrio.
@@ -3001,6 +3005,8 @@ teams.invite.by=Convidado(a) por %s
teams.invite.description=Clique no botรฃo abaixo para se juntar ร equipa.
follow_blocked_user = Nรฃo pode seguir esta organizaรงรฃo porque esta organizaรงรฃo bloqueou-o/a.
open_dashboard = Abrir painel de controlo
+settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de utilizador antigo estarรก disponรญvel para todos apรณs um perรญodo de espera de %[1]d dia, podendo ainda reivindicar o nome de utilizador antigo durante o perรญodo de espera.
+settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de utilizador antigo estarรก disponรญvel para todos apรณs um perรญodo de espera de %[1]d dias, podendo ainda reivindicar o nome de utilizador antigo durante o perรญodo de espera.
[admin]
dashboard=Painel de controlo
@@ -3821,6 +3827,13 @@ arch.version.backup = Cรณpia de seguranรงa
arch.version.replaces = Substitui
container.images.title = Imagens
search_in_external_registry = Procurar em %s
+alt.registry = Configure este registo a partir da linha de comandos:
+alt.registry.install = Para instalar o pacote, execute o seguinte comando:
+alt.install = Instalar pacote
+alt.repository = Informaรงรฃo do repositรณrio
+alt.repository.architectures = Arquiteturas
+alt.repository.multiple_groups = Este pacote estรก disponรญvel em vรกrios grupos.
+alt.setup = Adicionar um repositรณrio ร lista de repositรณrios ligados (escolha a arquitetura necessรกria em vez de '_arch_'):
[secrets]
secrets=Segredos
diff --git a/options/locale/locale_ru-RU.ini b/options/locale/locale_ru-RU.ini
index 5ed8dae67b..de6d9292af 100644
--- a/options/locale/locale_ru-RU.ini
+++ b/options/locale/locale_ru-RU.ini
@@ -680,6 +680,8 @@ Biography = ะ ัะตะฑะต
Website = ะะตะฑ-ัะฐะนั
Location = ะะตััะพะฟะพะปะพะถะตะฝะธะต
To = ะะฐะทะฒะฐะฝะธะต ะฒะตัะฒะธ
+email_domain_is_not_allowed = ะะพะผะตะฝ ะฐะดัะตัะฐ ัะป. ะฟะพััั %s ะฝะต ัะฐะทัะตััะฝ ะบ ะธัะฟะพะปัะทะพะฒะฐะฝะธั. ะฃะฑะตะดะธัะตัั, ััะพ ะพะฝ ะฒะฒะตะดัะฝ ะฟัะฐะฒะธะปัะฝะพ ะธะปะธ ะฟะพะฟัะพะฑัะนัะต ะดััะณะพะน ะฐะดัะตั.
+username_claiming_cooldown = ะญัะพ ะธะผั ะฟะพะบะฐ ะฝะต ะผะพะถะตั ะฑััั ะทะฐะฝััะพ, ั.ะบ. ััะพะบ ะตะณะพ ะทะฐัะธัั ะตัั ะฝะต ะฒััะตะป. ะะณะพ ะฟะพะปััะธััั ะทะฐะฝััั ะฟะพัะปะต %[1]s.
[user]
@@ -761,7 +763,7 @@ update_language_success=ะฏะทัะบ ะพะฑะฝะพะฒะปัะฝ.
update_profile_success=ะะฐั ะฟัะพัะธะปั ััะฟะตัะฝะพ ะพะฑะฝะพะฒะปัะฝ.
change_username=ะะฐัะต ะธะผั ะฟะพะปัะทะพะฒะฐัะตะปั ะฑัะปะพ ะธะทะผะตะฝะตะฝะพ.
change_username_prompt=ะะฑัะฐัะธัะต ะฒะฝะธะผะฐะฝะธะต: ะธะทะผะตะฝะตะฝะธะต ะธะผะตะฝะธ ะฟะพะปัะทะพะฒะฐัะตะปั ัะฐะบะถะต ะผะตะฝัะตั URL ะฒะฐัะตะน ััััะฝะพะน ะทะฐะฟะธัะธ.
-change_username_redirect_prompt=ะกัะฐัะพะต ะธะผั ะฟะพะปัะทะพะฒะฐัะตะปั ะฑัะดะตั ะฟะตัะตะฝะฐะฟัะฐะฒะปััั ะฝะฐ ะฝะพะฒะพะต ะดะพ ัะตั ะฟะพั, ะฟะพะบะฐ ะตะณะพ ะฝะต ะทะฐะนะผัั.
+change_username_redirect_prompt=ะกัะฐัะพะต ะธะผั ะฑัะดะตั ะฟะตัะตะฝะฐะฟัะฐะฒะปััั ะฝะฐ ะฝะพะฒะพะต ะดะพ ัะตั ะฟะพั, ะฟะพะบะฐ ะพะฝะพ ะฝะต ะฑัะดะตั ะทะฐะฝััะพ.
continue=ะะฐะปะตะต
cancel=ะัะผะตะฝะฐ
language=ะฏะทัะบ
@@ -1057,6 +1059,8 @@ language.description = ะัะฑัะฐะฝะฝัะน ัะทัะบ ะฑัะดะตั ัะพั ัะฐะฝัะฝ
language.localization_project = ะะพะผะพะณะธัะต ั ะฟะตัะตะฒะพะดะพะผ Forgejo ะฝะฐ ัะฒะพะน ัะทัะบ! ะะพะดัะพะฑะฝะตะต.
user_block_yourself = ะะตะปัะทั ะทะฐะฑะปะพะบะธัะพะฒะฐัั ัะตะฑั.
pronouns_custom_label = ะััะณะธะต ะผะตััะพะธะผะตะฝะธั
+change_username_redirect_prompt.with_cooldown.one = ะัะตะถะฝะตะต ะธะผั ะฑัะดะตั ะดะพัััะฟะฝะพ ะดะปั ะธัะฟะพะปัะทะพะฒะฐะฝะธั ะดััะณะธะผ ะฟะพะปัะทะพะฒะฐัะตะปัะผ ะฟะพัะปะต ะธััะตัะตะฝะธั ะทะฐัะธัั ะฒ %[1]d ะดะตะฝั. ะั ัะผะพะถะตัะต ะฒะตัะฝััั ะตะณะพ ัะตะฑะต ะฒะพ ะฒัะตะผั ััะพะบะฐ ะทะฐัะธัั.
+change_username_redirect_prompt.with_cooldown.few = ะัะตะถะฝะตะต ะธะผั ะฑัะดะตั ะดะพัััะฟะฝะพ ะดะปั ะธัะฟะพะปัะทะพะฒะฐะฝะธั ะดััะณะธะผ ะฟะพะปัะทะพะฒะฐัะตะปัะผ ะฟะพัะปะต ะธััะตัะตะฝะธั ะทะฐัะธัั ะฒ %[1]d ะดะฝะตะน. ะั ัะผะพะถะตัะต ะฒะตัะฝััั ะตะณะพ ัะตะฑะต ะฒะพ ะฒัะตะผั ััะพะบะฐ ะทะฐัะธัั.
[repo]
owner=ะะปะฐะดะตะปะตั
@@ -2650,7 +2654,7 @@ tag.create_tag_from=ะกะพะทะดะฐัั ะฝะพะฒัะน ัะตะณ ะธะท ยซ%sยป
tag.create_success=ะขะตะณ ยซ%sยป ัะพะทะดะฐะฝ.
-topic.manage_topics=ะ ะตะดะฐะบัะธัะพะฒะฐัั ัะตะผะฐัะธัะตัะบะธะต ะผะตัะบะธ
+topic.manage_topics=ะะทะผะตะฝะธัั ัะตะผั
topic.done=ะกะพั ัะฐะฝะธัั
topic.count_prompt=ะะตะปัะทั ะฒัะฑัะฐัั ะฑะพะปะตะต 25 ัะตะผ
topic.format_prompt=ะขะตะผั ะดะพะปะถะฝั ะฝะฐัะธะฝะฐัััั ั ะฑัะบะฒั ะธะปะธ ัะธััั ะธ ะผะพะณัั ัะพะดะตัะถะฐัั ะดะตัะธัั (ยซ-ยป) ะธ ัะพัะบะธ (ยซ.ยป). ะะปะธะฝะฐ ัะตะผั ะฝะต ะดะพะปะถะฝะฐ ะฟัะตะฒััะฐัั 35 ัะธะผะฒะพะปะพะฒ. ะัะต ะฑัะบะฒั ะดะพะปะถะฝั ะฑััั ัััะพัะฝัะผะธ.
@@ -3003,6 +3007,8 @@ teams.invite.description=ะะฐะถะผะธัะต ะฝะฐ ะบะฝะพะฟะบั ะฝะธะถะต, ััะพะฑั
follow_blocked_user = ะั ะฝะต ะผะพะถะตัะต ะฟะพะดะฟะธัะฐัััั ะฝะฐ ััั ะพัะณะฐะฝะธะทะฐัะธั, ั.ะบ. ะฒั ะฒ ะฝะตะน ะทะฐะฑะปะพะบะธัะพะฒะฐะฝั.
teams.general_access = ะะฐัััะฐะธะฒะฐะตะผัะน ะดะพัััะฟ
open_dashboard = ะัะบัััั ะฟะฐะฝะตะปั
+settings.change_orgname_redirect_prompt.with_cooldown.few = ะัะตะถะฝะตะต ะฝะฐะทะฒะฐะฝะธะต ะฑัะดะตั ะดะพัััะฟะฝะพ ะดะปั ะธัะฟะพะปัะทะพะฒะฐะฝะธั ะดััะณะธะผ ะฟะพะปัะทะพะฒะฐัะตะปัะผ ะฟะพัะปะต ะธััะตัะตะฝะธั ะทะฐัะธัั ะฒ %[1]d ะดะฝะตะน. ะั ัะผะพะถะตัะต ะฒะตัะฝััั ะตะณะพ ะฒะพ ะฒัะตะผั ััะพะบะฐ ะทะฐัะธัั.
+settings.change_orgname_redirect_prompt.with_cooldown.one = ะัะตะถะฝะตะต ะฝะฐะทะฒะฐะฝะธะต ะฑัะดะตั ะดะพัััะฟะฝะพ ะดะปั ะธัะฟะพะปัะทะพะฒะฐะฝะธั ะดััะณะธะผ ะฟะพะปัะทะพะฒะฐัะตะปัะผ ะฟะพัะปะต ะธััะตัะตะฝะธั ะทะฐัะธัั ะฒ %[1]d ะดะตะฝั. ะั ัะผะพะถะตัะต ะฒะตัะฝััั ะตะณะพ ะฒะพ ะฒัะตะผั ััะพะบะฐ ะทะฐัะธัั.
[admin]
dashboard=ะะฐะฝะตะปั ัะฟัะฐะฒะปะตะฝะธั
@@ -3708,7 +3714,7 @@ composer.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั Co
composer.dependencies=ะะฐะฒะธัะธะผะพััะธ
composer.dependencies.development=ะะฐะฒะธัะธะผะพััะธ ะดะปั ัะฐะทัะฐะฑะพัะบะธ
conan.details.repository=ะ ะตะฟะพะทะธัะพัะธะน
-conan.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+conan.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
conan.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั Conan, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
conda.registry=ะัะพะฟะธัะธัะต ััะพั ัะตะตััั ะฒ ะบะฐัะตััะฒะต ัะตะฟะพะทะธัะพัะธั Conda ะฒ ัะฒะพัะผ ัะฐะนะปะต .condarc:
conda.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั Conda, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
@@ -3723,7 +3729,7 @@ container.labels.key=ะะปัั
container.labels.value=ะะฝะฐัะตะฝะธะต
cran.registry=ะะฐัััะพะนัะต ััะพั ัะตะตััั ะฒ ัะฐะนะปะต Rprofile.site:
cran.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
-debian.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+debian.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
debian.registry.info=ะัะฑะตัะธัะต $distribution ะธ $component ะธะท ัะฟะธัะบะฐ ะฝะธะถะต.
debian.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
debian.repository=ะ ัะตะฟะพะทะธัะพัะธะธ
@@ -3732,13 +3738,13 @@ debian.repository.components=ะะพะผะฟะพะฝะตะฝัั
debian.repository.architectures=ะัั ะธัะตะบัััั
generic.download=ะกะบะฐัะฐัั ะฟะฐะบะตั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
go.install=ะฃััะฐะฝะพะฒะธัะต ะฟะฐะบะตั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
-helm.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+helm.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
helm.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
maven.registry=ะะฐัััะพะนัะต ัะตะตััั ะฒ ัะฐะนะปะต pom.xml ะฒะฐัะตะณะพ ะฟัะพะตะบัะฐ:
maven.install=ะงัะพะฑั ะธัะฟะพะปัะทะพะฒะฐัั ะฟะฐะบะตั, ะฒะบะปััะธัะต ะฒ ะฑะปะพะบ dependencies ะฒ ัะฐะนะปะต pom.xml ัะปะตะดัััะตะต:
maven.install2=ะัะฟะพะปะฝะธัั ัะตัะตะท ะบะพะผะฐะฝะดะฝัั ัััะพะบั:
maven.download=ะงัะพะฑั ัะบะฐัะฐัั ะทะฐะฒะธัะธะผะพััั, ะทะฐะฟัััะธัะต ะฒ ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะต:
-nuget.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+nuget.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
nuget.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั NuGet, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
nuget.dependency.framework=ะฆะตะปะตะฒะพะน ััะตะนะผะฒะพัะบ
npm.registry=ะะฐัััะพะนัะต ัะตะตััั ะฒ ัะฐะนะปะต .npmrc ะฒะฐัะตะณะพ ะฟัะพะตะบัะฐ:
@@ -3752,7 +3758,7 @@ npm.details.tag=ะขะตะณ
pub.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั Dart, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
pypi.requires=ะขัะตะฑัะตััั Python
pypi.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั ั ะฟะพะผะพััั pip, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
-rpm.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+rpm.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
rpm.distros.redhat=ะฝะฐ ะดะธัััะธะฑััะธะฒะฐั ัะตะผะตะนััะฒะฐ RedHat
rpm.distros.suse=ะฝะฐ ะดะธัััะธะฑััะธะฒะฐั ัะตะผะตะนััะฒะฐ SUSE
rpm.install=ะงัะพะฑั ัััะฐะฝะพะฒะธัั ะฟะฐะบะตั, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
@@ -3764,7 +3770,7 @@ rubygems.dependencies.runtime=ะะฐะฒะธัะธะผะพััะธ ะฒัะตะผะตะฝะธ ะฒัะฟะพะปะฝ
rubygems.dependencies.development=ะะฐะฒะธัะธะผะพััะธ ะดะปั ัะฐะทัะฐะฑะพัะบะธ
rubygems.required.ruby=ะขัะตะฑัะตััั ะฒะตััะธั Ruby
rubygems.required.rubygems=ะขัะตะฑัะตััั ะฒะตััะธั RubyGem
-swift.registry=ะะฐัััะพะธัั ัะตะตััั ะธะท ะบะพะผะฐะฝะดะฝะพะน ัััะพะบะธ:
+swift.registry=ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
swift.install=ะะพะฑะฐะฒััะต ะฟะฐะบะตั ะฒ ัะฒะพะน ัะฐะนะป Package.swift:
swift.install2=ะธ ะทะฐะฟัััะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
vagrant.install=ะงัะพะฑั ะดะพะฑะฐะฒะธัั ะฑะพะบั Vagrant, ะฒัะฟะพะปะฝะธัะต ัะปะตะดััััั ะบะพะผะฐะฝะดั:
@@ -3834,6 +3840,9 @@ container.images.title = ะะฑัะฐะทั
search_in_external_registry = ะะฐะนัะธ ะฒ %s
alt.repository = ะ ัะตะฟะพะทะธัะพัะธะธ
alt.repository.architectures = ะัั ะธัะตะบัััั
+alt.registry = ะะพะฑะฐะฒััะต ัะตะตััั ะบะพะผะฐะฝะดะพะน:
+alt.repository.multiple_groups = ะญัะพั ะฟะฐะบะตั ะดะพัััะฟะตะฝ ะฒ ะฝะตัะบะพะปัะบะธั ะณััะฟะฟะฐั .
+alt.setup = ะะพะฑะฐะฒััะต ัะตะฟะพะทะธัะพัะธะน ะฒ ัะฒะพะน ัะฟะธัะพะบ ัะตะฟะพะทะธัะพัะธะตะฒ (ะฒัะฑะตัะธัะต ะฟะพะดั ะพะดัััั ะฐัั ะธัะตะบัััั ะฒะผะตััะพ ยซ_arch_ยป):
[secrets]
secrets=ะกะตะบัะตัั
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 472ce499f1..a9aee2c373 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -666,6 +666,8 @@ invalid_group_team_map_error = ` ะฟัะธะทะฝะฐัะตะฝะฝั ะฝะตะดัะนัะฝะต: %s`
unsupported_login_type = ะฆะตะน ัะธะฟ ะฒั ะพะดั ะฝะต ะฟัะดััะธะผัั ะฒะธะดะฐะปะตะฝะฝั ะพะฑะปัะบะพะฒะพะณะพ ะทะฐะฟะธัั.
admin_cannot_delete_self = ะะธ ะฝะต ะผะพะถะตัะต ะฒะธะดะฐะปะธัะธ ัะตะฑะต, ัะบัะพ ะฒะธ ั ะฐะดะผัะฝััััะฐัะพัะพะผ. ะกะฟะพัะฐัะบั ะทะฝัะผััั ัะท ัะตะฑะต ะฟัะฐะฒะฐ ะฐะดะผัะฝััััะฐัะพัะฐ.
unset_password = ะะปั ะบะพัะธัััะฒะฐัะฐ ะฝะต ะฒััะฐะฝะพะฒะปะตะฝะพ ะฟะฐัะพะปั.
+username_claiming_cooldown = ะฆะต ัะผ'ั ะบะพัะธัััะฒะฐัะฐ ะฝะต ะผะพะถะฝะฐ ะฟัะธัะฒะพััะธ, ะพัะบัะปัะบะธ ะนะพะณะพ ะฟะตััะพะด ะทะฐั ะธััั ัะต ะฝะต ะทะฐะบัะฝัะธะฒัั. ะะผ'ั ะผะพะถะฝะฐ ะฑัะดะต ะฟัะธัะฒะพััะธ %[1]s.
+email_domain_is_not_allowed = ะะพะผะตะฝ ะฐะดัะตัะธ ะตะปะตะบััะพะฝะฝะพั ะฟะพััะธ %s ะบะพะฝัะปัะบััั ะท EMAIL_DOMAIN_ALLOWLIST ะฐะฑะพ EMAIL_DOMAIN_BLOCKLIST. ะะตัะตะฒัััะต, ัะธ ะฒะธ ะฟัะฐะฒะธะปัะฝะพ ะฒะบะฐะทะฐะปะธ ะฐะดัะตัั ะตะปะตะบััะพะฝะฝะพั ะฟะพััะธ.
[user]
@@ -761,7 +763,7 @@ update_password=ะะฝะพะฒะธัะธ ะฟะฐัะพะปั
old_password=ะะพัะพัะฝะธะน ะฟะฐัะพะปั
new_password=ะะพะฒะธะน ะฟะฐัะพะปั
password_incorrect=ะะพัะพัะฝะธะน ะฟะฐัะพะปั ะฝะตะฟัะฐะฒะธะปัะฝะธะน.
-change_password_success=ะะฐั ะฟะฐัะพะปั ะฑัะฒ ะพะฝะพะฒะปะตะฝะธะน. ะขะตะฟะตั ัะฒัะนะดััั ะฒ ัะธััะตะผั, ะฒะธะบะพัะธััะพะฒัััะธ ะฝะพะฒะธะน ะฟะฐัะพะปั.
+change_password_success=ะะฐั ะฟะฐัะพะปั ะพะฝะพะฒะปะตะฝะพ. ะัะดัะตะฟะตั ะฒั ะพะดััะต ะฒ ัะธััะตะผั, ะฒะธะบะพัะธััะพะฒัััะธ ะฝะพะฒะธะน ะฟะฐัะพะปั.
password_change_disabled=ะะตะปะพะบะฐะปัะฝั ะฐะบะฐัะฝัะธ ะฝะต ะผะพะถััั ะทะผัะฝะธัะธ ะฟะฐัะพะปั ัะตัะตะท Forgejo.
emails=ะะดัะตัะฐ ะตะปะตะบััะพะฝะฝะพั ะฟะพััะธ
@@ -1006,6 +1008,9 @@ key_signature_ssh_placeholder = ะะพัะธะฝะฐััััั ะท ยซ-----BEGIN SSH SIGNA
user_block_yourself = ะะธ ะฝะต ะผะพะถะตัะต ะทะฐะฑะปะพะบัะฒะฐัะธ ัะตะฑะต.
pronouns_custom_label = ะะฝัั ะทะฐะนะผะตะฝะฝะธะบะธ
repo_and_org_access = ะะพัััะฟ ะดะพ ัะตะฟะพะทะธัะพััั ัะฐ ะพัะณะฐะฝัะทะฐััั
+change_username_redirect_prompt.with_cooldown.few = ะกัะฐัะต ัะผ'ั ะบะพัะธัััะฒะฐัะฐ ะฑัะดะต ะดะพัััะฟะฝะต ะฒััะผ ะฟััะปั ะฟะตััะพะดั ะทะฐั ะธััั, ัะบะธะน ััะธะฒะฐัะธะผะต %[1]d ะดะฝัะฒ. ะัะพััะณะพะผ ะฟะตััะพะดั ะทะฐั ะธััั ะฒะธ ัะต ะผะพะถะตัะต ะฟะพะฒะตัะฝััะธ ัะพะฑั ััะฐัะต ัะผ'ั.
+change_username_redirect_prompt.with_cooldown.one = ะกัะฐัะต ัะผ'ั ะบะพัะธัััะฒะฐัะฐ ะฑัะดะต ะดะพัััะฟะฝะต ะฒััะผ ะฟััะปั ะฟะตััะพะดั ะทะฐั ะธััั, ัะบะธะน ััะธะฒะฐัะธะผะต %[1]d ะดะตะฝั. ะัะพััะณะพะผ ะฟะตััะพะดั ะทะฐั ะธััั ะฒะธ ัะต ะผะพะถะตัะต ะฟะพะฒะตัะฝััะธ ัะพะฑั ััะฐัะต ัะผ'ั.
+change_username_redirect_prompt = ะกัะฐัะต ัะผ'ั ะบะพัะธัััะฒะฐัะฐ ะฑัะดะต ะฟะตัะตะฝะฐะฟัะฐะฒะปะตะฝะฝัะผ, ะฟะพะบะธ ั ัะพัั ะฝะต ะฟัะธัะฒะพััั ัะผ'ั ัะพะฑั.
[repo]
owner=ะะปะฐัะฝะธะบ
@@ -2595,6 +2600,8 @@ follow_blocked_user = ะะธ ะฝะต ะผะพะถะตัะต ััะตะถะธัะธ ะทะฐ ัััั ะพัะณ
teams.invite.description = ะฉะพะฑ ะฟัะธัะดะฝะฐัะธัั ะดะพ ะบะพะผะฐะฝะดะธ, ะฝะฐัะธัะฝััั ะบะฝะพะฟะบั ะฝะธะถัะต.
teams.invite.title = ะะฐั ะทะฐะฟัะพัะตะฝะพ ะฟัะธัะดะฝะฐัะธัั ะดะพ ะบะพะผะฐะฝะดะธ %s ะฒ ะพัะณะฐะฝัะทะฐััั %s.
form.name_reserved = ะะฐะทะฒั ะพัะณะฐะฝัะทะฐััั ยซ%sยป ะทะฐัะตะทะตัะฒะพะฒะฐะฝะพ.
+settings.change_orgname_redirect_prompt.with_cooldown.one = ะกัะฐัะฐ ะฝะฐะทะฒะฐ ะฑัะดะต ะดะพัััะฟะฝะฐ ะฒััะผ ะฟััะปั ะฟะตััะพะดั ะทะฐั ะธััั, ัะบะธะน ััะธะฒะฐัะธะผะต %[1]d ะดะตะฝั. ะัะพััะณะพะผ ะฟะตััะพะดั ะทะฐั ะธััั ะฒะธ ัะต ะผะพะถะตัะต ะฟะพะฒะตัะฝััะธ ััะฐัั ะฝะฐะทะฒั.
+settings.change_orgname_redirect_prompt.with_cooldown.few = ะกัะฐัะฐ ะฝะฐะทะฒะฐ ะฑัะดะต ะดะพัััะฟะฝะฐ ะฒััะผ ะฟััะปั ะฟะตััะพะดั ะทะฐั ะธััั, ัะบะธะน ััะธะฒะฐัะธะผะต %[1]d ะดะฝัะฒ. ะัะพััะณะพะผ ะฟะตััะพะดั ะทะฐั ะธััั ะฒะธ ัะต ะผะพะถะตัะต ะฟะพะฒะตัะฝััะธ ััะฐัั ะฝะฐะทะฒั.
[admin]
dashboard=ะะฐะฝะตะปั ัะฟัะฐะฒะปัะฝะฝั
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index b17d85cffa..a527197ce3 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -680,6 +680,8 @@ AccessToken = ่ฎฟ้ฎไปค็
Description = ๆ่ฟฐ
Pronouns = ไปฃ็งฐ
Biography = ็ฎๅ
+username_claiming_cooldown = ็จๆทๅไธ่ฝ่ขซ่ฎค้ข๏ผๅ ไธบๅ ถไปๅคไบๅทๅดๆ้ดใๅ ถๅฏไปฅๅจ%[1]sๅ่ขซ่ฎค้ขใ
+email_domain_is_not_allowed = ็จๆท็ตๅญ้ฎ็ฎฑ็ๅๅ%sไธEMAIL_DOMAIN_ALLOWLISTๆEMAIL_DOMAIN_BLOCKLISTๅฒ็ชใ่ฏท็กฎไฟๆจๆญฃ็กฎ่ฎพ็ฝฎไบ็ตๅญ้ฎไปถๅฐๅใ
[user]
change_avatar=ไฟฎๆนๅคดๅโฆ
@@ -804,7 +806,7 @@ old_password=ๅฝๅๅฏ็
new_password=ๆฐ็ๅฏ็
retype_new_password=็กฎ่ฎคๆฐๅฏ็
password_incorrect=ๅฝๅๅฏ็ ไธๆญฃ็กฎใ
-change_password_success=ๆจ็ๅฏ็ ๅทฒๆดๆฐใไป็ฐๅจๅผๅงไฝฟ็จๆจ็ๆฐๅฏ็ ็ปๅฝใ
+change_password_success=ๆจ็ๅฏ็ ๅทฒๆดๆฐใไป็ฐๅจๅผๅง่ฏทไฝฟ็จๆจ็ๆฐๅฏ็ ็ปๅฝใ
password_change_disabled=้ๆฌๅฐๅธๆทไธ่ฝ้่ฟ Forgejo ็ web ็้ขๆดๆนๅฏ็ ใ
emails=้ฎ็ฎฑๅฐๅ
@@ -1056,6 +1058,8 @@ language.description = ๆญค่ฏญ่จๅฐไฟๅญๅฐๆจ็่ดฆๅทไธญ๏ผๅนถๅจๆจ็ปๅฝๅ
language.localization_project = ๅธฎๅฉๆไปฌๅฐ Forgejo ็ฟป่ฏๆๆจ็่ฏญ่จ๏ผไบ่งฃๆดๅคใ
user_block_yourself = ๆจไธ่ฝๅฑ่ฝ่ชๅทฑใ
pronouns_custom_label = ่ชๅฎไนไปฃ่ฏ
+change_username_redirect_prompt.with_cooldown.one = ๆง็็จๆทๅๅฐๅจ%[1]dๅคฉ็ๅทๅดๆๅๅฏนๆๆไบบๅฏ็จ๏ผๆจไปๅฏไปฅๅจๆญคๆ้ด้ๆฐ่ฎค้ขๆง็็จๆทๅใ
+change_username_redirect_prompt.with_cooldown.few = ๆง็็จๆทๅๅฐๅจ%[1]dๅคฉ็ๅทๅดๆๅๅฏนๆๆไบบๅฏ็จ๏ผๆจไปๅฏไปฅๅจๆญคๆ้ด้ๆฐ่ฎค้ขๆง็็จๆทๅใ
[repo]
new_repo_helper=ไปฃ็ ไปๅบๅ ๅซไบๆๆ็้กน็ฎๆไปถ๏ผๅ ๆฌ็ๆฌๅๅฒ่ฎฐๅฝใๅทฒ็ปๅจๅ ถไปๅฐๆนๆ็ฎกไบ๏ผ่ฟ็งปไปๅบใ
@@ -2866,6 +2870,7 @@ issues.context.menu = ่ฏ่ฎบ่ๅ
issues.reaction.alt_add = ๅฏน่ฏ่ฎบๆทปๅ %[1]s ๅๅบใ
release.summary_card_alt = ไปๅบ %[2]s ไธญๆ ้ขไธบ %[1]s ็็ๆฌๅๅธ็ๆ่ฆๅก็
summary_card_alt = ไปๅบ %s ็ๆ่ฆๅก็
+editor.commit_email = ๆไบค็ตๅญ้ฎไปถ
[graphs]
component_loading=ๆญฃๅจๅ ่ฝฝ %sโฆ
@@ -3001,6 +3006,8 @@ teams.invite.by=้่ฏทไบบ %s
teams.invite.description=่ฏท็นๅปไธ้ข็ๆ้ฎๅ ๅ ฅๅข้ใ
follow_blocked_user = ไฝ ๆ ๆณๅ ณๆณจๆญค็ป็ป๏ผๅ ไธบๆญค็ป็ปๅทฒๅฑ่ฝไฝ ใ
open_dashboard = ๆๅผไปช่กจ็
+settings.change_orgname_redirect_prompt.with_cooldown.one = ๆง็็จๆทๅๅฐๅจ%[1]dๅคฉ็ๅทๅดๆๅๅฏนๆๆไบบๅฏ็จ๏ผๆจไปๅฏไปฅๅจๆญคๆ้ด้ๆฐ่ฎค้ขๆง็็จๆทๅใ
+settings.change_orgname_redirect_prompt.with_cooldown.few = ๆง็็จๆทๅๅฐๅจ%[1]dๅคฉ็ๅทๅดๆๅๅฏนๆๆไบบๅฏ็จ๏ผๆจไปๅฏไปฅๅจๆญคๆ้ด้ๆฐ่ฎค้ขๆง็็จๆทๅใ
[admin]
dashboard=็ฎก็้ขๆฟ
diff --git a/package-lock.json b/package-lock.json
index 33ff9157ca..21596d1f45 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -62,7 +62,7 @@
"devDependencies": {
"@axe-core/playwright": "4.10.1",
"@eslint-community/eslint-plugin-eslint-comments": "4.4.1",
- "@playwright/test": "1.49.1",
+ "@playwright/test": "1.50.1",
"@stoplight/spectral-cli": "6.14.2",
"@stylistic/eslint-plugin-js": "2.12.1",
"@stylistic/stylelint-plugin": "3.1.1",
@@ -86,9 +86,9 @@
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.14.0",
- "happy-dom": "16.3.0",
+ "happy-dom": "16.8.1",
"license-checker-rseidelsohn": "4.4.2",
- "markdownlint-cli": "0.43.0",
+ "markdownlint-cli": "0.44.0",
"postcss-html": "1.8.0",
"stylelint": "16.12.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
@@ -3350,13 +3350,13 @@
}
},
"node_modules/@playwright/test": {
- "version": "1.49.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz",
- "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==",
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.50.1.tgz",
+ "integrity": "sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright": "1.49.1"
+ "playwright": "1.50.1"
},
"bin": {
"playwright": "cli.js"
@@ -4533,6 +4533,16 @@
"@types/d3-selection": "*"
}
},
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
"node_modules/@types/doctrine": {
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.9.tgz",
@@ -4594,6 +4604,13 @@
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"license": "MIT"
},
+ "node_modules/@types/katex": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
+ "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/markdown-escape": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@types/markdown-escape/-/markdown-escape-1.1.3.tgz",
@@ -4607,6 +4624,13 @@
"integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==",
"license": "MIT"
},
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/node": {
"version": "22.10.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.7.tgz",
@@ -4646,6 +4670,13 @@
"license": "MIT",
"optional": true
},
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/urijs": {
"version": "1.19.25",
"resolved": "https://registry.npmjs.org/@types/urijs/-/urijs-1.19.25.tgz",
@@ -6143,6 +6174,39 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/chart.js": {
"version": "4.4.5",
"resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.5.tgz",
@@ -7271,6 +7335,20 @@
}
}
},
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/decode-uri-component": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
@@ -7363,6 +7441,30 @@
"node": ">= 0.6.0"
}
},
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/didyoumean": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -9155,9 +9257,9 @@
}
},
"node_modules/happy-dom": {
- "version": "16.3.0",
- "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.3.0.tgz",
- "integrity": "sha512-Q71RaIhyS21vhW17Tpa5W36yqQXIlE1TZ0A0Gguts8PShUSQE/7fBgxYGxgm3+5y0gF6afdlAVHLQqgrIcfRzg==",
+ "version": "16.8.1",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-16.8.1.tgz",
+ "integrity": "sha512-n0QrmT9lD81rbpKsyhnlz3DgnMZlaOkJPpgi746doA+HvaMC79bdWkwjrNnGJRvDrWTI8iOcJiVTJ5CdT/AZRw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -9527,6 +9629,32 @@
"node": ">=10.13.0"
}
},
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-array-buffer": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz",
@@ -9704,6 +9832,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -9783,6 +9922,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-js-type": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-js-type/-/is-js-type-3.0.0.tgz",
@@ -10796,14 +10946,21 @@
}
},
"node_modules/markdownlint": {
- "version": "0.36.1",
- "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.36.1.tgz",
- "integrity": "sha512-s73fU2CQN7WCgjhaQUQ8wYESQNzGRNOKDd+3xgVqu8kuTEhmwepd/mxOv1LR2oV046ONrTLBFsM7IoKWNvmy5g==",
+ "version": "0.37.4",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.37.4.tgz",
+ "integrity": "sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"markdown-it": "14.1.0",
- "markdownlint-micromark": "0.1.12"
+ "micromark": "4.0.1",
+ "micromark-core-commonmark": "2.0.2",
+ "micromark-extension-directive": "3.0.2",
+ "micromark-extension-gfm-autolink-literal": "2.1.0",
+ "micromark-extension-gfm-footnote": "2.1.0",
+ "micromark-extension-gfm-table": "2.1.0",
+ "micromark-extension-math": "3.1.0",
+ "micromark-util-types": "2.0.1"
},
"engines": {
"node": ">=18"
@@ -10813,20 +10970,20 @@
}
},
"node_modules/markdownlint-cli": {
- "version": "0.43.0",
- "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.43.0.tgz",
- "integrity": "sha512-6vwurKK4B21eyYzwgX6ph13cZS7hE6LZfcS8QyD722CyxVD2RtAvbZK2p7k+FZbbKORulEuwl+hJaEq1l6/hoQ==",
+ "version": "0.44.0",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz",
+ "integrity": "sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "commander": "~12.1.0",
- "glob": "~11.0.0",
- "ignore": "~6.0.2",
- "js-yaml": "^4.1.0",
+ "commander": "~13.1.0",
+ "glob": "~10.4.5",
+ "ignore": "~7.0.3",
+ "js-yaml": "~4.1.0",
"jsonc-parser": "~3.3.1",
- "jsonpointer": "5.0.1",
- "markdownlint": "~0.36.1",
- "minimatch": "~10.0.1",
+ "jsonpointer": "~5.0.1",
+ "markdownlint": "~0.37.4",
+ "minimatch": "~9.0.5",
"run-con": "~1.3.2",
"smol-toml": "~1.3.1"
},
@@ -10838,9 +10995,9 @@
}
},
"node_modules/markdownlint-cli/node_modules/commander": {
- "version": "12.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
- "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz",
+ "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==",
"dev": true,
"license": "MIT",
"engines": {
@@ -10848,55 +11005,36 @@
}
},
"node_modules/markdownlint-cli/node_modules/glob": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.1.tgz",
- "integrity": "sha512-zrQDm8XPnYEKawJScsnM0QzobJxlT/kHOOlRTio8IH/GrmxRE5fjllkzdaHclIuNjUQTJYH2xHNIGfdpJkDJUw==",
+ "version": "10.4.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
"dev": true,
"license": "ISC",
"dependencies": {
"foreground-child": "^3.1.0",
- "jackspeak": "^4.0.1",
- "minimatch": "^10.0.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
- "path-scurry": "^2.0.0"
+ "path-scurry": "^1.11.1"
},
"bin": {
"glob": "dist/esm/bin.mjs"
},
- "engines": {
- "node": "20 || >=22"
- },
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/markdownlint-cli/node_modules/ignore": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
- "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz",
+ "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
- "node_modules/markdownlint-cli/node_modules/jackspeak": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
- "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "dependencies": {
- "@isaacs/cliui": "^8.0.2"
- },
- "engines": {
- "node": "20 || >=22"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/markdownlint-cli/node_modules/jsonc-parser": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
@@ -10904,46 +11042,22 @@
"dev": true,
"license": "MIT"
},
- "node_modules/markdownlint-cli/node_modules/lru-cache": {
- "version": "11.0.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
- "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
+ "node_modules/markdownlint-cli/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
"dev": true,
"license": "ISC",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/markdownlint-cli/node_modules/path-scurry": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
- "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
- "dev": true,
- "license": "BlueOak-1.0.0",
"dependencies": {
- "lru-cache": "^11.0.0",
- "minipass": "^7.1.2"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": "20 || >=22"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/markdownlint-micromark": {
- "version": "0.1.12",
- "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.12.tgz",
- "integrity": "sha512-RlB6EwMGgc0sxcIhOQ2+aq7Zw1V2fBnzbXKGgYK/mVWdT7cz34fteKSwfYeo4rL6+L/q2tyC9QtD/PgZbkdyJQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/DavidAnson"
- }
- },
"node_modules/marked": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
@@ -11059,6 +11173,542 @@
"node": ">= 18"
}
},
+ "node_modules/micromark": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
+ "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz",
+ "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-extension-directive": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz",
+ "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "parse-entities": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-autolink-literal": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz",
+ "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-footnote": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
+ "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-gfm-table": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz",
+ "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-extension-math": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-math/-/micromark-extension-math-3.1.0.tgz",
+ "integrity": "sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/katex": "^0.16.0",
+ "devlop": "^1.0.0",
+ "katex": "^0.16.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
+ "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
+ "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
+ "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
+ "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
+ "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
+ "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
+ "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
+ "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
+ "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
+ "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
+ "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
+ "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
+ "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
+ "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
+ "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz",
+ "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
+ "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz",
+ "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/micromatch": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
@@ -11581,6 +12231,26 @@
"node": ">=6"
}
},
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -11817,13 +12487,13 @@
}
},
"node_modules/playwright": {
- "version": "1.49.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
- "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.50.1.tgz",
+ "integrity": "sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "playwright-core": "1.49.1"
+ "playwright-core": "1.50.1"
},
"bin": {
"playwright": "cli.js"
@@ -11836,9 +12506,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.49.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
- "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
+ "version": "1.50.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.50.1.tgz",
+ "integrity": "sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
diff --git a/package.json b/package.json
index 95129444fb..0736be5026 100644
--- a/package.json
+++ b/package.json
@@ -61,7 +61,7 @@
"devDependencies": {
"@axe-core/playwright": "4.10.1",
"@eslint-community/eslint-plugin-eslint-comments": "4.4.1",
- "@playwright/test": "1.49.1",
+ "@playwright/test": "1.50.1",
"@stoplight/spectral-cli": "6.14.2",
"@stylistic/eslint-plugin-js": "2.12.1",
"@stylistic/stylelint-plugin": "3.1.1",
@@ -85,9 +85,9 @@
"eslint-plugin-vue-scoped-css": "2.9.0",
"eslint-plugin-wc": "2.2.0",
"globals": "15.14.0",
- "happy-dom": "16.3.0",
+ "happy-dom": "16.8.1",
"license-checker-rseidelsohn": "4.4.2",
- "markdownlint-cli": "0.43.0",
+ "markdownlint-cli": "0.44.0",
"postcss-html": "1.8.0",
"stylelint": "16.12.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
diff --git a/renovate.json b/renovate.json
index c34ae1aaba..7efe4123b0 100644
--- a/renovate.json
+++ b/renovate.json
@@ -62,6 +62,7 @@
"description": "Group nodejs packages",
"matchPackageNames": [
"code.forgejo.org/oci/node",
+ "data.forgejo.org/oci/node",
"docker.io/library/node",
"docker.io/node",
"node"
diff --git a/routers/api/actions/runner/utils.go b/routers/api/actions/runner/utils.go
index 539be8d889..0fd7ca5c44 100644
--- a/routers/api/actions/runner/utils.go
+++ b/routers/api/actions/runner/utils.go
@@ -8,14 +8,8 @@ import (
"fmt"
actions_model "code.gitea.io/gitea/models/actions"
- "code.gitea.io/gitea/models/db"
secret_model "code.gitea.io/gitea/models/secret"
- actions_module "code.gitea.io/gitea/modules/actions"
- "code.gitea.io/gitea/modules/container"
- "code.gitea.io/gitea/modules/git"
- "code.gitea.io/gitea/modules/json"
"code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/services/actions"
runnerv1 "code.gitea.io/actions-proto-go/runner/v1"
@@ -65,82 +59,16 @@ func pickTask(ctx context.Context, runner *actions_model.ActionRunner) (*runnerv
}
func generateTaskContext(t *actions_model.ActionTask) *structpb.Struct {
- event := map[string]any{}
- _ = json.Unmarshal([]byte(t.Job.Run.EventPayload), &event)
-
- // TriggerEvent is added in https://github.com/go-gitea/gitea/pull/25229
- // This fallback is for the old ActionRun that doesn't have the TriggerEvent field
- // and should be removed in 1.22
- eventName := t.Job.Run.TriggerEvent
- if eventName == "" {
- eventName = t.Job.Run.Event.Event()
- }
-
- baseRef := ""
- headRef := ""
- ref := t.Job.Run.Ref
- sha := t.Job.Run.CommitSHA
- if pullPayload, err := t.Job.Run.GetPullRequestEventPayload(); err == nil && pullPayload.PullRequest != nil && pullPayload.PullRequest.Base != nil && pullPayload.PullRequest.Head != nil {
- baseRef = pullPayload.PullRequest.Base.Ref
- headRef = pullPayload.PullRequest.Head.Ref
-
- // if the TriggerEvent is pull_request_target, ref and sha need to be set according to the base of pull request
- // In GitHub's documentation, ref should be the branch or tag that triggered workflow. But when the TriggerEvent is pull_request_target,
- // the ref will be the base branch.
- if t.Job.Run.TriggerEvent == actions_module.GithubEventPullRequestTarget {
- ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name
- sha = pullPayload.PullRequest.Base.Sha
- }
- }
-
- refName := git.RefName(ref)
-
giteaRuntimeToken, err := actions.CreateAuthorizationToken(t.ID, t.Job.RunID, t.JobID)
if err != nil {
log.Error("actions.CreateAuthorizationToken failed: %v", err)
}
- taskContext, err := structpb.NewStruct(map[string]any{
- // standard contexts, see https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
- "action": "", // string, The name of the action currently running, or the id of a step. GitHub removes special characters, and uses the name __run when the current step runs a script without an id. If you use the same action more than once in the same job, the name will include a suffix with the sequence number with underscore before it. For example, the first script you run will have the name __run, and the second script will be named __run_2. Similarly, the second invocation of actions/checkout will be actionscheckout2.
- "action_path": "", // string, The path where an action is located. This property is only supported in composite actions. You can use this path to access files located in the same repository as the action.
- "action_ref": "", // string, For a step executing an action, this is the ref of the action being executed. For example, v2.
- "action_repository": "", // string, For a step executing an action, this is the owner and repository name of the action. For example, actions/checkout.
- "action_status": "", // string, For a composite action, the current result of the composite action.
- "actor": t.Job.Run.TriggerUser.Name, // string, The username of the user that triggered the initial workflow run. If the workflow run is a re-run, this value may differ from github.triggering_actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges.
- "api_url": setting.AppURL + "api/v1", // string, The URL of the GitHub REST API.
- "base_ref": baseRef, // string, The base_ref or target branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target.
- "env": "", // string, Path on the runner to the file that sets environment variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions."
- "event": event, // object, The full event webhook payload. You can access individual properties of the event using this context. This object is identical to the webhook payload of the event that triggered the workflow run, and is different for each event. The webhooks for each GitHub Actions event is linked in "Events that trigger workflows." For example, for a workflow run triggered by the push event, this object contains the contents of the push webhook payload.
- "event_name": eventName, // string, The name of the event that triggered the workflow run.
- "event_path": "", // string, The path to the file on the runner that contains the full event webhook payload.
- "graphql_url": "", // string, The URL of the GitHub GraphQL API.
- "head_ref": headRef, // string, The head_ref or source branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target.
- "job": fmt.Sprint(t.JobID), // string, The job_id of the current job.
- "ref": ref, // string, The fully-formed ref of the branch or tag that triggered the workflow run. For workflows triggered by push, this is the branch or tag ref that was pushed. For workflows triggered by pull_request, this is the pull request merge branch. For workflows triggered by release, this is the release tag created. For other triggers, this is the branch or tag ref that triggered the workflow run. This is only set if a branch or tag is available for the event type. The ref given is fully-formed, meaning that for branches the format is refs/heads/, for pull requests it is refs/pull//merge, and for tags it is refs/tags/. For example, refs/heads/feature-branch-1.
- "ref_name": refName.ShortName(), // string, The short ref name of the branch or tag that triggered the workflow run. This value matches the branch or tag name shown on GitHub. For example, feature-branch-1.
- "ref_protected": false, // boolean, true if branch protections are configured for the ref that triggered the workflow run.
- "ref_type": refName.RefType(), // string, The type of ref that triggered the workflow run. Valid values are branch or tag.
- "path": "", // string, Path on the runner to the file that sets system PATH variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions."
- "repository": t.Job.Run.Repo.OwnerName + "/" + t.Job.Run.Repo.Name, // string, The owner and repository name. For example, Codertocat/Hello-World.
- "repository_owner": t.Job.Run.Repo.OwnerName, // string, The repository owner's name. For example, Codertocat.
- "repositoryUrl": t.Job.Run.Repo.HTMLURL(), // string, The Git URL to the repository. For example, git://github.com/codertocat/hello-world.git.
- "retention_days": "", // string, The number of days that workflow run logs and artifacts are kept.
- "run_id": fmt.Sprint(t.Job.RunID), // string, A unique number for each workflow run within a repository. This number does not change if you re-run the workflow run.
- "run_number": fmt.Sprint(t.Job.Run.Index), // string, A unique number for each run of a particular workflow in a repository. This number begins at 1 for the workflow's first run, and increments with each new run. This number does not change if you re-run the workflow run.
- "run_attempt": fmt.Sprint(t.Job.Attempt), // string, A unique number for each attempt of a particular workflow run in a repository. This number begins at 1 for the workflow run's first attempt, and increments with each re-run.
- "secret_source": "Actions", // string, The source of a secret used in a workflow. Possible values are None, Actions, Dependabot, or Codespaces.
- "server_url": setting.AppURL, // string, The URL of the GitHub server. For example: https://github.com.
- "sha": sha, // string, The commit SHA that triggered the workflow. The value of this commit SHA depends on the event that triggered the workflow. For more information, see "Events that trigger workflows." For example, ffac537e6cbbf934b08745a378932722df287a53.
- "token": t.Token, // string, A token to authenticate on behalf of the GitHub App installed on your repository. This is functionally equivalent to the GITHUB_TOKEN secret. For more information, see "Automatic token authentication."
- "triggering_actor": "", // string, The username of the user that initiated the workflow run. If the workflow run is a re-run, this value may differ from github.actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges.
- "workflow": t.Job.Run.WorkflowID, // string, The name of the workflow. If the workflow file doesn't specify a name, the value of this property is the full path of the workflow file in the repository.
- "workspace": "", // string, The default working directory on the runner for steps, and the default location of your repository when using the checkout action.
+ gitCtx := actions.GenerateGiteaContext(t.Job.Run, t.Job)
+ gitCtx["token"] = t.Token
+ gitCtx["gitea_runtime_token"] = giteaRuntimeToken
- // additional contexts
- "gitea_default_actions_url": setting.Actions.DefaultActionsURL.URL(),
- "gitea_runtime_token": giteaRuntimeToken,
- })
+ taskContext, err := structpb.NewStruct(gitCtx)
if err != nil {
log.Error("structpb.NewStruct failed: %v", err)
}
@@ -150,68 +78,18 @@ func generateTaskContext(t *actions_model.ActionTask) *structpb.Struct {
func findTaskNeeds(ctx context.Context, task *actions_model.ActionTask) (map[string]*runnerv1.TaskNeed, error) {
if err := task.LoadAttributes(ctx); err != nil {
- return nil, fmt.Errorf("LoadAttributes: %w", err)
+ return nil, fmt.Errorf("task LoadAttributes: %w", err)
}
- if len(task.Job.Needs) == 0 {
- return nil, nil
- }
- needs := container.SetOf(task.Job.Needs...)
-
- jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: task.Job.RunID})
+ taskNeeds, err := actions.FindTaskNeeds(ctx, task.Job)
if err != nil {
- return nil, fmt.Errorf("FindRunJobs: %w", err)
+ return nil, err
}
-
- jobIDJobs := make(map[string][]*actions_model.ActionRunJob)
- for _, job := range jobs {
- jobIDJobs[job.JobID] = append(jobIDJobs[job.JobID], job)
- }
-
- ret := make(map[string]*runnerv1.TaskNeed, len(needs))
- for jobID, jobsWithSameID := range jobIDJobs {
- if !needs.Contains(jobID) {
- continue
- }
- var jobOutputs map[string]string
- for _, job := range jobsWithSameID {
- if job.TaskID == 0 || !job.Status.IsDone() {
- // it shouldn't happen, or the job has been rerun
- continue
- }
- got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID)
- if err != nil {
- return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err)
- }
- outputs := make(map[string]string, len(got))
- for _, v := range got {
- outputs[v.OutputKey] = v.OutputValue
- }
- if len(jobOutputs) == 0 {
- jobOutputs = outputs
- } else {
- jobOutputs = mergeTwoOutputs(outputs, jobOutputs)
- }
- }
+ ret := make(map[string]*runnerv1.TaskNeed, len(taskNeeds))
+ for jobID, taskNeed := range taskNeeds {
ret[jobID] = &runnerv1.TaskNeed{
- Outputs: jobOutputs,
- Result: runnerv1.Result(actions_model.AggregateJobStatus(jobsWithSameID)),
+ Outputs: taskNeed.Outputs,
+ Result: runnerv1.Result(taskNeed.Result),
}
}
-
return ret, nil
}
-
-// mergeTwoOutputs merges two outputs from two different ActionRunJobs
-// Values with the same output name may be overridden. The user should ensure the output names are unique.
-// See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#using-job-outputs-in-a-matrix-job
-func mergeTwoOutputs(o1, o2 map[string]string) map[string]string {
- ret := make(map[string]string, len(o1))
- for k1, v1 := range o1 {
- if len(v1) > 0 {
- ret[k1] = v1
- } else {
- ret[k1] = o2[k1]
- }
- }
- return ret
-}
diff --git a/routers/api/v1/misc/markup_test.go b/routers/api/v1/misc/markup_test.go
index df70ee49ef..32568b805f 100644
--- a/routers/api/v1/misc/markup_test.go
+++ b/routers/api/v1/misc/markup_test.go
@@ -112,7 +112,7 @@ Here are some links to the most important topics. You can find the full list of
Quick Links
Here are some links to the most important topics. You can find the full list of pages at the sidebar.
+
`,
}
diff --git a/routers/api/v1/user/gpg_key.go b/routers/api/v1/user/gpg_key.go
index 2fe4eb8e78..652007a78b 100644
--- a/routers/api/v1/user/gpg_key.go
+++ b/routers/api/v1/user/gpg_key.go
@@ -303,11 +303,7 @@ func DeleteGPGKey(ctx *context.APIContext) {
}
if err := asymkey_model.DeleteGPGKey(ctx, ctx.Doer, ctx.ParamsInt64(":id")); err != nil {
- if asymkey_model.IsErrGPGKeyAccessDenied(err) {
- ctx.Error(http.StatusForbidden, "", "You do not have access to this key")
- } else {
- ctx.Error(http.StatusInternalServerError, "DeleteGPGKey", err)
- }
+ ctx.Error(http.StatusInternalServerError, "DeleteGPGKey", err)
return
}
@@ -317,8 +313,6 @@ func DeleteGPGKey(ctx *context.APIContext) {
// HandleAddGPGKeyError handle add GPGKey error
func HandleAddGPGKeyError(ctx *context.APIContext, err error, token string) {
switch {
- case asymkey_model.IsErrGPGKeyAccessDenied(err):
- ctx.Error(http.StatusUnprocessableEntity, "GPGKeyAccessDenied", "You do not have access to this GPG key")
case asymkey_model.IsErrGPGKeyIDAlreadyUsed(err):
ctx.Error(http.StatusUnprocessableEntity, "GPGKeyIDAlreadyUsed", "A key with the same id already exists")
case asymkey_model.IsErrGPGKeyParsing(err):
diff --git a/routers/web/admin/users.go b/routers/web/admin/users.go
index 6bfc35cb99..36ce8d286c 100644
--- a/routers/web/admin/users.go
+++ b/routers/web/admin/users.go
@@ -83,6 +83,7 @@ func Users(ctx *context.Context) {
IsTwoFactorEnabled: util.OptionalBoolParse(statusFilterMap["is_2fa_enabled"]),
IsProhibitLogin: util.OptionalBoolParse(statusFilterMap["is_prohibit_login"]),
IncludeReserved: true, // administrator needs to list all accounts include reserved, bot, remote ones
+ Load2FAStatus: true,
ExtraParamStrings: extraParamStrings,
}, tplUsers)
}
diff --git a/routers/web/auth/auth.go b/routers/web/auth/auth.go
index 5cb4ebb440..ca8f06bdb1 100644
--- a/routers/web/auth/auth.go
+++ b/routers/web/auth/auth.go
@@ -225,15 +225,6 @@ func SignInPost(ctx *context.Context) {
log.Warn("Failed authentication attempt for %s from %s: %v", form.UserName, ctx.RemoteAddr(), err)
ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
ctx.HTML(http.StatusOK, "user/auth/prohibit_login")
- } else if user_model.IsErrUserInactive(err) {
- if setting.Service.RegisterEmailConfirm {
- ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
- ctx.HTML(http.StatusOK, TplActivate)
- } else {
- log.Warn("Failed authentication attempt for %s from %s: %v", form.UserName, ctx.RemoteAddr(), err)
- ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
- ctx.HTML(http.StatusOK, "user/auth/prohibit_login")
- }
} else {
ctx.ServerError("UserSignIn", err)
}
diff --git a/routers/web/auth/linkaccount.go b/routers/web/auth/linkaccount.go
index 9b0141c14e..8dce0a30a4 100644
--- a/routers/web/auth/linkaccount.go
+++ b/routers/web/auth/linkaccount.go
@@ -99,16 +99,6 @@ func handleSignInError(ctx *context.Context, userName string, ptrForm any, tmpl
log.Info("Failed authentication attempt for %s from %s: %v", userName, ctx.RemoteAddr(), err)
ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
ctx.HTML(http.StatusOK, "user/auth/prohibit_login")
- } else if user_model.IsErrUserInactive(err) {
- ctx.Data["user_exists"] = true
- if setting.Service.RegisterEmailConfirm {
- ctx.Data["Title"] = ctx.Tr("auth.active_your_account")
- ctx.HTML(http.StatusOK, TplActivate)
- } else {
- log.Info("Failed authentication attempt for %s from %s: %v", userName, ctx.RemoteAddr(), err)
- ctx.Data["Title"] = ctx.Tr("auth.prohibit_login")
- ctx.HTML(http.StatusOK, "user/auth/prohibit_login")
- }
} else {
ctx.ServerError(invoker, err)
}
diff --git a/routers/web/explore/org.go b/routers/web/explore/org.go
index 7178630b64..d13271ae53 100644
--- a/routers/web/explore/org.go
+++ b/routers/web/explore/org.go
@@ -39,7 +39,11 @@ func Organizations(ctx *context.Context) {
)
sortOrder := ctx.FormString("sort")
if sortOrder == "" {
- sortOrder = "newest"
+ if supportedSortOrders.Contains(setting.UI.ExploreDefaultSort) {
+ sortOrder = setting.UI.ExploreDefaultSort
+ } else {
+ sortOrder = "newest"
+ }
ctx.SetFormString("sort", sortOrder)
}
diff --git a/routers/web/explore/user.go b/routers/web/explore/user.go
index 15c60f546f..241e5f61a1 100644
--- a/routers/web/explore/user.go
+++ b/routers/web/explore/user.go
@@ -114,7 +114,9 @@ func RenderUserSearch(ctx *context.Context, opts *user_model.SearchUserOptions,
ctx.Data["Keyword"] = opts.Keyword
ctx.Data["Total"] = count
ctx.Data["Users"] = users
- ctx.Data["UsersTwoFaStatus"] = user_model.UserList(users).GetTwoFaStatus(ctx)
+ if opts.Load2FAStatus {
+ ctx.Data["UsersTwoFaStatus"] = user_model.UserList(users).GetTwoFaStatus(ctx)
+ }
ctx.Data["ShowUserEmail"] = setting.UI.ShowUserEmail
ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled
@@ -149,7 +151,11 @@ func Users(ctx *context.Context) {
)
sortOrder := ctx.FormString("sort")
if sortOrder == "" {
- sortOrder = "newest"
+ if supportedSortOrders.Contains(setting.UI.ExploreDefaultSort) {
+ sortOrder = setting.UI.ExploreDefaultSort
+ } else {
+ sortOrder = "newest"
+ }
ctx.SetFormString("sort", sortOrder)
}
diff --git a/routers/web/repo/blame.go b/routers/web/repo/blame.go
index 4f962d4c19..c7fbaaefcb 100644
--- a/routers/web/repo/blame.go
+++ b/routers/web/repo/blame.go
@@ -56,6 +56,11 @@ func RefBlame(ctx *context.Context) {
HandleGitError(ctx, "Repo.Commit.GetTreeEntryByPath", err)
return
}
+ if entry.IsDir() {
+ ctx.NotFound("Cannot blame directory", nil)
+ return
+ }
+
blob := entry.Blob()
ctx.Data["PageIsViewCode"] = true
diff --git a/routers/web/user/home.go b/routers/web/user/home.go
index c59dcf5c25..d67af29071 100644
--- a/routers/web/user/home.go
+++ b/routers/web/user/home.go
@@ -10,7 +10,6 @@ import (
"net/http"
"regexp"
"slices"
- "sort"
"strconv"
"strings"
@@ -242,7 +241,9 @@ func Milestones(ctx *context.Context) {
ctx.ServerError("SearchRepositoryByCondition", err)
return
}
- sort.Sort(showRepos)
+ slices.SortFunc(showRepos, func(a, b *repo_model.Repository) int {
+ return strings.Compare(a.FullName(), b.FullName())
+ })
for i := 0; i < len(milestones); {
for _, repo := range showRepos {
diff --git a/routers/web/user/home_test.go b/routers/web/user/home_test.go
index e1c8ca9a79..c09f609161 100644
--- a/routers/web/user/home_test.go
+++ b/routers/web/user/home_test.go
@@ -98,6 +98,8 @@ func TestMilestones(t *testing.T) {
assert.EqualValues(t, 1, ctx.Data["Total"])
assert.Len(t, ctx.Data["Milestones"], 1)
assert.Len(t, ctx.Data["Repos"], 2) // both repo 42 and 1 have milestones and both are owned by user 2
+ assert.EqualValues(t, "user2/glob", ctx.Data["Repos"].(repo_model.RepositoryList)[0].FullName())
+ assert.EqualValues(t, "user2/repo1", ctx.Data["Repos"].(repo_model.RepositoryList)[1].FullName())
}
func TestMilestonesForSpecificRepo(t *testing.T) {
diff --git a/routers/web/user/package.go b/routers/web/user/package.go
index 707c86db7a..70ea20d388 100644
--- a/routers/web/user/package.go
+++ b/routers/web/user/package.go
@@ -6,6 +6,7 @@ package user
import (
"fmt"
"net/http"
+ "slices"
"code.gitea.io/gitea/models/db"
org_model "code.gitea.io/gitea/models/organization"
@@ -23,7 +24,6 @@ import (
debian_module "code.gitea.io/gitea/modules/packages/debian"
rpm_module "code.gitea.io/gitea/modules/packages/rpm"
"code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/util"
"code.gitea.io/gitea/modules/web"
packages_helper "code.gitea.io/gitea/routers/api/packages/helper"
shared_user "code.gitea.io/gitea/routers/web/shared/user"
@@ -200,9 +200,9 @@ func ViewPackageVersion(ctx *context.Context) {
}
}
- ctx.Data["Branches"] = util.Sorted(branches.Values())
- ctx.Data["Repositories"] = util.Sorted(repositories.Values())
- ctx.Data["Architectures"] = util.Sorted(architectures.Values())
+ ctx.Data["Branches"] = slices.Sorted(branches.Seq())
+ ctx.Data["Repositories"] = slices.Sorted(repositories.Seq())
+ ctx.Data["Architectures"] = slices.Sorted(architectures.Seq())
case packages_model.TypeArch:
ctx.Data["SignMail"] = fmt.Sprintf("%s@noreply.%s", ctx.Package.Owner.Name, setting.Packages.RegistryHost)
groups := make(container.Set[string])
@@ -213,7 +213,7 @@ func ViewPackageVersion(ctx *context.Context) {
}
}
}
- ctx.Data["Groups"] = util.Sorted(groups.Values())
+ ctx.Data["Groups"] = slices.Sorted(groups.Seq())
case packages_model.TypeDebian:
distributions := make(container.Set[string])
components := make(container.Set[string])
@@ -232,9 +232,9 @@ func ViewPackageVersion(ctx *context.Context) {
}
}
- ctx.Data["Distributions"] = util.Sorted(distributions.Values())
- ctx.Data["Components"] = util.Sorted(components.Values())
- ctx.Data["Architectures"] = util.Sorted(architectures.Values())
+ ctx.Data["Distributions"] = slices.Sorted(distributions.Seq())
+ ctx.Data["Components"] = slices.Sorted(components.Seq())
+ ctx.Data["Architectures"] = slices.Sorted(architectures.Seq())
case packages_model.TypeRpm, packages_model.TypeAlt:
groups := make(container.Set[string])
architectures := make(container.Set[string])
@@ -250,8 +250,8 @@ func ViewPackageVersion(ctx *context.Context) {
}
}
- ctx.Data["Groups"] = util.Sorted(groups.Values())
- ctx.Data["Architectures"] = util.Sorted(architectures.Values())
+ ctx.Data["Groups"] = slices.Sorted(groups.Seq())
+ ctx.Data["Architectures"] = slices.Sorted(architectures.Seq())
}
var (
diff --git a/services/actions/context.go b/services/actions/context.go
new file mode 100644
index 0000000000..be1c85522b
--- /dev/null
+++ b/services/actions/context.go
@@ -0,0 +1,161 @@
+// Copyright 2025 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package actions
+
+import (
+ "context"
+ "fmt"
+
+ actions_model "code.gitea.io/gitea/models/actions"
+ "code.gitea.io/gitea/models/db"
+ actions_module "code.gitea.io/gitea/modules/actions"
+ "code.gitea.io/gitea/modules/container"
+ "code.gitea.io/gitea/modules/git"
+ "code.gitea.io/gitea/modules/json"
+ "code.gitea.io/gitea/modules/setting"
+)
+
+// GenerateGiteaContext generate the gitea context without token and gitea_runtime_token
+// job can be nil when generating a context for parsing workflow-level expressions
+func GenerateGiteaContext(run *actions_model.ActionRun, job *actions_model.ActionRunJob) map[string]any {
+ event := map[string]any{}
+ _ = json.Unmarshal([]byte(run.EventPayload), &event)
+
+ baseRef := ""
+ headRef := ""
+ ref := run.Ref
+ sha := run.CommitSHA
+ if pullPayload, err := run.GetPullRequestEventPayload(); err == nil && pullPayload.PullRequest != nil && pullPayload.PullRequest.Base != nil && pullPayload.PullRequest.Head != nil {
+ baseRef = pullPayload.PullRequest.Base.Ref
+ headRef = pullPayload.PullRequest.Head.Ref
+
+ // if the TriggerEvent is pull_request_target, ref and sha need to be set according to the base of pull request
+ // In GitHub's documentation, ref should be the branch or tag that triggered workflow. But when the TriggerEvent is pull_request_target,
+ // the ref will be the base branch.
+ if run.TriggerEvent == actions_module.GithubEventPullRequestTarget {
+ ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name
+ sha = pullPayload.PullRequest.Base.Sha
+ }
+ }
+
+ refName := git.RefName(ref)
+
+ gitContext := map[string]any{
+ // standard contexts, see https://docs.github.com/en/actions/learn-github-actions/contexts#github-context
+ "action": "", // string, The name of the action currently running, or the id of a step. GitHub removes special characters, and uses the name __run when the current step runs a script without an id. If you use the same action more than once in the same job, the name will include a suffix with the sequence number with underscore before it. For example, the first script you run will have the name __run, and the second script will be named __run_2. Similarly, the second invocation of actions/checkout will be actionscheckout2.
+ "action_path": "", // string, The path where an action is located. This property is only supported in composite actions. You can use this path to access files located in the same repository as the action.
+ "action_ref": "", // string, For a step executing an action, this is the ref of the action being executed. For example, v2.
+ "action_repository": "", // string, For a step executing an action, this is the owner and repository name of the action. For example, actions/checkout.
+ "action_status": "", // string, For a composite action, the current result of the composite action.
+ "actor": run.TriggerUser.Name, // string, The username of the user that triggered the initial workflow run. If the workflow run is a re-run, this value may differ from github.triggering_actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges.
+ "api_url": setting.AppURL + "api/v1", // string, The URL of the GitHub REST API.
+ "base_ref": baseRef, // string, The base_ref or target branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target.
+ "env": "", // string, Path on the runner to the file that sets environment variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions."
+ "event": event, // object, The full event webhook payload. You can access individual properties of the event using this context. This object is identical to the webhook payload of the event that triggered the workflow run, and is different for each event. The webhooks for each GitHub Actions event is linked in "Events that trigger workflows." For example, for a workflow run triggered by the push event, this object contains the contents of the push webhook payload.
+ "event_name": run.TriggerEvent, // string, The name of the event that triggered the workflow run.
+ "event_path": "", // string, The path to the file on the runner that contains the full event webhook payload.
+ "graphql_url": "", // string, The URL of the GitHub GraphQL API.
+ "head_ref": headRef, // string, The head_ref or source branch of the pull request in a workflow run. This property is only available when the event that triggers a workflow run is either pull_request or pull_request_target.
+ "job": "", // string, The job_id of the current job.
+ "ref": ref, // string, The fully-formed ref of the branch or tag that triggered the workflow run. For workflows triggered by push, this is the branch or tag ref that was pushed. For workflows triggered by pull_request, this is the pull request merge branch. For workflows triggered by release, this is the release tag created. For other triggers, this is the branch or tag ref that triggered the workflow run. This is only set if a branch or tag is available for the event type. The ref given is fully-formed, meaning that for branches the format is refs/heads/, for pull requests it is refs/pull//merge, and for tags it is refs/tags/. For example, refs/heads/feature-branch-1.
+ "ref_name": refName.ShortName(), // string, The short ref name of the branch or tag that triggered the workflow run. This value matches the branch or tag name shown on GitHub. For example, feature-branch-1.
+ "ref_protected": false, // boolean, true if branch protections are configured for the ref that triggered the workflow run.
+ "ref_type": refName.RefType(), // string, The type of ref that triggered the workflow run. Valid values are branch or tag.
+ "path": "", // string, Path on the runner to the file that sets system PATH variables from workflow commands. This file is unique to the current step and is a different file for each step in a job. For more information, see "Workflow commands for GitHub Actions."
+ "repository": run.Repo.OwnerName + "/" + run.Repo.Name, // string, The owner and repository name. For example, Codertocat/Hello-World.
+ "repository_owner": run.Repo.OwnerName, // string, The repository owner's name. For example, Codertocat.
+ "repositoryUrl": run.Repo.HTMLURL(), // string, The Git URL to the repository. For example, git://github.com/codertocat/hello-world.git.
+ "retention_days": "", // string, The number of days that workflow run logs and artifacts are kept.
+ "run_id": "", // string, A unique number for each workflow run within a repository. This number does not change if you re-run the workflow run.
+ "run_number": fmt.Sprint(run.Index), // string, A unique number for each run of a particular workflow in a repository. This number begins at 1 for the workflow's first run, and increments with each new run. This number does not change if you re-run the workflow run.
+ "run_attempt": "", // string, A unique number for each attempt of a particular workflow run in a repository. This number begins at 1 for the workflow run's first attempt, and increments with each re-run.
+ "secret_source": "Actions", // string, The source of a secret used in a workflow. Possible values are None, Actions, Dependabot, or Codespaces.
+ "server_url": setting.AppURL, // string, The URL of the GitHub server. For example: https://github.com.
+ "sha": sha, // string, The commit SHA that triggered the workflow. The value of this commit SHA depends on the event that triggered the workflow. For more information, see "Events that trigger workflows." For example, ffac537e6cbbf934b08745a378932722df287a53.
+ "triggering_actor": "", // string, The username of the user that initiated the workflow run. If the workflow run is a re-run, this value may differ from github.actor. Any workflow re-runs will use the privileges of github.actor, even if the actor initiating the re-run (github.triggering_actor) has different privileges.
+ "workflow": run.WorkflowID, // string, The name of the workflow. If the workflow file doesn't specify a name, the value of this property is the full path of the workflow file in the repository.
+ "workspace": "", // string, The default working directory on the runner for steps, and the default location of your repository when using the checkout action.
+
+ // additional contexts
+ "gitea_default_actions_url": setting.Actions.DefaultActionsURL.URL(),
+ }
+
+ if job != nil {
+ gitContext["job"] = job.JobID
+ gitContext["run_id"] = fmt.Sprint(job.RunID)
+ gitContext["run_attempt"] = fmt.Sprint(job.Attempt)
+ }
+
+ return gitContext
+}
+
+type TaskNeed struct {
+ Result actions_model.Status
+ Outputs map[string]string
+}
+
+// FindTaskNeeds finds the `needs` for the task by the task's job
+func FindTaskNeeds(ctx context.Context, job *actions_model.ActionRunJob) (map[string]*TaskNeed, error) {
+ if len(job.Needs) == 0 {
+ return nil, nil
+ }
+ needs := container.SetOf(job.Needs...)
+
+ jobs, err := db.Find[actions_model.ActionRunJob](ctx, actions_model.FindRunJobOptions{RunID: job.RunID})
+ if err != nil {
+ return nil, fmt.Errorf("FindRunJobs: %w", err)
+ }
+
+ jobIDJobs := make(map[string][]*actions_model.ActionRunJob)
+ for _, job := range jobs {
+ jobIDJobs[job.JobID] = append(jobIDJobs[job.JobID], job)
+ }
+
+ ret := make(map[string]*TaskNeed, len(needs))
+ for jobID, jobsWithSameID := range jobIDJobs {
+ if !needs.Contains(jobID) {
+ continue
+ }
+ var jobOutputs map[string]string
+ for _, job := range jobsWithSameID {
+ if job.TaskID == 0 || !job.Status.IsDone() {
+ // it shouldn't happen, or the job has been rerun
+ continue
+ }
+ got, err := actions_model.FindTaskOutputByTaskID(ctx, job.TaskID)
+ if err != nil {
+ return nil, fmt.Errorf("FindTaskOutputByTaskID: %w", err)
+ }
+ outputs := make(map[string]string, len(got))
+ for _, v := range got {
+ outputs[v.OutputKey] = v.OutputValue
+ }
+ if len(jobOutputs) == 0 {
+ jobOutputs = outputs
+ } else {
+ jobOutputs = mergeTwoOutputs(outputs, jobOutputs)
+ }
+ }
+ ret[jobID] = &TaskNeed{
+ Outputs: jobOutputs,
+ Result: actions_model.AggregateJobStatus(jobsWithSameID),
+ }
+ }
+ return ret, nil
+}
+
+// mergeTwoOutputs merges two outputs from two different ActionRunJobs
+// Values with the same output name may be overridden. The user should ensure the output names are unique.
+// See https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#using-job-outputs-in-a-matrix-job
+func mergeTwoOutputs(o1, o2 map[string]string) map[string]string {
+ ret := make(map[string]string, len(o1))
+ for k1, v1 := range o1 {
+ if len(v1) > 0 {
+ ret[k1] = v1
+ } else {
+ ret[k1] = o2[k1]
+ }
+ }
+ return ret
+}
diff --git a/routers/api/actions/runner/utils_test.go b/services/actions/context_test.go
similarity index 77%
rename from routers/api/actions/runner/utils_test.go
rename to services/actions/context_test.go
index c8a0a28d65..a80d2d84e3 100644
--- a/routers/api/actions/runner/utils_test.go
+++ b/services/actions/context_test.go
@@ -1,7 +1,7 @@
// Copyright 2024 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
-package runner
+package actions
import (
"context"
@@ -14,12 +14,13 @@ import (
"github.com/stretchr/testify/require"
)
-func Test_findTaskNeeds(t *testing.T) {
+func TestFindTaskNeeds(t *testing.T) {
require.NoError(t, unittest.PrepareTestDatabase())
task := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionTask{ID: 51})
+ job := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRunJob{ID: task.JobID})
- ret, err := findTaskNeeds(context.Background(), task)
+ ret, err := FindTaskNeeds(context.Background(), job)
require.NoError(t, err)
assert.Len(t, ret, 1)
assert.Contains(t, ret, "job1")
diff --git a/services/context/repo.go b/services/context/repo.go
index d294c00455..ff03844c03 100644
--- a/services/context/repo.go
+++ b/services/context/repo.go
@@ -937,6 +937,9 @@ func getRefName(ctx *Base, repo *Repository, pathType RepoRefType) string {
// of repository reference
func RepoRefByType(refType RepoRefType, ignoreNotExistErr ...bool) func(*Context) context.CancelFunc {
return func(ctx *Context) (cancel context.CancelFunc) {
+ if ctx.Repo.Repository.IsBeingCreated() {
+ return nil // no git repo, so do nothing
+ }
// Empty repository does not have reference information.
if ctx.Repo.Repository.IsEmpty {
// assume the user is viewing the (non-existent) default branch
diff --git a/services/doctor/breaking.go b/services/doctor/breaking.go
index 683ec97389..ec8433b8de 100644
--- a/services/doctor/breaking.go
+++ b/services/doctor/breaking.go
@@ -10,6 +10,7 @@ import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/log"
+ "code.gitea.io/gitea/modules/setting"
"code.gitea.io/gitea/modules/validation"
"xorm.io/builder"
@@ -30,6 +31,8 @@ func iterateUserAccounts(ctx context.Context, each func(*user.User) error) error
// addresses would be currently facing a error due to their invalid email address.
// Ref: https://github.com/go-gitea/gitea/pull/19085 & https://github.com/go-gitea/gitea/pull/17688
func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error {
+ setting.LoadServiceSetting()
+
// We could use quirky SQL to get all users that start without a [a-zA-Z0-9], but that would mean
// DB provider-specific SQL and only works _now_. So instead we iterate through all user accounts
// and use the validation.ValidateEmail function to be future-proof.
@@ -61,6 +64,8 @@ func checkUserEmail(ctx context.Context, logger log.Logger, _ bool) error {
// are allowed for various reasons. This check helps with detecting users that, according
// to our reserved names, don't have a valid username.
func checkUserName(ctx context.Context, logger log.Logger, _ bool) error {
+ setting.LoadServiceSetting()
+
var invalidUserCount int64
if err := iterateUserAccounts(ctx, func(u *user.User) error {
if err := user.IsUsableUsername(u.Name); err != nil {
diff --git a/services/gitdiff/gitdiff.go b/services/gitdiff/gitdiff.go
index 7d137fb214..65f6ac8d12 100644
--- a/services/gitdiff/gitdiff.go
+++ b/services/gitdiff/gitdiff.go
@@ -1117,7 +1117,10 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi
} else {
actualBeforeCommitID := opts.BeforeCommitID
if len(actualBeforeCommitID) == 0 {
- parentCommit, _ := commit.Parent(0)
+ parentCommit, err := commit.Parent(0)
+ if err != nil {
+ return nil, err
+ }
actualBeforeCommitID = parentCommit.ID.String()
}
@@ -1126,7 +1129,6 @@ func GetDiff(ctx context.Context, gitRepo *git.Repository, opts *DiffOptions, fi
AddDynamicArguments(actualBeforeCommitID, opts.AfterCommitID)
opts.BeforeCommitID = actualBeforeCommitID
- var err error
beforeCommit, err = gitRepo.GetCommit(opts.BeforeCommitID)
if err != nil {
return nil, err
diff --git a/services/mirror/mirror_pull.go b/services/mirror/mirror_pull.go
index bce8386f54..b180cf498f 100644
--- a/services/mirror/mirror_pull.go
+++ b/services/mirror/mirror_pull.go
@@ -96,6 +96,7 @@ type mirrorSyncResult struct {
/*
// * [new tag] v0.1.8 -> v0.1.8
// * [new branch] master -> origin/master
+// * [new ref] refs/pull/2/head -> refs/pull/2/head"
// - [deleted] (none) -> origin/test // delete a branch
// - [deleted] (none) -> 1 // delete a tag
// 957a993..a87ba5f test -> origin/test
@@ -126,6 +127,11 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult {
refName: git.RefNameFromBranch(refName),
oldCommitID: gitShortEmptySha,
})
+ case strings.HasPrefix(lines[i], " * [new ref]"): // new reference
+ results = append(results, &mirrorSyncResult{
+ refName: git.RefName(refName),
+ oldCommitID: gitShortEmptySha,
+ })
case strings.HasPrefix(lines[i], " - "): // Delete reference
isTag := !strings.HasPrefix(refName, remoteName+"/")
var refFullName git.RefName
@@ -168,13 +174,19 @@ func parseRemoteUpdateOutput(output, remoteName string) []*mirrorSyncResult {
log.Error("Expect two SHAs but not what found: %q", lines[i])
continue
}
+ var refFullName git.RefName
+ if strings.HasPrefix(refName, "refs/") {
+ refFullName = git.RefName(refName)
+ } else {
+ refFullName = git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/"))
+ }
+
results = append(results, &mirrorSyncResult{
- refName: git.RefNameFromBranch(strings.TrimPrefix(refName, remoteName+"/")),
+ refName: refFullName,
oldCommitID: shas[0],
newCommitID: shas[1],
})
- case strings.HasPrefix(lines[i], " * [new ref]"): // new reference - nothing to do
default:
log.Warn("parseRemoteUpdateOutput: unexpected update line %q", lines[i])
}
diff --git a/services/mirror/mirror_test.go b/services/mirror/mirror_test.go
index 860470522e..e26204e2ec 100644
--- a/services/mirror/mirror_test.go
+++ b/services/mirror/mirror_test.go
@@ -21,7 +21,7 @@ func Test_parseRemoteUpdateOutput(t *testing.T) {
* [new ref] refs/pull/516/head -> refs/pull/516/head
`
results := parseRemoteUpdateOutput(output, "origin")
- assert.Len(t, results, 6)
+ assert.Len(t, results, 8)
assert.EqualValues(t, "refs/tags/v0.1.8", results[0].refName.String())
assert.EqualValues(t, gitShortEmptySha, results[0].oldCommitID)
assert.EqualValues(t, "", results[0].newCommitID)
@@ -45,4 +45,12 @@ func Test_parseRemoteUpdateOutput(t *testing.T) {
assert.EqualValues(t, "refs/heads/test3", results[5].refName.String())
assert.EqualValues(t, "957a993", results[5].oldCommitID)
assert.EqualValues(t, "a87ba5f", results[5].newCommitID)
+
+ assert.EqualValues(t, "refs/pull/27/merge", results[6].refName.String())
+ assert.EqualValues(t, gitShortEmptySha, results[6].oldCommitID)
+ assert.EqualValues(t, "", results[6].newCommitID)
+
+ assert.EqualValues(t, "refs/pull/516/head", results[7].refName.String())
+ assert.EqualValues(t, gitShortEmptySha, results[7].oldCommitID)
+ assert.EqualValues(t, "", results[7].newCommitID)
}
diff --git a/services/packages/alt/repository.go b/services/packages/alt/repository.go
index 7b7951eebb..f49c435e64 100644
--- a/services/packages/alt/repository.go
+++ b/services/packages/alt/repository.go
@@ -711,7 +711,7 @@ func buildRelease(ctx context.Context, pv *packages_model.PackageVersion, pfs []
architectures.Add(pd.FileMetadata.Architecture)
}
- for architecture := range architectures {
+ for architecture := range architectures.Seq() {
version := time.Now().Unix()
label := setting.AppName
data := fmt.Sprintf(`Archive: Alt Linux Team
diff --git a/services/release/release.go b/services/release/release.go
index 876514beec..b52e4b124e 100644
--- a/services/release/release.go
+++ b/services/release/release.go
@@ -372,7 +372,7 @@ func UpdateRelease(ctx context.Context, doer *user_model.User, gitRepo *git.Repo
return err
}
- for _, uuid := range delAttachmentUUIDs.Values() {
+ for uuid := range delAttachmentUUIDs.Seq() {
if err := storage.Attachments.Delete(repo_model.AttachmentRelativePath(uuid)); err != nil {
// Even delete files failed, but the attachments has been removed from database, so we
// should not return error but only record the error on logs.
diff --git a/templates/install.tmpl b/templates/install.tmpl
index ae800df130..7a9b40826f 100644
--- a/templates/install.tmpl
+++ b/templates/install.tmpl
@@ -363,5 +363,5 @@
-
+
{{template "base/footer" .}}
diff --git a/templates/repo/diff/image_diff.tmpl b/templates/repo/diff/image_diff.tmpl
index 0612854609..a793f54da1 100644
--- a/templates/repo/diff/image_diff.tmpl
+++ b/templates/repo/diff/image_diff.tmpl
@@ -22,7 +22,7 @@
{{if .blobBase}}