diff --git a/.deadcode-out b/.deadcode-out
index 9641f272b3..61c5bcb055 100644
--- a/.deadcode-out
+++ b/.deadcode-out
@@ -13,6 +13,13 @@ forgejo.org/models
IsErrSHANotFound
IsErrMergeDivergingFastForwardOnly
+forgejo.org/models/activities
+ GetActivityByID
+ NewFederatedUserActivity
+ CreateUserActivity
+ GetFollowingFeeds
+ FederatedUserActivity.loadActor
+
forgejo.org/models/auth
WebAuthnCredentials
@@ -54,9 +61,17 @@ forgejo.org/models/user
IsErrExternalLoginUserAlreadyExist
IsErrExternalLoginUserNotExist
NewFederatedUser
+ NewFederatedUserFollower
IsErrUserSettingIsNotExist
GetUserAllSettings
DeleteUserSetting
+ GetFederatedUser
+ GetFederatedUserByUserID
+ UpdateFederatedUser
+ GetFollowersForUser
+ AddFollower
+ RemoveFollower
+ IsFollowingAp
forgejo.org/modules/activitypub
NewContext
@@ -87,12 +102,24 @@ forgejo.org/modules/eventsource
Event.String
forgejo.org/modules/forgefed
+ NewForgeFollowFromAp
+ NewForgeFollow
+ ForgeFollow.MarshalJSON
+ ForgeFollow.UnmarshalJSON
+ ForgeFollow.Validate
NewForgeUndoLike
ForgeUndoLike.UnmarshalJSON
ForgeUndoLike.Validate
+ NewForgeUserActivityFromAp
+ NewForgeUserActivity
+ ForgeUserActivity.Validate
+ NewPersonIDFromModel
GetItemByType
JSONUnmarshalerFn
NotEmpty
+ NewForgeUserActivityNoteFromAp
+ newNote
+ ForgeUserActivityNote.Validate
ToRepository
OnRepository
@@ -204,6 +231,7 @@ forgejo.org/modules/util/filebuffer
forgejo.org/modules/validation
IsErrNotValid
+ ValidateIDExists
forgejo.org/modules/web
RouteMock
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 9d8f54ee13..28fa9e4555 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -6,7 +6,7 @@
"ghcr.io/devcontainers/features/node:1": {
"version": "22"
},
- "ghcr.io/devcontainers/features/git-lfs:1.2.3": {},
+ "ghcr.io/devcontainers/features/git-lfs:1.2.4": {},
"ghcr.io/warrenbuckley/codespace-features/sqlite:1": {}
},
"customizations": {
diff --git a/.dockerignore b/.dockerignore
index 5e7a893014..807c70b000 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -37,13 +37,9 @@ coverage.all
coverage/
cpu.out
-/modules/migration/bindata.go
/modules/migration/bindata.go.hash
-/modules/options/bindata.go
/modules/options/bindata.go.hash
-/modules/public/bindata.go
/modules/public/bindata.go.hash
-/modules/templates/bindata.go
/modules/templates/bindata.go.hash
*.db
diff --git a/.forgejo/issue_template/bug-report-ui.yaml b/.forgejo/issue_template/bug-report-ui.yaml
index 57d578b232..8bb7bf1d49 100644
--- a/.forgejo/issue_template/bug-report-ui.yaml
+++ b/.forgejo/issue_template/bug-report-ui.yaml
@@ -6,7 +6,7 @@ body:
- type: markdown
attributes:
value: |
- **NOTE: If your issue is a security concern, please email
Enter an absolute path if you run Forgejo as a service.")))
assert.Empty(t, checkLocaleContent([]byte("hi_user_x = Hi %s,")))
+ assert.Empty(t, checkLocaleContent([]byte("key = Press Shift")))
assert.Equal(t, []string{"error404: The page you are trying to reach either does not exist or you are not authorized to view it."}, checkLocaleContent([]byte("error404 = The page you are trying to reach either does not exist or you are not authorized to view it.")))
})
diff --git a/cmd/actions.go b/cmd/actions.go
index 54b5154cfa..12af2c8e86 100644
--- a/cmd/actions.go
+++ b/cmd/actions.go
@@ -4,25 +4,28 @@
package cmd
import (
+ "context"
"fmt"
"forgejo.org/modules/private"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- // CmdActions represents the available actions sub-commands.
- CmdActions = &cli.Command{
+// CmdActions represents the available actions sub-commands.
+func cmdActions() *cli.Command {
+ return &cli.Command{
Name: "actions",
Usage: "Manage Forgejo Actions",
- Subcommands: []*cli.Command{
- subcmdActionsGenRunnerToken,
+ Commands: []*cli.Command{
+ subcmdActionsGenRunnerToken(),
},
}
+}
- subcmdActionsGenRunnerToken = &cli.Command{
+func subcmdActionsGenRunnerToken() *cli.Command {
+ return &cli.Command{
Name: "generate-runner-token",
Usage: "Generate a new token for a runner to use to register with the server",
Action: runGenerateActionsRunnerToken,
@@ -36,10 +39,10 @@ var (
},
},
}
-)
+}
-func runGenerateActionsRunnerToken(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runGenerateActionsRunnerToken(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setting.MustInstalled()
diff --git a/cmd/admin.go b/cmd/admin.go
index e04a5bc530..7e06a99cda 100644
--- a/cmd/admin.go
+++ b/cmd/admin.go
@@ -15,56 +15,64 @@ import (
"forgejo.org/modules/log"
repo_module "forgejo.org/modules/repository"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- // CmdAdmin represents the available admin sub-command.
- CmdAdmin = &cli.Command{
+// CmdAdmin represents the available admin sub-command.
+func cmdAdmin() *cli.Command {
+ return &cli.Command{
Name: "admin",
Usage: "Perform common administrative operations",
- Subcommands: []*cli.Command{
- subcmdUser,
- subcmdRepoSyncReleases,
- subcmdRegenerate,
- subcmdAuth,
- subcmdSendMail,
+ Commands: []*cli.Command{
+ subcmdUser(),
+ subcmdRepoSyncReleases(),
+ subcmdRegenerate(),
+ subcmdAuth(),
+ subcmdSendMail(),
},
}
+}
- subcmdRepoSyncReleases = &cli.Command{
+func subcmdRepoSyncReleases() *cli.Command {
+ return &cli.Command{
Name: "repo-sync-releases",
Usage: "Synchronize repository releases with tags",
Action: runRepoSyncReleases,
}
+}
- subcmdRegenerate = &cli.Command{
+func subcmdRegenerate() *cli.Command {
+ return &cli.Command{
Name: "regenerate",
Usage: "Regenerate specific files",
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
microcmdRegenHooks,
microcmdRegenKeys,
},
}
+}
- subcmdAuth = &cli.Command{
+func subcmdAuth() *cli.Command {
+ return &cli.Command{
Name: "auth",
Usage: "Modify external auth providers",
- Subcommands: []*cli.Command{
- microcmdAuthAddOauth,
- microcmdAuthUpdateOauth,
- microcmdAuthAddLdapBindDn,
- microcmdAuthUpdateLdapBindDn,
- microcmdAuthAddLdapSimpleAuth,
- microcmdAuthUpdateLdapSimpleAuth,
- microcmdAuthAddSMTP,
- microcmdAuthUpdateSMTP,
- microcmdAuthList,
- microcmdAuthDelete,
+ Commands: []*cli.Command{
+ microcmdAuthAddOauth(),
+ microcmdAuthUpdateOauth(),
+ microcmdAuthAddLdapBindDn(),
+ microcmdAuthUpdateLdapBindDn(),
+ microcmdAuthAddLdapSimpleAuth(),
+ microcmdAuthUpdateLdapSimpleAuth(),
+ microcmdAuthAddSMTP(),
+ microcmdAuthUpdateSMTP(),
+ microcmdAuthList(),
+ microcmdAuthDelete(),
},
}
+}
- subcmdSendMail = &cli.Command{
+func subcmdSendMail() *cli.Command {
+ return &cli.Command{
Name: "sendmail",
Usage: "Send a message to all users",
Action: runSendMail,
@@ -86,15 +94,17 @@ var (
},
},
}
+}
- idFlag = &cli.Int64Flag{
+func idFlag() *cli.Int64Flag {
+ return &cli.Int64Flag{
Name: "id",
Usage: "ID of authentication source",
}
-)
+}
-func runRepoSyncReleases(_ *cli.Context) error {
- ctx, cancel := installSignals()
+func runRepoSyncReleases(ctx context.Context, _ *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_auth.go b/cmd/admin_auth.go
index b5e0212df7..cb95b3b3c8 100644
--- a/cmd/admin_auth.go
+++ b/cmd/admin_auth.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"os"
@@ -13,17 +14,20 @@ import (
"forgejo.org/models/db"
auth_service "forgejo.org/services/auth"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- microcmdAuthDelete = &cli.Command{
+func microcmdAuthDelete() *cli.Command {
+ return &cli.Command{
Name: "delete",
Usage: "Delete specific auth source",
- Flags: []cli.Flag{idFlag},
+ Flags: []cli.Flag{idFlag()},
Action: runDeleteAuth,
}
- microcmdAuthList = &cli.Command{
+}
+
+func microcmdAuthList() *cli.Command {
+ return &cli.Command{
Name: "list",
Usage: "List auth sources",
Action: runListAuth,
@@ -54,10 +58,10 @@ var (
},
},
}
-)
+}
-func runListAuth(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runListAuth(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
@@ -81,7 +85,7 @@ func runListAuth(c *cli.Context) error {
// loop through each source and print
w := tabwriter.NewWriter(os.Stdout, c.Int("min-width"), c.Int("tab-width"), c.Int("padding"), padChar, flags)
- fmt.Fprintf(w, "ID\tName\tType\tEnabled\n")
+ fmt.Fprint(w, "ID\tName\tType\tEnabled\n")
for _, source := range authSources {
fmt.Fprintf(w, "%d\t%s\t%s\t%t\n", source.ID, source.Name, source.Type.String(), source.IsActive)
}
@@ -90,12 +94,12 @@ func runListAuth(c *cli.Context) error {
return nil
}
-func runDeleteAuth(c *cli.Context) error {
+func runDeleteAuth(ctx context.Context, c *cli.Command) error {
if !c.IsSet("id") {
return errors.New("--id flag is missing")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_auth_ldap.go b/cmd/admin_auth_ldap.go
index 637769b153..997d6b3a16 100644
--- a/cmd/admin_auth_ldap.go
+++ b/cmd/admin_auth_ldap.go
@@ -11,7 +11,7 @@ import (
"forgejo.org/models/auth"
"forgejo.org/services/auth/source/ldap"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
type (
@@ -23,8 +23,8 @@ type (
}
)
-var (
- commonLdapCLIFlags = []cli.Flag{
+func commonLdapCLIFlags() []cli.Flag {
+ return []cli.Flag{
&cli.StringFlag{
Name: "name",
Usage: "Authentication name.",
@@ -102,8 +102,10 @@ var (
Usage: "The attribute of the user’s LDAP record containing the user’s avatar.",
},
}
+}
- ldapBindDnCLIFlags = append(commonLdapCLIFlags,
+func ldapBindDnCLIFlags() []cli.Flag {
+ return append(commonLdapCLIFlags(),
&cli.StringFlag{
Name: "bind-dn",
Usage: "The DN to bind to the LDAP server with when searching for the user.",
@@ -128,49 +130,59 @@ var (
Name: "page-size",
Usage: "Search page size.",
})
+}
- ldapSimpleAuthCLIFlags = append(commonLdapCLIFlags,
+func ldapSimpleAuthCLIFlags() []cli.Flag {
+ return append(commonLdapCLIFlags(),
&cli.StringFlag{
Name: "user-dn",
Usage: "The user's DN.",
})
+}
- microcmdAuthAddLdapBindDn = &cli.Command{
+func microcmdAuthAddLdapBindDn() *cli.Command {
+ return &cli.Command{
Name: "add-ldap",
Usage: "Add new LDAP (via Bind DN) authentication source",
- Action: func(c *cli.Context) error {
- return newAuthService().addLdapBindDn(c)
+ Action: func(ctx context.Context, cli *cli.Command) error {
+ return newAuthService().addLdapBindDn(ctx, cli)
},
- Flags: ldapBindDnCLIFlags,
+ Flags: ldapBindDnCLIFlags(),
}
+}
- microcmdAuthUpdateLdapBindDn = &cli.Command{
+func microcmdAuthUpdateLdapBindDn() *cli.Command {
+ return &cli.Command{
Name: "update-ldap",
Usage: "Update existing LDAP (via Bind DN) authentication source",
- Action: func(c *cli.Context) error {
- return newAuthService().updateLdapBindDn(c)
+ Action: func(ctx context.Context, cli *cli.Command) error {
+ return newAuthService().updateLdapBindDn(ctx, cli)
},
- Flags: append([]cli.Flag{idFlag}, ldapBindDnCLIFlags...),
+ Flags: append([]cli.Flag{idFlag()}, ldapBindDnCLIFlags()...),
}
+}
- microcmdAuthAddLdapSimpleAuth = &cli.Command{
+func microcmdAuthAddLdapSimpleAuth() *cli.Command {
+ return &cli.Command{
Name: "add-ldap-simple",
Usage: "Add new LDAP (simple auth) authentication source",
- Action: func(c *cli.Context) error {
- return newAuthService().addLdapSimpleAuth(c)
+ Action: func(ctx context.Context, cli *cli.Command) error {
+ return newAuthService().addLdapSimpleAuth(ctx, cli)
},
- Flags: ldapSimpleAuthCLIFlags,
+ Flags: ldapSimpleAuthCLIFlags(),
}
+}
- microcmdAuthUpdateLdapSimpleAuth = &cli.Command{
+func microcmdAuthUpdateLdapSimpleAuth() *cli.Command {
+ return &cli.Command{
Name: "update-ldap-simple",
Usage: "Update existing LDAP (simple auth) authentication source",
- Action: func(c *cli.Context) error {
- return newAuthService().updateLdapSimpleAuth(c)
+ Action: func(ctx context.Context, cli *cli.Command) error {
+ return newAuthService().updateLdapSimpleAuth(ctx, cli)
},
- Flags: append([]cli.Flag{idFlag}, ldapSimpleAuthCLIFlags...),
+ Flags: append([]cli.Flag{idFlag()}, ldapSimpleAuthCLIFlags()...),
}
-)
+}
// newAuthService creates a service with default functions.
func newAuthService() *authService {
@@ -183,7 +195,7 @@ func newAuthService() *authService {
}
// parseAuthSource assigns values on authSource according to command line flags.
-func parseAuthSource(c *cli.Context, authSource *auth.Source) {
+func parseAuthSource(c *cli.Command, authSource *auth.Source) {
if c.IsSet("name") {
authSource.Name = c.String("name")
}
@@ -202,7 +214,7 @@ func parseAuthSource(c *cli.Context, authSource *auth.Source) {
}
// parseLdapConfig assigns values on config according to command line flags.
-func parseLdapConfig(c *cli.Context, config *ldap.Source) error {
+func parseLdapConfig(c *cli.Command, config *ldap.Source) error {
if c.IsSet("name") {
config.Name = c.String("name")
}
@@ -289,7 +301,7 @@ func findLdapSecurityProtocolByName(name string) (ldap.SecurityProtocol, bool) {
// getAuthSource gets the login source by its id defined in the command line flags.
// It returns an error if the id is not set, does not match any source or if the source is not of expected type.
-func (a *authService) getAuthSource(ctx context.Context, c *cli.Context, authType auth.Type) (*auth.Source, error) {
+func (a *authService) getAuthSource(ctx context.Context, c *cli.Command, authType auth.Type) (*auth.Source, error) {
if err := argsSet(c, "id"); err != nil {
return nil, err
}
@@ -307,12 +319,12 @@ func (a *authService) getAuthSource(ctx context.Context, c *cli.Context, authTyp
}
// addLdapBindDn adds a new LDAP via Bind DN authentication source.
-func (a *authService) addLdapBindDn(c *cli.Context) error {
+func (a *authService) addLdapBindDn(ctx context.Context, c *cli.Command) error {
if err := argsSet(c, "name", "security-protocol", "host", "port", "user-search-base", "user-filter", "email-attribute"); err != nil {
return err
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := a.initDB(ctx); err != nil {
@@ -336,8 +348,8 @@ func (a *authService) addLdapBindDn(c *cli.Context) error {
}
// updateLdapBindDn updates a new LDAP via Bind DN authentication source.
-func (a *authService) updateLdapBindDn(c *cli.Context) error {
- ctx, cancel := installSignals()
+func (a *authService) updateLdapBindDn(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := a.initDB(ctx); err != nil {
@@ -358,12 +370,12 @@ func (a *authService) updateLdapBindDn(c *cli.Context) error {
}
// addLdapSimpleAuth adds a new LDAP (simple auth) authentication source.
-func (a *authService) addLdapSimpleAuth(c *cli.Context) error {
+func (a *authService) addLdapSimpleAuth(ctx context.Context, c *cli.Command) error {
if err := argsSet(c, "name", "security-protocol", "host", "port", "user-dn", "user-filter", "email-attribute"); err != nil {
return err
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := a.initDB(ctx); err != nil {
@@ -387,8 +399,8 @@ func (a *authService) addLdapSimpleAuth(c *cli.Context) error {
}
// updateLdapSimpleAuth updates a new LDAP (simple auth) authentication source.
-func (a *authService) updateLdapSimpleAuth(c *cli.Context) error {
- ctx, cancel := installSignals()
+func (a *authService) updateLdapSimpleAuth(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := a.initDB(ctx); err != nil {
diff --git a/cmd/admin_auth_ldap_test.go b/cmd/admin_auth_ldap_test.go
index 7ca0264454..89ce5f4f08 100644
--- a/cmd/admin_auth_ldap_test.go
+++ b/cmd/admin_auth_ldap_test.go
@@ -8,18 +8,17 @@ import (
"testing"
"forgejo.org/models/auth"
+ "forgejo.org/modules/test"
"forgejo.org/services/auth/source/ldap"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func TestAddLdapBindDn(t *testing.T) {
// Mock cli functions to do not exit on error
- osExiter := cli.OsExiter
- defer func() { cli.OsExiter = osExiter }()
- cli.OsExiter = func(code int) {}
+ defer test.MockVariableValue(&cli.OsExiter, func(code int) {})()
// Test cases
cases := []struct {
@@ -226,12 +225,12 @@ func TestAddLdapBindDn(t *testing.T) {
}
// Create a copy of command to test
- app := cli.NewApp()
- app.Flags = microcmdAuthAddLdapBindDn.Flags
+ app := cli.Command{}
+ app.Flags = microcmdAuthAddLdapBindDn().Flags
app.Action = service.addLdapBindDn
// Run it
- err := app.Run(c.args)
+ err := app.Run(t.Context(), c.args)
if c.errMsg != "" {
assert.EqualError(t, err, c.errMsg, "case %d: error should match", n)
} else {
@@ -243,9 +242,7 @@ func TestAddLdapBindDn(t *testing.T) {
func TestAddLdapSimpleAuth(t *testing.T) {
// Mock cli functions to do not exit on error
- osExiter := cli.OsExiter
- defer func() { cli.OsExiter = osExiter }()
- cli.OsExiter = func(code int) {}
+ defer test.MockVariableValue(&cli.OsExiter, func(code int) {})()
// Test cases
cases := []struct {
@@ -457,12 +454,12 @@ func TestAddLdapSimpleAuth(t *testing.T) {
}
// Create a copy of command to test
- app := cli.NewApp()
- app.Flags = microcmdAuthAddLdapSimpleAuth.Flags
+ app := cli.Command{}
+ app.Flags = microcmdAuthAddLdapSimpleAuth().Flags
app.Action = service.addLdapSimpleAuth
// Run it
- err := app.Run(c.args)
+ err := app.Run(t.Context(), c.args)
if c.errMsg != "" {
assert.EqualError(t, err, c.errMsg, "case %d: error should match", n)
} else {
@@ -474,9 +471,7 @@ func TestAddLdapSimpleAuth(t *testing.T) {
func TestUpdateLdapBindDn(t *testing.T) {
// Mock cli functions to do not exit on error
- osExiter := cli.OsExiter
- defer func() { cli.OsExiter = osExiter }()
- cli.OsExiter = func(code int) {}
+ defer test.MockVariableValue(&cli.OsExiter, func(code int) {})()
// Test cases
cases := []struct {
@@ -920,12 +915,12 @@ func TestUpdateLdapBindDn(t *testing.T) {
}
// Create a copy of command to test
- app := cli.NewApp()
- app.Flags = microcmdAuthUpdateLdapBindDn.Flags
+ app := cli.Command{}
+ app.Flags = microcmdAuthUpdateLdapBindDn().Flags
app.Action = service.updateLdapBindDn
// Run it
- err := app.Run(c.args)
+ err := app.Run(t.Context(), c.args)
if c.errMsg != "" {
assert.EqualError(t, err, c.errMsg, "case %d: error should match", n)
} else {
@@ -937,9 +932,7 @@ func TestUpdateLdapBindDn(t *testing.T) {
func TestUpdateLdapSimpleAuth(t *testing.T) {
// Mock cli functions to do not exit on error
- osExiter := cli.OsExiter
- defer func() { cli.OsExiter = osExiter }()
- cli.OsExiter = func(code int) {}
+ defer test.MockVariableValue(&cli.OsExiter, func(code int) {})()
// Test cases
cases := []struct {
@@ -1310,12 +1303,12 @@ func TestUpdateLdapSimpleAuth(t *testing.T) {
}
// Create a copy of command to test
- app := cli.NewApp()
- app.Flags = microcmdAuthUpdateLdapSimpleAuth.Flags
+ app := cli.Command{}
+ app.Flags = microcmdAuthUpdateLdapSimpleAuth().Flags
app.Action = service.updateLdapSimpleAuth
// Run it
- err := app.Run(c.args)
+ err := app.Run(t.Context(), c.args)
if c.errMsg != "" {
assert.EqualError(t, err, c.errMsg, "case %d: error should match", n)
} else {
diff --git a/cmd/admin_auth_oauth.go b/cmd/admin_auth_oauth.go
index 58238794b8..abdcd5d48a 100644
--- a/cmd/admin_auth_oauth.go
+++ b/cmd/admin_auth_oauth.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"net/url"
@@ -11,11 +12,11 @@ import (
auth_model "forgejo.org/models/auth"
"forgejo.org/services/auth/source/oauth2"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- oauthCLIFlags = []cli.Flag{
+func oauthCLIFlags() []cli.Flag {
+ return []cli.Flag{
&cli.StringFlag{
Name: "name",
Value: "",
@@ -120,23 +121,27 @@ var (
Usage: "Activate automatic team membership removal depending on groups",
},
}
+}
- microcmdAuthAddOauth = &cli.Command{
+func microcmdAuthAddOauth() *cli.Command {
+ return &cli.Command{
Name: "add-oauth",
Usage: "Add new Oauth authentication source",
Action: runAddOauth,
- Flags: oauthCLIFlags,
+ Flags: oauthCLIFlags(),
}
+}
- microcmdAuthUpdateOauth = &cli.Command{
+func microcmdAuthUpdateOauth() *cli.Command {
+ return &cli.Command{
Name: "update-oauth",
Usage: "Update existing Oauth authentication source",
Action: runUpdateOauth,
- Flags: append(oauthCLIFlags[:1], append([]cli.Flag{idFlag}, oauthCLIFlags[1:]...)...),
+ Flags: append(oauthCLIFlags()[:1], append([]cli.Flag{idFlag()}, oauthCLIFlags()[1:]...)...),
}
-)
+}
-func parseOAuth2Config(c *cli.Context) *oauth2.Source {
+func parseOAuth2Config(_ context.Context, c *cli.Command) *oauth2.Source {
var customURLMapping *oauth2.CustomURLMapping
if c.IsSet("use-custom-urls") {
customURLMapping = &oauth2.CustomURLMapping{
@@ -168,15 +173,15 @@ func parseOAuth2Config(c *cli.Context) *oauth2.Source {
}
}
-func runAddOauth(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runAddOauth(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
return err
}
- config := parseOAuth2Config(c)
+ config := parseOAuth2Config(ctx, c)
if config.Provider == "openidConnect" {
discoveryURL, err := url.Parse(config.OpenIDConnectAutoDiscoveryURL)
if err != nil || (discoveryURL.Scheme != "http" && discoveryURL.Scheme != "https") {
@@ -192,12 +197,12 @@ func runAddOauth(c *cli.Context) error {
})
}
-func runUpdateOauth(c *cli.Context) error {
+func runUpdateOauth(ctx context.Context, c *cli.Command) error {
if !c.IsSet("id") {
return errors.New("--id flag is missing")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_auth_stmp.go b/cmd/admin_auth_stmp.go
index e166cc38cd..48b3adaac3 100644
--- a/cmd/admin_auth_stmp.go
+++ b/cmd/admin_auth_stmp.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"strings"
@@ -11,11 +12,11 @@ import (
"forgejo.org/modules/util"
"forgejo.org/services/auth/source/smtp"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- smtpCLIFlags = []cli.Flag{
+func smtpCLIFlags() []cli.Flag {
+ return []cli.Flag{
&cli.StringFlag{
Name: "name",
Value: "",
@@ -71,23 +72,27 @@ var (
Value: true,
},
}
+}
- microcmdAuthAddSMTP = &cli.Command{
+func microcmdAuthAddSMTP() *cli.Command {
+ return &cli.Command{
Name: "add-smtp",
Usage: "Add new SMTP authentication source",
Action: runAddSMTP,
- Flags: smtpCLIFlags,
+ Flags: smtpCLIFlags(),
}
+}
- microcmdAuthUpdateSMTP = &cli.Command{
+func microcmdAuthUpdateSMTP() *cli.Command {
+ return &cli.Command{
Name: "update-smtp",
Usage: "Update existing SMTP authentication source",
Action: runUpdateSMTP,
- Flags: append(smtpCLIFlags[:1], append([]cli.Flag{idFlag}, smtpCLIFlags[1:]...)...),
+ Flags: append(smtpCLIFlags()[:1], append([]cli.Flag{idFlag()}, smtpCLIFlags()[1:]...)...),
}
-)
+}
-func parseSMTPConfig(c *cli.Context, conf *smtp.Source) error {
+func parseSMTPConfig(c *cli.Command, conf *smtp.Source) error {
if c.IsSet("auth-type") {
conf.Auth = c.String("auth-type")
validAuthTypes := []string{"PLAIN", "LOGIN", "CRAM-MD5"}
@@ -123,8 +128,8 @@ func parseSMTPConfig(c *cli.Context, conf *smtp.Source) error {
return nil
}
-func runAddSMTP(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runAddSMTP(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
@@ -163,12 +168,12 @@ func runAddSMTP(c *cli.Context) error {
})
}
-func runUpdateSMTP(c *cli.Context) error {
+func runUpdateSMTP(ctx context.Context, c *cli.Command) error {
if !c.IsSet("id") {
return errors.New("--id flag is missing")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_regenerate.go b/cmd/admin_regenerate.go
index 4e7f685843..7bfd12f8f4 100644
--- a/cmd/admin_regenerate.go
+++ b/cmd/admin_regenerate.go
@@ -4,11 +4,13 @@
package cmd
import (
+ "context"
+
asymkey_model "forgejo.org/models/asymkey"
"forgejo.org/modules/graceful"
repo_service "forgejo.org/services/repository"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
var (
@@ -25,8 +27,8 @@ var (
}
)
-func runRegenerateHooks(_ *cli.Context) error {
- ctx, cancel := installSignals()
+func runRegenerateHooks(ctx context.Context, _ *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
@@ -35,8 +37,8 @@ func runRegenerateHooks(_ *cli.Context) error {
return repo_service.SyncRepositoryHooks(graceful.GetManager().ShutdownContext())
}
-func runRegenerateKeys(_ *cli.Context) error {
- ctx, cancel := installSignals()
+func runRegenerateKeys(ctx context.Context, _ *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_user.go b/cmd/admin_user.go
index 967a6ed88a..f4f6fb49af 100644
--- a/cmd/admin_user.go
+++ b/cmd/admin_user.go
@@ -4,18 +4,21 @@
package cmd
import (
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var subcmdUser = &cli.Command{
- Name: "user",
- Usage: "Modify users",
- Subcommands: []*cli.Command{
- microcmdUserCreate,
- microcmdUserList,
- microcmdUserChangePassword,
- microcmdUserDelete,
- microcmdUserGenerateAccessToken,
- microcmdUserMustChangePassword,
- },
+func subcmdUser() *cli.Command {
+ return &cli.Command{
+ Name: "user",
+ Usage: "Modify users",
+ Commands: []*cli.Command{
+ microcmdUserCreate(),
+ microcmdUserList(),
+ microcmdUserChangePassword(),
+ microcmdUserDelete(),
+ microcmdUserGenerateAccessToken(),
+ microcmdUserMustChangePassword(),
+ microcmdUserResetMFA(),
+ },
+ }
}
diff --git a/cmd/admin_user_change_password.go b/cmd/admin_user_change_password.go
index 563ad96afd..dd8c9d378a 100644
--- a/cmd/admin_user_change_password.go
+++ b/cmd/admin_user_change_password.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
@@ -13,40 +14,42 @@ import (
"forgejo.org/modules/setting"
user_service "forgejo.org/services/user"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserChangePassword = &cli.Command{
- Name: "change-password",
- Usage: "Change a user's password",
- Action: runChangePassword,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "username",
- Aliases: []string{"u"},
- Value: "",
- Usage: "The user to change password for",
+func microcmdUserChangePassword() *cli.Command {
+ return &cli.Command{
+ Name: "change-password",
+ Usage: "Change a user's password",
+ Action: runChangePassword,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "username",
+ Aliases: []string{"u"},
+ Value: "",
+ Usage: "The user to change password for",
+ },
+ &cli.StringFlag{
+ Name: "password",
+ Aliases: []string{"p"},
+ Value: "",
+ Usage: "New password to set for user",
+ },
+ &cli.BoolFlag{
+ Name: "must-change-password",
+ Usage: "User must change password",
+ Value: true,
+ },
},
- &cli.StringFlag{
- Name: "password",
- Aliases: []string{"p"},
- Value: "",
- Usage: "New password to set for user",
- },
- &cli.BoolFlag{
- Name: "must-change-password",
- Usage: "User must change password",
- Value: true,
- },
- },
+ }
}
-func runChangePassword(c *cli.Context) error {
+func runChangePassword(ctx context.Context, c *cli.Command) error {
if err := argsSet(c, "username", "password"); err != nil {
return err
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_user_create.go b/cmd/admin_user_create.go
index f84254f39c..96431412f6 100644
--- a/cmd/admin_user_create.go
+++ b/cmd/admin_user_create.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"strings"
@@ -15,75 +16,76 @@ import (
"forgejo.org/modules/optional"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserCreate = &cli.Command{
- Name: "create",
- Usage: "Create a new user in database",
- Action: runCreateUser,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "name",
- Usage: "Username. DEPRECATED: use username instead",
+func microcmdUserCreate() *cli.Command {
+ return &cli.Command{
+ Name: "create",
+ Usage: "Create a new user in database",
+ Action: runCreateUser,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "name",
+ Usage: "Username. DEPRECATED: use username instead",
+ },
+ &cli.StringFlag{
+ Name: "username",
+ Usage: "Username",
+ },
+ &cli.StringFlag{
+ Name: "password",
+ Usage: "User password",
+ },
+ &cli.StringFlag{
+ Name: "email",
+ Usage: "User email address",
+ },
+ &cli.BoolFlag{
+ Name: "admin",
+ Usage: "User is an admin",
+ },
+ &cli.BoolFlag{
+ Name: "random-password",
+ Usage: "Generate a random password for the user",
+ },
+ &cli.BoolFlag{
+ Name: "must-change-password",
+ Usage: "Set this option to false to prevent forcing the user to change their password after initial login",
+ Value: true,
+ },
+ &cli.IntFlag{
+ Name: "random-password-length",
+ Usage: "Length of the random password to be generated",
+ Value: 12,
+ },
+ &cli.BoolFlag{
+ Name: "access-token",
+ Usage: "Generate access token for the user",
+ },
+ &cli.StringFlag{
+ Name: "access-token-name",
+ Usage: `Name of the generated access token`,
+ Value: "gitea-admin",
+ },
+ &cli.StringFlag{
+ Name: "access-token-scopes",
+ Usage: `Scopes of the generated access token, comma separated. Examples: "all", "public-only,read:issue", "write:repository,write:user"`,
+ Value: "all",
+ },
+ &cli.BoolFlag{
+ Name: "restricted",
+ Usage: "Make a restricted user account",
+ },
+ &cli.StringFlag{
+ Name: "fullname",
+ Usage: `The full, human-readable name of the user`,
+ },
},
- &cli.StringFlag{
- Name: "username",
- Usage: "Username",
- },
- &cli.StringFlag{
- Name: "password",
- Usage: "User password",
- },
- &cli.StringFlag{
- Name: "email",
- Usage: "User email address",
- },
- &cli.BoolFlag{
- Name: "admin",
- Usage: "User is an admin",
- },
- &cli.BoolFlag{
- Name: "random-password",
- Usage: "Generate a random password for the user",
- },
- &cli.BoolFlag{
- Name: "must-change-password",
- Usage: "Set this option to false to prevent forcing the user to change their password after initial login",
- Value: true,
- DisableDefaultText: true,
- },
- &cli.IntFlag{
- Name: "random-password-length",
- Usage: "Length of the random password to be generated",
- Value: 12,
- },
- &cli.BoolFlag{
- Name: "access-token",
- Usage: "Generate access token for the user",
- },
- &cli.StringFlag{
- Name: "access-token-name",
- Usage: `Name of the generated access token`,
- Value: "gitea-admin",
- },
- &cli.StringFlag{
- Name: "access-token-scopes",
- Usage: `Scopes of the generated access token, comma separated. Examples: "all", "public-only,read:issue", "write:repository,write:user"`,
- Value: "all",
- },
- &cli.BoolFlag{
- Name: "restricted",
- Usage: "Make a restricted user account",
- },
- &cli.StringFlag{
- Name: "fullname",
- Usage: `The full, human-readable name of the user`,
- },
- },
+ }
}
-func runCreateUser(c *cli.Context) error {
+func runCreateUser(ctx context.Context, c *cli.Command) error {
// this command highly depends on the many setting options (create org, visibility, etc.), so it must have a full setting load first
// duplicate setting loading should be safe at the moment, but it should be refactored & improved in the future.
setting.LoadSettings()
@@ -108,10 +110,10 @@ func runCreateUser(c *cli.Context) error {
username = c.String("username")
} else {
username = c.String("name")
- _, _ = fmt.Fprintf(c.App.ErrWriter, "--name flag is deprecated. Use --username instead.\n")
+ _, _ = fmt.Fprint(c.Root().ErrWriter, "--name flag is deprecated. Use --username instead.\n")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_user_delete.go b/cmd/admin_user_delete.go
index 9a4cc22a77..3382c53e5f 100644
--- a/cmd/admin_user_delete.go
+++ b/cmd/admin_user_delete.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"strings"
@@ -12,41 +13,43 @@ import (
"forgejo.org/modules/storage"
user_service "forgejo.org/services/user"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserDelete = &cli.Command{
- Name: "delete",
- Usage: "Delete specific user by id, name or email",
- Flags: []cli.Flag{
- &cli.Int64Flag{
- Name: "id",
- Usage: "ID of user of the user to delete",
+func microcmdUserDelete() *cli.Command {
+ return &cli.Command{
+ Name: "delete",
+ Usage: "Delete specific user by id, name or email",
+ Flags: []cli.Flag{
+ &cli.Int64Flag{
+ Name: "id",
+ Usage: "ID of user of the user to delete",
+ },
+ &cli.StringFlag{
+ Name: "username",
+ Aliases: []string{"u"},
+ Usage: "Username of the user to delete",
+ },
+ &cli.StringFlag{
+ Name: "email",
+ Aliases: []string{"e"},
+ Usage: "Email of the user to delete",
+ },
+ &cli.BoolFlag{
+ Name: "purge",
+ Usage: "Purge user, all their repositories, organizations and comments",
+ },
},
- &cli.StringFlag{
- Name: "username",
- Aliases: []string{"u"},
- Usage: "Username of the user to delete",
- },
- &cli.StringFlag{
- Name: "email",
- Aliases: []string{"e"},
- Usage: "Email of the user to delete",
- },
- &cli.BoolFlag{
- Name: "purge",
- Usage: "Purge user, all their repositories, organizations and comments",
- },
- },
- Action: runDeleteUser,
+ Action: runDeleteUser,
+ }
}
-func runDeleteUser(c *cli.Context) error {
+func runDeleteUser(ctx context.Context, c *cli.Command) error {
if !c.IsSet("id") && !c.IsSet("username") && !c.IsSet("email") {
return errors.New("You must provide the id, username or email of a user to delete")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_user_generate_access_token.go b/cmd/admin_user_generate_access_token.go
index 1a6c003171..d0f2878297 100644
--- a/cmd/admin_user_generate_access_token.go
+++ b/cmd/admin_user_generate_access_token.go
@@ -4,49 +4,52 @@
package cmd
import (
+ "context"
"errors"
"fmt"
auth_model "forgejo.org/models/auth"
user_model "forgejo.org/models/user"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserGenerateAccessToken = &cli.Command{
- Name: "generate-access-token",
- Usage: "Generate an access token for a specific user",
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "username",
- Aliases: []string{"u"},
- Usage: "Username",
+func microcmdUserGenerateAccessToken() *cli.Command {
+ return &cli.Command{
+ Name: "generate-access-token",
+ Usage: "Generate an access token for a specific user",
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "username",
+ Aliases: []string{"u"},
+ Usage: "Username",
+ },
+ &cli.StringFlag{
+ Name: "token-name",
+ Aliases: []string{"t"},
+ Usage: "Token name",
+ Value: "gitea-admin",
+ },
+ &cli.BoolFlag{
+ Name: "raw",
+ Usage: "Display only the token value",
+ },
+ &cli.StringFlag{
+ Name: "scopes",
+ Value: "all",
+ Usage: `Comma separated list of scopes to apply to access token, examples: "all", "public-only,read:issue", "write:repository,write:user"`,
+ },
},
- &cli.StringFlag{
- Name: "token-name",
- Aliases: []string{"t"},
- Usage: "Token name",
- Value: "gitea-admin",
- },
- &cli.BoolFlag{
- Name: "raw",
- Usage: "Display only the token value",
- },
- &cli.StringFlag{
- Name: "scopes",
- Value: "all",
- Usage: `Comma separated list of scopes to apply to access token, examples: "all", "public-only,read:issue", "write:repository,write:user"`,
- },
- },
- Action: runGenerateAccessToken,
+ Action: runGenerateAccessToken,
+ }
}
-func runGenerateAccessToken(c *cli.Context) error {
+func runGenerateAccessToken(ctx context.Context, c *cli.Command) error {
if !c.IsSet("username") {
return errors.New("you must provide a username to generate a token for")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
diff --git a/cmd/admin_user_list.go b/cmd/admin_user_list.go
index 6044ce7c3f..ccc4b8c917 100644
--- a/cmd/admin_user_list.go
+++ b/cmd/admin_user_list.go
@@ -4,29 +4,32 @@
package cmd
import (
+ "context"
"fmt"
"os"
"text/tabwriter"
user_model "forgejo.org/models/user"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserList = &cli.Command{
- Name: "list",
- Usage: "List users",
- Action: runListUsers,
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "admin",
- Usage: "List only admin users",
+func microcmdUserList() *cli.Command {
+ return &cli.Command{
+ Name: "list",
+ Usage: "List users",
+ Action: runListUsers,
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "admin",
+ Usage: "List only admin users",
+ },
},
- },
+ }
}
-func runListUsers(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runListUsers(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if err := initDB(ctx); err != nil {
@@ -41,7 +44,7 @@ func runListUsers(c *cli.Context) error {
w := tabwriter.NewWriter(os.Stdout, 5, 0, 1, ' ', 0)
if c.IsSet("admin") {
- fmt.Fprintf(w, "ID\tUsername\tEmail\tIsActive\n")
+ fmt.Fprint(w, "ID\tUsername\tEmail\tIsActive\n")
for _, u := range users {
if u.IsAdmin {
fmt.Fprintf(w, "%d\t%s\t%s\t%t\n", u.ID, u.Name, u.Email, u.IsActive)
@@ -49,7 +52,7 @@ func runListUsers(c *cli.Context) error {
}
} else {
twofa := user_model.UserList(users).GetTwoFaStatus(ctx)
- fmt.Fprintf(w, "ID\tUsername\tEmail\tIsActive\tIsAdmin\t2FA\n")
+ fmt.Fprint(w, "ID\tUsername\tEmail\tIsActive\tIsAdmin\t2FA\n")
for _, u := range users {
fmt.Fprintf(w, "%d\t%s\t%s\t%t\t%t\t%t\n", u.ID, u.Name, u.Email, u.IsActive, u.IsAdmin, twofa[u.ID])
}
diff --git a/cmd/admin_user_must_change_password.go b/cmd/admin_user_must_change_password.go
index 920f5c7b21..2ccad56eb9 100644
--- a/cmd/admin_user_must_change_password.go
+++ b/cmd/admin_user_must_change_password.go
@@ -4,38 +4,41 @@
package cmd
import (
+ "context"
"errors"
"fmt"
user_model "forgejo.org/models/user"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var microcmdUserMustChangePassword = &cli.Command{
- Name: "must-change-password",
- Usage: "Set the must change password flag for the provided users or all users",
- Action: runMustChangePassword,
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "all",
- Aliases: []string{"A"},
- Usage: "All users must change password, except those explicitly excluded with --exclude",
+func microcmdUserMustChangePassword() *cli.Command {
+ return &cli.Command{
+ Name: "must-change-password",
+ Usage: "Set the must change password flag for the provided users or all users",
+ Action: runMustChangePassword,
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "all",
+ Aliases: []string{"A"},
+ Usage: "All users must change password, except those explicitly excluded with --exclude",
+ },
+ &cli.StringSliceFlag{
+ Name: "exclude",
+ Aliases: []string{"e"},
+ Usage: "Do not change the must-change-password flag for these users",
+ },
+ &cli.BoolFlag{
+ Name: "unset",
+ Usage: "Instead of setting the must-change-password flag, unset it",
+ },
},
- &cli.StringSliceFlag{
- Name: "exclude",
- Aliases: []string{"e"},
- Usage: "Do not change the must-change-password flag for these users",
- },
- &cli.BoolFlag{
- Name: "unset",
- Usage: "Instead of setting the must-change-password flag, unset it",
- },
- },
+ }
}
-func runMustChangePassword(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runMustChangePassword(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
if c.NArg() == 0 && !c.IsSet("all") {
diff --git a/cmd/admin_user_reset_mfa.go b/cmd/admin_user_reset_mfa.go
new file mode 100644
index 0000000000..8107fd97bf
--- /dev/null
+++ b/cmd/admin_user_reset_mfa.go
@@ -0,0 +1,73 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package cmd
+
+import (
+ "context"
+ "fmt"
+
+ auth_model "forgejo.org/models/auth"
+ user_model "forgejo.org/models/user"
+
+ "github.com/urfave/cli/v3"
+)
+
+func microcmdUserResetMFA() *cli.Command {
+ return &cli.Command{
+ Name: "reset-mfa",
+ Usage: "Remove all two-factor authentication configurations for a user",
+ Action: runResetMFA,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "username",
+ Aliases: []string{"u"},
+ Value: "",
+ Usage: "The user to update",
+ },
+ },
+ }
+}
+
+func runResetMFA(ctx context.Context, c *cli.Command) error {
+ if err := argsSet(c, "username"); err != nil {
+ return err
+ }
+
+ ctx, cancel := installSignals(ctx)
+ defer cancel()
+
+ if err := initDB(ctx); err != nil {
+ return err
+ }
+
+ user, err := user_model.GetUserByName(ctx, c.String("username"))
+ if err != nil {
+ return err
+ }
+
+ webAuthnList, err := auth_model.GetWebAuthnCredentialsByUID(ctx, user.ID)
+ if err != nil {
+ return err
+ }
+
+ for _, credential := range webAuthnList {
+ if _, err := auth_model.DeleteCredential(ctx, credential.ID, user.ID); err != nil {
+ return err
+ }
+ }
+
+ tfaModes, err := auth_model.GetTwoFactorByUID(ctx, user.ID)
+ if err == nil && tfaModes != nil {
+ if err := auth_model.DeleteTwoFactorByID(ctx, tfaModes.ID, user.ID); err != nil {
+ return err
+ }
+ } else {
+ if _, is := err.(auth_model.ErrTwoFactorNotEnrolled); !is {
+ return err
+ }
+ }
+
+ fmt.Printf("%s's two-factor authentication settings have been removed!\n", user.Name)
+ return nil
+}
diff --git a/cmd/cert.go b/cmd/cert.go
index bf83af389f..f9e3a16f3e 100644
--- a/cmd/cert.go
+++ b/cmd/cert.go
@@ -6,6 +6,7 @@
package cmd
import (
+ "context"
"crypto/ecdsa"
"crypto/elliptic"
"crypto/rand"
@@ -20,47 +21,49 @@ import (
"strings"
"time"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdCert represents the available cert sub-command.
-var CmdCert = &cli.Command{
- Name: "cert",
- Usage: "Generate self-signed certificate",
- Description: `Generate a self-signed X.509 certificate for a TLS server.
+func cmdCert() *cli.Command {
+ return &cli.Command{
+ Name: "cert",
+ Usage: "Generate self-signed certificate",
+ Description: `Generate a self-signed X.509 certificate for a TLS server.
Outputs to 'cert.pem' and 'key.pem' and will overwrite existing files.`,
- Action: runCert,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "host",
- Value: "",
- Usage: "Comma-separated hostnames and IPs to generate a certificate for",
+ Action: runCert,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "host",
+ Value: "",
+ Usage: "Comma-separated hostnames and IPs to generate a certificate for",
+ },
+ &cli.StringFlag{
+ Name: "ecdsa-curve",
+ Value: "",
+ Usage: "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521",
+ },
+ &cli.IntFlag{
+ Name: "rsa-bits",
+ Value: 3072,
+ Usage: "Size of RSA key to generate. Ignored if --ecdsa-curve is set",
+ },
+ &cli.StringFlag{
+ Name: "start-date",
+ Value: "",
+ Usage: "Creation date formatted as Jan 1 15:04:05 2011",
+ },
+ &cli.DurationFlag{
+ Name: "duration",
+ Value: 365 * 24 * time.Hour,
+ Usage: "Duration that certificate is valid for",
+ },
+ &cli.BoolFlag{
+ Name: "ca",
+ Usage: "whether this cert should be its own Certificate Authority",
+ },
},
- &cli.StringFlag{
- Name: "ecdsa-curve",
- Value: "",
- Usage: "ECDSA curve to use to generate a key. Valid values are P224, P256, P384, P521",
- },
- &cli.IntFlag{
- Name: "rsa-bits",
- Value: 3072,
- Usage: "Size of RSA key to generate. Ignored if --ecdsa-curve is set",
- },
- &cli.StringFlag{
- Name: "start-date",
- Value: "",
- Usage: "Creation date formatted as Jan 1 15:04:05 2011",
- },
- &cli.DurationFlag{
- Name: "duration",
- Value: 365 * 24 * time.Hour,
- Usage: "Duration that certificate is valid for",
- },
- &cli.BoolFlag{
- Name: "ca",
- Usage: "whether this cert should be its own Certificate Authority",
- },
- },
+ }
}
func publicKey(priv any) any {
@@ -89,7 +92,7 @@ func pemBlockForKey(priv any) *pem.Block {
}
}
-func runCert(c *cli.Context) error {
+func runCert(ctx context.Context, c *cli.Command) error {
if err := argsSet(c, "host"); err != nil {
return err
}
diff --git a/cmd/cmd.go b/cmd/cmd.go
index c887d0ed52..85a482b78c 100644
--- a/cmd/cmd.go
+++ b/cmd/cmd.go
@@ -20,19 +20,21 @@ import (
"forgejo.org/modules/setting"
"forgejo.org/modules/util"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// argsSet checks that all the required arguments are set. args is a list of
// arguments that must be set in the passed Context.
-func argsSet(c *cli.Context, args ...string) error {
+func argsSet(c *cli.Command, args ...string) error {
for _, a := range args {
if !c.IsSet(a) {
return errors.New(a + " is not set")
}
- if util.IsEmptyString(c.String(a)) {
- return errors.New(a + " is required")
+ if s, ok := c.Value(a).(string); ok {
+ if util.IsEmptyString(s) {
+ return errors.New(a + " is required")
+ }
}
}
return nil
@@ -73,8 +75,8 @@ If this is the intended configuration file complete the [database] section.`, se
return nil
}
-func installSignals() (context.Context, context.CancelFunc) {
- ctx, cancel := context.WithCancel(context.Background())
+func installSignals(ctx context.Context) (context.Context, context.CancelFunc) {
+ ctx, cancel := context.WithCancel(ctx)
go func() {
// install notify
signalChannel := make(chan os.Signal, 1)
@@ -109,7 +111,7 @@ func setupConsoleLogger(level log.Level, colorize bool, out io.Writer) {
log.GetManager().GetLogger(log.DEFAULT).ReplaceAllWriters(writer)
}
-func globalBool(c *cli.Context, name string) bool {
+func globalBool(c *cli.Command, name string) bool {
for _, ctx := range c.Lineage() {
if ctx.Bool(name) {
return true
@@ -120,16 +122,16 @@ func globalBool(c *cli.Context, name string) bool {
// PrepareConsoleLoggerLevel by default, use INFO level for console logger, but some sub-commands (for git/ssh protocol) shouldn't output any log to stdout.
// Any log appears in git stdout pipe will break the git protocol, eg: client can't push and hangs forever.
-func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(*cli.Context) error {
- return func(c *cli.Context) error {
+func PrepareConsoleLoggerLevel(defaultLevel log.Level) func(ctx context.Context, cli *cli.Command) (context.Context, error) {
+ return func(ctx context.Context, cli *cli.Command) (context.Context, error) {
level := defaultLevel
- if globalBool(c, "quiet") {
+ if globalBool(cli, "quiet") {
level = log.FATAL
}
- if globalBool(c, "debug") || globalBool(c, "verbose") {
+ if globalBool(cli, "debug") || globalBool(cli, "verbose") {
level = log.TRACE
}
log.SetConsoleLogger(log.DEFAULT, "console-default", level)
- return nil
+ return ctx, nil
}
}
diff --git a/cmd/docs.go b/cmd/docs.go
deleted file mode 100644
index 1dc0980c00..0000000000
--- a/cmd/docs.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2020 The Gitea Authors. All rights reserved.
-// SPDX-License-Identifier: MIT
-
-package cmd
-
-import (
- "fmt"
- "os"
- "strings"
-
- "github.com/urfave/cli/v2"
-)
-
-// CmdDocs represents the available docs sub-command.
-var CmdDocs = &cli.Command{
- Name: "docs",
- Usage: "Output CLI documentation",
- Description: "A command to output Forgejo's CLI documentation, optionally to a file.",
- Action: runDocs,
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "man",
- Usage: "Output man pages instead",
- },
- &cli.StringFlag{
- Name: "output",
- Aliases: []string{"o"},
- Usage: "Path to output to instead of stdout (will overwrite if exists)",
- },
- },
-}
-
-func runDocs(ctx *cli.Context) error {
- docs, err := ctx.App.ToMarkdown()
- if ctx.Bool("man") {
- docs, err = ctx.App.ToMan()
- }
- if err != nil {
- return err
- }
-
- if !ctx.Bool("man") {
- // Clean up markdown. The following bug was fixed in v2, but is present in v1.
- // It affects markdown output (even though the issue is referring to man pages)
- // https://github.com/urfave/cli/issues/1040
- firstHashtagIndex := strings.Index(docs, "#")
-
- if firstHashtagIndex > 0 {
- docs = docs[firstHashtagIndex:]
- }
- }
-
- out := os.Stdout
- if ctx.String("output") != "" {
- fi, err := os.Create(ctx.String("output"))
- if err != nil {
- return err
- }
- defer fi.Close()
- out = fi
- }
-
- _, err = fmt.Fprintln(out, docs)
- return err
-}
diff --git a/cmd/doctor.go b/cmd/doctor.go
index 3807623ccd..681794f094 100644
--- a/cmd/doctor.go
+++ b/cmd/doctor.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"fmt"
golog "log"
"os"
@@ -19,80 +20,86 @@ import (
"forgejo.org/modules/setting"
"forgejo.org/services/doctor"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdDoctor represents the available doctor sub-command.
-var CmdDoctor = &cli.Command{
- Name: "doctor",
- Usage: "Diagnose and optionally fix problems, convert or re-create database tables",
- Description: "A command to diagnose problems with the current Forgejo instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
+func cmdDoctor() *cli.Command {
+ return &cli.Command{
+ Name: "doctor",
+ Usage: "Diagnose and optionally fix problems, convert or re-create database tables",
+ Description: "A command to diagnose problems with the current Forgejo instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
- Subcommands: []*cli.Command{
- cmdDoctorCheck,
- cmdRecreateTable,
- cmdDoctorConvert,
- },
+ Commands: []*cli.Command{
+ cmdDoctorCheck(),
+ cmdRecreateTable(),
+ cmdDoctorConvert(),
+ },
+ }
}
-var cmdDoctorCheck = &cli.Command{
- Name: "check",
- Usage: "Diagnose and optionally fix problems",
- Description: "A command to diagnose problems with the current Forgejo instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
- Action: runDoctorCheck,
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "list",
- Usage: "List the available checks",
+func cmdDoctorCheck() *cli.Command {
+ return &cli.Command{
+ Name: "check",
+ Usage: "Diagnose and optionally fix problems",
+ Description: "A command to diagnose problems with the current Forgejo instance according to the given configuration. Some problems can optionally be fixed by modifying the database or data storage.",
+ Action: runDoctorCheck,
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "list",
+ Usage: "List the available checks",
+ },
+ &cli.BoolFlag{
+ Name: "default",
+ Usage: "Run the default checks (if neither --run or --all is set, this is the default behaviour)",
+ },
+ &cli.StringSliceFlag{
+ Name: "run",
+ Usage: "Run the provided checks - (if --default is set, the default checks will also run)",
+ },
+ &cli.BoolFlag{
+ Name: "all",
+ Usage: "Run all the available checks",
+ },
+ &cli.BoolFlag{
+ Name: "fix",
+ Usage: "Automatically fix what we can",
+ },
+ &cli.StringFlag{
+ Name: "log-file",
+ Usage: `Name of the log file (no verbose log output by default). Set to "-" to output to stdout`,
+ },
+ &cli.BoolFlag{
+ Name: "color",
+ Aliases: []string{"H"},
+ Usage: "Use color for outputted information",
+ },
},
- &cli.BoolFlag{
- Name: "default",
- Usage: "Run the default checks (if neither --run or --all is set, this is the default behaviour)",
- },
- &cli.StringSliceFlag{
- Name: "run",
- Usage: "Run the provided checks - (if --default is set, the default checks will also run)",
- },
- &cli.BoolFlag{
- Name: "all",
- Usage: "Run all the available checks",
- },
- &cli.BoolFlag{
- Name: "fix",
- Usage: "Automatically fix what we can",
- },
- &cli.StringFlag{
- Name: "log-file",
- Usage: `Name of the log file (no verbose log output by default). Set to "-" to output to stdout`,
- },
- &cli.BoolFlag{
- Name: "color",
- Aliases: []string{"H"},
- Usage: "Use color for outputted information",
- },
- },
+ }
}
-var cmdRecreateTable = &cli.Command{
- Name: "recreate-table",
- Usage: "Recreate tables from XORM definitions and copy the data.",
- ArgsUsage: "[TABLE]... : (TABLEs to recreate - leave blank for all)",
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "debug",
- Usage: "Print SQL commands sent",
+func cmdRecreateTable() *cli.Command {
+ return &cli.Command{
+ Name: "recreate-table",
+ Usage: "Recreate tables from XORM definitions and copy the data.",
+ ArgsUsage: "[TABLE]... : (TABLEs to recreate - leave blank for all)",
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "debug",
+ Usage: "Print SQL commands sent",
+ },
},
- },
- Description: `The database definitions Forgejo uses change across versions, sometimes changing default values and leaving old unused columns.
+ Description: `The database definitions Forgejo uses change across versions, sometimes changing default values and leaving old unused columns.
This command will cause Xorm to recreate tables, copying over the data and deleting the old table.
You should back-up your database before doing this and ensure that your database is up-to-date first.`,
- Action: runRecreateTable,
+ Action: runRecreateTable,
+ }
}
-func runRecreateTable(ctx *cli.Context) error {
- stdCtx, cancel := installSignals()
+func runRecreateTable(stdCtx context.Context, ctx *cli.Command) error {
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
// Redirect the default golog to here
@@ -143,7 +150,7 @@ func runRecreateTable(ctx *cli.Context) error {
})
}
-func setupDoctorDefaultLogger(ctx *cli.Context, colorize bool) {
+func setupDoctorDefaultLogger(ctx *cli.Command, colorize bool) {
// Silence the default loggers
setupConsoleLogger(log.FATAL, log.CanColorStderr, os.Stderr)
@@ -165,8 +172,8 @@ func setupDoctorDefaultLogger(ctx *cli.Context, colorize bool) {
}
}
-func runDoctorCheck(ctx *cli.Context) error {
- stdCtx, cancel := installSignals()
+func runDoctorCheck(stdCtx context.Context, ctx *cli.Command) error {
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
colorize := log.CanColorStdout
diff --git a/cmd/doctor_convert.go b/cmd/doctor_convert.go
index 06883264a3..44bebae154 100644
--- a/cmd/doctor_convert.go
+++ b/cmd/doctor_convert.go
@@ -4,25 +4,28 @@
package cmd
import (
+ "context"
"fmt"
"forgejo.org/models/db"
"forgejo.org/modules/log"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// cmdDoctorConvert represents the available convert sub-command.
-var cmdDoctorConvert = &cli.Command{
- Name: "convert",
- Usage: "Convert the database",
- Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
- Action: runDoctorConvert,
+func cmdDoctorConvert() *cli.Command {
+ return &cli.Command{
+ Name: "convert",
+ Usage: "Convert the database",
+ Description: "A command to convert an existing MySQL database from utf8 to utf8mb4",
+ Action: runDoctorConvert,
+ }
}
-func runDoctorConvert(ctx *cli.Context) error {
- stdCtx, cancel := installSignals()
+func runDoctorConvert(stdCtx context.Context, ctx *cli.Command) error {
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
if err := initDB(stdCtx); err != nil {
diff --git a/cmd/doctor_test.go b/cmd/doctor_test.go
index bfb4b9d803..c3eda8315b 100644
--- a/cmd/doctor_test.go
+++ b/cmd/doctor_test.go
@@ -11,7 +11,7 @@ import (
"forgejo.org/services/doctor"
"github.com/stretchr/testify/require"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func TestDoctorRun(t *testing.T) {
@@ -22,12 +22,12 @@ func TestDoctorRun(t *testing.T) {
SkipDatabaseInitialization: true,
})
- app := cli.NewApp()
- app.Commands = []*cli.Command{cmdDoctorCheck}
- err := app.Run([]string{"./gitea", "check", "--run", "test-check"})
+ app := cli.Command{}
+ app.Commands = []*cli.Command{cmdDoctorCheck()}
+ err := app.Run(t.Context(), []string{"./gitea", "check", "--run", "test-check"})
require.NoError(t, err)
- err = app.Run([]string{"./gitea", "check", "--run", "no-such"})
+ err = app.Run(t.Context(), []string{"./gitea", "check", "--run", "no-such"})
require.ErrorContains(t, err, `unknown checks: "no-such"`)
- err = app.Run([]string{"./gitea", "check", "--run", "test-check,no-such"})
+ err = app.Run(t.Context(), []string{"./gitea", "check", "--run", "test-check,no-such"})
require.ErrorContains(t, err, `unknown checks: "no-such"`)
}
diff --git a/cmd/dump.go b/cmd/dump.go
index bc0b269924..cb01e74196 100644
--- a/cmd/dump.go
+++ b/cmd/dump.go
@@ -5,6 +5,8 @@
package cmd
import (
+ "context"
+ "errors"
"fmt"
"io"
"os"
@@ -22,7 +24,7 @@ import (
"code.forgejo.org/go-chi/session"
"github.com/mholt/archiver/v3"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func addReader(w archiver.Writer, r io.ReadCloser, info os.FileInfo, customName string, verbose bool) error {
@@ -83,6 +85,10 @@ func (o *outputType) Set(value string) error {
return fmt.Errorf("allowed values are %s", o.Join())
}
+func (o *outputType) Get() any {
+ return o.String()
+}
+
func (o outputType) String() string {
if o.selected == "" {
return o.Default
@@ -96,79 +102,81 @@ var outputTypeEnum = &outputType{
}
// CmdDump represents the available dump sub-command.
-var CmdDump = &cli.Command{
- Name: "dump",
- Usage: "Dump Forgejo files and database",
- Description: `Dump compresses all related files and database into zip file.
+func cmdDump() *cli.Command {
+ return &cli.Command{
+ Name: "dump",
+ Usage: "Dump Forgejo files and database",
+ Description: `Dump compresses all related files and database into zip file.
It can be used for backup and capture Forgejo server image to send to maintainer`,
- Action: runDump,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "file",
- Aliases: []string{"f"},
- Value: fmt.Sprintf("forgejo-dump-%d.zip", time.Now().Unix()),
- Usage: "Name of the dump file which will be created. Supply '-' for stdout. See type for available types.",
+ Action: runDump,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "file",
+ Aliases: []string{"f"},
+ Value: fmt.Sprintf("forgejo-dump-%d.zip", time.Now().Unix()),
+ Usage: "Name of the dump file which will be created. Supply '-' for stdout. See type for available types.",
+ },
+ &cli.BoolFlag{
+ Name: "verbose",
+ Aliases: []string{"V"},
+ Usage: "Show process details",
+ },
+ &cli.BoolFlag{
+ Name: "quiet",
+ Aliases: []string{"q"},
+ Usage: "Only display warnings and errors",
+ },
+ &cli.StringFlag{
+ Name: "tempdir",
+ Aliases: []string{"t"},
+ Usage: "Temporary dir path",
+ },
+ &cli.StringFlag{
+ Name: "database",
+ Aliases: []string{"d"},
+ Usage: "Specify the database SQL syntax: sqlite3, mysql, postgres",
+ },
+ &cli.BoolFlag{
+ Name: "skip-repository",
+ Aliases: []string{"R"},
+ Usage: "Skip repositories",
+ },
+ &cli.BoolFlag{
+ Name: "skip-log",
+ Aliases: []string{"L"},
+ Usage: "Skip logs",
+ },
+ &cli.BoolFlag{
+ Name: "skip-custom-dir",
+ Usage: "Skip custom directory",
+ },
+ &cli.BoolFlag{
+ Name: "skip-lfs-data",
+ Usage: "Skip LFS data",
+ },
+ &cli.BoolFlag{
+ Name: "skip-attachment-data",
+ Usage: "Skip attachment data",
+ },
+ &cli.BoolFlag{
+ Name: "skip-package-data",
+ Usage: "Skip package data",
+ },
+ &cli.BoolFlag{
+ Name: "skip-index",
+ Usage: "Skip bleve index data",
+ },
+ &cli.BoolFlag{
+ Name: "skip-repo-archives",
+ Usage: "Skip repository archives",
+ },
+ &cli.GenericFlag{
+ Name: "type",
+ Value: outputTypeEnum,
+ Usage: fmt.Sprintf("Dump output format: %s", outputTypeEnum.Join()),
+ },
},
- &cli.BoolFlag{
- Name: "verbose",
- Aliases: []string{"V"},
- Usage: "Show process details",
- },
- &cli.BoolFlag{
- Name: "quiet",
- Aliases: []string{"q"},
- Usage: "Only display warnings and errors",
- },
- &cli.StringFlag{
- Name: "tempdir",
- Aliases: []string{"t"},
- Usage: "Temporary dir path",
- },
- &cli.StringFlag{
- Name: "database",
- Aliases: []string{"d"},
- Usage: "Specify the database SQL syntax: sqlite3, mysql, postgres",
- },
- &cli.BoolFlag{
- Name: "skip-repository",
- Aliases: []string{"R"},
- Usage: "Skip repositories",
- },
- &cli.BoolFlag{
- Name: "skip-log",
- Aliases: []string{"L"},
- Usage: "Skip logs",
- },
- &cli.BoolFlag{
- Name: "skip-custom-dir",
- Usage: "Skip custom directory",
- },
- &cli.BoolFlag{
- Name: "skip-lfs-data",
- Usage: "Skip LFS data",
- },
- &cli.BoolFlag{
- Name: "skip-attachment-data",
- Usage: "Skip attachment data",
- },
- &cli.BoolFlag{
- Name: "skip-package-data",
- Usage: "Skip package data",
- },
- &cli.BoolFlag{
- Name: "skip-index",
- Usage: "Skip bleve index data",
- },
- &cli.BoolFlag{
- Name: "skip-repo-archives",
- Usage: "Skip repository archives",
- },
- &cli.GenericFlag{
- Name: "type",
- Value: outputTypeEnum,
- Usage: fmt.Sprintf("Dump output format: %s", outputTypeEnum.Join()),
- },
- },
+ }
}
func fatal(format string, args ...any) {
@@ -176,7 +184,7 @@ func fatal(format string, args ...any) {
log.Fatal(format, args...)
}
-func runDump(ctx *cli.Context) error {
+func runDump(stdCtx context.Context, ctx *cli.Command) error {
var file *os.File
fileName := ctx.String("file")
outType := ctx.String("type")
@@ -212,16 +220,16 @@ func runDump(ctx *cli.Context) error {
if !setting.InstallLock {
log.Error("Is '%s' really the right config path?\n", setting.CustomConf)
- return fmt.Errorf("forgejo is not initialized")
+ return errors.New("forgejo is not initialized")
}
setting.LoadSettings() // cannot access session settings otherwise
verbose := ctx.Bool("verbose")
if verbose && ctx.Bool("quiet") {
- return fmt.Errorf("--quiet and --verbose cannot both be set")
+ return errors.New("--quiet and --verbose cannot both be set")
}
- stdCtx, cancel := installSignals()
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
err := db.InitEngine(stdCtx)
diff --git a/cmd/dump_repo.go b/cmd/dump_repo.go
index 7c7440dad7..7159d55e99 100644
--- a/cmd/dump_repo.go
+++ b/cmd/dump_repo.go
@@ -19,73 +19,75 @@ import (
"forgejo.org/services/convert"
"forgejo.org/services/migrations"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdDumpRepository represents the available dump repository sub-command.
-var CmdDumpRepository = &cli.Command{
- Name: "dump-repo",
- Usage: "Dump the repository from git/github/gitea/gitlab",
- Description: "This is a command for dumping the repository data.",
- Action: runDumpRepository,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "git_service",
- Value: "",
- Usage: "Git service, git, github, gitea, gitlab. If clone_addr could be recognized, this could be ignored.",
- },
- &cli.StringFlag{
- Name: "repo_dir",
- Aliases: []string{"r"},
- Value: "./data",
- Usage: "Repository dir path to store the data",
- },
- &cli.StringFlag{
- Name: "clone_addr",
- Value: "",
- Usage: "The URL will be clone, currently could be a git/github/gitea/gitlab http/https URL",
- },
- &cli.StringFlag{
- Name: "auth_username",
- Value: "",
- Usage: "The username to visit the clone_addr",
- },
- &cli.StringFlag{
- Name: "auth_password",
- Value: "",
- Usage: "The password to visit the clone_addr",
- },
- &cli.StringFlag{
- Name: "auth_token",
- Value: "",
- Usage: "The personal token to visit the clone_addr",
- },
- &cli.StringFlag{
- Name: "owner_name",
- Value: "",
- Usage: "The data will be stored on a directory with owner name if not empty",
- },
- &cli.StringFlag{
- Name: "repo_name",
- Value: "",
- Usage: "The data will be stored on a directory with repository name if not empty",
- },
- &cli.StringFlag{
- Name: "units",
- Value: "",
- Usage: `Which items will be migrated, one or more units should be separated as comma.
+func cmdDumpRepository() *cli.Command {
+ return &cli.Command{
+ Name: "dump-repo",
+ Usage: "Dump the repository from git/github/gitea/gitlab",
+ Description: "This is a command for dumping the repository data.",
+ Action: runDumpRepository,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "git_service",
+ Value: "",
+ Usage: "Git service, git, github, gitea, gitlab. If clone_addr could be recognized, this could be ignored.",
+ },
+ &cli.StringFlag{
+ Name: "repo_dir",
+ Aliases: []string{"r"},
+ Value: "./data",
+ Usage: "Repository dir path to store the data",
+ },
+ &cli.StringFlag{
+ Name: "clone_addr",
+ Value: "",
+ Usage: "The URL will be clone, currently could be a git/github/gitea/gitlab http/https URL",
+ },
+ &cli.StringFlag{
+ Name: "auth_username",
+ Value: "",
+ Usage: "The username to visit the clone_addr",
+ },
+ &cli.StringFlag{
+ Name: "auth_password",
+ Value: "",
+ Usage: "The password to visit the clone_addr",
+ },
+ &cli.StringFlag{
+ Name: "auth_token",
+ Value: "",
+ Usage: "The personal token to visit the clone_addr",
+ },
+ &cli.StringFlag{
+ Name: "owner_name",
+ Value: "",
+ Usage: "The data will be stored on a directory with owner name if not empty",
+ },
+ &cli.StringFlag{
+ Name: "repo_name",
+ Value: "",
+ Usage: "The data will be stored on a directory with repository name if not empty",
+ },
+ &cli.StringFlag{
+ Name: "units",
+ Value: "",
+ Usage: `Which items will be migrated, one or more units should be separated as comma.
wiki, issues, labels, releases, release_assets, milestones, pull_requests, comments are allowed. Empty means all units.`,
+ },
},
- },
+ }
}
-func runDumpRepository(ctx *cli.Context) error {
+func runDumpRepository(stdCtx context.Context, ctx *cli.Command) error {
setupConsoleLogger(log.INFO, log.CanColorStderr, os.Stderr)
// setting.DisableLoggerInit()
setting.LoadSettings() // cannot access skip_tls_verify settings otherwise
- stdCtx, cancel := installSignals()
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
if err := initDB(stdCtx); err != nil {
diff --git a/cmd/embedded.go b/cmd/embedded.go
index c8b9d13d25..8fa76ccef1 100644
--- a/cmd/embedded.go
+++ b/cmd/embedded.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"os"
@@ -19,23 +20,25 @@ import (
"forgejo.org/modules/util"
"github.com/gobwas/glob"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdEmbedded represents the available extract sub-command.
-var (
- CmdEmbedded = &cli.Command{
+func cmdEmbedded() *cli.Command {
+ return &cli.Command{
Name: "embedded",
Usage: "Extract embedded resources",
Description: "A command for extracting embedded resources, like templates and images",
- Subcommands: []*cli.Command{
- subcmdList,
- subcmdView,
- subcmdExtract,
+ Commands: []*cli.Command{
+ subcmdList(),
+ subcmdView(),
+ subcmdExtract(),
},
}
+}
- subcmdList = &cli.Command{
+func subcmdList() *cli.Command {
+ return &cli.Command{
Name: "list",
Usage: "List files matching the given pattern",
Action: runList,
@@ -47,8 +50,10 @@ var (
},
},
}
+}
- subcmdView = &cli.Command{
+func subcmdView() *cli.Command {
+ return &cli.Command{
Name: "view",
Usage: "View a file matching the given pattern",
Action: runView,
@@ -60,8 +65,10 @@ var (
},
},
}
+}
- subcmdExtract = &cli.Command{
+func subcmdExtract() *cli.Command {
+ return &cli.Command{
Name: "extract",
Usage: "Extract resources",
Action: runExtract,
@@ -90,9 +97,9 @@ var (
},
},
}
+}
- matchedAssetFiles []assetFile
-)
+var matchedAssetFiles []assetFile
type assetFile struct {
fs *assetfs.LayeredFS
@@ -100,7 +107,7 @@ type assetFile struct {
path string
}
-func initEmbeddedExtractor(c *cli.Context) error {
+func initEmbeddedExtractor(_ context.Context, c *cli.Command) error {
setupConsoleLogger(log.ERROR, log.CanColorStderr, os.Stderr)
patterns, err := compileCollectPatterns(c.Args().Slice())
@@ -115,32 +122,32 @@ func initEmbeddedExtractor(c *cli.Context) error {
return nil
}
-func runList(c *cli.Context) error {
- if err := runListDo(c); err != nil {
+func runList(ctx context.Context, c *cli.Command) error {
+ if err := runListDo(ctx, c); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return err
}
return nil
}
-func runView(c *cli.Context) error {
- if err := runViewDo(c); err != nil {
+func runView(ctx context.Context, c *cli.Command) error {
+ if err := runViewDo(ctx, c); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return err
}
return nil
}
-func runExtract(c *cli.Context) error {
- if err := runExtractDo(c); err != nil {
+func runExtract(ctx context.Context, c *cli.Command) error {
+ if err := runExtractDo(ctx, c); err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
return err
}
return nil
}
-func runListDo(c *cli.Context) error {
- if err := initEmbeddedExtractor(c); err != nil {
+func runListDo(ctx context.Context, c *cli.Command) error {
+ if err := initEmbeddedExtractor(ctx, c); err != nil {
return err
}
@@ -151,8 +158,8 @@ func runListDo(c *cli.Context) error {
return nil
}
-func runViewDo(c *cli.Context) error {
- if err := initEmbeddedExtractor(c); err != nil {
+func runViewDo(ctx context.Context, c *cli.Command) error {
+ if err := initEmbeddedExtractor(ctx, c); err != nil {
return err
}
@@ -174,8 +181,8 @@ func runViewDo(c *cli.Context) error {
return nil
}
-func runExtractDo(c *cli.Context) error {
- if err := initEmbeddedExtractor(c); err != nil {
+func runExtractDo(ctx context.Context, c *cli.Command) error {
+ if err := initEmbeddedExtractor(ctx, c); err != nil {
return err
}
@@ -271,7 +278,7 @@ func extractAsset(d string, a assetFile, overwrite, rename bool) error {
return nil
}
-func collectAssetFilesByPattern(c *cli.Context, globs []glob.Glob, path string, layer *assetfs.Layer) {
+func collectAssetFilesByPattern(c *cli.Command, globs []glob.Glob, path string, layer *assetfs.Layer) {
fs := assetfs.Layered(layer)
files, err := fs.ListAllFiles(".", true)
if err != nil {
diff --git a/cmd/forgejo/actions.go b/cmd/forgejo/actions.go
index dbe7398bcf..c445d1aa38 100644
--- a/cmd/forgejo/actions.go
+++ b/cmd/forgejo/actions.go
@@ -6,6 +6,7 @@ package forgejo
import (
"context"
"encoding/hex"
+ "errors"
"fmt"
"io"
"os"
@@ -16,14 +17,14 @@ import (
"forgejo.org/modules/setting"
private_routers "forgejo.org/routers/private"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func CmdActions(ctx context.Context) *cli.Command {
return &cli.Command{
Name: "actions",
Usage: "Commands for managing Forgejo Actions",
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
SubcmdActionsGenerateRunnerToken(ctx),
SubcmdActionsGenerateRunnerSecret(ctx),
SubcmdActionsRegister(ctx),
@@ -36,7 +37,7 @@ func SubcmdActionsGenerateRunnerToken(ctx context.Context) *cli.Command {
Name: "generate-runner-token",
Usage: "Generate a new token for a runner to use to register with the server",
Before: prepareWorkPathAndCustomConf(ctx),
- Action: func(cliCtx *cli.Context) error { return RunGenerateActionsRunnerToken(ctx, cliCtx) },
+ Action: RunGenerateActionsRunnerToken,
Flags: []cli.Flag{
&cli.StringFlag{
Name: "scope",
@@ -52,7 +53,7 @@ func SubcmdActionsGenerateRunnerSecret(ctx context.Context) *cli.Command {
return &cli.Command{
Name: "generate-secret",
Usage: "Generate a secret suitable for input to the register subcommand",
- Action: func(cliCtx *cli.Context) error { return RunGenerateSecret(ctx, cliCtx) },
+ Action: RunGenerateSecret,
}
}
@@ -61,7 +62,7 @@ func SubcmdActionsRegister(ctx context.Context) *cli.Command {
Name: "register",
Usage: "Idempotent registration of a runner using a shared secret",
Before: prepareWorkPathAndCustomConf(ctx),
- Action: func(cliCtx *cli.Context) error { return RunRegister(ctx, cliCtx) },
+ Action: RunRegister,
Flags: []cli.Flag{
&cli.StringFlag{
Name: "secret",
@@ -105,26 +106,26 @@ func SubcmdActionsRegister(ctx context.Context) *cli.Command {
}
}
-func readSecret(ctx context.Context, cliCtx *cli.Context) (string, error) {
- if cliCtx.IsSet("secret") {
- return cliCtx.String("secret"), nil
+func readSecret(ctx context.Context, cli *cli.Command) (string, error) {
+ if cli.IsSet("secret") {
+ return cli.String("secret"), nil
}
- if cliCtx.IsSet("secret-stdin") {
+ if cli.IsSet("secret-stdin") {
buf, err := io.ReadAll(ContextGetStdin(ctx))
if err != nil {
return "", err
}
return string(buf), nil
}
- if cliCtx.IsSet("secret-file") {
- path := cliCtx.String("secret-file")
+ if cli.IsSet("secret-file") {
+ path := cli.String("secret-file")
buf, err := os.ReadFile(path)
if err != nil {
return "", err
}
return string(buf), nil
}
- return "", fmt.Errorf("at least one of the --secret, --secret-stdin, --secret-file options is required")
+ return "", errors.New("at least one of the --secret, --secret-stdin, --secret-file options is required")
}
func validateSecret(secret string) error {
@@ -138,18 +139,18 @@ func validateSecret(secret string) error {
return nil
}
-func getLabels(cliCtx *cli.Context) (*[]string, error) {
- if !cliCtx.Bool("keep-labels") {
- lblValue := strings.Split(cliCtx.String("labels"), ",")
+func getLabels(cli *cli.Command) (*[]string, error) {
+ if !cli.Bool("keep-labels") {
+ lblValue := strings.Split(cli.String("labels"), ",")
return &lblValue, nil
}
- if cliCtx.String("labels") != "" {
- return nil, fmt.Errorf("--labels and --keep-labels should not be used together")
+ if cli.String("labels") != "" {
+ return nil, errors.New("--labels and --keep-labels should not be used together")
}
return nil, nil
}
-func RunRegister(ctx context.Context, cliCtx *cli.Context) error {
+func RunRegister(ctx context.Context, cli *cli.Command) error {
var cancel context.CancelFunc
if !ContextGetNoInit(ctx) {
ctx, cancel = installSignals(ctx)
@@ -161,17 +162,17 @@ func RunRegister(ctx context.Context, cliCtx *cli.Context) error {
}
setting.MustInstalled()
- secret, err := readSecret(ctx, cliCtx)
+ secret, err := readSecret(ctx, cli)
if err != nil {
return err
}
if err := validateSecret(secret); err != nil {
return err
}
- scope := cliCtx.String("scope")
- name := cliCtx.String("name")
- version := cliCtx.String("version")
- labels, err := getLabels(cliCtx)
+ scope := cli.String("scope")
+ name := cli.String("name")
+ version := cli.String("version")
+ labels, err := getLabels(cli)
if err != nil {
return err
}
@@ -209,7 +210,7 @@ func RunRegister(ctx context.Context, cliCtx *cli.Context) error {
return nil
}
-func RunGenerateSecret(ctx context.Context, cliCtx *cli.Context) error {
+func RunGenerateSecret(ctx context.Context, cli *cli.Command) error {
runner := actions_model.ActionRunner{}
if err := runner.GenerateToken(); err != nil {
return err
@@ -220,7 +221,7 @@ func RunGenerateSecret(ctx context.Context, cliCtx *cli.Context) error {
return nil
}
-func RunGenerateActionsRunnerToken(ctx context.Context, cliCtx *cli.Context) error {
+func RunGenerateActionsRunnerToken(ctx context.Context, cli *cli.Command) error {
if !ContextGetNoInit(ctx) {
var cancel context.CancelFunc
ctx, cancel = installSignals(ctx)
@@ -229,7 +230,7 @@ func RunGenerateActionsRunnerToken(ctx context.Context, cliCtx *cli.Context) err
setting.MustInstalled()
- scope := cliCtx.String("scope")
+ scope := cli.String("scope")
respText, extra := private.GenerateActionsRunnerToken(ctx, scope)
if extra.HasError() {
diff --git a/cmd/forgejo/actions_test.go b/cmd/forgejo/actions_test.go
index b58f52184c..11315239f7 100644
--- a/cmd/forgejo/actions_test.go
+++ b/cmd/forgejo/actions_test.go
@@ -4,14 +4,13 @@
package forgejo
import (
+ "context"
"fmt"
"testing"
- "forgejo.org/services/context"
-
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func TestActions_getLabels(t *testing.T) {
@@ -54,21 +53,21 @@ func TestActions_getLabels(t *testing.T) {
},
}
- flags := SubcmdActionsRegister(context.Context{}).Flags
+ flags := SubcmdActionsRegister(t.Context()).Flags
for _, c := range cases {
t.Run(fmt.Sprintf("args: %v", c.args), func(t *testing.T) {
// Create a copy of command to test
var result *resultType
- app := cli.NewApp()
+ app := cli.Command{}
app.Flags = flags
- app.Action = func(ctx *cli.Context) error {
+ app.Action = func(_ context.Context, ctx *cli.Command) error {
labels, err := getLabels(ctx)
result = &resultType{labels, err}
return nil
}
// Run it
- _ = app.Run(c.args)
+ _ = app.Run(t.Context(), c.args)
// Test the results
require.NotNil(t, result)
diff --git a/cmd/forgejo/f3.go b/cmd/forgejo/f3.go
index bfd14cd1a4..c4aafeac58 100644
--- a/cmd/forgejo/f3.go
+++ b/cmd/forgejo/f3.go
@@ -20,7 +20,7 @@ import (
f3_cmd "code.forgejo.org/f3/gof3/v3/cmd"
f3_logger "code.forgejo.org/f3/gof3/v3/logger"
f3_util "code.forgejo.org/f3/gof3/v3/util"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func CmdF3(ctx context.Context) *cli.Command {
@@ -28,21 +28,21 @@ func CmdF3(ctx context.Context) *cli.Command {
return &cli.Command{
Name: "f3",
Usage: "F3",
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
SubcmdF3Mirror(ctx),
},
}
}
func SubcmdF3Mirror(ctx context.Context) *cli.Command {
- mirrorCmd := f3_cmd.CreateCmdMirror(ctx)
+ mirrorCmd := f3_cmd.CreateCmdMirror()
mirrorCmd.Before = prepareWorkPathAndCustomConf(ctx)
f3Action := mirrorCmd.Action
- mirrorCmd.Action = func(c *cli.Context) error { return runMirror(ctx, c, f3Action) }
+ mirrorCmd.Action = func(ctx context.Context, cli *cli.Command) error { return runMirror(ctx, cli, f3Action) }
return mirrorCmd
}
-func runMirror(ctx context.Context, c *cli.Context, action cli.ActionFunc) error {
+func runMirror(ctx context.Context, c *cli.Command, action cli.ActionFunc) error {
setting.LoadF3Setting()
if !setting.F3.Enabled {
return errors.New("F3 is disabled, it is not ready to be used and is only present for development purposes")
@@ -69,7 +69,7 @@ func runMirror(ctx context.Context, c *cli.Context, action cli.ActionFunc) error
}
}
- err := action(c)
+ err := action(ctx, c)
if panicError, ok := err.(f3_util.PanicError); ok {
log.Debug("F3 Stack trace\n%s", panicError.Stack())
}
diff --git a/cmd/forgejo/forgejo.go b/cmd/forgejo/forgejo.go
index 3b95c80991..171ef1a71d 100644
--- a/cmd/forgejo/forgejo.go
+++ b/cmd/forgejo/forgejo.go
@@ -16,7 +16,7 @@ import (
"forgejo.org/modules/private"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
type key int
@@ -34,7 +34,7 @@ func CmdForgejo(ctx context.Context) *cli.Command {
Name: "forgejo-cli",
Usage: "Forgejo CLI",
Flags: []cli.Flag{},
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
CmdActions(ctx),
CmdF3(ctx),
},
@@ -147,12 +147,12 @@ func handleCliResponseExtra(ctx context.Context, extra private.ResponseExtra) er
return cli.Exit(extra.Error, 1)
}
-func prepareWorkPathAndCustomConf(ctx context.Context) func(c *cli.Context) error {
- return func(c *cli.Context) error {
+func prepareWorkPathAndCustomConf(ctx context.Context) func(ctx context.Context, cli *cli.Command) (context.Context, error) {
+ return func(ctx context.Context, cli *cli.Command) (context.Context, error) {
if !ContextGetNoInit(ctx) {
var args setting.ArgWorkPathAndCustomConf
// from children to parent, check the global flags
- for _, curCtx := range c.Lineage() {
+ for _, curCtx := range cli.Lineage() {
if curCtx.IsSet("work-path") && args.WorkPath == "" {
args.WorkPath = curCtx.String("work-path")
}
@@ -165,6 +165,6 @@ func prepareWorkPathAndCustomConf(ctx context.Context) func(c *cli.Context) erro
}
setting.InitWorkPathAndCommonConfig(os.Getenv, args)
}
- return nil
+ return ctx, nil
}
}
diff --git a/cmd/generate.go b/cmd/generate.go
index dcbdcd0353..7076ae541f 100644
--- a/cmd/generate.go
+++ b/cmd/generate.go
@@ -5,56 +5,65 @@
package cmd
import (
+ "context"
"fmt"
"os"
"forgejo.org/modules/generate"
"github.com/mattn/go-isatty"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- // CmdGenerate represents the available generate sub-command.
- CmdGenerate = &cli.Command{
+// CmdGenerate represents the available generate sub-command.
+func cmdGenerate() *cli.Command {
+ return &cli.Command{
Name: "generate",
Usage: "Generate Gitea's secrets/keys/tokens",
- Subcommands: []*cli.Command{
- subcmdSecret,
+ Commands: []*cli.Command{
+ subcmdSecret(),
},
}
+}
- subcmdSecret = &cli.Command{
+func subcmdSecret() *cli.Command {
+ return &cli.Command{
Name: "secret",
Usage: "Generate a secret token",
- Subcommands: []*cli.Command{
- microcmdGenerateInternalToken,
- microcmdGenerateLfsJwtSecret,
- microcmdGenerateSecretKey,
+ Commands: []*cli.Command{
+ microcmdGenerateInternalToken(),
+ microcmdGenerateLfsJwtSecret(),
+ microcmdGenerateSecretKey(),
},
}
+}
- microcmdGenerateInternalToken = &cli.Command{
+func microcmdGenerateInternalToken() *cli.Command {
+ return &cli.Command{
Name: "INTERNAL_TOKEN",
Usage: "Generate a new INTERNAL_TOKEN",
Action: runGenerateInternalToken,
}
+}
- microcmdGenerateLfsJwtSecret = &cli.Command{
+func microcmdGenerateLfsJwtSecret() *cli.Command {
+ return &cli.Command{
Name: "JWT_SECRET",
Aliases: []string{"LFS_JWT_SECRET"},
Usage: "Generate a new JWT_SECRET",
Action: runGenerateLfsJwtSecret,
}
+}
- microcmdGenerateSecretKey = &cli.Command{
+func microcmdGenerateSecretKey() *cli.Command {
+ return &cli.Command{
Name: "SECRET_KEY",
Usage: "Generate a new SECRET_KEY",
Action: runGenerateSecretKey,
}
-)
+}
-func runGenerateInternalToken(c *cli.Context) error {
+func runGenerateInternalToken(ctx context.Context, c *cli.Command) error {
internalToken, err := generate.NewInternalToken()
if err != nil {
return err
@@ -63,25 +72,25 @@ func runGenerateInternalToken(c *cli.Context) error {
fmt.Printf("%s", internalToken)
if isatty.IsTerminal(os.Stdout.Fd()) {
- fmt.Printf("\n")
+ fmt.Println()
}
return nil
}
-func runGenerateLfsJwtSecret(c *cli.Context) error {
+func runGenerateLfsJwtSecret(ctx context.Context, c *cli.Command) error {
_, jwtSecretBase64 := generate.NewJwtSecret()
fmt.Printf("%s", jwtSecretBase64)
if isatty.IsTerminal(os.Stdout.Fd()) {
- fmt.Printf("\n")
+ fmt.Print("\n")
}
return nil
}
-func runGenerateSecretKey(c *cli.Context) error {
+func runGenerateSecretKey(ctx context.Context, c *cli.Command) error {
secretKey, err := generate.NewSecretKey()
if err != nil {
return err
@@ -90,7 +99,7 @@ func runGenerateSecretKey(c *cli.Context) error {
fmt.Printf("%s", secretKey)
if isatty.IsTerminal(os.Stdout.Fd()) {
- fmt.Printf("\n")
+ fmt.Print("\n")
}
return nil
diff --git a/cmd/hook.go b/cmd/hook.go
index 935c1b08ea..909cdfdf84 100644
--- a/cmd/hook.go
+++ b/cmd/hook.go
@@ -21,29 +21,31 @@ import (
repo_module "forgejo.org/modules/repository"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
const (
hookBatchSize = 30
)
-var (
- // CmdHook represents the available hooks sub-command.
- CmdHook = &cli.Command{
+// CmdHook represents the available hooks sub-command.
+func cmdHook() *cli.Command {
+ return &cli.Command{
Name: "hook",
Usage: "(internal) Should only be called by Git",
Description: "Delegate commands to corresponding Git hooks",
Before: PrepareConsoleLoggerLevel(log.FATAL),
- Subcommands: []*cli.Command{
- subcmdHookPreReceive,
- subcmdHookUpdate,
- subcmdHookPostReceive,
- subcmdHookProcReceive,
+ Commands: []*cli.Command{
+ subcmdHookPreReceive(),
+ subcmdHookUpdate(),
+ subcmdHookPostReceive(),
+ subcmdHookProcReceive(),
},
}
+}
- subcmdHookPreReceive = &cli.Command{
+func subcmdHookPreReceive() *cli.Command {
+ return &cli.Command{
Name: "pre-receive",
Usage: "Delegate pre-receive Git hook",
Description: "This command should only be called by Git",
@@ -54,7 +56,10 @@ var (
},
},
}
- subcmdHookUpdate = &cli.Command{
+}
+
+func subcmdHookUpdate() *cli.Command {
+ return &cli.Command{
Name: "update",
Usage: "Delegate update Git hook",
Description: "This command should only be called by Git",
@@ -65,7 +70,10 @@ var (
},
},
}
- subcmdHookPostReceive = &cli.Command{
+}
+
+func subcmdHookPostReceive() *cli.Command {
+ return &cli.Command{
Name: "post-receive",
Usage: "Delegate post-receive Git hook",
Description: "This command should only be called by Git",
@@ -76,8 +84,11 @@ var (
},
},
}
- // Note: new hook since git 2.29
- subcmdHookProcReceive = &cli.Command{
+}
+
+// Note: new hook since git 2.29
+func subcmdHookProcReceive() *cli.Command {
+ return &cli.Command{
Name: "proc-receive",
Usage: "Delegate proc-receive Git hook",
Description: "This command should only be called by Git",
@@ -88,7 +99,7 @@ var (
},
},
}
-)
+}
type delayWriter struct {
internal io.Writer
@@ -161,11 +172,11 @@ func (n *nilWriter) WriteString(s string) (int, error) {
return len(s), nil
}
-func runHookPreReceive(c *cli.Context) error {
+func runHookPreReceive(ctx context.Context, c *cli.Command) error {
if isInternal, _ := strconv.ParseBool(os.Getenv(repo_module.EnvIsInternal)); isInternal {
return nil
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), true)
@@ -247,7 +258,7 @@ Forgejo or set your environment appropriately.`, "")
newCommitIDs[count] = newCommitID
refFullNames[count] = refFullName
count++
- fmt.Fprintf(out, "*")
+ fmt.Fprint(out, "*")
if count >= hookBatchSize {
fmt.Fprintf(out, " Checking %d references\n", count)
@@ -263,10 +274,10 @@ Forgejo or set your environment appropriately.`, "")
lastline = 0
}
} else {
- fmt.Fprintf(out, ".")
+ fmt.Fprint(out, ".")
}
if lastline >= hookBatchSize {
- fmt.Fprintf(out, "\n")
+ fmt.Fprint(out, "\n")
lastline = 0
}
}
@@ -283,7 +294,7 @@ Forgejo or set your environment appropriately.`, "")
return fail(ctx, extra.UserMsg, "HookPreReceive(last) failed: %v", extra.Error)
}
} else if lastline > 0 {
- fmt.Fprintf(out, "\n")
+ fmt.Fprint(out, "\n")
}
fmt.Fprintf(out, "Checked %d references in total\n", total)
@@ -291,13 +302,13 @@ Forgejo or set your environment appropriately.`, "")
}
// runHookUpdate process the update hook: https://git-scm.com/docs/githooks#update
-func runHookUpdate(c *cli.Context) error {
+func runHookUpdate(ctx context.Context, c *cli.Command) error {
// Now if we're an internal don't do anything else
if isInternal, _ := strconv.ParseBool(os.Getenv(repo_module.EnvIsInternal)); isInternal {
return nil
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
if c.NArg() != 3 {
@@ -323,8 +334,8 @@ func runHookUpdate(c *cli.Context) error {
return fail(ctx, fmt.Sprintf("The modification of %s is skipped as it's an internal reference.", refFullName), "")
}
-func runHookPostReceive(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runHookPostReceive(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), true)
@@ -399,7 +410,7 @@ Forgejo or set your environment appropriately.`, "")
continue
}
- fmt.Fprintf(out, ".")
+ fmt.Fprint(out, ".")
oldCommitIDs[count] = string(fields[0])
newCommitIDs[count] = string(fields[1])
refFullNames[count] = git.RefName(fields[2])
@@ -487,8 +498,8 @@ func hookPrintResults(results []private.HookPostReceiveBranchResult) {
}
}
-func runHookProcReceive(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runHookProcReceive(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), true)
diff --git a/cmd/hook_test.go b/cmd/hook_test.go
index 89bd3cf737..82ed392fb8 100644
--- a/cmd/hook_test.go
+++ b/cmd/hook_test.go
@@ -19,7 +19,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// Capture what's being written into a standard file descriptor.
@@ -134,14 +134,14 @@ func TestDelayWriter(t *testing.T) {
defer ts.Close()
defer test.MockVariableValue(&setting.LocalURL, ts.URL+"/")()
- app := cli.NewApp()
- app.Commands = []*cli.Command{subcmdHookPreReceive}
+ app := cli.Command{}
+ app.Commands = []*cli.Command{subcmdHookPreReceive()}
t.Run("Should delay", func(t *testing.T) {
defer test.MockVariableValue(&setting.Git.VerbosePushDelay, time.Millisecond*500)()
finish := captureOutput(t, os.Stdout)
- err = app.Run([]string{"./forgejo", "pre-receive"})
+ err = app.Run(t.Context(), []string{"./forgejo", "pre-receive"})
require.NoError(t, err)
out := finish()
@@ -153,7 +153,7 @@ func TestDelayWriter(t *testing.T) {
defer test.MockVariableValue(&setting.Git.VerbosePushDelay, time.Second*5)()
finish := captureOutput(t, os.Stdout)
- err = app.Run([]string{"./forgejo", "pre-receive"})
+ err = app.Run(t.Context(), []string{"./forgejo", "pre-receive"})
require.NoError(t, err)
out := finish()
@@ -163,15 +163,15 @@ func TestDelayWriter(t *testing.T) {
}
func TestRunHookUpdate(t *testing.T) {
- app := cli.NewApp()
- app.Commands = []*cli.Command{subcmdHookUpdate}
+ app := cli.Command{}
+ app.Commands = []*cli.Command{subcmdHookUpdate()}
t.Run("Removal of internal reference", func(t *testing.T) {
defer test.MockVariableValue(&cli.OsExiter, func(code int) {})()
defer test.MockVariableValue(&setting.IsProd, false)()
finish := captureOutput(t, os.Stderr)
- err := app.Run([]string{"./forgejo", "update", "refs/pull/1/head", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000000"})
+ err := app.Run(t.Context(), []string{"./forgejo", "update", "refs/pull/1/head", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000000"})
out := finish()
require.Error(t, err)
@@ -183,7 +183,7 @@ func TestRunHookUpdate(t *testing.T) {
defer test.MockVariableValue(&setting.IsProd, false)()
finish := captureOutput(t, os.Stderr)
- err := app.Run([]string{"./forgejo", "update", "refs/pull/1/head", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000001"})
+ err := app.Run(t.Context(), []string{"./forgejo", "update", "refs/pull/1/head", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000001"})
out := finish()
require.Error(t, err)
@@ -191,12 +191,12 @@ func TestRunHookUpdate(t *testing.T) {
})
t.Run("Removal of branch", func(t *testing.T) {
- err := app.Run([]string{"./forgejo", "update", "refs/head/main", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000000"})
+ err := app.Run(t.Context(), []string{"./forgejo", "update", "refs/head/main", "0a51ae26bc73c47e2f754560c40904cf14ed51a9", "0000000000000000000000000000000000000000"})
require.NoError(t, err)
})
t.Run("Not enough arguments", func(t *testing.T) {
- err := app.Run([]string{"./forgejo", "update"})
+ err := app.Run(t.Context(), []string{"./forgejo", "update"})
require.NoError(t, err)
})
}
diff --git a/cmd/keys.go b/cmd/keys.go
index 2d241984c4..00901903f4 100644
--- a/cmd/keys.go
+++ b/cmd/keys.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"strings"
@@ -11,45 +12,47 @@ import (
"forgejo.org/modules/log"
"forgejo.org/modules/private"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdKeys represents the available keys sub-command
-var CmdKeys = &cli.Command{
- Name: "keys",
- Usage: "(internal) Should only be called by SSH server",
- Description: "Queries the Forgejo database to get the authorized command for a given ssh key fingerprint",
- Before: PrepareConsoleLoggerLevel(log.FATAL),
- Action: runKeys,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "expected",
- Aliases: []string{"e"},
- Value: "git",
- Usage: "Expected user for whom provide key commands",
+func cmdKeys() *cli.Command {
+ return &cli.Command{
+ Name: "keys",
+ Usage: "(internal) Should only be called by SSH server",
+ Description: "Queries the Forgejo database to get the authorized command for a given ssh key fingerprint",
+ Before: PrepareConsoleLoggerLevel(log.FATAL),
+ Action: runKeys,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "expected",
+ Aliases: []string{"e"},
+ Value: "git",
+ Usage: "Expected user for whom provide key commands",
+ },
+ &cli.StringFlag{
+ Name: "username",
+ Aliases: []string{"u"},
+ Value: "",
+ Usage: "Username trying to log in by SSH",
+ },
+ &cli.StringFlag{
+ Name: "type",
+ Aliases: []string{"t"},
+ Value: "",
+ Usage: "Type of the SSH key provided to the SSH Server (requires content to be provided too)",
+ },
+ &cli.StringFlag{
+ Name: "content",
+ Aliases: []string{"k"},
+ Value: "",
+ Usage: "Base64 encoded content of the SSH key provided to the SSH Server (requires type to be provided too)",
+ },
},
- &cli.StringFlag{
- Name: "username",
- Aliases: []string{"u"},
- Value: "",
- Usage: "Username trying to log in by SSH",
- },
- &cli.StringFlag{
- Name: "type",
- Aliases: []string{"t"},
- Value: "",
- Usage: "Type of the SSH key provided to the SSH Server (requires content to be provided too)",
- },
- &cli.StringFlag{
- Name: "content",
- Aliases: []string{"k"},
- Value: "",
- Usage: "Base64 encoded content of the SSH key provided to the SSH Server (requires type to be provided too)",
- },
- },
+ }
}
-func runKeys(c *cli.Context) error {
+func runKeys(ctx context.Context, c *cli.Command) error {
if !c.IsSet("username") {
return errors.New("No username provided")
}
@@ -68,7 +71,7 @@ func runKeys(c *cli.Context) error {
return errors.New("No key type and content provided")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), true)
@@ -78,6 +81,6 @@ func runKeys(c *cli.Context) error {
if extra.Error != nil {
return extra.Error
}
- _, _ = fmt.Fprintln(c.App.Writer, strings.TrimSpace(authorizedString.Text))
+ _, _ = fmt.Fprintln(c.Root().Writer, strings.TrimSpace(authorizedString.Text))
return nil
}
diff --git a/cmd/mailer.go b/cmd/mailer.go
index cddebd6d36..d05d6c849b 100644
--- a/cmd/mailer.go
+++ b/cmd/mailer.go
@@ -4,16 +4,17 @@
package cmd
import (
+ "context"
"fmt"
"forgejo.org/modules/private"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-func runSendMail(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runSendMail(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setting.MustInstalled()
diff --git a/cmd/main.go b/cmd/main.go
index 9d559e078f..65cde47884 100644
--- a/cmd/main.go
+++ b/cmd/main.go
@@ -14,7 +14,7 @@ import (
"forgejo.org/modules/log"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// cmdHelp is our own help subcommand with more information
@@ -25,18 +25,18 @@ func cmdHelp() *cli.Command {
Aliases: []string{"h"},
Usage: "Shows a list of commands or help for one command",
ArgsUsage: "[command]",
- Action: func(c *cli.Context) (err error) {
- lineage := c.Lineage() // The order is from child to parent: help, doctor, Gitea, {Command:nil}
+ Action: func(ctx context.Context, c *cli.Command) (err error) {
+ lineage := c.Lineage() // The order is from child to parent: help, doctor, Forgejo
targetCmdIdx := 0
- if c.Command.Name == "help" {
+ if c.Name == "help" {
targetCmdIdx = 1
}
- if lineage[targetCmdIdx+1].Command != nil {
- err = cli.ShowCommandHelp(lineage[targetCmdIdx+1], lineage[targetCmdIdx].Command.Name)
+ if targetCmdIdx+1 < len(lineage) {
+ err = cli.ShowCommandHelp(ctx, lineage[targetCmdIdx+1], lineage[targetCmdIdx].Name)
} else {
err = cli.ShowAppHelp(c)
}
- _, _ = fmt.Fprintf(c.App.Writer, `
+ _, _ = fmt.Fprintf(c.Root().Writer, `
DEFAULT CONFIGURATION:
AppPath: %s
WorkPath: %s
@@ -77,25 +77,25 @@ func appGlobalFlags() []cli.Flag {
}
}
-func prepareSubcommandWithConfig(command *cli.Command, globalFlags []cli.Flag) {
- command.Flags = append(append([]cli.Flag{}, globalFlags...), command.Flags...)
+func prepareSubcommandWithConfig(command *cli.Command, globalFlags func() []cli.Flag) {
+ command.Flags = append(globalFlags(), command.Flags...)
command.Action = prepareWorkPathAndCustomConf(command.Action)
command.HideHelp = true
if command.Name != "help" {
- command.Subcommands = append(command.Subcommands, cmdHelp())
+ command.Commands = append(command.Commands, cmdHelp())
}
- for i := range command.Subcommands {
- prepareSubcommandWithConfig(command.Subcommands[i], globalFlags)
+ for i := range command.Commands {
+ prepareSubcommandWithConfig(command.Commands[i], globalFlags)
}
}
// prepareWorkPathAndCustomConf wraps the Action to prepare the work path and custom config
// It can't use "Before", because each level's sub-command's Before will be called one by one, so the "init" would be done multiple times
-func prepareWorkPathAndCustomConf(action cli.ActionFunc) func(ctx *cli.Context) error {
- return func(ctx *cli.Context) error {
+func prepareWorkPathAndCustomConf(action cli.ActionFunc) func(_ context.Context, _ *cli.Command) error {
+ return func(ctx context.Context, cli *cli.Command) error {
var args setting.ArgWorkPathAndCustomConf
// from children to parent, check the global flags
- for _, curCtx := range ctx.Lineage() {
+ for _, curCtx := range cli.Lineage() {
if curCtx.IsSet("work-path") && args.WorkPath == "" {
args.WorkPath = curCtx.String("work-path")
}
@@ -107,15 +107,15 @@ func prepareWorkPathAndCustomConf(action cli.ActionFunc) func(ctx *cli.Context)
}
}
setting.InitWorkPathAndCommonConfig(os.Getenv, args)
- if ctx.Bool("help") || action == nil {
+ if cli.Bool("help") || action == nil {
// the default behavior of "urfave/cli": "nil action" means "show help"
- return cmdHelp().Action(ctx)
+ return cmdHelp().Action(ctx, cli)
}
- return action(ctx)
+ return action(ctx, cli)
}
}
-func NewMainApp(version, versionExtra string) *cli.App {
+func NewMainApp(version, versionExtra string) *cli.Command {
path, err := os.Executable()
if err != nil {
panic(err)
@@ -124,7 +124,7 @@ func NewMainApp(version, versionExtra string) *cli.App {
subCmdsStandalone := make([]*cli.Command, 0, 10)
subCmdWithConfig := make([]*cli.Command, 0, 10)
- globalFlags := make([]cli.Flag, 0, 10)
+ globalFlags := func() []cli.Flag { return []cli.Flag{} }
//
// If the executable is forgejo-cli, provide a Forgejo specific CLI
@@ -133,14 +133,16 @@ func NewMainApp(version, versionExtra string) *cli.App {
if executable == "forgejo-cli" {
subCmdsStandalone = append(subCmdsStandalone, forgejo.CmdActions(context.Background()))
subCmdWithConfig = append(subCmdWithConfig, forgejo.CmdF3(context.Background()))
- globalFlags = append(globalFlags, []cli.Flag{
- &cli.BoolFlag{
- Name: "quiet",
- },
- &cli.BoolFlag{
- Name: "verbose",
- },
- }...)
+ globalFlags = func() []cli.Flag {
+ return []cli.Flag{
+ &cli.BoolFlag{
+ Name: "quiet",
+ },
+ &cli.BoolFlag{
+ Name: "verbose",
+ },
+ }
+ }
} else {
//
// Otherwise provide a Gitea compatible CLI which includes Forgejo
@@ -149,55 +151,54 @@ func NewMainApp(version, versionExtra string) *cli.App {
// binary and rename it to forgejo if they want.
//
subCmdsStandalone = append(subCmdsStandalone, forgejo.CmdForgejo(context.Background()))
- subCmdWithConfig = append(subCmdWithConfig, CmdActions)
+ subCmdWithConfig = append(subCmdWithConfig, cmdActions())
}
return innerNewMainApp(version, versionExtra, subCmdsStandalone, subCmdWithConfig, globalFlags)
}
-func innerNewMainApp(version, versionExtra string, subCmdsStandaloneArgs, subCmdWithConfigArgs []*cli.Command, globalFlagsArgs []cli.Flag) *cli.App {
- app := cli.NewApp()
- app.HelpName = "forgejo"
- app.Name = "Forgejo"
+func innerNewMainApp(version, versionExtra string, subCmdsStandaloneArgs, subCmdWithConfigArgs []*cli.Command, globalFlagsArgs func() []cli.Flag) *cli.Command {
+ app := &cli.Command{}
+ app.Name = "forgejo"
app.Usage = "Beyond coding. We forge."
app.Description = `By default, forgejo will start serving using the web-server with no argument, which can alternatively be run by running the subcommand "web".`
app.Version = version + versionExtra
- app.EnableBashCompletion = true
+ app.EnableShellCompletion = true
// these sub-commands need to use config file
subCmdWithConfig := []*cli.Command{
cmdHelp(), // the "help" sub-command was used to show the more information for "work path" and "custom config"
- CmdWeb,
- CmdServ,
- CmdHook,
- CmdKeys,
- CmdDump,
- CmdAdmin,
- CmdMigrate,
- CmdDoctor,
- CmdManager,
- CmdEmbedded,
- CmdMigrateStorage,
- CmdDumpRepository,
- CmdRestoreRepository,
+ cmdWeb(),
+ cmdServ(),
+ cmdHook(),
+ cmdKeys(),
+ cmdDump(),
+ cmdAdmin(),
+ cmdMigrate(),
+ cmdDoctor(),
+ cmdManager(),
+ cmdEmbedded(),
+ cmdMigrateStorage(),
+ cmdDumpRepository(),
+ cmdRestoreRepository(),
}
subCmdWithConfig = append(subCmdWithConfig, subCmdWithConfigArgs...)
// these sub-commands do not need the config file, and they do not depend on any path or environment variable.
subCmdStandalone := []*cli.Command{
- CmdCert,
- CmdGenerate,
- CmdDocs,
+ cmdCert(),
+ cmdGenerate(),
}
subCmdStandalone = append(subCmdStandalone, subCmdsStandaloneArgs...)
- app.DefaultCommand = CmdWeb.Name
+ app.DefaultCommand = cmdWeb().Name
- globalFlags := appGlobalFlags()
- globalFlags = append(globalFlags, globalFlagsArgs...)
+ globalFlags := func() []cli.Flag {
+ return append(appGlobalFlags(), globalFlagsArgs()...)
+ }
app.Flags = append(app.Flags, cli.VersionFlag)
- app.Flags = append(app.Flags, globalFlags...)
+ app.Flags = append(app.Flags, globalFlags()...)
app.HideHelp = true // use our own help action to show helps (with more information like default config)
app.Before = PrepareConsoleLoggerLevel(log.INFO)
for i := range subCmdWithConfig {
@@ -210,8 +211,8 @@ func innerNewMainApp(version, versionExtra string, subCmdsStandaloneArgs, subCmd
return app
}
-func RunMainApp(app *cli.App, args ...string) error {
- err := app.Run(args)
+func RunMainApp(app *cli.Command, args ...string) error {
+ err := app.Run(context.Background(), args)
if err == nil {
return nil
}
@@ -220,7 +221,7 @@ func RunMainApp(app *cli.App, args ...string) error {
cli.OsExiter(1)
return err
}
- _, _ = fmt.Fprintf(app.ErrWriter, "Command error: %v\n", err)
+ _, _ = fmt.Fprintf(app.Root().ErrWriter, "Command error: %v\n", err)
cli.OsExiter(1)
return err
}
diff --git a/cmd/main_test.go b/cmd/main_test.go
index 1ff71005e3..737150c62f 100644
--- a/cmd/main_test.go
+++ b/cmd/main_test.go
@@ -4,6 +4,8 @@
package cmd
import (
+ "context"
+ "errors"
"fmt"
"io"
"path/filepath"
@@ -16,7 +18,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func TestMain(m *testing.M) {
@@ -27,10 +29,10 @@ func makePathOutput(workPath, customPath, customConf string) string {
return fmt.Sprintf("WorkPath=%s\nCustomPath=%s\nCustomConf=%s", workPath, customPath, customConf)
}
-func newTestApp(testCmdAction func(ctx *cli.Context) error) *cli.App {
+func newTestApp(testCmdAction func(_ context.Context, ctx *cli.Command) error) *cli.Command {
app := NewMainApp("version", "version-extra")
testCmd := &cli.Command{Name: "test-cmd", Action: testCmdAction}
- prepareSubcommandWithConfig(testCmd, appGlobalFlags())
+ prepareSubcommandWithConfig(testCmd, appGlobalFlags)
app.Commands = append(app.Commands, testCmd)
app.DefaultCommand = testCmd.Name
return app
@@ -42,7 +44,7 @@ type runResult struct {
ExitCode int
}
-func runTestApp(app *cli.App, args ...string) (runResult, error) {
+func runTestApp(app *cli.Command, args ...string) (runResult, error) {
outBuf := new(strings.Builder)
errBuf := new(strings.Builder)
app.Writer = outBuf
@@ -65,7 +67,6 @@ func TestCliCmd(t *testing.T) {
defaultCustomConf := filepath.Join(defaultCustomPath, "conf/app.ini")
cli.CommandHelpTemplate = "(command help template)"
- cli.AppHelpTemplate = "(app help template)"
cli.SubcommandHelpTemplate = "(subcommand help template)"
cases := []struct {
@@ -109,12 +110,17 @@ func TestCliCmd(t *testing.T) {
},
}
- app := newTestApp(func(ctx *cli.Context) error {
- _, _ = fmt.Fprint(ctx.App.Writer, makePathOutput(setting.AppWorkPath, setting.CustomPath, setting.CustomConf))
- return nil
- })
for _, c := range cases {
t.Run(c.cmd, func(t *testing.T) {
+ defer test.MockProtect(&setting.AppWorkPath)()
+ defer test.MockProtect(&setting.CustomPath)()
+ defer test.MockProtect(&setting.CustomConf)()
+
+ app := newTestApp(func(_ context.Context, ctx *cli.Command) error {
+ _, _ = fmt.Fprint(ctx.Root().Writer, makePathOutput(setting.AppWorkPath, setting.CustomPath, setting.CustomConf))
+ return nil
+ })
+
for k, v := range c.env {
t.Setenv(k, v)
}
@@ -122,34 +128,34 @@ func TestCliCmd(t *testing.T) {
r, err := runTestApp(app, args...)
require.NoError(t, err, c.cmd)
assert.NotEmpty(t, c.exp, c.cmd)
- assert.Contains(t, r.Stdout, c.exp, c.cmd)
+ assert.Contains(t, r.Stdout, c.exp, c.cmd+"\n"+r.Stdout)
})
}
}
func TestCliCmdError(t *testing.T) {
- app := newTestApp(func(ctx *cli.Context) error { return fmt.Errorf("normal error") })
+ app := newTestApp(func(_ context.Context, ctx *cli.Command) error { return errors.New("normal error") })
r, err := runTestApp(app, "./gitea", "test-cmd")
require.Error(t, err)
assert.Equal(t, 1, r.ExitCode)
assert.Empty(t, r.Stdout)
assert.Equal(t, "Command error: normal error\n", r.Stderr)
- app = newTestApp(func(ctx *cli.Context) error { return cli.Exit("exit error", 2) })
+ app = newTestApp(func(_ context.Context, ctx *cli.Command) error { return cli.Exit("exit error", 2) })
r, err = runTestApp(app, "./gitea", "test-cmd")
require.Error(t, err)
assert.Equal(t, 2, r.ExitCode)
assert.Empty(t, r.Stdout)
assert.Equal(t, "exit error\n", r.Stderr)
- app = newTestApp(func(ctx *cli.Context) error { return nil })
+ app = newTestApp(func(_ context.Context, ctx *cli.Command) error { return nil })
r, err = runTestApp(app, "./gitea", "test-cmd", "--no-such")
require.Error(t, err)
assert.Equal(t, 1, r.ExitCode)
- assert.Equal(t, "Incorrect Usage: flag provided but not defined: -no-such\n\n", r.Stdout)
- assert.Empty(t, r.Stderr) // the cli package's strange behavior, the error message is not in stderr ....
+ assert.Equal(t, "Incorrect Usage: flag provided but not defined: -no-such\n\n", r.Stderr)
+ assert.Empty(t, r.Stdout)
- app = newTestApp(func(ctx *cli.Context) error { return nil })
+ app = newTestApp(func(_ context.Context, ctx *cli.Command) error { return nil })
r, err = runTestApp(app, "./gitea", "test-cmd")
require.NoError(t, err)
assert.Equal(t, -1, r.ExitCode) // the cli.OsExiter is not called
diff --git a/cmd/manager.go b/cmd/manager.go
index 56089947fd..029329b44e 100644
--- a/cmd/manager.go
+++ b/cmd/manager.go
@@ -4,30 +4,34 @@
package cmd
import (
+ "context"
"os"
"time"
"forgejo.org/modules/private"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- // CmdManager represents the manager command
- CmdManager = &cli.Command{
+// CmdManager represents the manager command
+func cmdManager() *cli.Command {
+ return &cli.Command{
Name: "manager",
Usage: "Manage the running forgejo process",
Description: "This is a command for managing the running forgejo process",
- Subcommands: []*cli.Command{
- subcmdShutdown,
- subcmdRestart,
- subcmdReloadTemplates,
- subcmdFlushQueues,
- subcmdLogging,
- subCmdProcesses,
+ Commands: []*cli.Command{
+ subcmdShutdown(),
+ subcmdRestart(),
+ subcmdReloadTemplates(),
+ subcmdFlushQueues(),
+ subcmdLogging(),
+ subCmdProcesses(),
},
}
- subcmdShutdown = &cli.Command{
+}
+
+func subcmdShutdown() *cli.Command {
+ return &cli.Command{
Name: "shutdown",
Usage: "Gracefully shutdown the running process",
Flags: []cli.Flag{
@@ -37,7 +41,10 @@ var (
},
Action: runShutdown,
}
- subcmdRestart = &cli.Command{
+}
+
+func subcmdRestart() *cli.Command {
+ return &cli.Command{
Name: "restart",
Usage: "Gracefully restart the running process - (not implemented for windows servers)",
Flags: []cli.Flag{
@@ -47,7 +54,10 @@ var (
},
Action: runRestart,
}
- subcmdReloadTemplates = &cli.Command{
+}
+
+func subcmdReloadTemplates() *cli.Command {
+ return &cli.Command{
Name: "reload-templates",
Usage: "Reload template files in the running process",
Flags: []cli.Flag{
@@ -57,7 +67,10 @@ var (
},
Action: runReloadTemplates,
}
- subcmdFlushQueues = &cli.Command{
+}
+
+func subcmdFlushQueues() *cli.Command {
+ return &cli.Command{
Name: "flush-queues",
Usage: "Flush queues in the running process",
Action: runFlushQueues,
@@ -76,7 +89,10 @@ var (
},
},
}
- subCmdProcesses = &cli.Command{
+}
+
+func subCmdProcesses() *cli.Command {
+ return &cli.Command{
Name: "processes",
Usage: "Display running processes within the current process",
Action: runProcesses,
@@ -106,10 +122,10 @@ var (
},
},
}
-)
+}
-func runShutdown(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runShutdown(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -117,8 +133,8 @@ func runShutdown(c *cli.Context) error {
return handleCliResponseExtra(extra)
}
-func runRestart(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runRestart(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -126,8 +142,8 @@ func runRestart(c *cli.Context) error {
return handleCliResponseExtra(extra)
}
-func runReloadTemplates(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runReloadTemplates(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -135,8 +151,8 @@ func runReloadTemplates(c *cli.Context) error {
return handleCliResponseExtra(extra)
}
-func runFlushQueues(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runFlushQueues(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -144,8 +160,8 @@ func runFlushQueues(c *cli.Context) error {
return handleCliResponseExtra(extra)
}
-func runProcesses(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runProcesses(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
diff --git a/cmd/manager_logging.go b/cmd/manager_logging.go
index c6db2bb05a..c543afe872 100644
--- a/cmd/manager_logging.go
+++ b/cmd/manager_logging.go
@@ -4,6 +4,7 @@
package cmd
import (
+ "context"
"errors"
"fmt"
"os"
@@ -11,11 +12,11 @@ import (
"forgejo.org/modules/log"
"forgejo.org/modules/private"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
-var (
- defaultLoggingFlags = []cli.Flag{
+func defaultLoggingFlags() []cli.Flag {
+ return []cli.Flag{
&cli.StringFlag{
Name: "logger",
Usage: `Logger name - will default to "default"`,
@@ -56,11 +57,13 @@ var (
Name: "debug",
},
}
+}
- subcmdLogging = &cli.Command{
+func subcmdLogging() *cli.Command {
+ return &cli.Command{
Name: "logging",
Usage: "Adjust logging commands",
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
{
Name: "pause",
Usage: "Pause logging (Forgejo will buffer logs up to a certain point and will drop them after that point)",
@@ -104,11 +107,11 @@ var (
}, {
Name: "add",
Usage: "Add a logger",
- Subcommands: []*cli.Command{
+ Commands: []*cli.Command{
{
Name: "file",
Usage: "Add a file logger",
- Flags: append(defaultLoggingFlags, []cli.Flag{
+ Flags: append(defaultLoggingFlags(), []cli.Flag{
&cli.StringFlag{
Name: "filename",
Aliases: []string{"f"},
@@ -152,7 +155,7 @@ var (
}, {
Name: "conn",
Usage: "Add a net conn logger",
- Flags: append(defaultLoggingFlags, []cli.Flag{
+ Flags: append(defaultLoggingFlags(), []cli.Flag{
&cli.BoolFlag{
Name: "reconnect-on-message",
Aliases: []string{"R"},
@@ -193,10 +196,10 @@ var (
},
},
}
-)
+}
-func runRemoveLogger(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runRemoveLogger(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -210,8 +213,8 @@ func runRemoveLogger(c *cli.Context) error {
return handleCliResponseExtra(extra)
}
-func runAddConnLogger(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runAddConnLogger(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -237,11 +240,11 @@ func runAddConnLogger(c *cli.Context) error {
if c.IsSet("reconnect-on-message") {
vals["reconnectOnMsg"] = c.Bool("reconnect-on-message")
}
- return commonAddLogger(c, mode, vals)
+ return commonAddLogger(ctx, c, mode, vals)
}
-func runAddFileLogger(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runAddFileLogger(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -270,10 +273,10 @@ func runAddFileLogger(c *cli.Context) error {
if c.IsSet("compression-level") {
vals["compressionLevel"] = c.Int("compression-level")
}
- return commonAddLogger(c, mode, vals)
+ return commonAddLogger(ctx, c, mode, vals)
}
-func commonAddLogger(c *cli.Context, mode string, vals map[string]any) error {
+func commonAddLogger(ctx context.Context, c *cli.Command, mode string, vals map[string]any) error {
if len(c.String("level")) > 0 {
vals["level"] = log.LevelFromString(c.String("level")).String()
}
@@ -300,15 +303,15 @@ func commonAddLogger(c *cli.Context, mode string, vals map[string]any) error {
if c.IsSet("writer") {
writer = c.String("writer")
}
- ctx, cancel := installSignals()
+ ctx, cancel := installSignals(ctx)
defer cancel()
extra := private.AddLogger(ctx, logger, writer, mode, vals)
return handleCliResponseExtra(extra)
}
-func runPauseLogging(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runPauseLogging(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -317,8 +320,8 @@ func runPauseLogging(c *cli.Context) error {
return nil
}
-func runResumeLogging(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runResumeLogging(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -327,8 +330,8 @@ func runResumeLogging(c *cli.Context) error {
return nil
}
-func runReleaseReopenLogging(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runReleaseReopenLogging(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
@@ -337,8 +340,8 @@ func runReleaseReopenLogging(c *cli.Context) error {
return nil
}
-func runSetLogSQL(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runSetLogSQL(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setup(ctx, c.Bool("debug"), false)
diff --git a/cmd/migrate.go b/cmd/migrate.go
index c192ca1966..5a485d17f9 100644
--- a/cmd/migrate.go
+++ b/cmd/migrate.go
@@ -11,19 +11,21 @@ import (
"forgejo.org/modules/log"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdMigrate represents the available migrate sub-command.
-var CmdMigrate = &cli.Command{
- Name: "migrate",
- Usage: "Migrate the database",
- Description: "This is a command for migrating the database, so that you can run 'forgejo admin user create' before starting the server.",
- Action: runMigrate,
+func cmdMigrate() *cli.Command {
+ return &cli.Command{
+ Name: "migrate",
+ Usage: "Migrate the database",
+ Description: "This is a command for migrating the database, so that you can run 'forgejo admin user create' before starting the server.",
+ Action: runMigrate,
+ }
}
-func runMigrate(ctx *cli.Context) error {
- stdCtx, cancel := installSignals()
+func runMigrate(stdCtx context.Context, ctx *cli.Command) error {
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
if err := initDB(stdCtx); err != nil {
diff --git a/cmd/migrate_storage.go b/cmd/migrate_storage.go
index 6a04dd48ae..d741a883e3 100644
--- a/cmd/migrate_storage.go
+++ b/cmd/migrate_storage.go
@@ -22,79 +22,81 @@ import (
"forgejo.org/modules/setting"
"forgejo.org/modules/storage"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
"xorm.io/xorm"
)
// CmdMigrateStorage represents the available migrate storage sub-command.
-var CmdMigrateStorage = &cli.Command{
- Name: "migrate-storage",
- Usage: "Migrate the storage",
- Description: "Copies stored files from storage configured in app.ini to parameter-configured storage",
- Action: runMigrateStorage,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "type",
- Aliases: []string{"t"},
- Value: "",
- Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages', 'actions-log', 'actions-artifacts'",
+func cmdMigrateStorage() *cli.Command {
+ return &cli.Command{
+ Name: "migrate-storage",
+ Usage: "Migrate the storage",
+ Description: "Copies stored files from storage configured in app.ini to parameter-configured storage",
+ Action: runMigrateStorage,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "type",
+ Aliases: []string{"t"},
+ Value: "",
+ Usage: "Type of stored files to copy. Allowed types: 'attachments', 'lfs', 'avatars', 'repo-avatars', 'repo-archivers', 'packages', 'actions-log', 'actions-artifacts'",
+ },
+ &cli.StringFlag{
+ Name: "storage",
+ Aliases: []string{"s"},
+ Value: "",
+ Usage: "New storage type: local (default) or minio",
+ },
+ &cli.StringFlag{
+ Name: "path",
+ Aliases: []string{"p"},
+ Value: "",
+ Usage: "New storage placement if store is local (leave blank for default)",
+ },
+ &cli.StringFlag{
+ Name: "minio-endpoint",
+ Value: "",
+ Usage: "Minio storage endpoint",
+ },
+ &cli.StringFlag{
+ Name: "minio-access-key-id",
+ Value: "",
+ Usage: "Minio storage accessKeyID",
+ },
+ &cli.StringFlag{
+ Name: "minio-secret-access-key",
+ Value: "",
+ Usage: "Minio storage secretAccessKey",
+ },
+ &cli.StringFlag{
+ Name: "minio-bucket",
+ Value: "",
+ Usage: "Minio storage bucket",
+ },
+ &cli.StringFlag{
+ Name: "minio-location",
+ Value: "",
+ Usage: "Minio storage location to create bucket",
+ },
+ &cli.StringFlag{
+ Name: "minio-base-path",
+ Value: "",
+ Usage: "Minio storage base path on the bucket",
+ },
+ &cli.BoolFlag{
+ Name: "minio-use-ssl",
+ Usage: "Enable SSL for minio",
+ },
+ &cli.BoolFlag{
+ Name: "minio-insecure-skip-verify",
+ Usage: "Skip SSL verification",
+ },
+ &cli.StringFlag{
+ Name: "minio-checksum-algorithm",
+ Value: "",
+ Usage: "Minio checksum algorithm (default/md5)",
+ },
},
- &cli.StringFlag{
- Name: "storage",
- Aliases: []string{"s"},
- Value: "",
- Usage: "New storage type: local (default) or minio",
- },
- &cli.StringFlag{
- Name: "path",
- Aliases: []string{"p"},
- Value: "",
- Usage: "New storage placement if store is local (leave blank for default)",
- },
- &cli.StringFlag{
- Name: "minio-endpoint",
- Value: "",
- Usage: "Minio storage endpoint",
- },
- &cli.StringFlag{
- Name: "minio-access-key-id",
- Value: "",
- Usage: "Minio storage accessKeyID",
- },
- &cli.StringFlag{
- Name: "minio-secret-access-key",
- Value: "",
- Usage: "Minio storage secretAccessKey",
- },
- &cli.StringFlag{
- Name: "minio-bucket",
- Value: "",
- Usage: "Minio storage bucket",
- },
- &cli.StringFlag{
- Name: "minio-location",
- Value: "",
- Usage: "Minio storage location to create bucket",
- },
- &cli.StringFlag{
- Name: "minio-base-path",
- Value: "",
- Usage: "Minio storage base path on the bucket",
- },
- &cli.BoolFlag{
- Name: "minio-use-ssl",
- Usage: "Enable SSL for minio",
- },
- &cli.BoolFlag{
- Name: "minio-insecure-skip-verify",
- Usage: "Skip SSL verification",
- },
- &cli.StringFlag{
- Name: "minio-checksum-algorithm",
- Value: "",
- Usage: "Minio checksum algorithm (default/md5)",
- },
- },
+ }
}
func migrateAttachments(ctx context.Context, dstStorage storage.ObjectStorage) error {
@@ -182,8 +184,8 @@ func migrateActionsArtifacts(ctx context.Context, dstStorage storage.ObjectStora
})
}
-func runMigrateStorage(ctx *cli.Context) error {
- stdCtx, cancel := installSignals()
+func runMigrateStorage(stdCtx context.Context, ctx *cli.Command) error {
+ stdCtx, cancel := installSignals(stdCtx)
defer cancel()
if err := initDB(stdCtx); err != nil {
diff --git a/cmd/restore_repo.go b/cmd/restore_repo.go
index 1e53ce26ba..0e9f0bb50a 100644
--- a/cmd/restore_repo.go
+++ b/cmd/restore_repo.go
@@ -4,52 +4,55 @@
package cmd
import (
+ "context"
"strings"
"forgejo.org/modules/private"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// CmdRestoreRepository represents the available restore a repository sub-command.
-var CmdRestoreRepository = &cli.Command{
- Name: "restore-repo",
- Usage: "Restore the repository from disk",
- Description: "This is a command for restoring the repository data.",
- Action: runRestoreRepository,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "repo_dir",
- Aliases: []string{"r"},
- Value: "./data",
- Usage: "Repository dir path to restore from",
- },
- &cli.StringFlag{
- Name: "owner_name",
- Value: "",
- Usage: "Restore destination owner name",
- },
- &cli.StringFlag{
- Name: "repo_name",
- Value: "",
- Usage: "Restore destination repository name",
- },
- &cli.StringFlag{
- Name: "units",
- Value: "",
- Usage: `Which items will be restored, one or more units should be separated as comma.
+func cmdRestoreRepository() *cli.Command {
+ return &cli.Command{
+ Name: "restore-repo",
+ Usage: "Restore the repository from disk",
+ Description: "This is a command for restoring the repository data.",
+ Action: runRestoreRepository,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "repo_dir",
+ Aliases: []string{"r"},
+ Value: "./data",
+ Usage: "Repository dir path to restore from",
+ },
+ &cli.StringFlag{
+ Name: "owner_name",
+ Value: "",
+ Usage: "Restore destination owner name",
+ },
+ &cli.StringFlag{
+ Name: "repo_name",
+ Value: "",
+ Usage: "Restore destination repository name",
+ },
+ &cli.StringFlag{
+ Name: "units",
+ Value: "",
+ Usage: `Which items will be restored, one or more units should be separated as comma.
wiki, issues, labels, releases, release_assets, milestones, pull_requests, comments are allowed. Empty means all units.`,
+ },
+ &cli.BoolFlag{
+ Name: "validation",
+ Usage: "Sanity check the content of the files before trying to load them",
+ },
},
- &cli.BoolFlag{
- Name: "validation",
- Usage: "Sanity check the content of the files before trying to load them",
- },
- },
+ }
}
-func runRestoreRepository(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runRestoreRepository(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
setting.MustInstalled()
diff --git a/cmd/serv.go b/cmd/serv.go
index 4b288632d2..1fac2d13f5 100644
--- a/cmd/serv.go
+++ b/cmd/serv.go
@@ -33,7 +33,7 @@ import (
"github.com/golang-jwt/jwt/v5"
"github.com/kballard/go-shellquote"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
const (
@@ -41,20 +41,22 @@ const (
)
// CmdServ represents the available serv sub-command.
-var CmdServ = &cli.Command{
- Name: "serv",
- Usage: "(internal) Should only be called by SSH shell",
- Description: "Serv provides access auth for repositories",
- Before: PrepareConsoleLoggerLevel(log.FATAL),
- Action: runServ,
- Flags: []cli.Flag{
- &cli.BoolFlag{
- Name: "enable-pprof",
+func cmdServ() *cli.Command {
+ return &cli.Command{
+ Name: "serv",
+ Usage: "(internal) Should only be called by SSH shell",
+ Description: "Serv provides access auth for repositories",
+ Before: PrepareConsoleLoggerLevel(log.FATAL),
+ Action: runServ,
+ Flags: []cli.Flag{
+ &cli.BoolFlag{
+ Name: "enable-pprof",
+ },
+ &cli.BoolFlag{
+ Name: "debug",
+ },
},
- &cli.BoolFlag{
- Name: "debug",
- },
- },
+ }
}
func setup(ctx context.Context, debug, gitNeeded bool) {
@@ -131,8 +133,8 @@ func handleCliResponseExtra(extra private.ResponseExtra) error {
return nil
}
-func runServ(c *cli.Context) error {
- ctx, cancel := installSignals()
+func runServ(ctx context.Context, c *cli.Command) error {
+ ctx, cancel := installSignals(ctx)
defer cancel()
// FIXME: This needs to internationalised
@@ -194,7 +196,7 @@ func runServ(c *cli.Context) error {
if git.CheckGitVersionAtLeast("2.29") == nil {
// for AGit Flow
if cmd == "ssh_info" {
- fmt.Print(`{"type":"gitea","version":1}`)
+ fmt.Print(`{"type":"agit","version":1}`)
return nil
}
}
diff --git a/cmd/web.go b/cmd/web.go
index 1e67b2e922..87965a7c1e 100644
--- a/cmd/web.go
+++ b/cmd/web.go
@@ -26,48 +26,50 @@ import (
"forgejo.org/routers/install"
"github.com/felixge/fgprof"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// PIDFile could be set from build tag
var PIDFile = "/run/gitea.pid"
// CmdWeb represents the available web sub-command.
-var CmdWeb = &cli.Command{
- Name: "web",
- Usage: "Start the Forgejo web server",
- Description: `The Forgejo web server is the only thing you need to run,
+func cmdWeb() *cli.Command {
+ return &cli.Command{
+ Name: "web",
+ Usage: "Start the Forgejo web server",
+ Description: `The Forgejo web server is the only thing you need to run,
and it takes care of all the other things for you`,
- Before: PrepareConsoleLoggerLevel(log.INFO),
- Action: runWeb,
- Flags: []cli.Flag{
- &cli.StringFlag{
- Name: "port",
- Aliases: []string{"p"},
- Value: "3000",
- Usage: "Temporary port number to prevent conflict",
+ Before: PrepareConsoleLoggerLevel(log.INFO),
+ Action: runWeb,
+ Flags: []cli.Flag{
+ &cli.StringFlag{
+ Name: "port",
+ Aliases: []string{"p"},
+ Value: "3000",
+ Usage: "Temporary port number to prevent conflict",
+ },
+ &cli.StringFlag{
+ Name: "install-port",
+ Value: "3000",
+ Usage: "Temporary port number to run the install page on to prevent conflict",
+ },
+ &cli.StringFlag{
+ Name: "pid",
+ Aliases: []string{"P"},
+ Value: PIDFile,
+ Usage: "Custom pid file path",
+ },
+ &cli.BoolFlag{
+ Name: "quiet",
+ Aliases: []string{"q"},
+ Usage: "Only display Fatal logging errors until logging is set-up",
+ },
+ &cli.BoolFlag{
+ Name: "verbose",
+ Usage: "Set initial logging to TRACE level until logging is properly set-up",
+ },
},
- &cli.StringFlag{
- Name: "install-port",
- Value: "3000",
- Usage: "Temporary port number to run the install page on to prevent conflict",
- },
- &cli.StringFlag{
- Name: "pid",
- Aliases: []string{"P"},
- Value: PIDFile,
- Usage: "Custom pid file path",
- },
- &cli.BoolFlag{
- Name: "quiet",
- Aliases: []string{"q"},
- Usage: "Only display Fatal logging errors until logging is set-up",
- },
- &cli.BoolFlag{
- Name: "verbose",
- Usage: "Set initial logging to TRACE level until logging is properly set-up",
- },
- },
+ }
}
func runHTTPRedirector() {
@@ -128,7 +130,7 @@ func showWebStartupMessage(msg string) {
}
}
-func serveInstall(ctx *cli.Context) error {
+func serveInstall(_ context.Context, ctx *cli.Command) error {
showWebStartupMessage("Prepare to run install page")
routers.InitWebInstallPage(graceful.GetManager().HammerContext())
@@ -161,7 +163,7 @@ func serveInstall(ctx *cli.Context) error {
return nil
}
-func serveInstalled(ctx *cli.Context) error {
+func serveInstalled(_ context.Context, ctx *cli.Command) error {
setting.InitCfgProvider(setting.CustomConf)
setting.LoadCommonSettings()
setting.MustInstalled()
@@ -233,7 +235,7 @@ func servePprof() {
finished()
}
-func runWeb(ctx *cli.Context) error {
+func runWeb(ctx context.Context, cli *cli.Command) error {
defer func() {
if panicked := recover(); panicked != nil {
log.Fatal("PANIC: %v\n%s", panicked, log.Stack(2))
@@ -251,12 +253,12 @@ func runWeb(ctx *cli.Context) error {
}
// Set pid file setting
- if ctx.IsSet("pid") {
- createPIDFile(ctx.String("pid"))
+ if cli.IsSet("pid") {
+ createPIDFile(cli.String("pid"))
}
if !setting.InstallLock {
- if err := serveInstall(ctx); err != nil {
+ if err := serveInstall(ctx, cli); err != nil {
return err
}
} else {
@@ -267,7 +269,7 @@ func runWeb(ctx *cli.Context) error {
go servePprof()
}
- return serveInstalled(ctx)
+ return serveInstalled(ctx, cli)
}
func setPort(port string) error {
diff --git a/contrib/autocompletion/bash_autocomplete b/contrib/autocompletion/bash_autocomplete
index 5cb62f26a7..58844938a6 100755
--- a/contrib/autocompletion/bash_autocomplete
+++ b/contrib/autocompletion/bash_autocomplete
@@ -1,4 +1,3 @@
-#! /bin/bash
# Heavily inspired by https://github.com/urfave/cli
_cli_bash_autocomplete() {
@@ -7,9 +6,9 @@ _cli_bash_autocomplete() {
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
if [[ "$cur" == "-"* ]]; then
- opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-bash-completion )
+ opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} ${cur} --generate-shell-completion )
else
- opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-bash-completion )
+ opts=$( ${COMP_WORDS[@]:0:$COMP_CWORD} --generate-shell-completion )
fi
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
diff --git a/contrib/autocompletion/zsh_autocomplete b/contrib/autocompletion/zsh_autocomplete
index b3b40df503..0fd1a0b175 100644
--- a/contrib/autocompletion/zsh_autocomplete
+++ b/contrib/autocompletion/zsh_autocomplete
@@ -9,9 +9,9 @@ _cli_zsh_autocomplete() {
local cur
cur=${words[-1]}
if [[ "$cur" == "-"* ]]; then
- opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-bash-completion)}")
+ opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} ${cur} --generate-shell-completion)}")
else
- opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-bash-completion)}")
+ opts=("${(@f)$(_CLI_ZSH_AUTOCOMPLETE_HACK=1 ${words[@]:0:#words[@]-1} --generate-shell-completion)}")
fi
if [[ "${opts[1]}" != "" ]]; then
diff --git a/contrib/environment-to-ini/README b/contrib/environment-to-ini/README
index f1d3f2ae83..e4caf25666 100644
--- a/contrib/environment-to-ini/README
+++ b/contrib/environment-to-ini/README
@@ -1,45 +1,46 @@
Environment To Ini
==================
-Multiple docker users have requested that the Gitea docker is changed
-to permit arbitrary configuration via environment variables.
+This tool allows defining Forgejo's entire configuration via environment
+variables, mostly geared towards usage in Docker.
-Gitea needs to use an ini file for configuration because the running
-environment that starts the docker may not be the same as that used
-by the hooks. An ini file also gives a good default and means that
-users do not have to completely provide a full environment.
+Forgejo needs to use an INI file for configuration because the running
+environment that starts the container may not be the same as the one used
+by the hooks. An INI file also gives a good default and means that
+users do not have to provide the entire set of environment variables.
With those caveats above, this command provides a generic way of
converting suitably structured environment variables into any ini
value.
-To use the command is very simple just run it and the default gitea
-app.ini will be rewritten to take account of the variables provided,
-however there are various options to give slightly different
-behavior and these can be interrogated with the `-h` option.
+When run, `environment-to-ini` will write the config files based on the
+environment variables provided.
+Check with the `-h` flag for several options to alter this behaviour.
-The environment variables should be of the form:
+Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME"
+will be mapped to the ini section "[section_name]" and the key
+"KEY_NAME" with the value as provided.
- GITEA__SECTION_NAME__KEY_NAME
-
-Note, SECTION_NAME in the notation above is case-insensitive.
+Environment variables of the form "FORGEJO__SECTION_NAME__KEY_NAME__FILE"
+will be mapped to the ini section "[section_name]" and the key
+"KEY_NAME" with the value loaded from the specified file.
Environment variables are usually restricted to a reduced character
set "0-9A-Z_" - in order to allow the setting of sections with
characters outside of that set, they should be escaped as following:
-"_0X2E_" for "." and "_0X2D_" for "-". The entire section and key names
-can be escaped as a UTF8 byte string if necessary. E.g. to configure:
+"_0X2E_" for ".". The entire section and key names can be escaped as
+a UTF8 byte string if necessary. E.g. to configure:
- """
- ...
- [log.console]
- COLORIZE=false
- STDERR=true
- ...
- """
+ """
+ ...
+ [log.console]
+ COLORIZE=false
+ STDERR=true
+ ...
+ """
-You would set the environment variables: "GITEA__LOG_0x2E_CONSOLE__COLORIZE=false"
-and "GITEA__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
+You would set the environment variables: "FORGEJO__LOG_0x2E_CONSOLE__COLORIZE=false"
+and "FORGEJO__LOG_0x2E_CONSOLE__STDERR=false". Other examples can be found
on the configuration cheat sheet.
To build locally, run:
diff --git a/contrib/environment-to-ini/environment-to-ini.go b/contrib/environment-to-ini/environment-to-ini.go
index 95f34527ac..e8e799b5f3 100644
--- a/contrib/environment-to-ini/environment-to-ini.go
+++ b/contrib/environment-to-ini/environment-to-ini.go
@@ -4,16 +4,17 @@
package main
import (
+ "context"
"os"
"forgejo.org/modules/log"
"forgejo.org/modules/setting"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
func main() {
- app := cli.NewApp()
+ app := cli.Command{}
app.Name = "environment-to-ini"
app.Usage = "Use provided environment to update configuration ini"
app.Description = `As a helper to allow docker users to update the forgejo configuration
@@ -72,13 +73,13 @@ func main() {
},
}
app.Action = runEnvironmentToIni
- err := app.Run(os.Args)
+ err := app.Run(context.Background(), os.Args)
if err != nil {
log.Fatal("Failed to run app with %s: %v", os.Args, err)
}
}
-func runEnvironmentToIni(c *cli.Context) error {
+func runEnvironmentToIni(ctx context.Context, c *cli.Command) error {
// the config system may change the environment variables, so get a copy first, to be used later
env := append([]string{}, os.Environ()...)
setting.InitWorkPathAndCfgProvider(os.Getenv, setting.ArgWorkPathAndCustomConf{
diff --git a/contrib/gitea-monitoring-mixin/dashboards/overview.libsonnet b/contrib/gitea-monitoring-mixin/dashboards/overview.libsonnet
index 31b7d4f9b2..108cab0eb1 100644
--- a/contrib/gitea-monitoring-mixin/dashboards/overview.libsonnet
+++ b/contrib/gitea-monitoring-mixin/dashboards/overview.libsonnet
@@ -408,7 +408,7 @@ local addIssueLabelsOverrides(labels) =
regex: '',
type: 'query',
multi: true,
- allValue: '.+'
+ allValue: '.+',
},
)
.addTemplate(
@@ -423,7 +423,7 @@ local addIssueLabelsOverrides(labels) =
regex: '',
type: 'query',
multi: true,
- allValue: '.+'
+ allValue: '.+',
},
)
.addTemplate(
diff --git a/custom/conf/app.example.ini b/custom/conf/app.example.ini
index 41599d411e..1b8d4c6697 100644
--- a/custom/conf/app.example.ini
+++ b/custom/conf/app.example.ini
@@ -183,7 +183,7 @@ RUN_USER = ; git
;;
;; For the built-in SSH server, choose the key exchange algorithms to support for SSH connections,
;; for system SSH this setting has no effect
-;SSH_SERVER_KEY_EXCHANGES = curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1
+;SSH_SERVER_KEY_EXCHANGES = mlkem768x25519-sha256, curve25519-sha256, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521, diffie-hellman-group14-sha256, diffie-hellman-group14-sha1
;;
;; For the built-in SSH server, choose the MACs to support for SSH connections,
;; for system SSH this setting has no effect
@@ -1025,6 +1025,10 @@ LEVEL = Info
;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
;DEFAULT_FORK_REPO_UNITS = repo.code,repo.pulls
;;
+;; Comma separated list of default mirror repo units.
+;; The set of allowed values and rules are the same as DEFAULT_REPO_UNITS.
+;DEFAULT_MIRROR_REPO_UNITS = repo.code,repo.releases,repo.issues,repo.wiki,repo.projects,repo.packages
+;;
;; Prefix archive files by placing them in a directory named after the repository
;PREFIX_ARCHIVE_FILES = true
;;
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 5737bed623..28cfa80089 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -1,5 +1,5 @@
import eslintCommunityEslintPluginEslintComments from '@eslint-community/eslint-plugin-eslint-comments';
-import stylisticEslintPluginJs from '@stylistic/eslint-plugin-js';
+import stylisticEslintPlugin from '@stylistic/eslint-plugin';
import vitest from '@vitest/eslint-plugin';
import arrayFunc from 'eslint-plugin-array-func';
import eslintPluginImportX from 'eslint-plugin-import-x';
@@ -26,7 +26,7 @@ export default tseslint.config(
{
plugins: {
'@eslint-community/eslint-comments': eslintCommunityEslintPluginEslintComments,
- '@stylistic/js': stylisticEslintPluginJs,
+ '@stylistic': stylisticEslintPlugin,
'@vitest': vitest,
'array-func': arrayFunc,
'no-jquery': noJquery,
@@ -69,62 +69,62 @@ export default tseslint.config(
'@eslint-community/eslint-comments/no-unused-enable': [2],
'@eslint-community/eslint-comments/no-use': [0],
'@eslint-community/eslint-comments/require-description': [0],
- '@stylistic/js/array-bracket-newline': [0],
- '@stylistic/js/array-bracket-spacing': [2, 'never'],
- '@stylistic/js/array-element-newline': [0],
- '@stylistic/js/arrow-parens': [2, 'always'],
+ '@stylistic/array-bracket-newline': [0],
+ '@stylistic/array-bracket-spacing': [2, 'never'],
+ '@stylistic/array-element-newline': [0],
+ '@stylistic/arrow-parens': [2, 'always'],
- '@stylistic/js/arrow-spacing': [2, {
+ '@stylistic/arrow-spacing': [2, {
before: true,
after: true,
}],
- '@stylistic/js/block-spacing': [0],
+ '@stylistic/block-spacing': [0],
- '@stylistic/js/brace-style': [2, '1tbs', {
+ '@stylistic/brace-style': [2, '1tbs', {
allowSingleLine: true,
}],
- '@stylistic/js/comma-dangle': [2, 'always-multiline'],
+ '@stylistic/comma-dangle': [2, 'always-multiline'],
- '@stylistic/js/comma-spacing': [2, {
+ '@stylistic/comma-spacing': [2, {
before: false,
after: true,
}],
- '@stylistic/js/comma-style': [2, 'last'],
- '@stylistic/js/computed-property-spacing': [2, 'never'],
- '@stylistic/js/dot-location': [2, 'property'],
- '@stylistic/js/eol-last': [2],
- '@stylistic/js/function-call-spacing': [2, 'never'],
- '@stylistic/js/function-call-argument-newline': [0],
- '@stylistic/js/function-paren-newline': [0],
- '@stylistic/js/generator-star-spacing': [0],
- '@stylistic/js/implicit-arrow-linebreak': [0],
+ '@stylistic/comma-style': [2, 'last'],
+ '@stylistic/computed-property-spacing': [2, 'never'],
+ '@stylistic/dot-location': [2, 'property'],
+ '@stylistic/eol-last': [2],
+ '@stylistic/function-call-spacing': [2, 'never'],
+ '@stylistic/function-call-argument-newline': [0],
+ '@stylistic/function-paren-newline': [0],
+ '@stylistic/generator-star-spacing': [0],
+ '@stylistic/implicit-arrow-linebreak': [0],
- '@stylistic/js/indent': [2, 2, {
+ '@stylistic/indent': [2, 2, {
ignoreComments: true,
SwitchCase: 1,
}],
- '@stylistic/js/key-spacing': [2],
- '@stylistic/js/keyword-spacing': [2],
- '@stylistic/js/linebreak-style': [2, 'unix'],
- '@stylistic/js/lines-around-comment': [0],
- '@stylistic/js/lines-between-class-members': [0],
- '@stylistic/js/max-len': [0],
- '@stylistic/js/max-statements-per-line': [0],
- '@stylistic/js/multiline-ternary': [0],
- '@stylistic/js/new-parens': [2],
- '@stylistic/js/newline-per-chained-call': [0],
- '@stylistic/js/no-confusing-arrow': [0],
- '@stylistic/js/no-extra-parens': [0],
- '@stylistic/js/no-extra-semi': [2],
- '@stylistic/js/no-floating-decimal': [0],
- '@stylistic/js/no-mixed-operators': [0],
- '@stylistic/js/no-mixed-spaces-and-tabs': [2],
+ '@stylistic/key-spacing': [2],
+ '@stylistic/keyword-spacing': [2],
+ '@stylistic/linebreak-style': [2, 'unix'],
+ '@stylistic/lines-around-comment': [0],
+ '@stylistic/lines-between-class-members': [0],
+ '@stylistic/max-len': [0],
+ '@stylistic/max-statements-per-line': [0],
+ '@stylistic/multiline-ternary': [0],
+ '@stylistic/new-parens': [2],
+ '@stylistic/newline-per-chained-call': [0],
+ '@stylistic/no-confusing-arrow': [0],
+ '@stylistic/no-extra-parens': [0],
+ '@stylistic/no-extra-semi': [2],
+ '@stylistic/no-floating-decimal': [0],
+ '@stylistic/no-mixed-operators': [0],
+ '@stylistic/no-mixed-spaces-and-tabs': [2],
- '@stylistic/js/no-multi-spaces': [2, {
+ '@stylistic/no-multi-spaces': [2, {
ignoreEOLComments: true,
exceptions: {
@@ -132,60 +132,60 @@ export default tseslint.config(
},
}],
- '@stylistic/js/no-multiple-empty-lines': [2, {
+ '@stylistic/no-multiple-empty-lines': [2, {
max: 1,
maxEOF: 0,
maxBOF: 0,
}],
- '@stylistic/js/no-tabs': [2],
- '@stylistic/js/no-trailing-spaces': [2],
- '@stylistic/js/no-whitespace-before-property': [2],
- '@stylistic/js/nonblock-statement-body-position': [2],
- '@stylistic/js/object-curly-newline': [0],
- '@stylistic/js/object-curly-spacing': [2, 'never'],
- '@stylistic/js/object-property-newline': [0],
- '@stylistic/js/one-var-declaration-per-line': [0],
- '@stylistic/js/operator-linebreak': [2, 'after'],
- '@stylistic/js/padded-blocks': [2, 'never'],
- '@stylistic/js/padding-line-between-statements': [0],
- '@stylistic/js/quote-props': [0],
+ '@stylistic/no-tabs': [2],
+ '@stylistic/no-trailing-spaces': [2],
+ '@stylistic/no-whitespace-before-property': [2],
+ '@stylistic/nonblock-statement-body-position': [2],
+ '@stylistic/object-curly-newline': [0],
+ '@stylistic/object-curly-spacing': [2, 'never'],
+ '@stylistic/object-property-newline': [0],
+ '@stylistic/one-var-declaration-per-line': [0],
+ '@stylistic/operator-linebreak': [2, 'after'],
+ '@stylistic/padded-blocks': [2, 'never'],
+ '@stylistic/padding-line-between-statements': [0],
+ '@stylistic/quote-props': [0],
- '@stylistic/js/quotes': [2, 'single', {
+ '@stylistic/quotes': [2, 'single', {
avoidEscape: true,
allowTemplateLiterals: true,
}],
- '@stylistic/js/rest-spread-spacing': [2, 'never'],
+ '@stylistic/rest-spread-spacing': [2, 'never'],
- '@stylistic/js/semi': [2, 'always', {
+ '@stylistic/semi': [2, 'always', {
omitLastInOneLineBlock: true,
}],
- '@stylistic/js/semi-spacing': [2, {
+ '@stylistic/semi-spacing': [2, {
before: false,
after: true,
}],
- '@stylistic/js/semi-style': [2, 'last'],
- '@stylistic/js/space-before-blocks': [2, 'always'],
+ '@stylistic/semi-style': [2, 'last'],
+ '@stylistic/space-before-blocks': [2, 'always'],
- '@stylistic/js/space-before-function-paren': [2, {
+ '@stylistic/space-before-function-paren': [2, {
anonymous: 'ignore',
named: 'never',
asyncArrow: 'always',
}],
- '@stylistic/js/space-in-parens': [2, 'never'],
- '@stylistic/js/space-infix-ops': [2],
- '@stylistic/js/space-unary-ops': [2],
- '@stylistic/js/spaced-comment': [2, 'always'],
- '@stylistic/js/switch-colon-spacing': [2],
- '@stylistic/js/template-curly-spacing': [2, 'never'],
- '@stylistic/js/template-tag-spacing': [2, 'never'],
- '@stylistic/js/wrap-iife': [2, 'inside'],
- '@stylistic/js/wrap-regex': [0],
- '@stylistic/js/yield-star-spacing': [2, 'after'],
+ '@stylistic/space-in-parens': [2, 'never'],
+ '@stylistic/space-infix-ops': [2],
+ '@stylistic/space-unary-ops': [2],
+ '@stylistic/spaced-comment': [2, 'always'],
+ '@stylistic/switch-colon-spacing': [2],
+ '@stylistic/template-curly-spacing': [2, 'never'],
+ '@stylistic/template-tag-spacing': [2, 'never'],
+ '@stylistic/wrap-iife': [2, 'inside'],
+ '@stylistic/wrap-regex': [0],
+ '@stylistic/yield-star-spacing': [2, 'after'],
'accessor-pairs': [2],
'array-callback-return': [2, {
diff --git a/flake.lock b/flake.lock
index 90672733d5..dcf7755013 100644
--- a/flake.lock
+++ b/flake.lock
@@ -20,11 +20,11 @@
},
"nixpkgs": {
"locked": {
- "lastModified": 1733392399,
- "narHash": "sha256-kEsTJTUQfQFIJOcLYFt/RvNxIK653ZkTBIs4DG+cBns=",
+ "lastModified": 1749285348,
+ "narHash": "sha256-frdhQvPbmDYaScPFiCnfdh3B/Vh81Uuoo0w5TkWmmjU=",
"owner": "nixos",
"repo": "nixpkgs",
- "rev": "d0797a04b81caeae77bcff10a9dde78bc17f5661",
+ "rev": "3e3afe5174c561dee0df6f2c2b2236990146329f",
"type": "github"
},
"original": {
diff --git a/flake.nix b/flake.nix
index daa66d1d04..01b23258b9 100644
--- a/flake.nix
+++ b/flake.nix
@@ -3,35 +3,20 @@
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
- outputs = {
- nixpkgs,
- flake-utils,
- ...
- }:
+ outputs =
+ {
+ nixpkgs,
+ flake-utils,
+ ...
+ }:
flake-utils.lib.eachDefaultSystem (
- system: let
+ system:
+ let
pkgs = nixpkgs.legacyPackages.${system};
- in {
- devShells.default = pkgs.mkShell {
- buildInputs = with pkgs; [
- # generic
- git
- git-lfs
- gnumake
- gnused
- gnutar
- gzip
-
- # frontend
- nodejs_20
-
- # backend
- gofumpt
- sqlite
- go
- gopls
- ];
- };
+ in
+ {
+ devShells.default = import ./shell.nix { inherit pkgs; };
+ formatter = pkgs.nixfmt-rfc-style;
}
);
}
diff --git a/go.mod b/go.mod
index 943e798209..510ec9c3ae 100644
--- a/go.mod
+++ b/go.mod
@@ -2,30 +2,31 @@ module forgejo.org
go 1.24
-toolchain go1.24.2
+toolchain go1.24.4
require (
- code.forgejo.org/f3/gof3/v3 v3.10.6
+ code.forgejo.org/f3/gof3/v3 v3.11.0
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251
+ code.forgejo.org/forgejo/go-rpmutils v1.0.0
code.forgejo.org/forgejo/levelqueue v1.0.0
code.forgejo.org/forgejo/reply v1.0.2
- code.forgejo.org/go-chi/binding v1.0.0
- code.forgejo.org/go-chi/cache v1.0.0
- code.forgejo.org/go-chi/captcha v1.0.1
- code.forgejo.org/go-chi/session v1.0.1
+ code.forgejo.org/go-chi/binding v1.0.1
+ code.forgejo.org/go-chi/cache v1.0.1
+ code.forgejo.org/go-chi/captcha v1.0.2
+ code.forgejo.org/go-chi/session v1.0.2
code.gitea.io/actions-proto-go v0.4.0
code.gitea.io/sdk/gitea v0.21.0
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
- connectrpc.com/connect v1.17.0
+ connectrpc.com/connect v1.18.1
github.com/42wim/httpsig v1.2.3
github.com/42wim/sshsig v0.0.0-20250502153856-5100632e8920
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
- github.com/ProtonMail/go-crypto v1.1.6
+ github.com/ProtonMail/go-crypto v1.3.0
github.com/PuerkitoBio/goquery v1.10.3
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.2
github.com/alecthomas/chroma/v2 v2.18.0
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
- github.com/blevesearch/bleve/v2 v2.5.1
+ github.com/blevesearch/bleve/v2 v2.5.2
github.com/buildkite/terminal-to-html/v3 v3.16.8
github.com/caddyserver/certmagic v0.23.0
github.com/chi-middleware/proxy v1.1.1
@@ -40,14 +41,14 @@ require (
github.com/gliderlabs/ssh v0.3.8
github.com/go-ap/activitypub v0.0.0-20231114162308-e219254dc5c9
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
- github.com/go-chi/chi/v5 v5.2.0
+ github.com/go-chi/chi/v5 v5.2.2
github.com/go-chi/cors v1.2.1
github.com/go-co-op/gocron v1.37.0
github.com/go-enry/go-enry/v2 v2.9.2
github.com/go-git/go-git/v5 v5.13.2
github.com/go-ldap/ldap/v3 v3.4.6
- github.com/go-openapi/spec v0.20.14
- github.com/go-sql-driver/mysql v1.9.1
+ github.com/go-openapi/spec v0.21.0
+ github.com/go-sql-driver/mysql v1.9.3
github.com/go-webauthn/webauthn v0.13.0
github.com/gobwas/glob v0.2.3
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
@@ -62,8 +63,8 @@ require (
github.com/hashicorp/go-version v1.7.0
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/huandu/xstrings v1.5.0
- github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056
- github.com/jhillyerd/enmime/v2 v2.1.0
+ github.com/inbucket/html2text v0.9.0
+ github.com/jhillyerd/enmime/v2 v2.2.0
github.com/json-iterator/go v1.1.12
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
github.com/klauspost/compress v1.18.0
@@ -75,7 +76,7 @@ require (
github.com/meilisearch/meilisearch-go v0.31.0
github.com/mholt/archiver/v3 v3.5.1
github.com/microcosm-cc/bluemonday v1.0.27
- github.com/minio/minio-go/v7 v7.0.91
+ github.com/minio/minio-go/v7 v7.0.94
github.com/msteinert/pam/v2 v2.1.0
github.com/nektos/act v0.2.52
github.com/niklasfasching/go-org v1.8.0
@@ -86,27 +87,25 @@ require (
github.com/prometheus/client_golang v1.21.1
github.com/redis/go-redis/v9 v9.8.0
github.com/robfig/cron/v3 v3.0.1
- github.com/santhosh-tekuri/jsonschema/v6 v6.0.1
- github.com/sassoftware/go-rpmutils v0.4.0
- github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
- github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
+ github.com/santhosh-tekuri/jsonschema/v6 v6.0.2
+ github.com/sergi/go-diff v1.4.0
github.com/stretchr/testify v1.10.0
github.com/syndtr/goleveldb v1.0.0
github.com/ulikunitz/xz v0.5.12
- github.com/urfave/cli/v2 v2.27.6
+ github.com/urfave/cli/v3 v3.3.3
github.com/valyala/fastjson v1.6.4
github.com/yohcop/openid-go v1.0.1
github.com/yuin/goldmark v1.7.12
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
- gitlab.com/gitlab-org/api/client-go v0.126.0
- go.uber.org/mock v0.5.1
- golang.org/x/crypto v0.38.0
+ gitlab.com/gitlab-org/api/client-go v0.130.1
+ go.uber.org/mock v0.5.2
+ golang.org/x/crypto v0.39.0
golang.org/x/image v0.27.0
- golang.org/x/net v0.40.0
+ golang.org/x/net v0.41.0
golang.org/x/oauth2 v0.30.0
- golang.org/x/sync v0.14.0
+ golang.org/x/sync v0.15.0
golang.org/x/sys v0.33.0
- golang.org/x/text v0.25.0
+ golang.org/x/text v0.26.0
google.golang.org/protobuf v1.36.4
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
gopkg.in/ini.v1 v1.67.0
@@ -121,7 +120,6 @@ require (
dario.cat/mergo v1.0.0 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
- github.com/DataDog/zstd v1.5.5 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/RoaringBitmap/roaring/v2 v2.4.5 // indirect
github.com/andybalholm/brotli v1.1.1 // indirect
@@ -146,14 +144,13 @@ require (
github.com/blevesearch/zapx/v13 v13.4.2 // indirect
github.com/blevesearch/zapx/v14 v14.4.2 // indirect
github.com/blevesearch/zapx/v15 v15.4.2 // indirect
- github.com/blevesearch/zapx/v16 v16.2.3 // indirect
+ github.com/blevesearch/zapx/v16 v16.2.4 // indirect
github.com/boombuler/barcode v1.0.1 // indirect
- github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
+ github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf // indirect
github.com/caddyserver/zerossl v0.1.3 // indirect
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
- github.com/cloudflare/circl v1.3.8 // indirect
- github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
+ github.com/cloudflare/circl v1.6.1 // indirect
github.com/cyphar/filepath-securejoin v0.3.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/davidmz/go-pageant v1.0.2 // indirect
@@ -161,7 +158,7 @@ require (
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
- github.com/fatih/color v1.16.0 // indirect
+ github.com/fatih/color v1.18.0 // indirect
github.com/fxamacker/cbor/v2 v2.8.0 // indirect
github.com/go-ap/errors v0.0.0-20231003111023-183eef4b31b7 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
@@ -170,9 +167,9 @@ require (
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
github.com/go-git/go-billy/v5 v5.6.2 // indirect
github.com/go-ini/ini v1.67.0 // indirect
- github.com/go-openapi/jsonpointer v0.20.2 // indirect
- github.com/go-openapi/jsonreference v0.20.4 // indirect
- github.com/go-openapi/swag v0.22.7 // indirect
+ github.com/go-openapi/jsonpointer v0.21.1 // indirect
+ github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/swag v0.23.1 // indirect
github.com/go-webauthn/x v0.1.21 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
@@ -195,7 +192,7 @@ require (
github.com/libdns/libdns v1.0.0-beta.1 // indirect
github.com/mailru/easyjson v0.9.0 // indirect
github.com/markbates/going v1.0.3 // indirect
- github.com/mattn/go-colorable v0.1.13 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/mholt/acmez/v3 v3.1.2 // indirect
github.com/miekg/dns v1.1.63 // indirect
@@ -208,8 +205,11 @@ require (
github.com/mschoch/smat v0.2.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/nwaples/rardecode v1.1.3 // indirect
- github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/olekukonko/errors v1.1.0 // indirect
+ github.com/olekukonko/ll v0.0.9 // indirect
+ github.com/olekukonko/tablewriter v1.0.7 // indirect
github.com/onsi/ginkgo v1.16.5 // indirect
+ github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c // indirect
github.com/pierrec/lz4/v4 v4.1.21 // indirect
github.com/pjbgf/sha1cd v0.3.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
@@ -221,15 +221,13 @@ require (
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.13.1 // indirect
github.com/rs/xid v1.6.0 // indirect
- github.com/russross/blackfriday/v2 v2.1.0 // indirect
- github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/skeema/knownhosts v1.3.0 // indirect
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
+ github.com/tinylib/msgp v1.3.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/xanzy/ssh-agent v0.3.3 // indirect
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
- github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/zeebo/assert v1.3.0 // indirect
github.com/zeebo/blake3 v0.2.4 // indirect
go.etcd.io/bbolt v1.4.0 // indirect
@@ -237,18 +235,16 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
- golang.org/x/mod v0.24.0 // indirect
- golang.org/x/time v0.10.0 // indirect
- golang.org/x/tools v0.31.0 // indirect
+ golang.org/x/mod v0.25.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
+ golang.org/x/tools v0.34.0 // indirect
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
gopkg.in/warnings.v0 v0.1.2 // indirect
)
replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
-replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0
-
-replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.26.0
+replace github.com/nektos/act => code.forgejo.org/forgejo/act v1.28.0
replace github.com/mholt/archiver/v3 => code.forgejo.org/forgejo/archiver/v3 v3.5.1
diff --git a/go.sum b/go.sum
index 7f6f6ecb32..53558fddd7 100644
--- a/go.sum
+++ b/go.sum
@@ -1,13 +1,15 @@
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
-code.forgejo.org/f3/gof3/v3 v3.10.6 h1:Ru/Iz+pqM8IPi7atUHE7+q7v3O3DRbYgMFqrFTsO1m8=
-code.forgejo.org/f3/gof3/v3 v3.10.6/go.mod h1:K6lQCWQIyN/5rjP/OJL9fMA6fd++satndE20w/I6Kss=
+code.forgejo.org/f3/gof3/v3 v3.11.0 h1:f/xToKwqTgxG6PYxvewywjDQyCcyHEEJ6sZqUitFsAE=
+code.forgejo.org/f3/gof3/v3 v3.11.0/go.mod h1:4FaRUNSQGBiD1M0DuB0yNv+Z2wMtlOeckgygHSSq4KQ=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251 h1:HTZl3CBk3ABNYtFI6TPLvJgGKFIhKT5CBk0sbOtkDKU=
code.forgejo.org/forgejo-contrib/go-libravatar v0.0.0-20191008002943-06d1c002b251/go.mod h1:PphB88CPbx601QrWPMZATeorACeVmQlyv3u+uUMbSaM=
-code.forgejo.org/forgejo/act v1.26.0 h1:6mTmoaw7d/WpYiw/Pw6AaypxFdgJog5OFi/PMEgEbxs=
-code.forgejo.org/forgejo/act v1.26.0/go.mod h1:HFDFrXPrqfM9aH2RCnMiBdo/3ThxDmZjp58InPjGOfo=
+code.forgejo.org/forgejo/act v1.28.0 h1:96njNC7C1YNyjWq5OWvLZMF/nw0PMthzIA8Nwbnn7jo=
+code.forgejo.org/forgejo/act v1.28.0/go.mod h1:dFuiwAmD5vyrzecysHB2kL/GM3wRpoVPl+WdbCTC8Bs=
code.forgejo.org/forgejo/archiver/v3 v3.5.1 h1:UmmbA7D5550uf71SQjarmrn6yKwOGxtEjb3jaYYtmSE=
code.forgejo.org/forgejo/archiver/v3 v3.5.1/go.mod h1:e3dqJ7H78uzsRSEACH1joayhuSyhnonssnDhppzS1L4=
+code.forgejo.org/forgejo/go-rpmutils v1.0.0 h1:RZGGeKt70p/WaIEL97pyT6uiiEIoN8/aLmS5Z6WmX0M=
+code.forgejo.org/forgejo/go-rpmutils v1.0.0/go.mod h1:cg+VbgLXfrDPza9T+kBsMb3TVmmzPN4XseT6gDGLSUk=
code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078 h1:RArF5AsF9LH4nEoJxqRxcP5r8hhRfWcId84G82YbqzA=
code.forgejo.org/forgejo/go-xsd-duration v0.0.0-20220703122237-02e73435a078/go.mod h1:g/V2Hjas6Z1UHUp4yIx6bATpNzJ7DYtD0FG3+xARWxs=
code.forgejo.org/forgejo/levelqueue v1.0.0 h1:9krYpU6BM+j/1Ntj6m+VCAIu0UNnne1/UfU/XgPpLuE=
@@ -16,22 +18,22 @@ code.forgejo.org/forgejo/reply v1.0.2 h1:dMhQCHV6/O3L5CLWNTol+dNzDAuyCK88z4J/lCd
code.forgejo.org/forgejo/reply v1.0.2/go.mod h1:RyZUfzQLc+fuLIGjTSQWDAJWPiL4WtKXB/FifT5fM7U=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616 h1:kEZL84+02jY9RxXM4zHBWZ3Fml0B09cmP1LGkDsCfIA=
code.forgejo.org/forgejo/ssh v0.0.0-20241211213324-5fc306ca0616/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
-code.forgejo.org/go-chi/binding v1.0.0 h1:EIDJtk9brK7WsT7rvS/D4cxX8XlnhY3LMy8ex1jeHu0=
-code.forgejo.org/go-chi/binding v1.0.0/go.mod h1:fWwqaHj0H1/KeCpBqdvKunflq8pYfciEHI5v3UUeE2E=
-code.forgejo.org/go-chi/cache v1.0.0 h1:akLfGxNlHcacmtutovNtYFSTMsbdcp5MGjAEsP4pxnE=
-code.forgejo.org/go-chi/cache v1.0.0/go.mod h1:OVlZ/TqDYJ+RUJ+R+J+OLxtlyjo3pbjBeK7LAWAB+Vk=
-code.forgejo.org/go-chi/captcha v1.0.1 h1:/oe1fvGOpdyyeGijg3oMYNOYLvEovNvp79Y3gLe3qbk=
-code.forgejo.org/go-chi/captcha v1.0.1/go.mod h1:6EbjSVVa7WoZFENgwK/hLAJZq+HBXtgRsjnIngILC8Y=
-code.forgejo.org/go-chi/session v1.0.1 h1:RNkcJQZJBqlvJoIFXSth87b3kMFZLDBA18VcitD+Z0Y=
-code.forgejo.org/go-chi/session v1.0.1/go.mod h1:y69sjS984wc7k4xyu77yNE5HKeSlBoQW8VSGdsK7RAs=
+code.forgejo.org/go-chi/binding v1.0.1 h1:coKNI+X1NzRN7X85LlrpvBRqk0TXpJ+ja28vusQWEuY=
+code.forgejo.org/go-chi/binding v1.0.1/go.mod h1:oTFFDg/dkwFbmVuusiULB1OlrIJM95cOGK7Nc3GYcoo=
+code.forgejo.org/go-chi/cache v1.0.1 h1:w6IsDcPbeEnEYZn7M2HJe3/3/Ehtcw/72VjcVK7+lBw=
+code.forgejo.org/go-chi/cache v1.0.1/go.mod h1:K3aQSyRIN4xiuqV1kanfQ6O4ToDpzDpY3bNOyGjFe3U=
+code.forgejo.org/go-chi/captcha v1.0.2 h1:vyHDPXkpjDv8bLO9NqtWzZayzstD/WpJ5xwEkAaqZGQ=
+code.forgejo.org/go-chi/captcha v1.0.2/go.mod h1:lxiPLcJ76UCZHoH31/Wbum4GUi2NgjfFZLrJkKv1lLE=
+code.forgejo.org/go-chi/session v1.0.2 h1:pG+AXre9L9VXJmTaADXkmeEPuRalhmBXyv6tG2Rvjcc=
+code.forgejo.org/go-chi/session v1.0.2/go.mod h1:HnEGyBny7WPzCiVLP2vzL5ssma+3gCSl/vLpuVNYrqc=
code.gitea.io/actions-proto-go v0.4.0 h1:OsPBPhodXuQnsspG1sQ4eRE1PeoZyofd7+i73zCwnsU=
code.gitea.io/actions-proto-go v0.4.0/go.mod h1:mn7Wkqz6JbnTOHQpot3yDeHx+O5C9EGhMEE+htvHBas=
code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4=
code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570 h1:TXbikPqa7YRtfU9vS6QJBg77pUvbEb6StRdZO8t1bEY=
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570/go.mod h1:IIAjsijsd8q1isWX8MACefDEgTQslQ4stk2AeeTt3kM=
-connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk=
-connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
+connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw=
+connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8=
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
@@ -46,13 +48,11 @@ github.com/6543/go-version v1.3.1 h1:HvOp+Telns7HWJ2Xo/05YXQSB2bE0WmVgbHqwMPZT4U
github.com/6543/go-version v1.3.1/go.mod h1:oqFAHCwtLVUTLdhQmVZWYvaHXTdsbB4SY85at64SQEo=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
-github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
-github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
-github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
-github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
+github.com/ProtonMail/go-crypto v1.3.0 h1:ILq8+Sf5If5DCpHQp4PbZdS1J7HDFRXz/+xKBiRGFrw=
+github.com/ProtonMail/go-crypto v1.3.0/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE=
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
github.com/RoaringBitmap/roaring/v2 v2.4.5 h1:uGrrMreGjvAtTBobc0g5IrW1D5ldxDQYe2JW2gggRdg=
@@ -87,8 +87,8 @@ github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCk
github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb h1:m935MPodAbYS46DG4pJSv7WO+VECIWUQ7OJYSoTrMh4=
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI=
-github.com/blevesearch/bleve/v2 v2.5.1 h1:cc/O++W2Hcjp1SU5ETHeE+QYWv2oV88ldYEPowdmg8M=
-github.com/blevesearch/bleve/v2 v2.5.1/go.mod h1:9g/wnbWKm9AgXrU8Ecqi+IDdqjUHWymwkQRDg+5tafU=
+github.com/blevesearch/bleve/v2 v2.5.2 h1:Ab0r0MODV2C5A6BEL87GqLBySqp/s9xFgceCju6BQk8=
+github.com/blevesearch/bleve/v2 v2.5.2/go.mod h1:5Dj6dUQxZM6aqYT3eutTD/GpWKGFSsV8f7LDidFbwXo=
github.com/blevesearch/bleve_index_api v1.2.8 h1:Y98Pu5/MdlkRyLM0qDHostYo7i+Vv1cDNhqTeR4Sy6Y=
github.com/blevesearch/bleve_index_api v1.2.8/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0=
github.com/blevesearch/geo v0.2.3 h1:K9/vbGI9ehlXdxjxDRJtoAMt7zGAsMIzc6n8zWcwnhg=
@@ -121,13 +121,13 @@ github.com/blevesearch/zapx/v14 v14.4.2 h1:2SGHakVKd+TrtEqpfeq8X+So5PShQ5nW6GNxT
github.com/blevesearch/zapx/v14 v14.4.2/go.mod h1:rz0XNb/OZSMjNorufDGSpFpjoFKhXmppH9Hi7a877D8=
github.com/blevesearch/zapx/v15 v15.4.2 h1:sWxpDE0QQOTjyxYbAVjt3+0ieu8NCE0fDRaFxEsp31k=
github.com/blevesearch/zapx/v15 v15.4.2/go.mod h1:1pssev/59FsuWcgSnTa0OeEpOzmhtmr/0/11H0Z8+Nw=
-github.com/blevesearch/zapx/v16 v16.2.3 h1:7Y0r+a3diEvlazsncexq1qoFOcBd64xwMS7aDm4lo1s=
-github.com/blevesearch/zapx/v16 v16.2.3/go.mod h1:wVJ+GtURAaRG9KQAMNYyklq0egV+XJlGcXNCE0OFjjA=
+github.com/blevesearch/zapx/v16 v16.2.4 h1:tGgfvleXTAkwsD5mEzgM3zCS/7pgocTCnO1oyAUjlww=
+github.com/blevesearch/zapx/v16 v16.2.4/go.mod h1:Rti/REtuuMmzwsI8/C/qIzRaEoSK/wiFYw5e5ctUKKs=
github.com/boombuler/barcode v1.0.1-0.20190219062509-6c824513bacc/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
-github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous=
-github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
+github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf h1:TqhNAT4zKbTdLa62d2HDBFdvgSbIGB3eJE8HqhgiL9I=
+github.com/bradfitz/gomemcache v0.0.0-20250403215159-8d39553ac7cf/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c=
github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA=
@@ -150,10 +150,8 @@ github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moA
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
-github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI=
-github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
-github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
-github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/cyphar/filepath-securejoin v0.3.6 h1:4d9N5ykBnSp5Xn2JkhocYDkOpURL/18CYMpo6xB9uWM=
github.com/cyphar/filepath-securejoin v0.3.6/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI=
@@ -194,8 +192,8 @@ github.com/emersion/go-sasl v0.0.0-20231106173351-e73c9f7bad43/go.mod h1:iL2twTe
github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594/go.mod h1:aqO8z8wPrjkscevZJFVE1wXJrLpC5LtJG7fqLOsPb2U=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
-github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
-github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/felixge/fgprof v0.9.5 h1:8+vR6yu2vvSKn08urWyEuxx75NWPEvybbkBirEpsbVY=
github.com/felixge/fgprof v0.9.5/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM=
github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
@@ -215,8 +213,8 @@ github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73/go.mod h1:jyveZeGw5La
github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-chi/chi/v5 v5.0.1/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
-github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0=
-github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
+github.com/go-chi/chi/v5 v5.2.2 h1:CMwsvRVTbXVytCk1Wd72Zy1LAsAh9GxMmSNWLHCG618=
+github.com/go-chi/chi/v5 v5.2.2/go.mod h1:L2yAIGWB3H+phAw1NxKwWM+7eUH/lU8pOMm5hHcoops=
github.com/go-chi/cors v1.2.1 h1:xEC8UT3Rlp2QuWNEr4Fs/c2EAGVKBwy/1vHx3bppil4=
github.com/go-chi/cors v1.2.1/go.mod h1:sSbTewc+6wYHBBCW7ytsFSn836hqM7JxpglAy2Vzc58=
github.com/go-co-op/gocron v1.37.0 h1:ZYDJGtQ4OMhTLKOKMIch+/CY70Brbb1dGdooLEhh7b0=
@@ -239,16 +237,16 @@ github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A=
github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A=
github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc=
-github.com/go-openapi/jsonpointer v0.20.2 h1:mQc3nmndL8ZBzStEo3JYF8wzmeWffDH4VbXz58sAx6Q=
-github.com/go-openapi/jsonpointer v0.20.2/go.mod h1:bHen+N0u1KEO3YlmqOjTT9Adn1RfD91Ar825/PuiRVs=
-github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU=
-github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4=
-github.com/go-openapi/spec v0.20.14 h1:7CBlRnw+mtjFGlPDRZmAMnq35cRzI91xj03HVyUi/Do=
-github.com/go-openapi/spec v0.20.14/go.mod h1:8EOhTpBoFiask8rrgwbLC3zmJfz4zsCUueRuPM6GNkw=
-github.com/go-openapi/swag v0.22.7 h1:JWrc1uc/P9cSomxfnsFSVWoE1FW6bNbrVPmpQYpCcR8=
-github.com/go-openapi/swag v0.22.7/go.mod h1:Gl91UqO+btAM0plGGxHqJcQZ1ZTy6jbmridBTsDy8A0=
-github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtSb/iI=
-github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
+github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic=
+github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk=
+github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
+github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU=
+github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0=
+github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
+github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U=
github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
@@ -343,12 +341,12 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab/go.mod h1:gx7rwoVhcfuVKG5uya9Hs3Sxj7EIvldVofAWIUtGouw=
-github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056 h1:iCHtR9CQyktQ5+f3dMVZfwD2KWJUgm7M0gdL9NGr8KA=
-github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk=
+github.com/inbucket/html2text v0.9.0 h1:ULJmVcBEMAcmLE+/rN815KG1Fx6+a4HhbUxiDiN+qks=
+github.com/inbucket/html2text v0.9.0/go.mod h1:QDaumzl+/OzlSVbNohhmg+yAy5pKjUjzCKW2BMvztKE=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-github.com/jhillyerd/enmime/v2 v2.1.0 h1:c8Qwi5Xq5EdtMN6byQWoZ/8I2RMTo6OJ7Xay+s1oPO0=
-github.com/jhillyerd/enmime/v2 v2.1.0/go.mod h1:EJ74dcRbBcqHSP2TBu08XRoy6y3Yx0cevwb1YkGMEmQ=
+github.com/jhillyerd/enmime/v2 v2.2.0 h1:Pe35MB96eZK5Q0XjlvPftOgWypQpd1gcbfJKAt7rsB8=
+github.com/jhillyerd/enmime/v2 v2.2.0/go.mod h1:SOBXlCemjhiV2DvHhAKnJiWrtJGS/Ffuw4Iy7NjBTaI=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -384,8 +382,6 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/libdns/libdns v1.0.0-beta.1 h1:KIf4wLfsrEpXpZ3vmc/poM8zCATXT2klbdPe6hyOBjQ=
github.com/libdns/libdns v1.0.0-beta.1/go.mod h1:4Bj9+5CQiNMVGf87wjX4CY3HQJypUHRuLvlsfsZqLWQ=
-github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0 h1:F/3FfGmKdiKFa8kL3YrpZ7pe9H4l4AzA1pbaOUnRvPI=
-github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0/go.mod h1:JEfTc3+2DF9Z4PXhLLvXL42zexJyh8rIq3OzUj/0rAk=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
@@ -393,12 +389,10 @@ github.com/markbates/going v1.0.3 h1:mY45T5TvW+Xz5A6jY7lf4+NLg9D8+iuStIHyR7M8qsE
github.com/markbates/going v1.0.3/go.mod h1:fQiT6v6yQar9UD6bd/D4Z5Afbk9J6BBVBtLiyY4gp2o=
github.com/markbates/goth v1.80.0 h1:NnvatczZDzOs1hn9Ug+dVYf2Viwwkp/ZDX5K+GLjan8=
github.com/markbates/goth v1.80.0/go.mod h1:4/GYHo+W6NWisrMPZnq0Yr2Q70UntNLn7KXEFhrIdAY=
-github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
-github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/mattn/go-sqlite3 v1.14.28 h1:ThEiQrnbtumT+QMknw63Befp/ce/nUPgBPMlRFEum7A=
@@ -415,8 +409,8 @@ github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY
github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg=
github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
-github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc=
-github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go=
+github.com/minio/minio-go/v7 v7.0.94 h1:1ZoksIKPyaSt64AVOyaQvhDOgVC3MfZsWM6mZXRUGtM=
+github.com/minio/minio-go/v7 v7.0.94/go.mod h1:71t2CqDt3ThzESgZUlU1rBN54mksGGlkLcFgguDnnAc=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -440,8 +434,12 @@ github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWk
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
-github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
-github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
+github.com/olekukonko/errors v1.1.0 h1:RNuGIh15QdDenh+hNvKrJkmxxjV4hcS50Db478Ou5sM=
+github.com/olekukonko/errors v1.1.0/go.mod h1:ppzxA5jBKcO1vIpCXQ9ZqgDh8iwODz6OXIGKU8r5m4Y=
+github.com/olekukonko/ll v0.0.9 h1:Y+1YqDfVkqMWuEQMclsF9HUR5+a82+dxJuL1HHSRpxI=
+github.com/olekukonko/ll v0.0.9/go.mod h1:En+sEW0JNETl26+K8eZ6/W4UQ7CYSrrgg/EdIYT2H8g=
+github.com/olekukonko/tablewriter v1.0.7 h1:HCC2e3MM+2g72M81ZcJU11uciw6z/p82aEnm4/ySDGw=
+github.com/olekukonko/tablewriter v1.0.7/go.mod h1:H428M+HzoUXC6JU2Abj9IT9ooRmdq9CxuDmKMtrOCMs=
github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -459,6 +457,8 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I
github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040=
github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M=
github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde/go.mod h1:nZgzbfBr3hhjoZnS66nKrHmduYNpc34ny7RK4z5/HM0=
+github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c h1:dAMKvw0MlJT1GshSTtih8C2gDs04w8dReiOGXrGLNoY=
+github.com/philhofer/fwd v1.1.3-0.20240916144458-20a13a1f6b7c/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM=
github.com/pierrec/lz4/v4 v4.1.2/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
@@ -497,17 +497,11 @@ github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
-github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
-github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw=
-github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
-github.com/sassoftware/go-rpmutils v0.4.0 h1:ojND82NYBxgwrV+mX1CWsd5QJvvEZTKddtCdFLPWhpg=
-github.com/sassoftware/go-rpmutils v0.4.0/go.mod h1:3goNWi7PGAT3/dlql2lv3+MSN5jNYPjT5mVcQcIsYzI=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ=
+github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU=
github.com/serenize/snaker v0.0.0-20171204205717-a683aaf2d516/go.mod h1:Yow6lPLSAXx2ifx470yD/nUe22Dv5vBvxK/UK9UUTVs=
-github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8=
-github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
-github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c h1:aqg5Vm5dwtvL+YgDpBcK1ITf3o96N/K7/wsRXQnUTEs=
-github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c/go.mod h1:owqhoLW1qZoYLZzLnBw+QkPP9WZnjlSWihhxAJC1+/M=
+github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw=
+github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4=
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
@@ -531,12 +525,14 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/tinylib/msgp v1.3.0 h1:ULuf7GPooDaIlbyvgAxBV/FI7ynli6LZ1/nVUNu+0ww=
+github.com/tinylib/msgp v1.3.0/go.mod h1:ykjzy2wzgrlvpDCRc4LA8UXy6D8bzMSuAF3WD57Gok0=
github.com/ulikunitz/xz v0.5.8/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
-github.com/urfave/cli/v2 v2.27.6 h1:VdRdS98FNhKZ8/Az8B7MTyGQmpIr36O1EHybx/LaZ4g=
-github.com/urfave/cli/v2 v2.27.6/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
+github.com/urfave/cli/v3 v3.3.3 h1:byCBaVdIXuLPIDm5CYZRVG6NvT7tv1ECqdU4YzlEa3I=
+github.com/urfave/cli/v3 v3.3.3/go.mod h1:FJSKtM/9AiiTOJL4fJ6TbMUkxBXn7GO9guZqoZtpYpo=
github.com/valyala/fastjson v1.6.4 h1:uAUNq9Z6ymTgGhcm0UynUAB6tlbakBrz6CQFax3BXVQ=
github.com/valyala/fastjson v1.6.4/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
@@ -545,8 +541,6 @@ github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM
github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
-github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
-github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/yohcop/openid-go v1.0.1 h1:DPRd3iPO5F6O5zX2e62XpVAbPT6wV51cuucH0z9g3js=
@@ -564,8 +558,8 @@ github.com/zeebo/blake3 v0.2.4 h1:KYQPkhpRtcqh0ssGYcKLG1JYvddkEA8QwCM/yBqhaZI=
github.com/zeebo/blake3 v0.2.4/go.mod h1:7eeQ6d2iXWRGF6npfaxl2CU+xy2Fjo2gxeyZGCRUjcE=
github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo=
github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4=
-gitlab.com/gitlab-org/api/client-go v0.126.0 h1:VV5TdkF6pMbEdFGvbR2CwEgJwg6qdg1u3bj5eD2tiWk=
-gitlab.com/gitlab-org/api/client-go v0.126.0/go.mod h1:bYC6fPORKSmtuPRyD9Z2rtbAjE7UeNatu2VWHRf4/LE=
+gitlab.com/gitlab-org/api/client-go v0.130.1 h1:1xF5C5Zq3sFeNg3PzS2z63oqrxifne3n/OnbI7nptRc=
+gitlab.com/gitlab-org/api/client-go v0.130.1/go.mod h1:ZhSxLAWadqP6J9lMh40IAZOlOxBLPRh7yFOXR/bMJWM=
go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk=
go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@@ -573,8 +567,8 @@ go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
-go.uber.org/mock v0.5.1 h1:ASgazW/qBmR+A32MYFDB6E2POoTgOwT509VP0CT/fjs=
-go.uber.org/mock v0.5.1/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM=
+go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
+go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
@@ -591,8 +585,8 @@ golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliY
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
+golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
golang.org/x/image v0.27.0 h1:C8gA4oWU/tKkdCfYT6T2u4faJu3MeNS5O8UPWlPF61w=
@@ -603,8 +597,8 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
-golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
-golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -620,8 +614,8 @@ golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
+golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -633,8 +627,8 @@ golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
+golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -653,7 +647,6 @@ golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -684,10 +677,10 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
-golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
-golang.org/x/time v0.10.0 h1:3usCWA8tQn0L8+hFJQNgzpWbd89begxN66o1Ojdn5L4=
-golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
+golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
+golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -695,8 +688,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
-golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU=
-golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/main.go b/main.go
index 3f0283db7f..ade43881cf 100644
--- a/main.go
+++ b/main.go
@@ -21,7 +21,7 @@ import (
_ "forgejo.org/modules/markup/markdown"
_ "forgejo.org/modules/markup/orgmode"
- "github.com/urfave/cli/v2"
+ "github.com/urfave/cli/v3"
)
// these flags will be set by the build flags
diff --git a/manifest.scm b/manifest.scm
new file mode 100644
index 0000000000..f9605bc2d9
--- /dev/null
+++ b/manifest.scm
@@ -0,0 +1,38 @@
+;;; Copyright 2025 The Forgejo Authors. All rights reserved.
+;;; SPDX-License-Identifier: MIT
+;;;
+;;; Commentary:
+;;;
+;;; This is a GNU Guix manifest that can be used to create a
+;;; development environment to build and test Forgejo.
+;;;
+;;; The following is a usage example to create a containerized
+;;; environment, with HOME shared for the Go cache and the network
+;;; made available to fetch required Go and Node dependencies.
+;;;
+#|
+guix shell -CNF --share=$HOME -m manifest.scm
+export GOTOOLCHAIN=local # to use the Go binary from Guix
+export CC=gcc CGO_ENABLED=1
+export TAGS="timetzdata sqlite sqlite_unlock_notify"
+make clean
+make -j$(nproc)
+make test -j$(nproc) # run unit tests
+make test-sqlite -j$(nproc) # run integration tests
+make watch # run an instance/rebuild on changes
+|#
+(specifications->manifest
+ (list "bash-minimal"
+ "coreutils"
+ "findutils"
+ "gcc-toolchain"
+ "git" ;libpcre support is required
+ "git-lfs"
+ "gnupg"
+ "go"
+ "grep"
+ "make"
+ "node"
+ "nss-certs"
+ "openssh"
+ "sed"))
diff --git a/models/actions/run.go b/models/actions/run.go
index 61159bc929..55def805ed 100644
--- a/models/actions/run.go
+++ b/models/actions/run.go
@@ -5,6 +5,7 @@ package actions
import (
"context"
+ "errors"
"fmt"
"slices"
"strings"
@@ -54,6 +55,7 @@ type ActionRun struct {
PreviousDuration time.Duration
Created timeutil.TimeStamp `xorm:"created"`
Updated timeutil.TimeStamp `xorm:"updated"`
+ NotifyEmail bool
}
func init() {
@@ -222,29 +224,38 @@ func InsertRun(ctx context.Context, run *ActionRun, jobs []*jobparser.SingleWork
var hasWaiting bool
for _, v := range jobs {
id, job := v.Job()
- needs := job.Needs()
- if err := v.SetJob(id, job.EraseNeeds()); err != nil {
- return err
+ status := StatusFailure
+ payload := []byte{}
+ needs := []string{}
+ name := run.Title
+ runsOn := []string{}
+ if job != nil {
+ needs = job.Needs()
+ if err := v.SetJob(id, job.EraseNeeds()); err != nil {
+ return err
+ }
+ payload, _ = v.Marshal()
+
+ if len(needs) > 0 || run.NeedApproval {
+ status = StatusBlocked
+ } else {
+ status = StatusWaiting
+ hasWaiting = true
+ }
+ name, _ = util.SplitStringAtByteN(job.Name, 255)
+ runsOn = job.RunsOn()
}
- payload, _ := v.Marshal()
- status := StatusWaiting
- if len(needs) > 0 || run.NeedApproval {
- status = StatusBlocked
- } else {
- hasWaiting = true
- }
- job.Name, _ = util.SplitStringAtByteN(job.Name, 255)
runJobs = append(runJobs, &ActionRunJob{
RunID: run.ID,
RepoID: run.RepoID,
OwnerID: run.OwnerID,
CommitSHA: run.CommitSHA,
IsForkPullRequest: run.IsForkPullRequest,
- Name: job.Name,
+ Name: name,
WorkflowPayload: payload,
JobID: id,
Needs: needs,
- RunsOn: job.RunsOn(),
+ RunsOn: runsOn,
Status: status,
})
}
@@ -346,7 +357,7 @@ func UpdateRunWithoutNotification(ctx context.Context, run *ActionRun, cols ...s
return err
}
if affected == 0 {
- return fmt.Errorf("run has changed")
+ return errors.New("run has changed")
// It's impossible that the run is not found, since Gitea never deletes runs.
}
diff --git a/models/actions/run_job_list.go b/models/actions/run_job_list.go
index cbcb4beb8e..afc754f26a 100644
--- a/models/actions/run_job_list.go
+++ b/models/actions/run_job_list.go
@@ -54,6 +54,8 @@ type FindRunJobOptions struct {
CommitSHA string
Statuses []Status
UpdatedBefore timeutil.TimeStamp
+ Events []string // []webhook_module.HookEventType
+ RunNumber int64
}
func (opts FindRunJobOptions) ToConds() builder.Cond {
@@ -76,5 +78,11 @@ func (opts FindRunJobOptions) ToConds() builder.Cond {
if opts.UpdatedBefore > 0 {
cond = cond.And(builder.Lt{"updated": opts.UpdatedBefore})
}
+ if len(opts.Events) > 0 {
+ cond = cond.And(builder.In("event", opts.Events))
+ }
+ if opts.RunNumber > 0 {
+ cond = cond.And(builder.Eq{"`index`": opts.RunNumber})
+ }
return cond
}
diff --git a/models/actions/runner.go b/models/actions/runner.go
index 4d5056b425..bece1ae301 100644
--- a/models/actions/runner.go
+++ b/models/actions/runner.go
@@ -16,6 +16,7 @@ import (
repo_model "forgejo.org/models/repo"
"forgejo.org/models/shared/types"
user_model "forgejo.org/models/user"
+ "forgejo.org/modules/log"
"forgejo.org/modules/optional"
"forgejo.org/modules/timeutil"
"forgejo.org/modules/translation"
@@ -353,3 +354,53 @@ func FixRunnersWithoutBelongingRepo(ctx context.Context) (int64, error) {
}
return res.RowsAffected()
}
+
+func DeleteOfflineRunners(ctx context.Context, olderThan timeutil.TimeStamp, globalOnly bool) error {
+ log.Info("Doing: DeleteOfflineRunners")
+
+ if olderThan.AsTime().After(timeutil.TimeStampNow().AddDuration(-RunnerOfflineTime).AsTime()) {
+ return fmt.Errorf("invalid `cron.cleanup_offline_runners.older_than`value: must be at least %q", RunnerOfflineTime)
+ }
+
+ cond := builder.Or(
+ // never online
+ builder.And(builder.Eq{"last_online": 0}, builder.Lt{"created": olderThan}),
+ // was online but offline
+ builder.And(builder.Gt{"last_online": 0}, builder.Lt{"last_online": olderThan}),
+ )
+
+ if globalOnly {
+ cond = builder.And(cond, builder.Eq{"owner_id": 0}, builder.Eq{"repo_id": 0})
+ }
+
+ if err := db.Iterate(
+ ctx,
+ cond,
+ func(ctx context.Context, r *ActionRunner) error {
+ if err := DeleteRunner(ctx, r); err != nil {
+ return fmt.Errorf("DeleteOfflineRunners: %w", err)
+ }
+ lastOnline := r.LastOnline.AsTime()
+ olderThanTime := olderThan.AsTime()
+ if !lastOnline.IsZero() && lastOnline.Before(olderThanTime) {
+ log.Info(
+ "Deleted runner [ID: %d, Name: %s], last online %s ago",
+ r.ID, r.Name, olderThanTime.Sub(lastOnline).String(),
+ )
+ } else {
+ log.Info(
+ "Deleted runner [ID: %d, Name: %s], unused since %s ago",
+ r.ID, r.Name, olderThanTime.Sub(r.Created.AsTime()).String(),
+ )
+ }
+
+ return nil
+ },
+ ); err != nil {
+ return err
+ }
+
+ log.Info("Finished: DeleteOfflineRunners")
+
+ return nil
+}
diff --git a/models/actions/runner_test.go b/models/actions/runner_test.go
index 0623e66046..1916c35a76 100644
--- a/models/actions/runner_test.go
+++ b/models/actions/runner_test.go
@@ -6,10 +6,12 @@ import (
"encoding/binary"
"fmt"
"testing"
+ "time"
auth_model "forgejo.org/models/auth"
"forgejo.org/models/db"
"forgejo.org/models/unittest"
+ "forgejo.org/modules/timeutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
@@ -73,3 +75,68 @@ func TestDeleteRunner(t *testing.T) {
idAsBinary[6], idAsBinary[7])
assert.Equal(t, idAsHexadecimal, after.UUID[19:])
}
+
+func TestDeleteOfflineRunnersRunnerGlobalOnly(t *testing.T) {
+ baseTime := time.Date(2024, 5, 19, 7, 40, 32, 0, time.UTC)
+ timeutil.MockSet(baseTime)
+ defer timeutil.MockUnset()
+
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ olderThan := timeutil.TimeStampNow().Add(-timeutil.Hour)
+
+ require.NoError(t, DeleteOfflineRunners(db.DefaultContext, olderThan, true))
+
+ // create at test base time
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 12345678})
+ // last_online test base time
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000001})
+ // created one month ago but a repo
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000002})
+ // last online one hour ago
+ unittest.AssertNotExistsBean(t, &ActionRunner{ID: 10000003})
+ // last online 10 seconds ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000004})
+ // created 1 month ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000005})
+ // created 1 hour ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000006})
+ // last online 1 hour ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000007})
+}
+
+func TestDeleteOfflineRunnersAll(t *testing.T) {
+ baseTime := time.Date(2024, 5, 19, 7, 40, 32, 0, time.UTC)
+ timeutil.MockSet(baseTime)
+ defer timeutil.MockUnset()
+
+ require.NoError(t, unittest.PrepareTestDatabase())
+
+ olderThan := timeutil.TimeStampNow().Add(-timeutil.Hour)
+
+ require.NoError(t, DeleteOfflineRunners(db.DefaultContext, olderThan, false))
+
+ // create at test base time
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 12345678})
+ // last_online test base time
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000001})
+ // created one month ago
+ unittest.AssertNotExistsBean(t, &ActionRunner{ID: 10000002})
+ // last online one hour ago
+ unittest.AssertNotExistsBean(t, &ActionRunner{ID: 10000003})
+ // last online 10 seconds ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000004})
+ // created 1 month ago
+ unittest.AssertNotExistsBean(t, &ActionRunner{ID: 10000005})
+ // created 1 hour ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000006})
+ // last online 1 hour ago
+ unittest.AssertExistsAndLoadBean(t, &ActionRunner{ID: 10000007})
+}
+
+func TestDeleteOfflineRunnersErrorOnInvalidOlderThanValue(t *testing.T) {
+ baseTime := time.Date(2024, 5, 19, 7, 40, 32, 0, time.UTC)
+ timeutil.MockSet(baseTime)
+ defer timeutil.MockUnset()
+ require.Error(t, DeleteOfflineRunners(db.DefaultContext, timeutil.TimeStampNow(), false))
+}
diff --git a/models/actions/status.go b/models/actions/status.go
index f4357af731..e42c221121 100644
--- a/models/actions/status.go
+++ b/models/actions/status.go
@@ -34,6 +34,15 @@ var statusNames = map[Status]string{
StatusBlocked: "blocked",
}
+var nameToStatus = make(map[string]Status, len(statusNames))
+
+func init() {
+ // Populate name to status lookup map
+ for status, name := range statusNames {
+ nameToStatus[name] = status
+ }
+}
+
// String returns the string name of the Status
func (s Status) String() string {
return statusNames[s]
@@ -102,3 +111,8 @@ func (s Status) AsResult() runnerv1.Result {
}
return runnerv1.Result_RESULT_UNSPECIFIED
}
+
+func StatusFromString(name string) (Status, bool) {
+ status, exists := nameToStatus[name]
+ return status, exists
+}
diff --git a/models/activities/action.go b/models/activities/action.go
index f4be7d23e2..8592f81414 100644
--- a/models/activities/action.go
+++ b/models/activities/action.go
@@ -7,6 +7,7 @@ package activities
import (
"context"
+ "errors"
"fmt"
"net/url"
"path"
@@ -441,6 +442,12 @@ func (a *Action) GetIssueContent(ctx context.Context) string {
return a.Issue.Content
}
+func GetActivityByID(ctx context.Context, id int64) (*Action, error) {
+ var act Action
+ _, err := db.GetEngine(ctx).ID(id).Get(&act)
+ return &act, err
+}
+
// GetFeedsOptions options for retrieving feeds
type GetFeedsOptions struct {
db.ListOptions
@@ -458,7 +465,7 @@ type GetFeedsOptions struct {
// GetFeeds returns actions according to the provided options
func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, error) {
if opts.RequestedUser == nil && opts.RequestedTeam == nil && opts.RequestedRepo == nil {
- return nil, 0, fmt.Errorf("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
+ return nil, 0, errors.New("need at least one of these filters: RequestedUser, RequestedTeam, RequestedRepo")
}
cond, err := activityQueryCondition(ctx, opts)
@@ -466,11 +473,8 @@ func GetFeeds(ctx context.Context, opts GetFeedsOptions) (ActionList, int64, err
return nil, 0, err
}
- sess := db.GetEngine(ctx).Where(cond).
- Select("`action`.*"). // this line will avoid select other joined table's columns
- Join("INNER", "repository", "`repository`.id = `action`.repo_id")
-
opts.SetDefaultValues()
+ sess := db.GetEngine(ctx).Where(cond)
sess = db.SetSessionPagination(sess, &opts)
actions := make([]*Action, 0, opts.PageSize)
@@ -597,13 +601,14 @@ func DeleteOldActions(ctx context.Context, olderThan time.Duration) (err error)
}
// NotifyWatchers creates batch of actions for every watcher.
-func NotifyWatchers(ctx context.Context, actions ...*Action) error {
+func NotifyWatchers(ctx context.Context, actions ...*Action) ([]Action, error) {
var watchers []*repo_model.Watch
var repo *repo_model.Repository
var err error
var permCode []bool
var permIssue []bool
var permPR []bool
+ var out []Action
e := db.GetEngine(ctx)
@@ -614,14 +619,14 @@ func NotifyWatchers(ctx context.Context, actions ...*Action) error {
// Add feeds for user self and all watchers.
watchers, err = repo_model.GetWatchers(ctx, act.RepoID)
if err != nil {
- return fmt.Errorf("get watchers: %w", err)
+ return nil, fmt.Errorf("get watchers: %w", err)
}
// Be aware that optimizing this correctly into the `GetWatchers` SQL
// query is for most cases less performant than doing this.
blockedDoerUserIDs, err := user_model.ListBlockedByUsersID(ctx, act.ActUserID)
if err != nil {
- return fmt.Errorf("user_model.ListBlockedByUsersID: %w", err)
+ return nil, fmt.Errorf("user_model.ListBlockedByUsersID: %w", err)
}
if len(blockedDoerUserIDs) > 0 {
@@ -636,8 +641,9 @@ func NotifyWatchers(ctx context.Context, actions ...*Action) error {
// Add feed for actioner.
act.UserID = act.ActUserID
if _, err = e.Insert(act); err != nil {
- return fmt.Errorf("insert new actioner: %w", err)
+ return nil, fmt.Errorf("insert new actioner: %w", err)
}
+ out = append(out, *act)
if repoChanged {
act.loadRepo(ctx)
@@ -645,7 +651,7 @@ func NotifyWatchers(ctx context.Context, actions ...*Action) error {
// check repo owner exist.
if err := act.Repo.LoadOwner(ctx); err != nil {
- return fmt.Errorf("can't get repo owner: %w", err)
+ return nil, fmt.Errorf("can't get repo owner: %w", err)
}
} else if act.Repo == nil {
act.Repo = repo
@@ -656,7 +662,7 @@ func NotifyWatchers(ctx context.Context, actions ...*Action) error {
act.ID = 0
act.UserID = act.Repo.Owner.ID
if err = db.Insert(ctx, act); err != nil {
- return fmt.Errorf("insert new actioner: %w", err)
+ return nil, fmt.Errorf("insert new actioner: %w", err)
}
}
@@ -709,26 +715,29 @@ func NotifyWatchers(ctx context.Context, actions ...*Action) error {
}
if err = db.Insert(ctx, act); err != nil {
- return fmt.Errorf("insert new action: %w", err)
+ return nil, fmt.Errorf("insert new action: %w", err)
}
}
}
- return nil
+ return out, nil
}
// NotifyWatchersActions creates batch of actions for every watcher.
-func NotifyWatchersActions(ctx context.Context, acts []*Action) error {
+func NotifyWatchersActions(ctx context.Context, acts []*Action) ([]Action, error) {
ctx, committer, err := db.TxContext(ctx)
if err != nil {
- return err
+ return nil, err
}
defer committer.Close()
+ var out []Action
for _, act := range acts {
- if err := NotifyWatchers(ctx, act); err != nil {
- return err
+ as, err := NotifyWatchers(ctx, act)
+ if err != nil {
+ return nil, err
}
+ out = append(out, as...)
}
- return committer.Commit()
+ return out, committer.Commit()
}
// DeleteIssueActions delete all actions related with issueID
diff --git a/models/activities/action_test.go b/models/activities/action_test.go
index 8b9b2f6929..47dbd8ac2d 100644
--- a/models/activities/action_test.go
+++ b/models/activities/action_test.go
@@ -197,7 +197,8 @@ func TestNotifyWatchers(t *testing.T) {
RepoID: 1,
OpType: activities_model.ActionStarRepo,
}
- require.NoError(t, activities_model.NotifyWatchers(db.DefaultContext, action))
+ _, err := activities_model.NotifyWatchers(db.DefaultContext, action)
+ require.NoError(t, err)
// One watchers are inactive, thus action is only created for user 8, 1, 4, 11
unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
@@ -226,24 +227,6 @@ func TestNotifyWatchers(t *testing.T) {
})
}
-func TestGetFeedsCorrupted(t *testing.T) {
- require.NoError(t, unittest.PrepareTestDatabase())
- user := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1})
- unittest.AssertExistsAndLoadBean(t, &activities_model.Action{
- ID: 8,
- RepoID: 1700,
- })
-
- actions, count, err := activities_model.GetFeeds(db.DefaultContext, activities_model.GetFeedsOptions{
- RequestedUser: user,
- Actor: user,
- IncludePrivate: true,
- })
- require.NoError(t, err)
- assert.Empty(t, actions)
- assert.Equal(t, int64(0), count)
-}
-
func TestConsistencyUpdateAction(t *testing.T) {
if !setting.Database.Type.IsSQLite3() {
t.Skip("Test is only for SQLite database.")
diff --git a/models/activities/federated_user_activity.go b/models/activities/federated_user_activity.go
new file mode 100644
index 0000000000..1ff3a855d0
--- /dev/null
+++ b/models/activities/federated_user_activity.go
@@ -0,0 +1,106 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package activities
+
+import (
+ "context"
+ "fmt"
+
+ "forgejo.org/models/db"
+ user_model "forgejo.org/models/user"
+ "forgejo.org/modules/json"
+ "forgejo.org/modules/log"
+ "forgejo.org/modules/timeutil"
+ "forgejo.org/modules/validation"
+
+ ap "github.com/go-ap/activitypub"
+)
+
+type FederatedUserActivity struct {
+ ID int64 `xorm:"pk autoincr"`
+ UserID int64 `xorm:"NOT NULL"`
+ ActorID int64
+ ActorURI string
+ Actor *user_model.User `xorm:"-"` // transient
+ NoteContent string `xorm:"TEXT"`
+ NoteURL string `xorm:"VARCHAR(255)"`
+ OriginalNote string `xorm:"TEXT"`
+ Created timeutil.TimeStamp `xorm:"created"`
+}
+
+func init() {
+ db.RegisterModel(new(FederatedUserActivity))
+}
+
+func NewFederatedUserActivity(userID, actorID int64, actorURI, noteContent, noteURL string, originalNote ap.Activity) (FederatedUserActivity, error) {
+ jsonString, err := json.Marshal(originalNote)
+ if err != nil {
+ return FederatedUserActivity{}, err
+ }
+ result := FederatedUserActivity{
+ UserID: userID,
+ ActorID: actorID,
+ ActorURI: actorURI,
+ NoteContent: noteContent,
+ NoteURL: noteURL,
+ OriginalNote: string(jsonString),
+ }
+ if valid, err := validation.IsValid(result); !valid {
+ return FederatedUserActivity{}, err
+ }
+ return result, nil
+}
+
+func (federatedUserActivity FederatedUserActivity) Validate() []string {
+ var result []string
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.UserID, "UserID")...)
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.ActorID, "ActorID")...)
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.ActorURI, "ActorURI")...)
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.NoteContent, "NoteContent")...)
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.NoteURL, "NoteURL")...)
+ result = append(result, validation.ValidateNotEmpty(federatedUserActivity.OriginalNote, "OriginalNote")...)
+ return result
+}
+
+func CreateUserActivity(ctx context.Context, federatedUserActivity *FederatedUserActivity) error {
+ if valid, err := validation.IsValid(federatedUserActivity); !valid {
+ return err
+ }
+ _, err := db.GetEngine(ctx).Insert(federatedUserActivity)
+ return err
+}
+
+type GetFollowingFeedsOptions struct {
+ db.ListOptions
+}
+
+func GetFollowingFeeds(ctx context.Context, actorID int64, opts GetFollowingFeedsOptions) ([]*FederatedUserActivity, int64, error) {
+ log.Debug("user_id = %s", actorID)
+ sess := db.GetEngine(ctx).Where("user_id = ?", actorID)
+ opts.SetDefaultValues()
+ sess = db.SetSessionPagination(sess, &opts)
+
+ actions := make([]*FederatedUserActivity, 0, opts.PageSize)
+ count, err := sess.FindAndCount(&actions)
+ if err != nil {
+ return nil, 0, fmt.Errorf("FindAndCount: %w", err)
+ }
+ for _, act := range actions {
+ if err := act.loadActor(ctx); err != nil {
+ return nil, 0, err
+ }
+ }
+ return actions, count, err
+}
+
+func (federatedUserActivity *FederatedUserActivity) loadActor(ctx context.Context) error {
+ log.Debug("for activity %s", federatedUserActivity)
+ actorUser, _, err := user_model.GetFederatedUserByUserID(ctx, federatedUserActivity.ActorID)
+ if err != nil {
+ return err
+ }
+ federatedUserActivity.Actor = actorUser
+
+ return nil
+}
diff --git a/models/activities/federated_user_activity_test.go b/models/activities/federated_user_activity_test.go
new file mode 100644
index 0000000000..9bf4f77984
--- /dev/null
+++ b/models/activities/federated_user_activity_test.go
@@ -0,0 +1,24 @@
+// Copyright 2024 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package activities
+
+import (
+ "testing"
+
+ "forgejo.org/modules/validation"
+)
+
+func Test_FederatedUserActivityValidation(t *testing.T) {
+ sut := FederatedUserActivity{}
+ sut.UserID = 13
+ sut.ActorID = 33
+ sut.ActorURI = "33"
+ sut.NoteContent = "Any content!"
+ sut.NoteURL = "https://example.org/note/17"
+ sut.OriginalNote = "federatedUserActivityNote-17"
+
+ if res, _ := validation.IsValid(sut); !res {
+ t.Errorf("sut expected to be valid: %v\n", sut.Validate())
+ }
+}
diff --git a/models/activities/user_heatmap.go b/models/activities/user_heatmap.go
index 0cc3f759c6..11badb77e2 100644
--- a/models/activities/user_heatmap.go
+++ b/models/activities/user_heatmap.go
@@ -13,6 +13,12 @@ import (
"forgejo.org/modules/timeutil"
)
+const (
+ // contributionsMaxAgeSeconds How old data to retrieve for the heatmap.
+ // 371 days to cover the entire heatmap (53 *full* weeks)
+ contributionsMaxAgeSeconds = 32054400
+)
+
// UserHeatmapData represents the data needed to create a heatmap
type UserHeatmapData struct {
Timestamp timeutil.TimeStamp `json:"timestamp"`
@@ -62,7 +68,7 @@ func getUserHeatmapData(ctx context.Context, user *user_model.User, team *organi
Select(groupBy+" AS timestamp, count(user_id) as contributions").
Table("action").
Where(cond).
- And("created_unix > ?", timeutil.TimeStampNow()-31536000).
+ And("created_unix >= ?", timeutil.TimeStampNow()-contributionsMaxAgeSeconds).
GroupBy("timestamp").
OrderBy("timestamp").
Find(&hdata)
diff --git a/models/activities/user_heatmap_test.go b/models/activities/user_heatmap_test.go
index d922f9a78b..34308cb3d4 100644
--- a/models/activities/user_heatmap_test.go
+++ b/models/activities/user_heatmap_test.go
@@ -54,6 +54,10 @@ func TestGetUserHeatmapDataByUser(t *testing.T) {
"multiple actions performed with two grouped together",
10, 10, 3, `[{"timestamp":1603009800,"contributions":1},{"timestamp":1603010700,"contributions":2}]`,
},
+ {
+ "test cutoff within",
+ 40, 40, 1, `[{"timestamp":1577404800,"contributions":1}]`,
+ },
}
// Prepare
require.NoError(t, unittest.PrepareTestDatabase())
diff --git a/models/asymkey/gpg_key.go b/models/asymkey/gpg_key.go
index b7e10ce85c..64866da076 100644
--- a/models/asymkey/gpg_key.go
+++ b/models/asymkey/gpg_key.go
@@ -5,6 +5,7 @@ package asymkey
import (
"context"
+ "errors"
"fmt"
"strings"
"time"
@@ -209,7 +210,7 @@ func parseGPGKey(ctx context.Context, ownerID int64, e *openpgp.Entity, verified
// deleteGPGKey does the actual key deletion
func deleteGPGKey(ctx context.Context, keyID string) (int64, error) {
if keyID == "" {
- return 0, fmt.Errorf("empty KeyId forbidden") // Should never happen but just to be sure
+ return 0, errors.New("empty KeyId forbidden") // Should never happen but just to be sure
}
// Delete imported key
n, err := db.GetEngine(ctx).Where("key_id=?", keyID).Delete(new(GPGKeyImport))
diff --git a/models/asymkey/gpg_key_common.go b/models/asymkey/gpg_key_common.go
index db1912c316..5b8a22fe63 100644
--- a/models/asymkey/gpg_key_common.go
+++ b/models/asymkey/gpg_key_common.go
@@ -7,6 +7,7 @@ import (
"bytes"
"crypto"
"encoding/base64"
+ "errors"
"fmt"
"hash"
"io"
@@ -75,7 +76,7 @@ func base64DecPubKey(content string) (*packet.PublicKey, error) {
// Check type
pkey, ok := p.(*packet.PublicKey)
if !ok {
- return nil, fmt.Errorf("key is not a public key")
+ return nil, errors.New("key is not a public key")
}
return pkey, nil
}
@@ -122,15 +123,15 @@ func readArmoredSign(r io.Reader) (body io.Reader, err error) {
func extractSignature(s string) (*packet.Signature, error) {
r, err := readArmoredSign(strings.NewReader(s))
if err != nil {
- return nil, fmt.Errorf("Failed to read signature armor")
+ return nil, errors.New("Failed to read signature armor")
}
p, err := packet.Read(r)
if err != nil {
- return nil, fmt.Errorf("Failed to read signature packet")
+ return nil, errors.New("Failed to read signature packet")
}
sig, ok := p.(*packet.Signature)
if !ok {
- return nil, fmt.Errorf("Packet is not a signature")
+ return nil, errors.New("Packet is not a signature")
}
return sig, nil
}
diff --git a/models/asymkey/gpg_key_object_verification.go b/models/asymkey/gpg_key_object_verification.go
index ccd31a38b1..745ed04869 100644
--- a/models/asymkey/gpg_key_object_verification.go
+++ b/models/asymkey/gpg_key_object_verification.go
@@ -6,6 +6,7 @@ package asymkey
import (
"context"
+ "errors"
"fmt"
"hash"
"strings"
@@ -316,7 +317,7 @@ func verifyWithGPGSettings(ctx context.Context, gpgSettings *git.GPGSettings, si
func verifySign(s *packet.Signature, h hash.Hash, k *GPGKey) error {
// Check if key can sign
if !k.CanSign {
- return fmt.Errorf("key can not sign")
+ return errors.New("key can not sign")
}
// Decode key
pkey, err := base64DecPubKey(k.Content)
diff --git a/models/asymkey/ssh_key_parse.go b/models/asymkey/ssh_key_parse.go
index 305e464b4b..8177db6439 100644
--- a/models/asymkey/ssh_key_parse.go
+++ b/models/asymkey/ssh_key_parse.go
@@ -10,6 +10,7 @@ import (
"encoding/base64"
"encoding/binary"
"encoding/pem"
+ "errors"
"fmt"
"math/big"
"os"
@@ -93,7 +94,7 @@ func parseKeyString(content string) (string, error) {
block, _ := pem.Decode([]byte(content))
if block == nil {
- return "", fmt.Errorf("failed to parse PEM block containing the public key")
+ return "", errors.New("failed to parse PEM block containing the public key")
}
if strings.Contains(block.Type, "PRIVATE") {
return "", ErrKeyIsPrivate
@@ -226,7 +227,7 @@ func SSHNativeParsePublicKey(keyLine string) (string, int, error) {
// The ssh library can parse the key, so next we find out what key exactly we have.
switch pkeyType {
- case ssh.KeyAlgoDSA:
+ case ssh.KeyAlgoDSA: //nolint:staticcheck
rawPub := struct {
Name string
P, Q, G, Y *big.Int
diff --git a/models/db/log.go b/models/db/log.go
index b94af8e39c..387709cc50 100644
--- a/models/db/log.go
+++ b/models/db/log.go
@@ -69,6 +69,9 @@ func (l *XORMLogBridge) Warn(v ...any) {
// Warnf show warning log
func (l *XORMLogBridge) Warnf(format string, v ...any) {
+ if format == "Table %s Column %s db default is %s, struct default is %s" || format == "Table %s Column %s db nullable is %v, struct nullable is %v" {
+ return
+ }
l.Log(stackLevel, log.WARN, format, v...)
}
diff --git a/models/error.go b/models/error.go
index e8962f386b..ebaa8a135d 100644
--- a/models/error.go
+++ b/models/error.go
@@ -414,7 +414,7 @@ func IsErrSHAOrCommitIDNotProvided(err error) bool {
}
func (err ErrSHAOrCommitIDNotProvided) Error() string {
- return "a SHA or commit ID must be proved when updating a file"
+ return "a SHA or commit ID must be provided when updating a file"
}
// ErrInvalidMergeStyle represents an error if merging with disabled merge strategy
diff --git a/models/fixtures/TestGetUsedForUser/action_artifact.yaml b/models/fixtures/TestGetUsedForUser/action_artifact.yaml
new file mode 100644
index 0000000000..db5392126d
--- /dev/null
+++ b/models/fixtures/TestGetUsedForUser/action_artifact.yaml
@@ -0,0 +1,17 @@
+-
+ id: 1001
+ run_id: 792
+ runner_id: 1
+ repo_id: 4
+ owner_id: 1
+ commit_sha: c2d72f548424103f01ee1dc02889c1e2bff816b0
+ storage_path: "27/5/1730330775594233150.chunk"
+ file_size: 693147180559
+ file_compressed_size: 693147180559
+ content_encoding: "application/zip"
+ artifact_path: "big-file.zip"
+ artifact_name: "big-file"
+ status: 4
+ created_unix: 1730330775
+ updated_unix: 1730330775
+ expired_unix: 1738106775
diff --git a/models/fixtures/action.yml b/models/fixtures/action.yml
index b2febb4ed8..a97e94fbf4 100644
--- a/models/fixtures/action.yml
+++ b/models/fixtures/action.yml
@@ -59,14 +59,6 @@
created_unix: 1603011540 # grouped with id:7
- id: 8
- user_id: 1
- op_type: 12 # close issue
- act_user_id: 1
- repo_id: 1700 # dangling intentional
- is_private: false
- created_unix: 1603011541
-
-- id: 9
user_id: 34
op_type: 12 # close issue
act_user_id: 34
@@ -74,3 +66,11 @@
is_private: false
created_unix: 1680454039
content: '4|' # issueId 5
+
+- id: 10
+ user_id: 40
+ op_type: 1 # create repo
+ act_user_id: 40
+ repo_id: 60 # public
+ is_private: false
+ created_unix: 1577404800 # end of heatmap
\ No newline at end of file
diff --git a/models/fixtures/action_run.yml b/models/fixtures/action_run.yml
index 7a7bf34197..5b6f89ae0e 100644
--- a/models/fixtures/action_run.yml
+++ b/models/fixtures/action_run.yml
@@ -471,3 +471,64 @@
need_approval: 0
approved_by: 0
event_payload: '{"head_commit":{"id":"5f22f7d0d95d614d25a5b68592adb345a4b5c7fd"}}'
+
+
+# GET action run(s) test
+-
+ id: 892
+ title: "successful push run"
+ repo_id: 63
+ owner_id: 2
+ workflow_id: "success.yaml"
+ index: 1
+ trigger_user_id: 2
+ ref: "refs/heads/main"
+ commit_sha: "97f29ee599c373c729132a5c46a046978311e0ee"
+ event: "push"
+ is_fork_pull_request: 0
+ status: 1 # success
+ started: 1683636528
+ stopped: 1683636626
+ created: 1683636108
+ updated: 1683636626
+ need_approval: 0
+ approved_by: 0
+
+-
+ id: 893
+ title: "failed pull_request run"
+ repo_id: 63
+ owner_id: 2
+ workflow_id: "failed.yaml"
+ index: 2
+ trigger_user_id: 2
+ ref: "refs/heads/bugfix-1"
+ commit_sha: "35c5cddfc19397501ec8f4f7bb808a7c8f04445f"
+ event: "pull_request"
+ is_fork_pull_request: 0
+ status: 2 # failure
+ started: 1683636528
+ stopped: 1683636626
+ created: 1683636108
+ updated: 1683636626
+ need_approval: 0
+ approved_by: 0
+
+-
+ id: 894
+ title: "running workflow_dispatch run"
+ repo_id: 63
+ owner_id: 2
+ workflow_id: "running.yaml"
+ index: 3
+ trigger_user_id: 2
+ ref: "refs/heads/main"
+ commit_sha: "97f29ee599c373c729132a5c46a046978311e0ee"
+ event: "workflow_dispatch"
+ is_fork_pull_request: 0
+ status: 6 # running
+ started: 1683636528
+ created: 1683636108
+ updated: 1683636626
+ need_approval: 0
+ approved_by: 0
diff --git a/models/fixtures/action_runner.yml b/models/fixtures/action_runner.yml
index 94deac998e..fcf26d49b6 100644
--- a/models/fixtures/action_runner.yml
+++ b/models/fixtures/action_runner.yml
@@ -18,3 +18,122 @@
created: 1716104432
updated: 1716104432
deleted: ~
+- id: 10000001
+ uuid: 10d3b248-6460-4bf5-b819-1f5b3109e10f
+ name: global-online
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 0
+ repo_id: 0
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: 7e9ed71f64e98ce1f70e94c63f3cb6c41a8cb0b90de3e1daf7ec5c35361d60ed44da67c5ac393b7aaf443dcfc766007dc828
+ token_salt: WUcgZWl7mW
+ last_online: 1716104422
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1716104431
+ updated: 1716104422
+ deleted: ~
+- id: 10000002
+ uuid: 1d188484-dd97-4a70-b707-5e87b578ab6b
+ name: repo-never-used
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 0
+ repo_id: 1
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: 51e88c17ac8b54dd101dc2e4f530a71643c703adba7170f4b1a28f1cb483b4cfb107798c521e0532ef3c6480b64518a5c6a5
+ token_salt: 4rh8ncXYIO
+ last_online: 0
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1713512432
+ updated: 1713512432
+ deleted: ~
+- id: 10000003
+ uuid: 7a039c6b-b0b2-4cf5-a93d-715d617f99e2
+ name: global-offline
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 0
+ repo_id: 0
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: c76960c56bc6069f0d1648991ec626500abe8c15286f5c355d565c3b5ba945d7d6f1272a6c77849e592528179511b94f5d69
+ token_salt: TFMe2jhOkB
+ last_online: 1715499632
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1715499632
+ updated: 1715499632
+ deleted: ~
+- id: 10000004
+ uuid: 93ca7fdd-faca-4df6-a474-8345263ef10b
+ name: user-online
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 1
+ repo_id: 0
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: 6ddf7f0f2301d2b3f66418145dc497a6d09fa6586e659afcb5ae2a0c5b639561d795aff8062537db9df73b396842ea826134
+ token_salt: QcdGuReAp4
+ last_online: 1716104422
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1716104431
+ updated: 1716104422
+ deleted: ~
+- id: 10000005
+ uuid: a8534df6-c4be-40f4-9714-903b69d973d9
+ name: user-never-used
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 1
+ repo_id: 0
+ description: desc
+ base: 0
+ repo_range: ""
+ token_hash: 4441de7defcfc3d21baa608dec66a562cf23307abddaabdbb836907ac5f48c8780c354891916c525b79ec7af8e95be7a09b4
+ token_salt: ONNqIOnj3t
+ last_online: 0
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1713512433
+ updated: 1713512433
+ deleted: ~
+- id: 10000006
+ uuid: e1c5bb6c-de68-4335-8955-5192f76708ac
+ name: orga-fresh-created
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 35
+ repo_id: 0
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: a61f9ee48c6847d243ace0a8936efe80af9277c7bc46d6da6e03d1d406608b8023ee66600ad24f0effaa8e3338f92ac97ac9
+ token_salt: fZJKjrFGWA
+ last_online: 0
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1716100832
+ updated: 1716100832
+ deleted: ~
+- id: 10000007
+ uuid: ff755f06-948e-479b-8031-5b3e9f123e32
+ name: orga-offline
+ version: v6.3.1+7-gc4c0ca0
+ owner_id: 35
+ repo_id: 0
+ description: ""
+ base: 0
+ repo_range: ""
+ token_hash: 9372efb38f9b64efe65065380abe2f24ef34a59d9619f4cdc08f1151e9849f0b6e722aa10538e8730288de6e2f09acdac695
+ token_salt: TnU7iiIdCb
+ last_online: 1716100832
+ last_active: 0
+ agent_labels: '["docker"]'
+ created: 1736085520
+ updated: 1716100832
+ deleted: ~
diff --git a/models/fixtures/comment.yml b/models/fixtures/comment.yml
index f4121284a6..34407d6f81 100644
--- a/models/fixtures/comment.yml
+++ b/models/fixtures/comment.yml
@@ -113,3 +113,344 @@
review_id: 22
assignee_id: 5
created_unix: 946684817
+
+-
+ id: 13
+ type: 29 # push
+ poster_id: 2
+ issue_id: 19 # in repo_id 58
+ content: '{"is_force_push":false,"commit_ids":["4ca8bcaf27e28504df7bf996819665986b01c847","96cef4a7b72b3c208340ae6f0cf55a93e9077c93","c5626fc9eff57eb1bb7b796b01d4d0f2f3f792a2"]}'
+ created_unix: 1688672373
+
+-
+ id: 14
+ type: 29 # push
+ poster_id: 2
+ issue_id: 19 # in repo_id 58
+ content: '{"is_force_push":false,"commit_ids":["23576dd018294e476c06e569b6b0f170d0558705"]}'
+ created_unix: 1688672374
+
+-
+ id: 15
+ type: 29 # push
+ poster_id: 2
+ issue_id: 19 # in repo_id 58
+ content: '{"is_force_push":false,"commit_ids":["3e64625bd6eb5bcba69ac97de6c8f507402df861", "c704db5794097441aa2d9dd834d5b7e2f8f08108"]}'
+ created_unix: 1688672375
+
+-
+ id: 16
+ type: 29 # push
+ poster_id: 2
+ issue_id: 19 # in repo_id 58
+ content: '{"is_force_push":false,"commit_ids":["811d46c7e518f4f180afb862c0db5cb8c80529ce", "747ddb3506a4fa04a7747808eb56ae16f9e933dc", "837d5c8125633d7d258f93b998e867eab0145520", "1978192d98bb1b65e11c2cf37da854fbf94bffd6"]}'
+ created_unix: 1688672376
+
+-
+ id: 17
+ type: 29 # push
+ poster_id: 2
+ issue_id: 19 # in repo_id 58
+ content: '{"is_force_push":true,"commit_ids":["1978192d98bb1b65e11c2cf37da854fbf94bffd6", "9b93963cf6de4dc33f915bb67f192d099c301f43"]}'
+ created_unix: 1749734240
+
+-
+ id: 2000
+ type: 8 # milestone
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ milestone_id: 1
+ old_milestone_id: 0
+ created_unix: 946684820
+
+-
+ id: 2001
+ type: 8 # milestone
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ milestone_id: 2
+ old_milestone_id: 1
+ created_unix: 946684920
+
+-
+ id: 2002
+ type: 8 # milestone
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ milestone_id: 0
+ old_milestone_id: 2
+ created_unix: 946685020
+
+-
+ id: 2003
+ type: 8 # milestone
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ milestone_id: 10 # not exsting milestone
+ old_milestone_id: 0
+ created_unix: 946685080
+
+-
+ id: 2010
+ type: 30 # project
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ project_id: 1
+ old_project_id: 0
+ created_unix: 946685120
+
+-
+ id: 2011
+ type: 30 # project
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ project_id: 2
+ old_project_id: 1
+ created_unix: 946685220
+
+-
+ id: 2012
+ type: 30 # project
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ project_id: 0
+ old_project_id: 2
+ created_unix: 946685320
+
+-
+ id: 2013
+ type: 30 # project
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ project_id: 10 # not existing project
+ old_project_id: 0
+ created_unix: 946685420
+
+-
+ id: 2020
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ label_id: 1
+ content: 1 # add label
+ created_unix: 946685520
+
+-
+ id: 2021
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1
+ label_id: 2
+ content: 1 # add label
+ created_unix: 946685620
+
+-
+ id: 2022
+ type: 7 # label
+ poster_id: 2
+ issue_id: 1 # in repo_id 1
+ label_id: 1
+ content: 0 # remove label
+ created_unix: 946685720
+
+-
+ id: 2023
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ label_id: 1
+ content: 1 # add label
+ created_unix: 946685720
+
+-
+ id: 2024
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ label_id: 2
+ content: 0 # remove label
+ created_unix: 946685720
+
+-
+ id: 2025
+ type: 7 # label
+ poster_id: 2
+ issue_id: 1 # in repo_id 1
+ label_id: 2
+ content: 1 # add label
+ created_unix: 946685820
+
+-
+ id: 2026
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ label_id: 1
+ content: 0 # remove label
+ created_unix: 946685920
+
+-
+ id: 2027
+ type: 7 # label
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ label_id: 2
+ content: 0 # remove label
+ created_unix: 946685920
+
+- id: 2040
+ type: 9 # assignee
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ assignee_id: 1 # self
+ removed_assignee: false # add assignee
+ created_unix: 946688020
+
+- id: 2041
+ type: 9 # assignee
+ poster_id: 2
+ issue_id: 1 # in repo_id 1
+ assignee_id: 1
+ removed_assignee: true # remove assignee
+ created_unix: 946688120
+
+- id: 2042
+ type: 9 # assignee
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ assignee_id: 2
+ removed_assignee: false # add assignee
+ created_unix: 946688220
+
+- id: 2043
+ type: 9 # assignee
+ poster_id: 2
+ issue_id: 1 # in repo_id 1
+ assignee_id: 2 # self
+ removed_assignee: true # remove assignee
+ created_unix: 946688320
+
+- id: 2050
+ type: 23 # lock
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946688420
+
+- id: 2051
+ type: 24 # unlock
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946688520
+
+- id: 2052
+ type: 23 # lock
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ content: "Too heated"
+ created_unix: 946688620
+
+- id: 2053
+ type: 24 # unlock
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946688720
+
+- id: 2060
+ type: 36 # pin
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946688820
+
+- id: 2061
+ type: 37 # unpin
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946688920
+
+- id: 2070
+ type: 2 # close
+ poster_id: 1
+ issue_id: 1 # in repo_id 1
+ created_unix: 946689020
+
+- id: 2071
+ type: 1 # reopen
+ poster_id: 2
+ issue_id: 1 # in repo_id 1
+ created_unix: 946689220
+
+- id: 2072
+ type: 2 # close
+ poster_id: 1
+ issue_id: 2 # pull in repo_id 1
+ created_unix: 946689320
+
+- id: 2073
+ type: 1 # reopen
+ poster_id: 2
+ issue_id: 2 # pull in repo_id 1
+ created_unix: 946689420
+
+- id: 2080
+ type: 3 # issue reference
+ poster_id: 1
+ issue_id: 1 # issue in repo_id 1
+ ref_repo_id: 1
+ ref_issue_id: 5 # issue in repo_id 1
+ created_unix: 946689500
+
+- id: 2081
+ type: 3 # issue reference
+ poster_id: 1
+ issue_id: 1 # issue in repo_id 1
+ ref_repo_id: 1
+ ref_issue_id: 2 # pull in repo_id 1
+ created_unix: 946689600
+
+- id: 2082
+ type: 3 # issue reference
+ poster_id: 1
+ issue_id: 1 # issue in repo_id 1
+ ref_repo_id: 32
+ ref_issue_id: 16 # issue in repo_id 32
+ created_unix: 946689700
+
+- id: 2083
+ type: 3 # issue reference
+ poster_id: 1
+ issue_id: 1 # issue in repo_id 1
+ ref_repo_id: 10
+ ref_issue_id: 8 # pull in repo_id 10
+ created_unix: 946689800
+
+- id: 2090
+ type: 6 # pull reference
+ poster_id: 1
+ issue_id: 2 # pull in repo_id 1
+ ref_repo_id: 1
+ ref_issue_id: 1 # issue in repo_id 1
+ created_unix: 946689900
+
+- id: 2091
+ type: 6 # pull reference
+ poster_id: 1
+ issue_id: 2 # pull in repo_id 1
+ ref_repo_id: 1
+ ref_issue_id: 2 # pull in repo_id 1
+ created_unix: 946690000
+
+- id: 2092
+ type: 6 # pull reference
+ poster_id: 1
+ issue_id: 2 # pull in repo_id 1
+ ref_repo_id: 32
+ ref_issue_id: 16 # issue in repo_id 32
+ created_unix: 946690050
+
+- id: 2093
+ type: 6 # pull reference
+ poster_id: 1
+ issue_id: 2 # pull in repo_id 1
+ ref_repo_id: 10
+ ref_issue_id: 8 # pull in repo_id 10
+ created_unix: 946690100
diff --git a/models/fixtures/follow.yml b/models/fixtures/follow.yml
index b8d35828bf..da3d4a60c1 100644
--- a/models/fixtures/follow.yml
+++ b/models/fixtures/follow.yml
@@ -17,3 +17,13 @@
id: 4
user_id: 31
follow_id: 33
+
+-
+ id: 5
+ user_id: 4
+ follow_id: 8
+
+-
+ id: 6
+ user_id: 5
+ follow_id: 8
diff --git a/models/fixtures/hook_task.yml b/models/fixtures/hook_task.yml
index fc0e03bca1..c62d451868 100644
--- a/models/fixtures/hook_task.yml
+++ b/models/fixtures/hook_task.yml
@@ -18,7 +18,7 @@
id: 2
hook_id: 1
uuid: uuid2
- is_delivered: false
+ is_delivered: true
-
id: 3
@@ -40,4 +40,4 @@
id: 4
hook_id: 3
uuid: uuid4
- is_delivered: false
+ is_delivered: true
diff --git a/models/fixtures/pull_auto_merge.yml b/models/fixtures/pull_auto_merge.yml
new file mode 100644
index 0000000000..ca780a73aa
--- /dev/null
+++ b/models/fixtures/pull_auto_merge.yml
@@ -0,0 +1 @@
+[] # empty
diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml
index cd49a51796..773f238645 100644
--- a/models/fixtures/repo_unit.yml
+++ b/models/fixtures/repo_unit.yml
@@ -795,3 +795,10 @@
type: 10
config: "{}"
created_unix: 946684810
+
+-
+ id: 115
+ repo_id: 63
+ type: 10
+ config: "{}"
+ created_unix: 946684810
diff --git a/models/fixtures/repository.yml b/models/fixtures/repository.yml
index 0ba4d06e14..2f104eed65 100644
--- a/models/fixtures/repository.yml
+++ b/models/fixtures/repository.yml
@@ -31,6 +31,8 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1731254961
updated_unix: 1731254961
+ topics: '[]'
+
-
id: 2
owner_id: 2
@@ -61,7 +63,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: true
-
+ topics: '[]'
-
id: 3
owner_id: 3
@@ -94,6 +96,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1700000001
updated_unix: 1700000001
+ topics: '[]'
-
id: 4
@@ -125,6 +128,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 5
@@ -158,6 +162,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1700000002
updated_unix: 1700000002
+ topics: '[]'
-
id: 6
@@ -190,6 +195,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1710000001
updated_unix: 1710000001
+ topics: '[]'
-
id: 7
@@ -222,6 +228,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1710000003
updated_unix: 1710000003
+ topics: '[]'
-
id: 8
@@ -254,6 +261,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1710000002
updated_unix: 1710000002
+ topics: '[]'
-
id: 9
@@ -284,6 +292,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 10
@@ -315,6 +324,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 11
@@ -346,6 +356,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 12
@@ -376,6 +387,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 13
@@ -406,6 +418,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 14
@@ -437,6 +450,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 15
@@ -468,6 +482,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 16
@@ -499,6 +514,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 17
@@ -529,6 +545,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 18
@@ -559,6 +576,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 19
@@ -589,6 +607,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 20
@@ -619,6 +638,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 21
@@ -649,6 +669,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 22
@@ -679,6 +700,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 23
@@ -709,6 +731,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 24
@@ -739,6 +762,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 25
@@ -769,6 +793,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 26
@@ -799,6 +824,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 27
@@ -829,6 +855,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 28
@@ -859,6 +886,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 29
@@ -889,6 +917,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 30
@@ -919,6 +948,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 31
@@ -950,6 +980,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 32 # org public repo
@@ -982,6 +1013,7 @@
close_issues_via_commit_in_any_branch: false
created_unix: 1700000003
updated_unix: 1700000003
+ topics: '[]'
-
id: 33
@@ -1013,6 +1045,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 34
@@ -1043,6 +1076,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 35
@@ -1073,6 +1107,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 36
@@ -1104,6 +1139,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 37
@@ -1135,6 +1171,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 38
@@ -1166,6 +1203,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 39
@@ -1197,6 +1235,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 40
@@ -1228,6 +1267,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 41
@@ -1259,6 +1299,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 42
@@ -1290,6 +1331,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 43
@@ -1320,6 +1362,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 44
@@ -1351,6 +1394,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 45
@@ -1381,6 +1425,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 46
@@ -1412,6 +1457,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 47
@@ -1443,6 +1489,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 48
@@ -1474,6 +1521,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 49
@@ -1506,6 +1554,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 50
@@ -1537,6 +1586,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 51
@@ -1568,6 +1618,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 52
@@ -1599,6 +1650,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 53
@@ -1627,6 +1679,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 54
@@ -1639,6 +1692,7 @@
is_archived: false
is_private: true
status: 0
+ topics: '[]'
-
id: 55
@@ -1651,6 +1705,7 @@
is_private: true
num_issues: 1
status: 0
+ topics: '[]'
-
id: 56
@@ -1664,6 +1719,7 @@
is_private: true
status: 0
num_issues: 0
+ topics: '[]'
-
id: 57
@@ -1677,6 +1733,7 @@
is_private: false
status: 0
num_issues: 0
+ topics: '[]'
-
id: 58 # org public repo
@@ -1708,6 +1765,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 1059
@@ -1721,6 +1779,7 @@
is_private: false
status: 0
num_issues: 0
+ topics: '[]'
-
id: 59
@@ -1734,6 +1793,7 @@
is_private: true
status: 0
num_issues: 0
+ topics: '[]'
-
id: 60
@@ -1765,6 +1825,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
-
id: 61
@@ -1796,6 +1857,7 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
- id: 62
owner_id: 2
@@ -1826,3 +1888,36 @@
size: 0
is_fsck_enabled: true
close_issues_via_commit_in_any_branch: false
+ topics: '[]'
+
+-
+ id: 63
+ owner_id: 2
+ owner_name: user2
+ lower_name: test_action_run_search
+ name: test_action_run_search
+ default_branch: main
+ num_watches: 0
+ num_stars: 0
+ num_forks: 0
+ num_issues: 0
+ num_closed_issues: 0
+ num_pulls: 0
+ num_closed_pulls: 0
+ num_milestones: 0
+ num_closed_milestones: 0
+ num_projects: 0
+ num_closed_projects: 0
+ is_private: true
+ is_empty: false
+ is_archived: false
+ is_mirror: false
+ status: 0
+ is_fork: false
+ fork_id: 0
+ is_template: false
+ template_id: 0
+ size: 0
+ is_fsck_enabled: true
+ close_issues_via_commit_in_any_branch: false
+ topics: '[]'
diff --git a/models/fixtures/team.yml b/models/fixtures/team.yml
index 149fe90888..a863f1203a 100644
--- a/models/fixtures/team.yml
+++ b/models/fixtures/team.yml
@@ -239,3 +239,15 @@
num_members: 2
includes_all_repositories: false
can_create_org_repo: false
+
+-
+ id: 25
+ org_id: 17
+ lower_name: super-user
+ name: super-user
+ description: ""
+ authorize: 3
+ num_repos: 0
+ num_members: 0
+ includes_all_repositories: 0
+ can_create_org_repo: 0
diff --git a/models/fixtures/team_unit.yml b/models/fixtures/team_unit.yml
index e8f8d0e422..4d282a7eb5 100644
--- a/models/fixtures/team_unit.yml
+++ b/models/fixtures/team_unit.yml
@@ -329,3 +329,10 @@
team_id: 22
type: 3
access_mode: 1
+
+-
+ id: 84
+ org_id: 17
+ team_id: 25
+ type: 3
+ access_mode: 3
diff --git a/models/fixtures/user.yml b/models/fixtures/user.yml
index 630505b8b4..00aa182540 100644
--- a/models/fixtures/user.yml
+++ b/models/fixtures/user.yml
@@ -53,6 +53,7 @@
login_source: 0
login_name: user2
type: 0
+ website: https://keyoxide.org/eb114f5e6c0dc2bcdd183550a4b61a2dc5923710
salt: ZogKvWdyEx
max_repo_creation: -1
is_active: true
@@ -69,7 +70,7 @@
num_followers: 2
num_following: 1
num_stars: 2
- num_repos: 17
+ num_repos: 18
num_teams: 0
num_members: 0
visibility: 0
@@ -93,7 +94,7 @@
login_name: org3
type: 1
salt: ZogKvWdyEx
- max_repo_creation: -1
+ max_repo_creation: 1000
is_active: false
is_admin: false
is_restricted: false
@@ -143,7 +144,7 @@
avatar_email: user4@example.com
use_custom_avatar: true
num_followers: 0
- num_following: 1
+ num_following: 2
num_stars: 0
num_repos: 0
num_teams: 0
@@ -181,7 +182,7 @@
avatar_email: user5@example.com
use_custom_avatar: true
num_followers: 0
- num_following: 0
+ num_following: 1
num_stars: 0
num_repos: 1
num_teams: 0
@@ -294,7 +295,7 @@
avatar: ""
avatar_email: user8@example.com
use_custom_avatar: true
- num_followers: 1
+ num_followers: 3
num_following: 1
num_stars: 0
num_repos: 0
@@ -641,7 +642,7 @@
num_following: 0
num_stars: 0
num_repos: 2
- num_teams: 3
+ num_teams: 4
num_members: 4
visibility: 0
repo_admin_change_team_access: false
diff --git a/models/forgefed/federationhost.go b/models/forgefed/federationhost.go
index 29f1b7d28e..978847bd95 100644
--- a/models/forgefed/federationhost.go
+++ b/models/forgefed/federationhost.go
@@ -6,6 +6,7 @@ package forgefed
import (
"database/sql"
"fmt"
+ "net/url"
"strings"
"time"
@@ -17,9 +18,9 @@ import (
// swagger:model
type FederationHost struct {
ID int64 `xorm:"pk autoincr"`
- HostFqdn string `xorm:"host_fqdn UNIQUE INDEX VARCHAR(255) NOT NULL"`
+ HostFqdn string `xorm:"host_fqdn UNIQUE(federation_host) INDEX VARCHAR(255) NOT NULL"`
+ HostPort uint16 `xorm:" UNIQUE(federation_host) INDEX NOT NULL DEFAULT 443"`
NodeInfo NodeInfo `xorm:"extends NOT NULL"`
- HostPort uint16 `xorm:"NOT NULL DEFAULT 443"`
HostSchema string `xorm:"NOT NULL DEFAULT 'https'"`
LatestActivity time.Time `xorm:"NOT NULL"`
KeyID sql.NullString `xorm:"key_id UNIQUE"`
@@ -42,6 +43,13 @@ func NewFederationHost(hostFqdn string, nodeInfo NodeInfo, port uint16, schema s
return result, nil
}
+func (host FederationHost) AsURL() url.URL {
+ return url.URL{
+ Scheme: host.HostSchema,
+ Host: fmt.Sprintf("%v:%v", host.HostFqdn, host.HostPort),
+ }
+}
+
// Validate collects error strings in a slice and returns this
func (host FederationHost) Validate() []string {
var result []string
diff --git a/models/forgefed/federationhost_test.go b/models/forgefed/federationhost_test.go
index 824495c9cb..d11affbae0 100644
--- a/models/forgefed/federationhost_test.go
+++ b/models/forgefed/federationhost_test.go
@@ -35,7 +35,7 @@ func Test_FederationHostValidation(t *testing.T) {
HostSchema: "https",
}
if res, _ := validation.IsValid(sut); res {
- t.Errorf("sut should be invalid: HostFqdn empty")
+ t.Error("sut should be invalid: HostFqdn empty")
}
sut = FederationHost{
@@ -48,7 +48,7 @@ func Test_FederationHostValidation(t *testing.T) {
HostSchema: "https",
}
if res, _ := validation.IsValid(sut); res {
- t.Errorf("sut should be invalid: HostFqdn too long (len=256)")
+ t.Error("sut should be invalid: HostFqdn too long (len=256)")
}
sut = FederationHost{
@@ -59,7 +59,7 @@ func Test_FederationHostValidation(t *testing.T) {
HostSchema: "https",
}
if res, _ := validation.IsValid(sut); res {
- t.Errorf("sut should be invalid: NodeInfo invalid")
+ t.Error("sut should be invalid: NodeInfo invalid")
}
sut = FederationHost{
@@ -72,7 +72,7 @@ func Test_FederationHostValidation(t *testing.T) {
HostSchema: "https",
}
if res, _ := validation.IsValid(sut); res {
- t.Errorf("sut should be invalid: Future timestamp")
+ t.Error("sut should be invalid: Future timestamp")
}
sut = FederationHost{
@@ -85,6 +85,6 @@ func Test_FederationHostValidation(t *testing.T) {
HostSchema: "https",
}
if res, _ := validation.IsValid(sut); res {
- t.Errorf("sut should be invalid: HostFqdn lower case")
+ t.Error("sut should be invalid: HostFqdn lower case")
}
}
diff --git a/models/forgefed/nodeinfo.go b/models/forgefed/nodeinfo.go
index 2461b5e499..38f51304c5 100644
--- a/models/forgefed/nodeinfo.go
+++ b/models/forgefed/nodeinfo.go
@@ -17,12 +17,14 @@ type (
)
const (
- ForgejoSourceType SoftwareNameType = "forgejo"
- GiteaSourceType SoftwareNameType = "gitea"
+ ForgejoSourceType SoftwareNameType = "forgejo"
+ GiteaSourceType SoftwareNameType = "gitea"
+ MastodonSourceType SoftwareNameType = "mastodon"
+ GoToSocialSourceType SoftwareNameType = "gotosocial"
)
var KnownSourceTypes = []any{
- ForgejoSourceType, GiteaSourceType,
+ ForgejoSourceType, GiteaSourceType, MastodonSourceType, GoToSocialSourceType,
}
// ------------------------------------------------ NodeInfoWellKnown ------------------------------------------------
diff --git a/models/forgefed/nodeinfo_test.go b/models/forgefed/nodeinfo_test.go
index 9e37e77100..a0c9781b90 100644
--- a/models/forgefed/nodeinfo_test.go
+++ b/models/forgefed/nodeinfo_test.go
@@ -4,7 +4,7 @@
package forgefed
import (
- "fmt"
+ "errors"
"reflect"
"strings"
"testing"
@@ -28,7 +28,7 @@ func Test_NodeInfoWellKnownUnmarshalJSON(t *testing.T) {
},
"empty": {
item: []byte(``),
- wantErr: fmt.Errorf("cannot parse JSON: cannot parse empty string; unparsed tail: \"\""),
+ wantErr: errors.New("cannot parse JSON: cannot parse empty string; unparsed tail: \"\""),
},
}
@@ -74,7 +74,7 @@ func Test_NewNodeInfoWellKnown(t *testing.T) {
_, err := NewNodeInfoWellKnown([]byte(`invalid`))
if err == nil {
- t.Errorf("error was expected here")
+ t.Error("error was expected here")
}
}
@@ -87,6 +87,6 @@ func Test_NewNodeInfo(t *testing.T) {
_, err := NewNodeInfo([]byte(`invalid`))
if err == nil {
- t.Errorf("error was expected here")
+ t.Error("error was expected here")
}
}
diff --git a/models/forgejo_migrations/migrate.go b/models/forgejo_migrations/migrate.go
index 73226c525f..737350b019 100644
--- a/models/forgejo_migrations/migrate.go
+++ b/models/forgejo_migrations/migrate.go
@@ -5,6 +5,7 @@ package forgejo_migrations //nolint:revive
import (
"context"
+ "errors"
"fmt"
"os"
@@ -98,6 +99,16 @@ var migrations = []*Migration{
NewMigration("Add public key information to `FederatedUser` and `FederationHost`", AddPublicKeyInformationForFederation),
// v29 -> v30
NewMigration("Migrate `User.NormalizedFederatedURI` column to extract port & schema into FederatedHost", MigrateNormalizedFederatedURI),
+ // v30 -> v31
+ NewMigration("Normalize repository.topics to empty slice instead of null", SetTopicsAsEmptySlice),
+ // v31 -> v32
+ NewMigration("Migrate maven package name concatenation", ChangeMavenArtifactConcatenation),
+ // v32 -> v33
+ NewMigration("Add federated user activity tables, update the `federated_user` table & add indexes", FederatedUserActivityMigration),
+ // v33 -> v34
+ NewMigration("Add `notify-email` column to `action_run` table", AddNotifyEmailToActionRun),
+ // v34 -> v35
+ NewMigration("Add index to `stopped` column in `action_run` table", AddIndexToActionRunStopped),
}
// GetCurrentDBVersion returns the current Forgejo database version.
@@ -130,7 +141,7 @@ func EnsureUpToDate(x *xorm.Engine) error {
}
if currentDB < 0 {
- return fmt.Errorf("database has not been initialized")
+ return errors.New("database has not been initialized")
}
expected := ExpectedVersion()
diff --git a/models/forgejo_migrations/v31.go b/models/forgejo_migrations/v31.go
new file mode 100644
index 0000000000..fdcab21b1a
--- /dev/null
+++ b/models/forgejo_migrations/v31.go
@@ -0,0 +1,58 @@
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package forgejo_migrations //nolint:revive
+
+import (
+ "xorm.io/xorm"
+ "xorm.io/xorm/schemas"
+)
+
+func SetTopicsAsEmptySlice(x *xorm.Engine) error {
+ var err error
+ switch x.Dialect().URI().DBType {
+ case schemas.MYSQL:
+ _, err = x.Exec("UPDATE `repository` SET topics = '[]' WHERE topics IS NULL OR topics = 'null'")
+ case schemas.SQLITE:
+ _, err = x.Exec("UPDATE `repository` SET topics = '[]' WHERE topics IS NULL OR topics = 'null'")
+ case schemas.POSTGRES:
+ _, err = x.Exec("UPDATE `repository` SET topics = '[]' WHERE topics IS NULL OR topics::text = 'null'")
+ }
+
+ if err != nil {
+ return err
+ }
+
+ if x.Dialect().URI().DBType == schemas.SQLITE {
+ sessMigration := x.NewSession()
+ defer sessMigration.Close()
+ if err := sessMigration.Begin(); err != nil {
+ return err
+ }
+ _, err = sessMigration.Exec("ALTER TABLE `repository` RENAME COLUMN `topics` TO `topics_backup`")
+ if err != nil {
+ return err
+ }
+ _, err = sessMigration.Exec("ALTER TABLE `repository` ADD COLUMN `topics` TEXT NOT NULL DEFAULT '[]'")
+ if err != nil {
+ return err
+ }
+ _, err = sessMigration.Exec("UPDATE `repository` SET `topics` = `topics_backup`")
+ if err != nil {
+ return err
+ }
+ _, err = sessMigration.Exec("ALTER TABLE `repository` DROP COLUMN `topics_backup`")
+ if err != nil {
+ return err
+ }
+
+ return sessMigration.Commit()
+ }
+
+ type Repository struct {
+ ID int64 `xorm:"pk autoincr"`
+ Topics []string `xorm:"TEXT JSON NOT NULL"`
+ }
+
+ return x.Sync(new(Repository))
+}
diff --git a/models/forgejo_migrations/v31_test.go b/models/forgejo_migrations/v31_test.go
new file mode 100644
index 0000000000..5b4aac2a60
--- /dev/null
+++ b/models/forgejo_migrations/v31_test.go
@@ -0,0 +1,38 @@
+// Copyright 2025 The Forgejo Authors.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package forgejo_migrations //nolint:revive
+
+import (
+ "testing"
+
+ migration_tests "forgejo.org/models/migrations/test"
+
+ "github.com/stretchr/testify/require"
+)
+
+func Test_SetTopicsAsEmptySlice(t *testing.T) {
+ type Repository struct {
+ ID int64 `xorm:"pk autoincr"`
+ Topics []string `xorm:"TEXT JSON"`
+ }
+
+ x, deferable := migration_tests.PrepareTestEnv(t, 0, new(Repository))
+ defer deferable()
+ if x == nil || t.Failed() {
+ return
+ }
+
+ require.NoError(t, SetTopicsAsEmptySlice(x))
+
+ var repos []Repository
+ require.NoError(t, x.Find(&repos))
+
+ for _, repo := range repos {
+ if repo.ID == 2 {
+ require.Equal(t, []string{"go", "dev"}, repo.Topics, "Valid topics should remain unchanged")
+ } else {
+ require.Equal(t, []string{}, repo.Topics, "NULL topics should be set to empty array")
+ }
+ }
+}
diff --git a/models/forgejo_migrations/v32.go b/models/forgejo_migrations/v32.go
new file mode 100644
index 0000000000..bed335ab6b
--- /dev/null
+++ b/models/forgejo_migrations/v32.go
@@ -0,0 +1,414 @@
+// Copyright 2025 The Forgejo Authors. All rights reserved.
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+package forgejo_migrations //nolint:revive
+
+import (
+ "encoding/xml"
+ "fmt"
+ "regexp"
+ "slices"
+ "sort"
+ "strconv"
+ "strings"
+
+ "forgejo.org/models/packages"
+ "forgejo.org/modules/json"
+ "forgejo.org/modules/log"
+ "forgejo.org/modules/packages/maven"
+ packages_service "forgejo.org/services/packages"
+
+ "golang.org/x/net/context"
+ "xorm.io/xorm"
+)
+
+var getPackage = packages_service.GetPackageFileStream
+
+type Snapshot struct {
+ baseVersion string
+ date string
+ time string
+ build int
+}
+
+type Metadata struct {
+ XMLName xml.Name `xml:"metadata"`
+ ModelVersion string `xml:"modelVersion,attr"`
+ GroupID string `xml:"groupId"`
+ ArtifactID string `xml:"artifactId"`
+ Version string `xml:"version"`
+}
+
+type mavenPackageResult struct {
+ PackageFile *packages.PackageFile `xorm:"extends"`
+ PackageVersion *packages.PackageVersion `xorm:"extends"`
+ Package *packages.Package `xorm:"extends"`
+ PackageName string `xorm:"-"`
+ Snapshot *Snapshot `xorm:"-"`
+ GroupID string `xorm:"-"`
+ ArtifactID string `xorm:"-"`
+}
+
+// ChangeMavenArtifactConcatenation resolves old dash-concatenated Maven coordinates and regenerates metadata.
+// Note: runs per-owner in a single transaction; failures roll back all owners.
+func ChangeMavenArtifactConcatenation(x *xorm.Engine) error {
+ sess := x.NewSession()
+ defer sess.Close()
+
+ if err := sess.Begin(); err != nil {
+ return err
+ }
+
+ // get unique owner IDs of Maven packages
+ var ownerIDs []*int64
+ if err := sess.
+ Table("package").
+ Select("package.owner_id").
+ Where("package.type = 'maven'").
+ GroupBy("package.owner_id").
+ OrderBy("package.owner_id DESC").
+ Find(&ownerIDs); err != nil {
+ return err
+ }
+
+ for _, id := range ownerIDs {
+ if err := fixMavenArtifactPerOwner(sess, id); err != nil {
+ log.Error("owner %d migration failed: %v", id, err)
+ return err // rollback all
+ }
+ }
+
+ return sess.Commit()
+}
+
+func fixMavenArtifactPerOwner(sess *xorm.Session, ownerID *int64) error {
+ results, err := getMavenPackageResultsToUpdate(sess, ownerID)
+ if err != nil {
+ return err
+ }
+
+ if err = resolvePackageCollisions(results, sess); err != nil {
+ return err
+ }
+
+ if err = processPackageVersions(results, sess); err != nil {
+ return err
+ }
+
+ return processPackageFiles(results, sess)
+}
+
+// processPackageFiles updates Maven package files and versions in the database
+// Returns an error if any database or processing operation fails.
+func processPackageFiles(results []*mavenPackageResult, sess *xorm.Session) error {
+ processedVersion := make(map[string][]*mavenPackageResult)
+
+ for _, r := range results {
+ if r.Snapshot != nil {
+ key := fmt.Sprintf("%s:%s", r.PackageName, r.PackageVersion.LowerVersion)
+ processedVersion[key] = append(processedVersion[key], r)
+ }
+
+ // Only update version_id when it differs
+ if r.PackageVersion.ID != r.PackageFile.VersionID {
+ pattern := strings.TrimSuffix(r.PackageFile.Name, ".pom") + "%"
+ // Per routers/api/packages/maven/maven.go:338, POM files already have the `IsLead`, so no update needed for this prop
+ if _, err := sess.Exec("UPDATE package_file SET version_id = ? WHERE version_id = ? and name like ?", r.PackageVersion.ID, r.PackageFile.VersionID, pattern); err != nil {
+ return err
+ }
+ }
+ }
+
+ // If maven-metadata.xml is missing (snapshot path collision), skip regeneration
+ // Without this metadata, Maven cannot resolve snapshot details
+ for _, packageResults := range processedVersion {
+ sort.Slice(packageResults, func(i, j int) bool {
+ return packageResults[i].Snapshot.build > packageResults[j].Snapshot.build
+ })
+
+ rs := packageResults[0]
+
+ pf, md, err := parseMetadata(sess, rs)
+ if err != nil {
+ return err
+ }
+
+ if pf != nil && md != nil && md.GroupID == rs.GroupID && md.ArtifactID == rs.ArtifactID {
+ if pf.VersionID != rs.PackageFile.VersionID {
+ if _, err := sess.ID(pf.ID).Cols("version_id").Update(pf); err != nil {
+ return err
+ }
+ }
+ continue
+ }
+
+ log.Warn("no maven-metadata.xml found for (id: %d) [%s:%s]", rs.PackageVersion.ID, rs.PackageName, rs.PackageVersion.Version)
+ }
+
+ return nil
+}
+
+// parseMetadata retrieves metadata for a Maven package file from the database and decodes it into a Metadata object.
+// Returns the associated PackageFile, Metadata, and any error encountered during processing.
+func parseMetadata(sess *xorm.Session, snapshot *mavenPackageResult) (*packages.PackageFile, *Metadata, error) {
+ ctx := context.Background()
+
+ var pf packages.PackageFile
+ found, err := sess.Table(pf).
+ Where("version_id = ?", snapshot.PackageFile.VersionID). // still the old id
+ And("lower_name = ?", "maven-metadata.xml").
+ Get(&pf)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ if !found {
+ return nil, nil, nil
+ }
+
+ s, _, _, err := getPackage(ctx, &pf)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ defer s.Close()
+ dec := xml.NewDecoder(s)
+ var m Metadata
+ if err := dec.Decode(&m); err != nil {
+ return nil, nil, err
+ }
+
+ return &pf, &m, nil
+}
+
+// processPackageVersions processes Maven package versions by updating metadata or inserting new records as necessary.
+// It avoids redundant updates by tracking already processed versions using a map. Returns an error on failure.
+func processPackageVersions(results []*mavenPackageResult, sess *xorm.Session) error {
+ processedVersion := make(map[string]int64)
+
+ for _, r := range results {
+ key := fmt.Sprintf("%s:%s", r.PackageName, r.PackageVersion.Version)
+
+ if id, ok := processedVersion[key]; ok {
+ r.PackageVersion.ID = id
+ continue
+ }
+
+ // for non collisions, just update the metadata
+ if r.PackageVersion.PackageID == r.Package.ID {
+ if _, err := sess.ID(r.PackageVersion.ID).Cols("metadata_json").Update(r.PackageVersion); err != nil {
+ return err
+ }
+ } else {
+ log.Info("Create new maven package version for %s:%s", r.PackageName, r.PackageVersion.Version)
+ r.PackageVersion.ID = 0
+ r.PackageVersion.PackageID = r.Package.ID
+ if _, err := sess.Insert(r.PackageVersion); err != nil {
+ return err
+ }
+ }
+
+ processedVersion[key] = r.PackageVersion.ID
+ }
+
+ return nil
+}
+
+// getMavenPackageResultsToUpdate retrieves Maven package results that need updates based on the owner ID.
+// It processes POM metadata, fixes package inconsistencies, and filters corrupted package versions.
+func getMavenPackageResultsToUpdate(sess *xorm.Session, ownerID *int64) ([]*mavenPackageResult, error) {
+ ctx := context.Background()
+ var candidates []*mavenPackageResult
+ if err := sess.
+ Table("package_file").
+ Select("package_file.*, package_version.*, package.*").
+ Join("INNER", "package_version", "package_version.id = package_file.version_id").
+ Join("INNER", "package", "package.id = package_version.package_id").
+ Where("package_file.lower_name LIKE ?", "%.pom").
+ And("package.type = ?", "maven").
+ And("package.owner_id = ?", ownerID).
+ OrderBy("package_version.id DESC, package_file.id DESC").
+ Find(&candidates); err != nil {
+ return nil, err
+ }
+
+ var results []*mavenPackageResult
+ var corruptedVersionIDs []int64
+
+ // fetch actual metadata from blob as all packages needs to be fixed following the new string concatenation
+ for _, r := range candidates {
+ if err := processPomMetadata(ctx, r); err != nil {
+ // Skip corrupted versions; admin intervention may be needed to repair these files.
+ log.Warn("Failed to process package file [id: %d] ignoring package version[%d]: %v", r.PackageFile.ID, r.PackageVersion.ID, err)
+
+ corruptedVersionIDs = append(corruptedVersionIDs, r.PackageVersion.ID)
+
+ continue
+ }
+
+ results = append(results, r)
+ log.Debug("Resolved id [%d] from [%s:%s] to [%s:%s] [Snapshot: %v]", r.Package.ID, r.Package.Name, r.PackageVersion.Version, r.PackageName, r.PackageVersion.Version, r.Snapshot)
+ }
+
+ for _, corruptedVersionID := range corruptedVersionIDs {
+ for i := 0; i < len(results); {
+ if corruptedVersionID == results[i].PackageVersion.ID {
+ results = append(results[:i], results[i+1:]...)
+ } else {
+ i++
+ }
+ }
+ }
+
+ return results, nil
+}
+
+// resolvePackageCollisions handles name collisions by keeping the first existing record and inserting new Package records for subsequent collisions.
+// Returns a map from PackageName to its resolved Package.ID.
+func resolvePackageCollisions(results []*mavenPackageResult, sess *xorm.Session) error {
+ // Group new names by lowerName
+ collisions := make(map[string][]string)
+ for _, r := range results {
+ names := collisions[r.Package.LowerName]
+ if !slices.Contains(names, r.PackageName) {
+ collisions[r.Package.LowerName] = append(names, r.PackageName)
+ }
+ }
+
+ pkgIDByName := make(map[string]int64)
+ var err error
+
+ for _, r := range results {
+ list := collisions[r.Package.LowerName]
+
+ // update to the upcoming package name which is colon separated
+ r.Package.Name = r.PackageName
+ r.Package.LowerName = r.PackageName
+
+ // exiting entry
+ if id, ok := pkgIDByName[r.PackageName]; ok {
+ r.Package.ID = id
+ // first package kept the current id
+ } else if list[0] == r.PackageName {
+ pkgIDByName[r.PackageName] = r.Package.ID
+
+ if _, err = sess.ID(r.Package.ID).Cols("name", "lower_name").Update(r.Package); err != nil {
+ return err
+ }
+ // create a new entry
+ } else {
+ log.Info("Create new maven package for %s", r.Package.Name)
+
+ r.Package.ID = 0
+ if _, err = sess.Insert(r.Package); err != nil {
+ return err
+ }
+
+ pkgIDByName[r.PackageName] = r.Package.ID
+ }
+ }
+
+ return nil
+}
+
+// processPomMetadata processes a Maven package file, parses its POM metadata, and updates PackageVersion information.
+func processPomMetadata(ctx context.Context, mpr *mavenPackageResult) error {
+ s, _, _, err := getPackage(ctx, mpr.PackageFile)
+ if err != nil {
+ return fmt.Errorf("unable to get package stream: %v", err)
+ }
+ defer s.Close()
+
+ actualPom, err := maven.ParsePackageMetaData(s)
+ if err != nil {
+ return fmt.Errorf("failed to parse POM metadata: %v", err)
+ }
+
+ raw, err := json.Marshal(actualPom)
+ if err != nil {
+ return fmt.Errorf("failed to marshal metadata: %v", err)
+ }
+
+ var currentPom *maven.Metadata
+ if err = json.Unmarshal([]byte(mpr.PackageVersion.MetadataJSON), ¤tPom); err != nil {
+ return fmt.Errorf("failed to unmarshal metadata: %v", err)
+ }
+
+ // since the rest api can also be (ab)used to upload artifacts wrong, just ignore them
+ if isInvalidMatch(currentPom, actualPom) {
+ return fmt.Errorf("artifact mismatch: actual [%s] expected [%s]", actualPom.ArtifactID, currentPom.ArtifactID)
+ }
+
+ // this will also fix packages that missed its groupID
+ // Ref: https://codeberg.org/forgejo/forgejo/pulls/6329
+ mpr.PackageVersion.MetadataJSON = string(raw)
+
+ // Since Maven packages are case-sensitive, avoid potential clashes and clean-ups
+ // by enforcing consistent case handling similar to RPM packages.
+ mpr.PackageName = fmt.Sprintf("%s:%s", actualPom.GroupID, actualPom.ArtifactID)
+
+ mpr.GroupID = actualPom.GroupID
+ mpr.ArtifactID = actualPom.ArtifactID
+
+ if strings.HasSuffix(mpr.PackageVersion.Version, "-SNAPSHOT") {
+ snap, err := extraSnapshotDetails(currentPom, actualPom, mpr)
+ if err != nil {
+ return err
+ }
+ mpr.Snapshot = snap
+ } else {
+ // only snapshots are affected but kept in case of not complete fixtures
+ expectedFileName := fmt.Sprintf("%s-%s.pom", actualPom.ArtifactID, mpr.PackageVersion.Version)
+ if mpr.PackageFile.Name != expectedFileName {
+ log.Warn("invalid package file name - this is a collision which needs to be resolved expected [%s], actual [%s]", expectedFileName, mpr.PackageFile.Name)
+ }
+ }
+
+ return nil
+}
+
+// extraSnapshotDetails extracts detailed snapshot information
+// Returns a Snapshot object encapsulating the extracted details or an error if the filename is invalid or parsing fails.
+func extraSnapshotDetails(currentPom, actualPom *maven.Metadata, mpr *mavenPackageResult) (*Snapshot, error) {
+ pattern := `^%s-` +
+ `(?P
88fc37a3c0...12fc37a3c0 (hash)
diff --git a/modules/test/utils.go b/modules/test/utils.go
index f60bad022e..db131f19d0 100644
--- a/modules/test/utils.go
+++ b/modules/test/utils.go
@@ -7,6 +7,7 @@ import (
"net/http"
"net/http/httptest"
"strings"
+ "time"
"forgejo.org/modules/json"
)
@@ -46,3 +47,8 @@ func MockProtect[T any](p *T) (reset func()) {
old := *p
return func() { *p = old }
}
+
+// When this is called, sleep until the unix time was increased by one.
+func SleepTillNextSecond() {
+ time.Sleep(time.Second - time.Since(time.Now().Truncate(time.Second)))
+}
diff --git a/modules/typesniffer/typesniffer.go b/modules/typesniffer/typesniffer.go
index a8fc70e54c..262feb2b05 100644
--- a/modules/typesniffer/typesniffer.go
+++ b/modules/typesniffer/typesniffer.go
@@ -24,6 +24,16 @@ const (
AvifMimeType = "image/avif"
// ApplicationOctetStream MIME type of binary files.
ApplicationOctetStream = "application/octet-stream"
+ // GLTFMimeType MIME type of GLTF files.
+ GLTFMimeType = "model/gltf+json"
+ // GLBMimeType MIME type of GLB files.
+ GLBMimeType = "model/gltf-binary"
+ // OBJMimeType MIME type of OBJ files.
+ OBJMimeType = "model/obj"
+ // STLMimeType MIME type of STL files.
+ STLMimeType = "model/stl"
+ // 3MFMimeType MIME type of 3MF files.
+ ThreeMFMimeType = "model/3mf"
)
var (
@@ -67,6 +77,36 @@ func (ct SniffedType) IsAudio() bool {
return strings.Contains(ct.contentType, "audio/")
}
+// Is3DModel detects if data is a 3D format
+func (ct SniffedType) Is3DModel() bool {
+ return strings.Contains(ct.contentType, "model/")
+}
+
+// IsGLTFFile detects if data is an SVG image format
+func (ct SniffedType) IsGLTF() bool {
+ return strings.Contains(ct.contentType, GLTFMimeType)
+}
+
+// IsGLBFile detects if data is an GLB image format
+func (ct SniffedType) IsGLB() bool {
+ return strings.Contains(ct.contentType, GLBMimeType)
+}
+
+// IsOBJFile detects if data is an OBJ image format
+func (ct SniffedType) IsOBJ() bool {
+ return strings.Contains(ct.contentType, OBJMimeType)
+}
+
+// IsSTLTextFile detects if data is an STL text format
+func (ct SniffedType) IsSTL() bool {
+ return strings.Contains(ct.contentType, STLMimeType)
+}
+
+// Is3MFFile detects if data is an 3MF image format
+func (ct SniffedType) Is3MF() bool {
+ return strings.Contains(ct.contentType, ThreeMFMimeType)
+}
+
// IsRepresentableAsText returns true if file content can be represented as
// plain text or is empty.
func (ct SniffedType) IsRepresentableAsText() bool {
@@ -75,7 +115,7 @@ func (ct SniffedType) IsRepresentableAsText() bool {
// IsBrowsableBinaryType returns whether a non-text type can be displayed in a browser
func (ct SniffedType) IsBrowsableBinaryType() bool {
- return ct.IsImage() || ct.IsSvgImage() || ct.IsPDF() || ct.IsVideo() || ct.IsAudio()
+ return ct.IsImage() || ct.IsSvgImage() || ct.IsPDF() || ct.IsVideo() || ct.IsAudio() || ct.Is3DModel()
}
// GetMimeType returns the mime type
@@ -135,6 +175,13 @@ func DetectContentType(data []byte) SniffedType {
ct = "audio/ogg" // for most cases, it is used as an audio container
}
}
+
+ // GLTF is unsupported by http.DetectContentType
+ // hexdump -n 4 -C glTF.glb
+ if bytes.HasPrefix(data, []byte("glTF")) {
+ ct = GLBMimeType
+ }
+
return SniffedType{ct}
}
diff --git a/modules/typesniffer/typesniffer_test.go b/modules/typesniffer/typesniffer_test.go
index 8d80b4ddb4..176d3658bb 100644
--- a/modules/typesniffer/typesniffer_test.go
+++ b/modules/typesniffer/typesniffer_test.go
@@ -117,6 +117,14 @@ func TestIsAudio(t *testing.T) {
assert.True(t, DetectContentType([]byte("ID3Toy\n====\t* hi 🌞, ..."+"🌛"[0:2])).IsText()) // test ID3 tag with incomplete UTF8 char
}
+func TestIsGLB(t *testing.T) {
+ glb, _ := hex.DecodeString("676c5446")
+ assert.True(t, DetectContentType(glb).IsGLB())
+ assert.True(t, DetectContentType(glb).Is3DModel())
+ assert.False(t, DetectContentType([]byte("plain text")).IsGLB())
+ assert.False(t, DetectContentType([]byte("plain text")).Is3DModel())
+}
+
func TestDetectContentTypeFromReader(t *testing.T) {
mp3, _ := base64.StdEncoding.DecodeString("SUQzBAAAAAABAFRYWFgAAAASAAADbWFqb3JfYnJhbmQAbXA0MgBUWFhYAAAAEQAAA21pbm9yX3Zl")
st, err := DetectContentTypeFromReader(bytes.NewReader(mp3))
@@ -145,3 +153,15 @@ func TestDetectContentTypeAvif(t *testing.T) {
assert.True(t, st.IsImage())
}
+
+func TestDetectContentTypeModelGLB(t *testing.T) {
+ glb, err := hex.DecodeString("676c5446")
+ require.NoError(t, err)
+
+ st, err := DetectContentTypeFromReader(bytes.NewReader(glb))
+ require.NoError(t, err)
+
+ // print st for debugging
+ assert.Equal(t, "model/gltf-binary", st.GetMimeType())
+ assert.True(t, st.IsGLB())
+}
diff --git a/modules/util/io.go b/modules/util/io.go
index 1559b019a0..4c99004c0c 100644
--- a/modules/util/io.go
+++ b/modules/util/io.go
@@ -4,7 +4,6 @@
package util
import (
- "bytes"
"errors"
"io"
)
@@ -20,42 +19,6 @@ func ReadAtMost(r io.Reader, buf []byte) (n int, err error) {
return n, err
}
-// ReadWithLimit reads at most "limit" bytes from r into buf.
-// If EOF or ErrUnexpectedEOF occurs while reading, err will be nil.
-func ReadWithLimit(r io.Reader, n int) (buf []byte, err error) {
- return readWithLimit(r, 1024, n)
-}
-
-func readWithLimit(r io.Reader, batch, limit int) ([]byte, error) {
- if limit <= batch {
- buf := make([]byte, limit)
- n, err := ReadAtMost(r, buf)
- if err != nil {
- return nil, err
- }
- return buf[:n], nil
- }
- res := bytes.NewBuffer(make([]byte, 0, batch))
- bufFix := make([]byte, batch)
- eof := false
- for res.Len() < limit && !eof {
- bufTmp := bufFix
- if res.Len()+batch > limit {
- bufTmp = bufFix[:limit-res.Len()]
- }
- n, err := io.ReadFull(r, bufTmp)
- if err == io.EOF || err == io.ErrUnexpectedEOF {
- eof = true
- } else if err != nil {
- return nil, err
- }
- if _, err = res.Write(bufTmp[:n]); err != nil {
- return nil, err
- }
- }
- return res.Bytes(), nil
-}
-
// ErrNotEmpty is an error reported when there is a non-empty reader
var ErrNotEmpty = errors.New("not-empty")
diff --git a/modules/util/io_test.go b/modules/util/io_test.go
deleted file mode 100644
index 870e713646..0000000000
--- a/modules/util/io_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2023 The Gitea Authors. All rights reserved.
-// SPDX-License-Identifier: MIT
-
-package util
-
-import (
- "bytes"
- "errors"
- "testing"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-type readerWithError struct {
- buf *bytes.Buffer
-}
-
-func (r *readerWithError) Read(p []byte) (n int, err error) {
- if r.buf.Len() < 2 {
- return 0, errors.New("test error")
- }
- return r.buf.Read(p)
-}
-
-func TestReadWithLimit(t *testing.T) {
- bs := []byte("0123456789abcdef")
-
- // normal test
- buf, err := readWithLimit(bytes.NewBuffer(bs), 5, 2)
- require.NoError(t, err)
- assert.Equal(t, []byte("01"), buf)
-
- buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 5)
- require.NoError(t, err)
- assert.Equal(t, []byte("01234"), buf)
-
- buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 6)
- require.NoError(t, err)
- assert.Equal(t, []byte("012345"), buf)
-
- buf, err = readWithLimit(bytes.NewBuffer(bs), 5, len(bs))
- require.NoError(t, err)
- assert.Equal(t, []byte("0123456789abcdef"), buf)
-
- buf, err = readWithLimit(bytes.NewBuffer(bs), 5, 100)
- require.NoError(t, err)
- assert.Equal(t, []byte("0123456789abcdef"), buf)
-
- // test with error
- buf, err = readWithLimit(&readerWithError{bytes.NewBuffer(bs)}, 5, 10)
- require.NoError(t, err)
- assert.Equal(t, []byte("0123456789"), buf)
-
- buf, err = readWithLimit(&readerWithError{bytes.NewBuffer(bs)}, 5, 100)
- require.ErrorContains(t, err, "test error")
- assert.Empty(t, buf)
-
- // test public function
- buf, err = ReadWithLimit(bytes.NewBuffer(bs), 2)
- require.NoError(t, err)
- assert.Equal(t, []byte("01"), buf)
-
- buf, err = ReadWithLimit(bytes.NewBuffer(bs), 9999999)
- require.NoError(t, err)
- assert.Equal(t, []byte("0123456789abcdef"), buf)
-}
diff --git a/modules/util/truncate.go b/modules/util/truncate.go
index f2edbdc673..7207a89177 100644
--- a/modules/util/truncate.go
+++ b/modules/util/truncate.go
@@ -54,3 +54,12 @@ func SplitTrimSpace(input, sep string) []string {
return stringList
}
+
+// TruncateRunes returns a truncated string with given rune limit,
+// it returns input string if its rune length doesn't exceed the limit.
+func TruncateRunes(str string, limit int) string {
+ if utf8.RuneCountInString(str) < limit {
+ return str
+ }
+ return string([]rune(str)[:limit])
+}
diff --git a/modules/util/truncate_test.go b/modules/util/truncate_test.go
index dfe1230fd4..8187b13eb2 100644
--- a/modules/util/truncate_test.go
+++ b/modules/util/truncate_test.go
@@ -44,3 +44,18 @@ func TestSplitString(t *testing.T) {
}
test(tc, SplitStringAtByteN)
}
+
+func TestTruncateRunes(t *testing.T) {
+ assert.Empty(t, TruncateRunes("", 0))
+ assert.Empty(t, TruncateRunes("", 1))
+
+ assert.Empty(t, TruncateRunes("ab", 0))
+ assert.Equal(t, "a", TruncateRunes("ab", 1))
+ assert.Equal(t, "ab", TruncateRunes("ab", 2))
+ assert.Equal(t, "ab", TruncateRunes("ab", 3))
+
+ assert.Empty(t, TruncateRunes("测试", 0))
+ assert.Equal(t, "测", TruncateRunes("测试", 1))
+ assert.Equal(t, "测试", TruncateRunes("测试", 2))
+ assert.Equal(t, "测试", TruncateRunes("测试", 3))
+}
diff --git a/modules/validation/email.go b/modules/validation/email.go
index fb563c2b81..8e1ffc203d 100644
--- a/modules/validation/email.go
+++ b/modules/validation/email.go
@@ -8,7 +8,6 @@ package validation
import (
"fmt"
"net/mail"
- "regexp"
"strings"
"forgejo.org/modules/setting"
@@ -20,21 +19,6 @@ import (
// ErrEmailNotActivated e-mail address has not been activated error
var ErrEmailNotActivated = util.NewInvalidArgumentErrorf("e-mail address has not been activated")
-// ErrEmailCharIsNotSupported e-mail address contains unsupported character
-type ErrEmailCharIsNotSupported struct {
- Email string
-}
-
-// IsErrEmailCharIsNotSupported checks if an error is an ErrEmailCharIsNotSupported
-func IsErrEmailCharIsNotSupported(err error) bool {
- _, ok := err.(ErrEmailCharIsNotSupported)
- return ok
-}
-
-func (err ErrEmailCharIsNotSupported) Error() string {
- return fmt.Sprintf("e-mail address contains unsupported character [email: %s]", err.Email)
-}
-
// ErrEmailInvalid represents an error where the email address does not comply with RFC 5322
// or has a leading '-' character
type ErrEmailInvalid struct {
@@ -55,8 +39,6 @@ func (err ErrEmailInvalid) Unwrap() error {
return util.ErrInvalidArgument
}
-var emailRegexp = regexp.MustCompile("^[a-zA-Z0-9.!#$%&'*+-/=?^_`{|}~]*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$")
-
// check if email is a valid address with allowed domain
func ValidateEmail(email string) error {
if err := validateEmailBasic(email); err != nil {
@@ -77,15 +59,12 @@ func validateEmailBasic(email string) error {
return ErrEmailInvalid{email}
}
- if !emailRegexp.MatchString(email) {
- return ErrEmailCharIsNotSupported{email}
- }
-
- if email[0] == '-' {
+ parsedAddress, err := mail.ParseAddress(email)
+ if err != nil {
return ErrEmailInvalid{email}
}
- if _, err := mail.ParseAddress(email); err != nil {
+ if parsedAddress.Name != "" {
return ErrEmailInvalid{email}
}
diff --git a/modules/validation/email_test.go b/modules/validation/email_test.go
index 68864b2450..b7ee766ddb 100644
--- a/modules/validation/email_test.go
+++ b/modules/validation/email_test.go
@@ -35,7 +35,7 @@ func TestEmailAddressValidate(t *testing.T) {
`first|last@iana.org`: nil,
`first}last@iana.org`: nil,
`first~last@iana.org`: nil,
- `first;last@iana.org`: ErrEmailCharIsNotSupported{`first;last@iana.org`},
+ `first;last@iana.org`: ErrEmailInvalid{`first;last@iana.org`},
".233@qq.com": ErrEmailInvalid{".233@qq.com"},
"!233@qq.com": nil,
"#233@qq.com": nil,
@@ -45,7 +45,7 @@ func TestEmailAddressValidate(t *testing.T) {
"'233@qq.com": nil,
"*233@qq.com": nil,
"+233@qq.com": nil,
- "-233@qq.com": ErrEmailInvalid{"-233@qq.com"},
+ "-233@qq.com": nil,
"/233@qq.com": nil,
"=233@qq.com": nil,
"?233@qq.com": nil,
@@ -56,9 +56,10 @@ func TestEmailAddressValidate(t *testing.T) {
"|233@qq.com": nil,
"}233@qq.com": nil,
"~233@qq.com": nil,
- ";233@qq.com": ErrEmailCharIsNotSupported{";233@qq.com"},
- "Foo /etc/pacman.conf
:
+arch.pacman.sync = Синхронизирайте пакета с pacman:
+details.repository_site = Уебсайт на хранилището
+arch.version.depends = Зависимости
+arch.version.optdepends = Допълнителни зависимости
+arch.version.replaces = Заменя
+go.install = Инсталирайте пакета от командния ред:
+cargo.registry = Настройте този регистър в конфигурационния файл на Cargo (например ~/.cargo/config.toml
):
+cargo.install = За да инсталирате пакета с Cargo, изпълнете следната команда:
+details.documentation_site = Уебсайт на документацията
+arch.version.conflicts = В конфликт
+alpine.repository.branches = Клонове
+arch.pacman.repo.multi.item = Конфигурация за %s
[tool]
hours = %d часа
@@ -447,7 +598,7 @@ projects.template.desc = Шаблон
projects.card_type.text_only = Само текст
projects.card_type.images_and_text = Изображения и текст
wiki = Уики
-wiki.welcome = Добре дошли в Уикито.
+wiki.welcome = Добре дошли в уикито.
wiki.create_first_page = Създаване на първата страница
editor.upload_file = Качване на файл
projects.column.color = Цвят
@@ -598,7 +749,7 @@ settings.admin_settings = Администраторски настройки
issues.role.owner = Притежател
settings.transfer.title = Прехвърляне на притежанието
issues.author = Автор
-issues.closed_at = `затвори тази задача %[2]s`
+issues.closed_at = `затвори тази задача %s`
settings.collaborator_deletion_desc = Премахването на сътрудник ще отнеме достъпа му до това хранилище. Продължаване?
commits.message = Съобщение
issues.due_date_not_set = Няма зададен краен срок.
@@ -622,9 +773,9 @@ issues.filter_type.all_issues = Всички задачи
issues.filter_poster_no_select = Всички автори
issues.opened_by = отворена %[1]s от %[3]s
issues.action_open = Отваряне
-pulls.closed_at = `затвори тази заявка за сливане %[2]s`
-pulls.reopened_at = `отвори наново тази заявка за сливане %[2]s`
-issues.reopened_at = `отвори наново тази задача %[2]s`
+pulls.closed_at = `затвори тази заявка за сливане %s`
+pulls.reopened_at = `отвори наново тази заявка за сливане %s`
+issues.reopened_at = `отвори наново тази задача %s`
projects.column.edit = Редактиране на колоната
issues.close = Затваряне на задачата
issues.ref_reopened_from = `отвори наново тази задача %[4]s %[2]s`
@@ -644,7 +795,7 @@ milestones.filter_sort.latest_due_date = Най-далечен краен сро
diff.view_file = Преглед на файла
release.deletion_success = Изданието е изтрито.
projects.column.delete = Изтриване на колоната
-migrate.migrating = Мигриране от %s ...
+migrate.migrating = Мигриране от %s …
escape_control_characters = Екраниране
issues.label_deletion_success = Етикетът е изтрит.
pulls.is_closed = Заявката за сливане е затворена.
@@ -1025,7 +1176,7 @@ issues.content_history.edited = редактирано
pulls.title_desc_one = иска да слее %[1]d подаване от %[2]s
в %[3]s
pulls.showing_specified_commit_range = Показани са само промените между %[1]s..%[2]s
pulls.merged_title_desc_one = сля %[1]d подаване от %[2]s
в %[3]s
%[4]s
-pulls.no_merge_access = Не сте упълномощени за сливане на тази заявка за сливане.
+pulls.no_merge_access = Не сте упълномощени да слеете тази заявка за сливане.
activity.navbar.code_frequency = Честота на промените
activity.git_stats_pushed_1 = е изтласкал
activity.git_stats_push_to_branch = към %s и
@@ -1054,7 +1205,7 @@ issues.dependency.cancel = Отказ
issues.dependency.add_error_dep_exists = Зависимостта вече съществува.
issues.dependency.add_error_dep_not_exist = Зависимостта не съществува.
issues.remove_ref_at = `премахна препратката %s %s`
-issues.ref_pull_from = `спомена тази заявка за сливане %[4]s %[2]s`
+issues.ref_pull_from = `спомена тази заявка за сливане %[3]s %[1]s`
issues.dependency.pr_no_dependencies = Няма зададени зависимости.
issues.dependency.remove_info = Премахване на тази зависимост
issues.dependency.removed_dependency = `премахна зависимостта %s`
@@ -1079,11 +1230,11 @@ issues.dependency.title = Зависимости
issues.dependency.issue_no_dependencies = Няма зададени зависимости.
issues.dependency.pr_close_blocked = Трябва да затворите всички задачи, блокиращи тази заявка за сливане, преди да можете да я слеете.
issues.dependency.pr_close_blocks = Тази заявка за сливане блокира затварянето на следните задачи
-issues.ref_issue_from = `спомена тази задача %[4]s %[2]s`
-issues.commit_ref_at = `спомена тази задача в подаване %[2]s`
+issues.ref_issue_from = `спомена тази задача %[3]s %[1]s`
+issues.commit_ref_at = `спомена тази задача в подаване %s`
issues.add_ref_at = `добави препратка %s %s`
pulls.merged_info_text = Клонът %s вече може да бъде изтрит.
-pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %[2]s`
+pulls.commit_ref_at = `спомена тази заявка за сливане в подаване %s`
issues.change_ref_at = `промени препратката от alt
+ click/enter
, за да изключите етикети`
+migrate.migrating_failed = Мигрирането от %s е неуспешно.
+migrate.migrating_issues = Мигриране на задачи
+mirror_from = огледално на
+fork_from_self = Не можете да разклоните хранилище, което притежавате.
+commit_graph.hide_pr_refs = Скриване на заявките за сливане
+generated = Генерирано
+broken_message = Git данните, лежащи в основата на това хранилище, не могат да бъдат прочетени. Свържете се с администратора на тази инстанция или изтрийте това хранилище.
+editor.file_is_a_symlink = `„%s“ е символна връзка. Символните връзки не могат да се редактират в уеб редактора`
+commits.browse_further = Разглеждане нататък
+commits.older = По-стари
+form.reach_limit_of_creation_n = Притежателят вече е достигнал лимита от %d хранилища.
+issues.edit.already_changed = Неуспешно запазване на промените в задачата. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
+transfer.accept_desc = Прехвърляне към „%s“
+archive.title = Това хранилище е архивирано. Можете да преглеждате файлове и да го клонирате, но не можете да правите промени в състоянието му, като изтласкване и създаване на нови задачи, заявки за сливане или коментари.
+form.reach_limit_of_creation_1 = Притежателят вече е достигнал лимита от %d хранилище.
+editor.patching = Прилагане на кръпка:
+editor.fail_to_apply_patch = Неуспешно прилагане на кръпка „%s“
+commits.no_commits = Няма общи подавания. „%s“ и „%s“ имат напълно различни истории.
+migrate.migrating_pulls = Мигриране на заявки за сливане
+migrate.migrating_topics = Мигриране на теми
+projects.desc = Управлявайте задачи и заявки за сливане в проектни табла.
+issues.choose.invalid_templates = %v невалидни шаблона са намерени
+pulls.edit.already_changed = Неуспешно запазване на промените в заявката за сливане. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
+migrate.gitbucket.description = Мигриране на данни от GitBucket инстанции.
+migrate.migrating_git = Мигриране на Git данни
+commits.newer = По-нови
+issues.choose.blank_about = Създаване на задача от стандартен шаблон.
+issues.filter_no_results = Няма резултати
+issues.filter_no_results_placeholder = Опитайте да коригирате филтрите си за търсене.
+archive.nocomment = Коментирането не е възможно, тъй като хранилището е архивирано.
+migrate.gitlab.description = Мигриране на данни от gitlab.com или други GitLab инстанции.
+transfer.no_permission_to_accept = Нямате разрешение да приемете това прехвърляне.
+transfer.no_permission_to_reject = Нямате разрешение да отхвърлите това прехвърляне.
+editor.file_changed_while_editing = Съдържанието на файла е променено, откакто сте го отворили. Щракнете тук, за да го видите, или Подайте промените отново, за да ги презапишете.
+sync_fork.button = Синхронизиране
+migrate.onedev.description = Мигриране на данни от code.onedev.io или други OneDev инстанции.
+migrate.codebase.description = Мигриране на данни от codebasehq.com.
+migrate.migrating_labels = Мигриране на етикети
+migrate.migrating_releases = Мигриране на издания
+editor.push_rejected_no_message = Промяната беше отхвърлена от сървъра без съобщение. Моля, проверете Git куките.
+issues.choose.open_external_link = Отваряне
+comments.edit.already_changed = Неуспешно запазване на промените в коментара. Изглежда съдържанието вече е променено от друг потребител. Моля, презаредете страницата и опитайте да редактирате отново, за да избегнете презаписването на техните промени
+commits.nothing_to_compare = Тези клонове са равни.
+transfer.reject_desc = Отказ от прехвърляне към „%s“
+subscribe.pull.guest.tooltip = Влезте, за да се абонирате за тази заявка за сливане.
+commit.contained_in_default_branch = Това подаване е част от стандартния клон
+normal_view = Нормален изглед
+issues.context.menu = Меню за коментара
+form.name_reserved = Името на хранилището „%s“ е резервирано.
+need_auth = Упълномощаване
+subscribe.issue.guest.tooltip = Влезте, за да се абонирате за тази задача.
+commitstatus.pending = В очакване
+commitstatus.success = Успех
+editor.cannot_commit_to_protected_branch = Не може да се подава в защитения клон „%s“.
+editor.no_commit_to_branch = Не може да се подава директно в клона, защото:
+editor.push_rejected = Промяната беше отхвърлена от сървъра. Моля, проверете Git куките.
+cite_this_repo = Цитиране на това хранилище
+migrate.gitea.description = Мигриране на данни от gitea.com или други Gitea инстанции.
+editor.push_rejected_summary = Пълно съобщение на отхвърлянето:
+sync_fork.branch_behind_one = Този клон е %[1]d подаване зад %[2]s
+sync_fork.branch_behind_few = Този клон е %[1]d подавания зад %[2]s
+form.string_too_long = Даденият низ е по-дълъг от %d знака.
+editor.commit_id_not_matching = Файлът е променен, докато сте го редактирали. Подайте в нов клон и след това слейте.
+editor.user_no_push_to_branch = Потребителят не може да изтласква в клона
+archive.pull.noreview = Това хранилище е архивирано. Не можете да рецензирате заявки за сливане.
+migrate.migrating_failed.error = Неуспешно мигриране: %s
+migrate.github.description = Мигриране на данни от github.com или GitHub Enterprise сървър.
+migrate.forgejo.description = Мигриране на данни от codeberg.org или други Forgejo инстанции.
+migrate.gogs.description = Мигриране на данни от notabug.org или други Gogs инстанции.
+migrate.migrating_milestones = Мигриране на етапи
+migrate.failed = Мигрирането е неуспешно: %v
+pulls.nothing_to_compare_and_allow_empty_pr = Тези клонове са равни. Тази заявка за сливане ще бъде празна.
+pulls.has_pull_request = `Вече съществува заявка за сливане между тези клонове: %[2]s#%[3]d`
+pulls.is_checking = Проверката за конфликти при сливане е в ход. Опитайте отново след няколко минути.
+pulls.cannot_merge_work_in_progress = Тази заявка за сливане е отбелязана като в процес на работа.
+pulls.blocked_by_approvals = Тази заявка за сливане все още няма достатъчно одобрения. Дадени са %d от %d одобрения.
+pulls.blocked_by_rejection = Тази заявка за сливане има поискани промени от официален рецензент.
+pulls.waiting_count_1 = %d чакаща рецензия
+pulls.status_checks_requested = Задължително
+pulls.update_branch_success = Обновяването на клона е успешно
+pulls.cannot_auto_merge_helper = Слейте ръчно, за да разрешите конфликтите.
+migrate.clone_address_desc = HTTP(S) или Git „clone“ URL на съществуващо хранилище
+pulls.add_prefix = Добавете префикс %s
+pulls.merge_pull_request = Създаване на подаване със сливане
+pulls.waiting_count_n = %d чакащи рецензии
+pulls.is_ancestor = Този клон вече е включен в целевия клон. Няма какво да се слива.
+pulls.required_status_check_missing = Някои задължителни проверки липсват.
+pulls.change_target_branch_at = `промени целевия клон от %s на %s %s`
+issues.time_spent_total = Общо изразходвано време
+issues.del_time_history = `изтри изразходваното време %s`
+pulls.nothing_to_compare_have_tag = Избраните клон/маркер са равни.
+pulls.cannot_auto_merge_desc = Тази заявка за сливане не може да бъде слята автоматично поради конфликти.
+issues.tracker_auto_close = Таймерът ще бъде спрян автоматично, когато тази задача бъде затворена
+issues.force_push_codes = `изтласка принудително %[1]s от %[2]s
към %[4]s
%[6]s`
+pulls.blocked_by_official_review_requests = Тази заявка за сливане е блокирана, защото липсва одобрение от един или повече официални рецензенти.
+issues.tracker = Проследяване на времето
+issues.add_time_history = `добави изразходвано време %s`
+migrate.repo_desc_helper = Оставете празно, за да внесете съществуващото описание
+migrate.git.description = Мигриране само на хранилище от всяка Git услуга.
+mirror_sync = синхронизирано
+migrate_repo = Мигриране на хранилище
+migrate_options = Опции за мигрирането
+editor.fork_before_edit = Трябва да разклоните това хранилище, за да направите или предложите промени в този файл.
+editor.must_have_write_access = Трябва да имате право на запис, за да правите или предлагате промени в този файл.
+editor.new_branch_name = Дайте име на новия клон за това подаване
+editor.invalid_commit_mail = Невалидна ел. поща за създаване на подаване.
+pulls.required_status_check_failed = Някои задължителни проверки не са успешни.
+issues.time_spent_from_all_authors = `Общо изразходвано време: %s`
+issues.attachment.download = `Щракнете, за да изтеглите „%s“`
+issues.attachment.open_tab = `Щракнете, за да видите „%s“ в нов раздел`
+pulls.update_branch = Обновяване на клона чрез сливане
+migrate_items = Елементи за мигриране
+commit.load_referencing_branches_and_tags = Зареждане на клонове и маркери, препращащи към това подаване
+pulls.files_conflicted = Тази заявка за сливане има промени, които са в конфликт с целевия клон.
+pulls.still_in_progress = Все още е в процес на работа?
+pulls.ready_for_review = Готово е за рецензиране?
+pulls.is_empty = Промените в този клон вече са в целевия клон. Това ще бъде празно подаване.
+issues.start_tracking = Започване на проследяване на времето
+migrate_options_mirror_helper = Това хранилище ще бъде огледално
+migrate_options_lfs = Мигриране на LFS файлове
+editor.upload_file_is_locked = Файлът „%s“ е заключен от %s.
+issues.tracking_already_started = `Вече сте започнали проследяване на времето по друга задача!`
+pulls.remove_prefix = Премахнете префикса %s
+author_search_tooltip = Показва максимум 30 потребители
+migrate.migrating_failed_no_addr = Мигрирането е неуспешно.
+issues.force_push_compare = Сравняване
+pulls.status_checking = Някои проверки са в очакване
+pulls.nothing_to_compare = Тези клонове са равни. Не е нужно да създавате заявка за сливане.
[modal]
confirm = Потвърждаване
@@ -1319,6 +1604,11 @@ table_modal.placeholder.content = Съдържание
table_modal.placeholder.header = Заглавка
buttons.new_table.tooltip = Добавяне на таблица
table_modal.header = Добавяне на таблица
+link_modal.description = Описание
+link_modal.header = Добавяне на връзка
+buttons.indent.tooltip = Вмъкване на елементи с едно ниво
+buttons.unindent.tooltip = Изваждане на елементи с едно ниво
+link_modal.paste_reminder = Подсказка: С URL адрес в клипборда можете да поставите директно в редактора, за да създадете връзка.
[org]
teams.write_access = Писане
@@ -1393,11 +1683,12 @@ members.private_helper = Да е видим
teams.no_desc = Този екип няма описание
settings.delete_org_desc = Тази организация ще бъде изтрита перманентно. Продължаване?
open_dashboard = Отваряне на таблото
+settings.change_orgname_prompt = Бележка: Промяната на името на организацията ще промени и URL адреса на вашата организация и ще освободи старото име.
[install]
admin_password = Парола
user = Потребителско име
-admin_email = Адрес на ел. поща
+admin_email = Адрес за ел. поща
path = Път
password = Парола
host = Хост
@@ -1427,13 +1718,17 @@ admin_title = Настройки на администраторския ака
err_empty_admin_password = Администраторската парола не може да бъде празна.
docker_helper = Ако стартирате Forgejo в Docker, моля, прочетете документацията преди да промените настройки.
sqlite_helper = Път на файла за SQLite3 базата данни.Package.swift
-fil:
-settings.link.select = Vælg Depot
-settings.link.button = Opdater Depot Link
+settings.link.select = Vælg depot
+settings.link.button = Opdater depot link
settings.link.error = Kunne ikke opdatere depotlinket.
owner.settings.cargo.initialize.success = Cargo-indekset blev oprettet.
owner.settings.cargo.rebuild.description = Genopbygning kan være nyttig, hvis indekset ikke er synkroniseret med de lagrede Cargo-pakker.
diff --git a/options/locale/locale_de-DE.ini b/options/locale/locale_de-DE.ini
index ed27d53014..f8bfc9258a 100644
--- a/options/locale/locale_de-DE.ini
+++ b/options/locale/locale_de-DE.ini
@@ -745,7 +745,7 @@ social=Soziale Konten
applications=Anwendungen
orgs=Organisationen
repos=Repositorys
-delete=Konto löschen
+delete=Account löschen
twofa=Zwei-Faktor-Authentifizierung (TOTP)
account_link=Verknüpfte Benutzerkonten
organization=Organisationen
@@ -1511,7 +1511,7 @@ projects.card_type.images_and_text=Bilder und Text
projects.card_type.text_only=Nur Text
issues.desc=Verwalte Bug-Reports, Aufgaben und Meilensteine.
-issues.filter_assignees=Filter
+issues.filter_assignees=Verantwortliche filtern
issues.filter_milestones=Meilenstein filtern
issues.filter_projects=Projekt filtern
issues.filter_labels=Label filtern
@@ -1577,7 +1577,7 @@ issues.remove_ref_at=`hat die Referenz %s %s entfernt`
issues.add_ref_at=`hat die Referenz %s %s hinzugefügt`
issues.delete_branch_at=`löschte den Branch %s %s`
issues.filter_label=Label
-issues.filter_label_exclude=`Alt
+ Klick/Enter
verwenden, um Labels auszuschließen`
+issues.filter_label_exclude=`Verwende Alt + Klick/Enter, um Labels auszuschließen`
issues.filter_label_no_select=Alle Labels
issues.filter_label_select_no_label=Kein Label
issues.filter_milestone=Meilenstein
@@ -1651,13 +1651,13 @@ issues.close_comment_issue=Mit Kommentar schließen
issues.reopen_issue=Wieder öffnen
issues.reopen_comment_issue=Mit Kommentar wieder öffnen
issues.create_comment=Kommentieren
-issues.closed_at=`hat diesen Issue %[2]s geschlossen`
-issues.reopened_at=`hat dieses Issue %[2]s wieder geöffnet`
-issues.commit_ref_at=`hat dieses Issue %[2]s aus einem Commit referenziert`
-issues.ref_issue_from=`hat %[2]s auf dieses Issue verwiesen %[4]s`
-issues.ref_pull_from=`hat %[2]s auf diesen Pull-Request verwiesen %[4]s`
-issues.ref_closing_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es schließen wird`
-issues.ref_reopening_from=`hat %[2]s in einem Pull-Request %[4]s auf dieses Issue verwiesen, welcher es erneut öffnen wird`
+issues.closed_at=`hat dieses Issue %s geschlossen`
+issues.reopened_at=`hat dieses Issue %s wieder geöffnet`
+issues.commit_ref_at=`hat dieses Issue %s aus einem Commit referenziert`
+issues.ref_issue_from=`hat %[1]s auf dieses Issue verwiesen %[3]s`
+issues.ref_pull_from=`referenzierte diesen Pull-Request %[3]s %[1]s`
+issues.ref_closing_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es schließen wird, %[1]s`
+issues.ref_reopening_from=`referenzierte dieses Issue aus einem Pull-Request %[3]s der es wieder öffnen wird, %[1]s`
issues.ref_closed_from=`hat dieses Issue %[4]s geschlossen %[2]s`
issues.ref_reopened_from=`hat dieses Issue %[4]s %[2]s wieder geöffnet`
issues.ref_from=`von %[1]s`
@@ -1962,8 +1962,8 @@ pulls.update_branch_success=Branch-Aktualisierung erfolgreich
pulls.update_not_allowed=Du hast keine Berechtigung, den Branch zu updaten
pulls.outdated_with_base_branch=Dieser Branch enthält nicht die neusten Commits des Basis-Branches
pulls.close=Pull-Request schließen
-pulls.closed_at=`hat diesen Pull-Request %[2]s geschlossen`
-pulls.reopened_at=`hat diesen Pull-Request %[2]s wieder geöffnet`
+pulls.closed_at=`hat diesen Pull-Request %s geschlossen`
+pulls.reopened_at=`hat diesen Pull-Request %s wieder geöffnet`
pulls.clear_merge_message=Merge-Nachricht löschen
pulls.clear_merge_message_hint=Das Löschen der Merge-Nachricht wird nur den Inhalt der Commit-Nachricht entfernen und generierte Git-Trailer wie „Co-Authored-By …“ erhalten.
@@ -2767,7 +2767,7 @@ settings.wiki_globally_editable = Allen erlauben, das Wiki zu bearbeiten
settings.protect_branch_name_pattern_desc = Geschützte Branch-Namens-Patterns. Siehe die Dokumentation für Pattern-Syntax. Beispiele: main, release/**
settings.ignore_stale_approvals = Abgestandene Genehmigungen ignorieren
settings.ignore_stale_approvals_desc = Genehmigungen, welche für ältere Commits gemacht wurden (abgestandene Reviews), nicht in die Gesamtzahl der Genehmigung des PRs mitzählen. Irrelevant, falls abgestandene Reviews bereits verworfen werden.
-pulls.commit_ref_at = `hat sich auf diesen Pull-Request von einem Commit %[2]s bezogen`
+pulls.commit_ref_at = `referenzierte diesen Pull-Request aus einem Commit %s`
pulls.fast_forward_only_merge_pull_request = Nur Fast-forward
pulls.cmd_instruction_checkout_desc = Checke einen neuen Branch aus deinem Projekt-Repository aus und teste die Änderungen.
pulls.cmd_instruction_merge_title = Zusammenführen
@@ -2917,6 +2917,14 @@ comment.blocked_by_user = Kommentieren ist nicht möglich, da du vom Repository-
sync_fork.branch_behind_one = Dieser Branch ist %[1]d Commit hinter %[2]s
sync_fork.branch_behind_few = Dieser Branch ist %[1]d Commits hinter %[2]s
sync_fork.button = Sync
+settings.event_action_failure_desc = Action-Run endete im Fehlschlag.
+settings.event_action_success_desc = Action-Run war erfolgreich.
+settings.event_action_failure = Fehlschlag
+settings.event_action_success = Erfolg
+settings.event_header_action = Action-Run-Ereignisse
+settings.event_action_recover_desc = Action-Run war erfolgreich, nachdem der letzte Action-Run im selben Arbeitsablauf fehlgeschlagen ist.
+settings.event_action_recover = Wiederherstellen
+issues.filter_type.all_pull_requests = Alle Pull-Requests
[graphs]
component_loading_failed = Konnte %s nicht laden
@@ -3053,8 +3061,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 Organisationsname ist nach einer Abkühldauer von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen.
-settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Abkühldauer von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Abkühldauer erneut beanspruchen.
+settings.change_orgname_redirect_prompt.with_cooldown.one = Der alte Organisationsname ist nach einer Schutzzeit von einem Tag wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Der alte Organisationsname ist nach einer Schutzzeit von %[1]d Tagen wieder für alle verfügbar. Du kannst den alten Namen während dieser Schutzzeit erneut beanspruchen.
[admin]
dashboard=Übersicht
@@ -4031,7 +4039,7 @@ repo_kind = Repos suchen …
user_kind = Benutzer suchen …
org_kind = Orgs suchen …
team_kind = Teams suchen …
-code_kind = Code suchen…
+code_kind = Code durchsuchen …
package_kind = Pakete suchen …
project_kind = Projekte suchen …
branch_kind = Branches suchen …
diff --git a/options/locale/locale_el-GR.ini b/options/locale/locale_el-GR.ini
index 4b1f19e295..398a0d9ce4 100644
--- a/options/locale/locale_el-GR.ini
+++ b/options/locale/locale_el-GR.ini
@@ -112,7 +112,7 @@ preview=Προεπισκόπηση
loading=Φόρτωση…
error=Σφάλμα
-error404=Η σελίδα που προσπαθείτε να φτάσετε είτε δεν υπάρχει είτε δεν είστε εξουσιοδοτημένοι για να την δείτε.
+error404=Η σελίδα που προσπαθείτε να φτάσετε είτε δεν υπάρχει, έχει αφαιρεθεί είτε δεν είστε εξουσιοδοτημένοι για να την δείτε.
go_back=Επιστροφή
never=Ποτέ
@@ -1626,13 +1626,13 @@ issues.close_comment_issue=Αποστολή σχολίου και κλείσιμ
issues.reopen_issue=Ανοίξτε ξανά
issues.reopen_comment_issue=Αποστολή σχολίου και επανάνοιγμα ζητήματος
issues.create_comment=Προσθήκη Σχολίου
-issues.closed_at=`αυτό το ζήτημα έκλεισε %[2]s`
-issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %[2]s`
-issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %[2]s`
-issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[4]s %[2]s`
-issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[4]s %[2]s`
-issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[4]s που στοχεύει να κλείσει το ζήτημα %[2]s`
-issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[4]s που θα ξαναανοίξει αυτό το ζήτημα %[2]s`
+issues.closed_at=`αυτό το ζήτημα έκλεισε %s`
+issues.reopened_at=`ξανά άνοιξε αυτό το ζήτημα %s`
+issues.commit_ref_at=`αναφορά σε αυτό το ζήτημα από την παραπομπή %s`
+issues.ref_issue_from=`αναφέρθηκε σε αυτό το ζήτημα %[3]s %[1]s`
+issues.ref_pull_from=`αναφέρθηκε σε αυτό το pull request %[3]s %[1]s`
+issues.ref_closing_from=`ανέφερε αυτό το ζήτημα σε ένα pull request %[3]s που στοχεύει να κλείσει το ζήτημα %[1]s`
+issues.ref_reopening_from=`αναφέρθηκε σε αυτό το ζήτημα σε ένα pull request %[3]s που θα ξαναανοίξει αυτό το ζήτημα %[1]s`
issues.ref_closed_from=`έκλεισε αυτό το ζήτημα %[4]s %[2]s`
issues.ref_reopened_from=`άνοιξε ξανά αυτό το ζήτημα %[4]s %[2]s`
issues.ref_from=`από %[1]s`
@@ -1939,8 +1939,8 @@ pulls.update_branch_success=Η ενημέρωση του κλάδου ήταν
pulls.update_not_allowed=Δεν επιτρέπεται να ενημερώσετε τον κλάδο
pulls.outdated_with_base_branch=Αυτός ο κλάδος δεν είναι ενημερωμένος με τον βασικό κλάδο
pulls.close=Κλείσιμο pull request
-pulls.closed_at=`έκλεισε αυτό το pull request %[2]s`
-pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %[2]s`
+pulls.closed_at=`έκλεισε αυτό το pull request %s`
+pulls.reopened_at=`άνοιξε ξανά αυτό το pull request %s`
pulls.cmd_instruction_hint=Προβολή οδηγιών γραμμής εντολών
pulls.cmd_instruction_checkout_title=Έλεγχος
pulls.cmd_instruction_checkout_desc=Από το repository του έργου σας, ελέγξτε έναν νέο κλάδο και δοκιμάστε τις αλλαγές.
@@ -2720,7 +2720,7 @@ settings.new_owner_blocked_doer = Ο νέος κάτοχος του αποθετ
settings.enter_repo_name = Γράψτε το όνομα του κατόχου και του αποθετηρίου ακριβώς όπως το βλέπετε:
settings.confirmation_string = Κείμενο επιβεβαίωσης
settings.units.overview = Επισκόπηση
-pulls.commit_ref_at = `ανέφερε το pull request στο commit %[2]s`
+pulls.commit_ref_at = `ανέφερε το pull request στο commit %s`
contributors.contribution_type.filter_label = Είδος συνεισφοράς:
settings.wiki_rename_branch_main_notices_1 = Αυτή η ενέργεια ΔΕΝ αναιρείται.
activity.navbar.contributors = Συνεισφέροντες
@@ -3941,29 +3941,29 @@ code_search_unavailable = Η αναζήτηση κώδικα δεν είναι
keyword_search_unavailable = Η αναζήτηση με την χρήση λέξεων-κλειδιών δεν είναι επί του παρόντος διαθέσιμη. Παρακαλώ επικοινωνήστε με τον διαχειριστή σας.
runner_kind = Αναζήτηση runner...
code_search_by_git_grep = Για την αναζήτηση κώδικα, χρησιμοποιείται η εντολή «git grep». Ίσως να παρουσιαστούν καλύτερα αποτελέσματα, αν ο διαχειριστής σας ενεργοποιήσει ένα ευρετήριο για αποθετήρια («Repository Indexer»).
-package_kind = Αναζήτηση πακέτων...
+package_kind = Αναζήτηση πακέτων…
project_kind = Αναζήτηση έργων...
-branch_kind = Αναζήτηση κλάδων...
+branch_kind = Αναζήτηση κλάδων…
commit_kind = Αναζήτηση commit...
no_results = Δεν βρέθηκαν κατάλληλα αποτελέσματα.
-search = Αναζήτηση...
+search = Αναζήτηση…
type_tooltip = Είδος αναζήτησης
fuzzy = Στο περίπου
fuzzy_tooltip = Να συμπεριληφθούν αποτελέσματα που μοιάζουν με τον όρο αναζήτησης
match = Ακριβής
match_tooltip = Να συμπεριληφθούν αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης
-repo_kind = Αναζήτηση αποθετηρίων...
-user_kind = Αναζήτηση χρηστών...
-org_kind = Αναζήτηση οργανισμών...
-team_kind = Αναζήτηση ομαδών...
-code_kind = Αναζήτηση κώδικα...
+repo_kind = Αναζήτηση αποθετηρίων…
+user_kind = Αναζήτηση χρηστών…
+org_kind = Αναζήτηση οργανισμών…
+team_kind = Αναζήτηση ομαδών…
+code_kind = Αναζήτηση κώδικα…
exact_tooltip = Να συμπεριληφθούν μόνο αποτελέσματα που ταιριάζουν με τον όρο αναζήτησης
issue_kind = Αναζήτηση ζητημάτων...
pull_kind = Αναζήτηση pull...
exact = Ακριβής
milestone_kind = Αναζήτηση ορόσημων...
union = Ένωση
-union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις που έχουν εισαχθεί και διαχωριστεί με κενό
+union_tooltip = Να συμπεριληφθούν αποτελέσματα που περιέχουν οποιαδήποτε από τις λέξεις χωρισμένες με κενό
regexp = Κανονική Έκφραση
regexp_tooltip = Ερμηνεία του όρου αναζήτησης ως κανονική έκφραση
diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini
index 856e070efb..5fd2ebd163 100644
--- a/options/locale/locale_en-US.ini
+++ b/options/locale/locale_en-US.ini
@@ -7,9 +7,9 @@ logo = Logo
sign_in = Sign in
sign_in_with_provider = Sign in with %s
sign_in_or = or
-sign_out = Sign Out
+sign_out = Sign out
sign_up = Register
-link_account = Link Account
+link_account = Link account
register = Register
version = Version
powered_by = Powered by %s
@@ -740,7 +740,7 @@ ssh_gpg_keys = SSH / GPG keys
applications = Applications
orgs = Organizations
repos = Repositories
-delete = Delete Account
+delete = Delete account
twofa = Two-factor authentication (TOTP)
organization = Organizations
uid = UID
@@ -768,8 +768,8 @@ update_profile_success = Your profile has been updated.
change_username = Your username has been changed.
change_username_prompt = Note: Changing your username also changes your account URL.
change_username_redirect_prompt = The old username will redirect until someone claims it.
-change_username_redirect_prompt.with_cooldown.one = The old username will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old username during the cooldown period.
-change_username_redirect_prompt.with_cooldown.few = The old username will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old username during the cooldown period.
+change_username_redirect_prompt.with_cooldown.one = The old username will be available to everyone after a cooldown period of %[1]d day. You can still reclaim the old username during the cooldown period.
+change_username_redirect_prompt.with_cooldown.few = The old username will be available to everyone after a cooldown period of %[1]d days. You can still reclaim the old username during the cooldown period.
continue = Continue
cancel = Cancel
language = Language
@@ -1540,11 +1540,11 @@ projects.card_type.images_and_text = Images and text
projects.card_type.text_only = Text only
issues.desc = Organize bug reports, tasks and milestones.
-issues.filter_assignees = Filter Assignee
-issues.filter_milestones = Filter Milestone
-issues.filter_projects = Filter Project
-issues.filter_labels = Filter Label
-issues.filter_reviewers = Filter Reviewer
+issues.filter_assignees = Filter assignee
+issues.filter_milestones = Filter milestone
+issues.filter_projects = Filter project
+issues.filter_labels = Filter label
+issues.filter_reviewers = Filter reviewer
issues.filter_no_results = No results
issues.filter_no_results_placeholder = Try adjusting your search filters.
issues.new = New issue
@@ -1610,7 +1610,7 @@ issues.remove_ref_at = `removed reference %s %s`
issues.add_ref_at = `added reference %s %s`
issues.delete_branch_at = `deleted branch %s %s`
issues.filter_label = Label
-issues.filter_label_exclude = `Use alt
+ click/enter
to exclude labels`
+issues.filter_label_exclude = Use Alt + Click to exclude labels
issues.filter_label_no_select = All labels
issues.filter_label_select_no_label = No label
issues.filter_milestone = Milestone
@@ -1628,6 +1628,7 @@ issues.filter_poster = Author
issues.filter_poster_no_select = All authors
issues.filter_type = Type
issues.filter_type.all_issues = All issues
+issues.filter_type.all_pull_requests = All pull requests
issues.filter_type.assigned_to_you = Assigned to you
issues.filter_type.created_by_you = Created by you
issues.filter_type.mentioning_you = Mentioning you
@@ -1693,15 +1694,13 @@ issues.close_comment_issue = Close with comment
issues.reopen_issue = Reopen
issues.reopen_comment_issue = Reopen with comment
issues.create_comment = Comment
-issues.closed_at = `closed this issue %[2]s`
-issues.reopened_at = `reopened this issue %[2]s`
-issues.commit_ref_at = `referenced this issue from a commit %[2]s`
-issues.ref_issue_from = `referenced this issue %[4]s %[2]s`
-issues.ref_pull_from = `referenced this pull request %[4]s %[2]s`
-issues.ref_closing_from = `referenced this issue from a pull request %[4]s that will close it, %[2]s`
-issues.ref_reopening_from = `referenced this issue from a pull request %[4]s that will reopen it, %[2]s`
-issues.ref_closed_from = `closed this issue %[4]s %[2]s`
-issues.ref_reopened_from = `reopened this issue %[4]s %[2]s`
+issues.closed_at = `closed this issue %s`
+issues.reopened_at = `reopened this issue %s`
+issues.commit_ref_at = `referenced this issue from a commit %s`
+issues.ref_issue_from = `referenced this issue %[3]s %[1]s`
+issues.ref_pull_from = `referenced this pull request %[3]s %[1]s`
+issues.ref_closing_from = `referenced this issue from a pull request %[3]s that will close it, %[1]s`
+issues.ref_reopening_from = `referenced this issue from a pull request %[3]s that will reopen it, %[1]s`
issues.ref_from = `from %[1]s`
issues.author = Author
issues.author.tooltip.issue = This user is the author of this issue.
@@ -2013,9 +2012,9 @@ pulls.update_branch_success = Branch update was successful
pulls.update_not_allowed = You are not allowed to update branch
pulls.outdated_with_base_branch = This branch is out-of-date with the base branch
pulls.close = Close pull request
-pulls.closed_at = `closed this pull request %[2]s`
-pulls.reopened_at = `reopened this pull request %[2]s`
-pulls.commit_ref_at = `referenced this pull request from a commit %[2]s`
+pulls.closed_at = `closed this pull request %s`
+pulls.reopened_at = `reopened this pull request %s`
+pulls.commit_ref_at = `referenced this pull request from a commit %s`
pulls.cmd_instruction_hint = View command line instructions
pulls.cmd_instruction_checkout_title = Checkout
pulls.cmd_instruction_checkout_desc = From your project repository, check out a new branch and test the changes.
@@ -2106,7 +2105,7 @@ signing.wont_sign.not_signed_in = You are not signed in.
ext_wiki = External Wiki
wiki = Wiki
-wiki.welcome = Welcome to the Wiki.
+wiki.welcome = Welcome to the wiki.
wiki.welcome_desc = The wiki lets you write and share documentation with collaborators.
wiki.desc = Write and share documentation with collaborators.
wiki.create_first_page = Create the first page
@@ -2389,7 +2388,7 @@ settings.add_collaborator_duplicate = The collaborator is already added to this
settings.add_collaborator_blocked_our = Cannot add the collaborator, because the repository owner has blocked them.
settings.add_collaborator_blocked_them = Cannot add the collaborator, because they have blocked the repository owner.
settings.delete_collaborator = Remove
-settings.collaborator_deletion = Remove Collaborator
+settings.collaborator_deletion = Remove collaborator
settings.collaborator_deletion_desc = Removing a collaborator will revoke their access to this repository. Continue?
settings.remove_collaborator_success = The collaborator has been removed.
settings.org_not_allowed_to_be_collaborator = Organizations cannot be added as a collaborator.
@@ -2486,6 +2485,13 @@ settings.event_pull_request_review_request_desc = Pull request review requested
settings.event_pull_request_approvals = Pull request approvals
settings.event_pull_request_merge = Pull request merge
settings.event_pull_request_enforcement = Enforcement
+settings.event_header_action = Action Run events
+settings.event_action_failure = Failure
+settings.event_action_failure_desc = Action Run ended as failure.
+settings.event_action_recover = Recover
+settings.event_action_recover_desc = Action Run succeeded after last Action Run in the same workflow failed.
+settings.event_action_success = Success
+settings.event_action_success_desc = Action Run succeeded.
settings.event_package = Package
settings.event_package_desc = Package created or deleted in a repository.
settings.branch_filter = Branch filter
@@ -2645,36 +2651,36 @@ settings.unarchive.text = Unarchiving the repo will restore its ability to recei
settings.unarchive.success = The repo was successfully unarchived.
settings.unarchive.error = An error occurred while trying to unarchive the repo. See the log for more details.
settings.update_avatar_success = The repository avatar has been updated.
-settings.lfs=LFS
-settings.lfs_filelist=LFS files stored in this repository
-settings.lfs_no_lfs_files=No LFS files stored in this repository
-settings.lfs_findcommits=Find commits
-settings.lfs_lfs_file_no_commits=No commits found for this LFS file
-settings.lfs_noattribute=This path does not have the lockable attribute in the default branch
-settings.lfs_delete=Delete LFS file with OID %s
-settings.lfs_delete_warning=Deleting an LFS file may cause "object does not exist" errors on checkout. Are you sure?
-settings.lfs_findpointerfiles=Find pointer files
-settings.lfs_locks=Locks
-settings.lfs_invalid_locking_path=Invalid path: %s
-settings.lfs_invalid_lock_directory=Cannot lock directory: %s
-settings.lfs_lock_already_exists=Lock already exists: %s
-settings.lfs_lock=Lock
-settings.lfs_lock_path=Filepath to lock…
-settings.lfs_locks_no_locks=No locks
-settings.lfs_lock_file_no_exist=Locked file does not exist in default branch
-settings.lfs_force_unlock=Force unlock
-settings.lfs_pointers.found=Found %d blob pointer(s) - %d associated, %d unassociated (%d missing from store)
-settings.lfs_pointers.sha=Blob hash
-settings.lfs_pointers.oid=OID
-settings.lfs_pointers.inRepo=In repo
-settings.lfs_pointers.exists=Exists in store
-settings.lfs_pointers.accessible=Accessible to user
-settings.lfs_pointers.associateAccessible=Associate accessible %d OIDs
-settings.rename_branch_failed_protected=Cannot rename branch %s because it is a protected branch.
-settings.rename_branch_failed_exist=Cannot rename branch because target branch %s exists.
-settings.rename_branch_failed_not_exist=Cannot rename branch %s because it does not exist.
-settings.rename_branch_success =Branch %s was successfully renamed to %s.
-settings.rename_branch=Rename branch
+settings.lfs = LFS
+settings.lfs_filelist = LFS files stored in this repository
+settings.lfs_no_lfs_files = No LFS files stored in this repository
+settings.lfs_findcommits = Find commits
+settings.lfs_lfs_file_no_commits = No commits found for this LFS file
+settings.lfs_noattribute = This path does not have the lockable attribute in the default branch
+settings.lfs_delete = Delete LFS file with OID %s
+settings.lfs_delete_warning = Deleting an LFS file may cause "object does not exist" errors on checkout. Are you sure?
+settings.lfs_findpointerfiles = Find pointer files
+settings.lfs_locks = Locks
+settings.lfs_invalid_locking_path = Invalid path: %s
+settings.lfs_invalid_lock_directory = Cannot lock directory: %s
+settings.lfs_lock_already_exists = Lock already exists: %s
+settings.lfs_lock = Lock
+settings.lfs_lock_path = Filepath to lock…
+settings.lfs_locks_no_locks = No locks
+settings.lfs_lock_file_no_exist = Locked file does not exist in default branch
+settings.lfs_force_unlock = Force unlock
+settings.lfs_pointers.found = Found %d blob pointer(s) - %d associated, %d unassociated (%d missing from store)
+settings.lfs_pointers.sha = Blob hash
+settings.lfs_pointers.oid = OID
+settings.lfs_pointers.inRepo = In repo
+settings.lfs_pointers.exists = Exists in store
+settings.lfs_pointers.accessible = Accessible to user
+settings.lfs_pointers.associateAccessible = Associate accessible %d OIDs
+settings.rename_branch_failed_protected = Cannot rename branch %s because it is a protected branch.
+settings.rename_branch_failed_exist = Cannot rename branch because target branch %s exists.
+settings.rename_branch_failed_not_exist = Cannot rename branch %s because it does not exist.
+settings.rename_branch_success = Branch %s was successfully renamed to %s.
+settings.rename_branch = Rename branch
diff.browse_source = Browse source
diff.parent = parent
@@ -2925,8 +2931,8 @@ settings.update_settings = Update settings
settings.update_setting_success = Organization settings have been updated.
settings.change_orgname_prompt = Note: Changing the organization name will also change your organization's URL and free the old name.
settings.change_orgname_redirect_prompt = The old name will redirect until it is claimed.
-settings.change_orgname_redirect_prompt.with_cooldown.one = The old organization name will be available to everyone after a cooldown period of %[1]d day, you can still reclaim the old name during the cooldown period.
-settings.change_orgname_redirect_prompt.with_cooldown.few = The old organization name will be available to everyone after a cooldown period of %[1]d days, you can still reclaim the old name during the cooldown period.
+settings.change_orgname_redirect_prompt.with_cooldown.one = The old organization name will be available to everyone after a cooldown period of %[1]d day. You can still reclaim the old name during the cooldown period.
+settings.change_orgname_redirect_prompt.with_cooldown.few = The old organization name will be available to everyone after a cooldown period of %[1]d days. You can still reclaim the old name during the cooldown period.
settings.update_avatar_success = The organization's avatar has been updated.
settings.delete = Delete organization
settings.delete_account = Delete this organization
@@ -2978,8 +2984,6 @@ teams.invite_team_member.list = Pending invitations
teams.delete_team_title = Delete team
teams.delete_team_desc = Deleting a team revokes repository access from its members. Continue?
teams.delete_team_success = The team has been deleted.
-teams.read_permission_desc = This team grants Read access: members can view and clone team repositories.
-teams.write_permission_desc = This team grants Write access: members can read from and push to team repositories.
teams.admin_permission_desc = This team grants Administrator access: members can read from, push to and add collaborators to team repositories.
teams.create_repo_permission_desc = Additionally, this team grants Create repository permission: members can create new repositories in organization.
teams.repositories = Team repositories
@@ -3777,8 +3781,8 @@ swift.install2 = and run the following command:
vagrant.install = To add a Vagrant box, run the following command:
settings.link = Link this package to a repository
settings.link.description = If you link a package with a repository, the package is listed in the repository's package list.
-settings.link.select = Select Repository
-settings.link.button = Update Repository Link
+settings.link.select = Select repository
+settings.link.button = Update repository link
settings.link.success = Repository link was successfully updated.
settings.link.error = Failed to update repository link.
settings.delete = Delete package
@@ -3824,7 +3828,7 @@ owner.settings.chef.keypair.description = Requests sent to the Chef registry mus
secrets = Secrets
description = Secrets will be passed to certain actions and cannot be read otherwise.
none = There are no secrets yet.
-creation = Add Secret
+creation = Add secret
creation.name_placeholder = case-insensitive, alphanumeric characters or underscores only, cannot start with GITEA_ or GITHUB_
creation.value_placeholder = Input any content. Whitespace at the start and end will be omitted.
creation.success = The secret "%s" has been added.
@@ -3866,7 +3870,7 @@ runners.task_list.run = Run
runners.task_list.status = Status
runners.task_list.repository = Repository
runners.task_list.commit = Commit
-runners.task_list.done_at = Done At
+runners.task_list.done_at = Done at
runners.edit_runner = Edit Runner
runners.update_runner = Update changes
runners.update_runner_success = Runner updated successfully
@@ -3939,7 +3943,7 @@ variables.update.failed = Failed to edit variable.
variables.update.success = The variable has been edited.
[projects]
-deleted.display_name = Deleted Project
+deleted.display_name = Deleted project
type-1.display_name = Individual project
type-2.display_name = Repository project
type-3.display_name = Organization project
diff --git a/options/locale/locale_eo.ini b/options/locale/locale_eo.ini
index e4fb8cdbc7..6393765d63 100644
--- a/options/locale/locale_eo.ini
+++ b/options/locale/locale_eo.ini
@@ -103,7 +103,7 @@ ok = Bone
download_logs = Elsuti protokolojn
unknown = Nekonata
issues = Eraroj
-error404 = Aŭ tiu ĉi paĝo ne ekzistas aŭ vi ne rajtas vidi ĝin.
+error404 = Aŭ tiu ĉi paĝo ne ekzistas, estis forigita aŭ vi ne rajtas vidi ĝin.
retry = Reprovi
activities = Aktivecoj
confirm_delete_selected = Konfirmi forigon de ĉiu elektito?
@@ -171,6 +171,7 @@ table_modal.placeholder.header = Kapo
table_modal.placeholder.content = Enhavo
table_modal.label.rows = Horizontaloj
table_modal.label.columns = Vertikaloj
+link_modal.description = Priskribo
[aria]
navbar = Esplora breto
@@ -523,6 +524,7 @@ totp_enrolled.text_1.has_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio
totp_enrolled.text_1.no_webauthn = Vi ĵus aktivigis TOTP-n por via konto. Tio volas diri ke por ĉiuj venontaj salutoj al via konto, vi devos uzi TOTP-n kiel 2FA metodo.
removed_security_key.no_2fa = Ne estas aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti.
totp_disabled.no_2fa = Ne estas plu aliaj 2FA agorditaj metodoj, tio estas ke ne plus necesas uzi 2FA-n por saluti.
+account_security_caution.text_1 = Se tio estis vi, vi povas sekure ignori ĉi tiun retmesaĝon.
[form]
TeamName = Gruponomo
@@ -861,30 +863,30 @@ npm.details.tag = Etikedo
[search]
-search = Serĉi...
+search = Serĉi…
regexp = RegEsp
milestone_kind = Serĉi celojn...
code_search_by_git_grep = Nunaj rezultoj de kodoserĉo estas provizitaj de "git grep". Eble estas plibonaj rezultoj se la retejestro aktivigas la indeksilon de kodo.
code_search_unavailable = Kodoserĉo ne haveblas nune. Bonvolu kontakti la retejestron.
-package_kind = Serĉi pakojn...
+package_kind = Serĉi pakojn…
type_tooltip = Serĉotipo
-user_kind = Serĉi uzantojn...
+user_kind = Serĉi uzantojn…
fuzzy_tooltip = Inkluzivas rezultojn proksime kongruantajn kun la serĉoterminoj
-repo_kind = Serĉi deponejojn...
-org_kind = Serĉi organizaĵojn...
-code_kind = Serĉi kodon...
-project_kind = Serĉi projektojn...
-team_kind = Serĉi teamojn...
+repo_kind = Serĉi deponejojn…
+org_kind = Serĉi organizaĵojn…
+code_kind = Serĉi kodon…
+project_kind = Serĉi projektojn…
+team_kind = Serĉi teamojn…
keyword_search_unavailable = Serĉo per ŝlosilvortoj ne haveblas nune. Bonvolu kontakti la retejestron.
union = Ŝlosilvortoj
union_tooltip = Inkluzivas rezultojn kongruantajn kun la ajnaj blankaspacitaj ŝlosilvortoj
-commit_kind = Serĉi enmetojn...
+commit_kind = Serĉi enmetojn…
no_results = Ne trovis kongruantajn rezultojn.
exact = Ĝusta
exact_tooltip = Inkluzivas nur rezultojn kongruantajn kun la ĝustaj serĉoterminoj
issue_kind = Serĉi erarojn...
regexp_tooltip = Interpretas la serĉoterminoj kiel regulesprimo
fuzzy = Svaga
-branch_kind = Serĉi disbranĉigojn...
+branch_kind = Serĉi disbranĉigojn…
runner_kind = Serĉi rulantojn...
pull_kind = Serĉi tirpetojn...
\ No newline at end of file
diff --git a/options/locale/locale_es-ES.ini b/options/locale/locale_es-ES.ini
index 63be50f3ce..bdafba93b4 100644
--- a/options/locale/locale_es-ES.ini
+++ b/options/locale/locale_es-ES.ini
@@ -1648,13 +1648,13 @@ issues.close_comment_issue=Cerrar con comentario
issues.reopen_issue=Reabrir
issues.reopen_comment_issue=Reabrir con comentario
issues.create_comment=Comentar
-issues.closed_at=`cerró esta incidencia %[2]s`
-issues.reopened_at=`reabrió esta incidencia %[2]s`
-issues.commit_ref_at=`referenció esta incidencia en un commit %[2]s`
-issues.ref_issue_from=`referenció esta incidencia %[4]s %[2]s`
-issues.ref_pull_from=`referenció este pull request %[4]s %[2]s`
-issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo cerrará , %[2]s`
-issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[4]s que lo reabrirá, %[2]s`
+issues.closed_at=`cerró esta incidencia %s`
+issues.reopened_at=`reabrió esta incidencia %s`
+issues.commit_ref_at=`referenció esta incidencia en un commit %s`
+issues.ref_issue_from=`referenció esta incidencia %[3]s %[1]s`
+issues.ref_pull_from=`referenció este pull request %[3]s %[1]s`
+issues.ref_closing_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo cerrará , %[1]s`
+issues.ref_reopening_from=`hizo referencia a esta incidencia desde un pull request %[3]s que lo reabrirá, %[1]s`
issues.ref_closed_from=`cerró esta incidencia %[4]s %[2]s`
issues.ref_reopened_from=`reabrió esta incidencia %[4]s %[2]s`
issues.ref_from=`de %[1]s`
@@ -1959,8 +1959,8 @@ pulls.update_branch_success=La actualización de la rama ha finalizado correctam
pulls.update_not_allowed=No tiene permisos para actualizar esta rama
pulls.outdated_with_base_branch=Esta rama está desactualizada con la rama base
pulls.close=Cerrar pull request
-pulls.closed_at=`cerró este pull request %[2]s`
-pulls.reopened_at=`reabrió este pull request %[2]s`
+pulls.closed_at=`cerró este pull request %s`
+pulls.reopened_at=`reabrió este pull request %s`
pulls.clear_merge_message=Borrar mensaje de fusión
pulls.clear_merge_message_hint=Limpiar el mensaje de fusión solo eliminará el contenido del mensaje de commit y mantendrá frases generadas como "Co-Autorizado por …".
@@ -2789,7 +2789,7 @@ pulls.status_checks_hide_all = Ocultar todas las verificaciones
settings.federation_not_enabled = La federación no está habilitada en tu instancia.
wiki.search = Buscar en wiki
pulls.status_checks_show_all = Mostrar todas las verificaciones
-pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %[2]s`
+pulls.commit_ref_at = `hizo referencia a este pull request desde un commit %s`
pulls.cmd_instruction_merge_title = Fusionar
contributors.contribution_type.deletions = Eliminaciones
contributors.contribution_type.filter_label = Tipo de contribución:
@@ -2886,6 +2886,7 @@ issues.filter_no_results_placeholder = Intenta ajustar tus filtros de búsqueda.
pulls.delete_after_merge.head_branch.is_default = La rama actual que desea eliminar es la rama por defecto y no se puede eliminar.
summary_card_alt = Tarjeta de resumen del repositorio %s
settings.pull_mirror_sync_quota_exceeded = Cuota excedida, no se empujan los cambios.
+archive.nocomment = No es posible hacer comentarios porque el repositorio está archivado.
[graphs]
component_loading = Cargando %s…
@@ -3945,6 +3946,8 @@ runs.no_workflows = Aún no hay flujos de trabajo.
workflow.dispatch.success = La ejecución del flujo de trabajo se ha solicitado correctamente.
variables.not_found = No se ha encontrado la variable.
workflow.dispatch.input_required = Se requiere valor para la entrada "%s".
+workflow.dispatch.trigger_found = Este flujo de trabajo tiene un disparador de eventos alt
+ klikkaus/rivinvaihto
poissulkeaksesi tunnisteita`
-issues.filter_label_no_select=Kaikki tunnisteet
+issues.filter_label=Nimilappu
+issues.filter_label_exclude=`Käytä alt
+ napsautus/rivinvaihto
poissulkeaksesi nimilappuja`
+issues.filter_label_no_select=Kaikki nimilaput
issues.filter_milestone=Merkkipaalu
issues.filter_project=Projekti
-issues.filter_assignee=Osoitettu
+issues.filter_assignee=Käsittelijä
issues.filter_poster=Tekijä
issues.filter_type=Tyyppi
issues.filter_type.all_issues=Kaikki ongelmat
@@ -1224,15 +1263,15 @@ issues.filter_sort.recentupdate=Äskettäin päivitetty
issues.filter_sort.leastupdate=Kauiten aikaa sitten päivitetty
issues.filter_sort.mostcomment=Eniten kommentoidut
issues.filter_sort.leastcomment=Vähiten kommentoidut
-issues.filter_sort.nearduedate=Lähin määräpäivä
-issues.filter_sort.farduedate=Kaukaisin määräpäivä
+issues.filter_sort.nearduedate=Lähin eräpäivä
+issues.filter_sort.farduedate=Kaukaisin eräpäivä
issues.filter_sort.moststars=Eniten tähtiä
issues.filter_sort.feweststars=Vähiten tähtiä
issues.filter_sort.mostforks=Eniten forkattu
issues.filter_sort.fewestforks=Vähiten forkattu
issues.action_open=Avaa
issues.action_close=Sulje
-issues.action_label=Tunniste
+issues.action_label=Nimilappu
issues.action_milestone=Merkkipaalu
issues.action_milestone_no_select=Ei merkkipaalua
issues.action_assignee=Osoitettu henkilölle
@@ -1241,7 +1280,7 @@ issues.previous=Edellinen
issues.next=Seuraava
issues.open_title=Avoinna
issues.closed_title=Suljettu
-issues.draft_title=Työversio
+issues.draft_title=Luonnos
issues.num_comments=%d kommenttia
issues.commented_at=`kommentoi %s`
issues.delete_comment_confirm=Haluatko varmasti poistaa tämän kommentin?
@@ -1254,24 +1293,24 @@ issues.close_comment_issue=Kommentoi ja sulje
issues.reopen_issue=Avaa uudelleen
issues.reopen_comment_issue=Kommentoi ja avaa uudelleen
issues.create_comment=Kommentoi
-issues.closed_at=`sulki tämän ongelman %[2]s`
-issues.reopened_at=`uudelleenavasi tämän ongelman %[2]s`
-issues.commit_ref_at=`viittasi tähän ongelmaan commitissa %[2]s`
+issues.closed_at=`sulki tämän ongelman %s`
+issues.reopened_at=`uudelleenavasi tämän ongelman %s`
+issues.commit_ref_at=`viittasi tähän ongelmaan kommitissa %s`
issues.author=Tekijä
issues.role.owner=Omistaja
issues.role.member=Jäsen
issues.edit=Muokkaa
issues.cancel=Peruuta
issues.save=Tallenna
-issues.label_title=Tunnisteen nimi
+issues.label_title=Nimi
issues.label_description=Kuvaus
-issues.label_color=Tunnisteen väri
-issues.label_count=%d tunnistetta
-issues.label_open_issues=%d avointa ongelmaa
+issues.label_color=Väri
+issues.label_count=%d nimilappua
+issues.label_open_issues=%d avointa ongelmaa/vetopyyntöä
issues.label_edit=Muokkaa
issues.label_delete=Poista
-issues.label_modify=Muokkaa tunnistetta
-issues.label_deletion=Poista tunniste
+issues.label_modify=Muokkaa nimilappua
+issues.label_deletion=Poista nimilappu
issues.label.filter_sort.alphabetically=Aakkosjärjestyksessä
issues.label.filter_sort.reverse_alphabetically=Käänteisessä aakkosjärjestyksessä
issues.label.filter_sort.by_size=Pienin koko
@@ -1284,7 +1323,7 @@ issues.unlock=Avaa keskustelu
issues.unlock_comment=avasi tämän keskustelun lukituksen %s
issues.lock_confirm=Lukitse
issues.unlock_confirm=Avaa
-issues.lock.notice_1=- Muut käyttäjät eivät voi lisätä uusia kommentteja tähän vianlippuun.
+issues.lock.notice_1=- Muut käyttäjät eivät voi lisätä uusia kommentteja tähän ongelmaan.
issues.lock.notice_3=- Voit aina myöhemmin avata tämän ongelman lukituksesta.
issues.unlock.notice_2=- Voit aina myöhemmin lukita tämän ongelman uudelleen.
issues.lock.reason=Lukitsemisen syy
@@ -1306,19 +1345,19 @@ issues.add_time_hours=Tuntia
issues.add_time_minutes=Minuuttia
issues.add_time_sum_to_small=Aikaa ei syötetty.
issues.time_spent_from_all_authors=`Käytetty kokonaisaika: %s`
-issues.due_date=Määräpäivä
-issues.push_commit_1=lisäsi %d sitoumuksen %s
-issues.push_commits_n=lisäsi %d sitoumusta %s
+issues.due_date=Eräpäivä
+issues.push_commit_1=lisäsi %d kommitin %s
+issues.push_commits_n=lisäsi %d kommittia %s
issues.due_date_form=vvvv-kk-pp
issues.due_date_form_edit=Muokkaa
issues.due_date_form_remove=Poista
-issues.due_date_not_set=Määräpäivää ei ole asetettu.
+issues.due_date_not_set=Eräpäivää ei ole asetettu.
issues.due_date_overdue=Myöhässä
issues.dependency.title=Riippuvuudet
-issues.dependency.issue_no_dependencies=Riippuvuuksia ei asetettu.
-issues.dependency.pr_no_dependencies=Riippuvuuksia ei asetettu.
+issues.dependency.issue_no_dependencies=Riippuvuuksia ei ole asetettu.
+issues.dependency.pr_no_dependencies=Riippuvuuksia ei ole asetettu.
issues.dependency.add=Lisää riippuvuus…
-issues.dependency.cancel=Peru
+issues.dependency.cancel=Peruuta
issues.dependency.remove=Poista
issues.dependency.remove_info=Poistä tämä riippuvuus
issues.review.self.approval=Et voi hyväksyä omia vetopyyntöjä.
@@ -1335,11 +1374,11 @@ issues.content_history.created=luotu
pulls.new=Uusi vetopyyntö
-pulls.compare_changes=Uusi pull-pyyntö
+pulls.compare_changes=Uusi vetopyyntö
pulls.has_viewed_file=Katsottu
pulls.viewed_files_label=%[1]d / %[2]d tiedostoa katsottu
pulls.compare_compare=vedä kohteesta
-pulls.filter_branch=Suodata branch
+pulls.filter_branch=Suodata haara
pulls.no_results=Tuloksia ei löytynyt.
pulls.nothing_to_compare=Nämä haarat vastaavat toisiaan. Ei ole tarvetta luoda vetopyyntöä.
pulls.nothing_to_compare_and_allow_empty_pr=Nämä haarat vastaavat toisiaan. Vetopyyntö tulee olemaan tyhjä.
@@ -1348,13 +1387,13 @@ pulls.create=Luo vetopyyntö
pulls.title_desc_few=haluaa yhdistää %[1]d committia lähteestä %[2]s
kohteeseen %[3]s
pulls.merged_title_desc_few=yhdistetty %[1]d committia lähteestä %[2]s
kohteeseen %[3]s
%[4]s
pulls.tab_conversation=Keskustelu
-pulls.tab_commits=Commitit
+pulls.tab_commits=Kommitit
pulls.tab_files=Muuttuneet tiedostot
pulls.merged=Yhdistetty
pulls.title_wip_desc=`Aloita otsikko sanalla %s estääksesi vetopyynnön yhdistämisen vahingossa.`
-pulls.add_prefix=Lisää %s etuliite
-pulls.remove_prefix=Poista %s etuliite
-pulls.can_auto_merge_desc=Tämä pull-pyyntö voidaan yhdistää automaattisesti.
+pulls.add_prefix=Lisää etuliite %s
+pulls.remove_prefix=Poista etuliite %s
+pulls.can_auto_merge_desc=Tämä vetopyyntö voidaan yhdistää automaattisesti.
@@ -1366,13 +1405,13 @@ pulls.can_auto_merge_desc=Tämä pull-pyyntö voidaan yhdistää automaattisesti
milestones.new=Uusi merkkipaalu
milestones.closed=Suljettu %s
-milestones.no_due_date=Ei määräpäivää
+milestones.no_due_date=Ei eräpäivää
milestones.open=Avaa uudelleen
milestones.close=Sulje
milestones.create=Luo merkkipaalu
milestones.title=Otsikko
milestones.desc=Kuvaus
-milestones.due_date=Määräpäivä (valinnainen)
+milestones.due_date=Eräpäivä (valinnainen)
milestones.clear=Tyhjennä
milestones.edit=Muokkaa merkkipaalua
milestones.cancel=Peruuta
@@ -1383,11 +1422,11 @@ milestones.filter_sort.least_issues=Vähiten ongelmia
wiki=Wiki
-wiki.welcome=Tervetuloa Wikiin.
+wiki.welcome=Tervetuloa wikiin.
wiki.welcome_desc=Wikissä voit kirjoittaa ja jakaa dokumentaatiota käyttäjien kesken.
wiki.create_first_page=Luo ensimmäinen sivu
wiki.page=Sivu
-wiki.filter_page=Suodatin sivu
+wiki.filter_page=Suodata sivu
wiki.new_page=Sivu
wiki.default_commit_message=Kirjoita muistiinpano tästä päivityksestä (valinnainen).
wiki.save_page=Tallenna sivu
@@ -1416,7 +1455,7 @@ activity.active_issues_count_1=%d aktiivinen ongelma
activity.active_issues_count_n=%d aktiivista ongelmaa
activity.closed_issues_count_1=suljettu ongelma
activity.closed_issues_count_n=suljettua ongelmaa
-activity.title.issues_created_by=%s luonnut %s
+activity.title.issues_created_by=%s luonut %s
activity.closed_issue_label=Suljettu
activity.new_issues_count_1=Uusi ongelma
activity.new_issues_count_n=uutta ongelmaa
@@ -1432,14 +1471,14 @@ activity.git_stats_and_deletions=ja
activity.git_stats_deletion_1=%d poisto
activity.git_stats_deletion_n=%d poistoa
-contributors.contribution_type.commits=Sitoumukset
+contributors.contribution_type.commits=Kommitit
search=Haku
search.match=Osuma
search.code_no_results=Hakuehtoasi vastaavaa lähdekoodia ei löytynyt.
settings=Asetukset
-settings.options=Repo
+settings.options=Tietovarasto
settings.collaboration.admin=Ylläpitäjä
settings.collaboration.write=Kirjoita
settings.collaboration.read=Lue
@@ -1450,31 +1489,31 @@ settings.githooks=Git-koukut
settings.basic_settings=Perusasetukset
settings.mirror_settings=Peilauksen asetukset
-settings.site=Nettisivu
+settings.site=Verkkosivusto
settings.update_settings=Tallenna asetukset
settings.advanced_settings=Lisäasetukset
settings.use_internal_wiki=Käytä sisäänrakennettua wikiä
settings.use_external_wiki=Käytä ulkoista wikiä
settings.external_wiki_url=Ulkoisen wikin URL-osoite
-settings.external_wiki_url_desc=Wiki-välilehden klikkaus ohjaa vierailijat ulkoisen wiki-URL-osoitteeseen.
-settings.tracker_url_format=Ulkoisen vianseurannan URL-muoto
+settings.external_wiki_url_desc=Wiki-välilehden napsauttaminen ohjaa vierailijat ulkoiseen wiki-URL-osoitteeseen.
+settings.tracker_url_format=Ulkoisen ongelmanseurannan URL-muoto
settings.tracker_issue_style.numeric=Numeerinen
settings.tracker_issue_style.alphanumeric=Aakkosnumeerinen
-settings.enable_timetracker=Ota ajan seuranta käyttöön
+settings.enable_timetracker=Ota ajanseuranta käyttöön
settings.danger_zone=Vaaravyöhyke
-settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen repo. Ole hyvä ja valitse toinen nimi.
+settings.new_owner_has_same_repo=Uudella omistajalla on jo samanniminen tietovarasto. Valitse toinen nimi.
settings.transfer.title=Siirrä omistajuus
settings.transfer_form_title=Syötä repon nimi vahvistuksena:
-settings.transfer_notices_3=- Jos arkisto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
+settings.transfer_notices_3=- Jos tietovarasto on yksityinen ja se siirretään yksittäiselle käyttäjälle, tämä toiminto varmistaa, että käyttäjällä on ainakin lukuoikeudet (ja muuttaa käyttöoikeuksia tarvittaessa).
settings.transfer_owner=Uusi omistaja
settings.wiki_delete=Poista wikidata
-settings.wiki_delete_desc=Repon wikin data poistaminen on pysyvä eikä voi peruuttaa.
+settings.wiki_delete_desc=Tietovaraston wikin data poistaminen on pysyvä, eikä sitä voi perua.
settings.confirm_wiki_delete=Poista wikidata
-settings.wiki_deletion_success=Repon wiki data on poistettu.
+settings.wiki_deletion_success=Tietovaraston wikidata on poistettu.
settings.delete=Poista tämä tietovarasto
-settings.delete_desc=Repon poistaminen on pysyvä eikä voi peruuttaa.
-settings.delete_notices_1=- Tätä toimintoa EI VOI peruuttaa myöhemmin.
-settings.update_settings_success=Repon asetukset on päivitetty.
+settings.delete_desc=Tietovaraston poistaminen on pysyvä, eikä sitä voi perua.
+settings.delete_notices_1=- Tätä toimintoa EI VOI perua myöhemmin.
+settings.update_settings_success=Tietovaraston asetukset on päivitetty.
settings.delete_collaborator=Poista
settings.search_user_placeholder=Etsi käyttäjä…
settings.teams=Tiimit
@@ -1484,19 +1523,19 @@ settings.webhook_deletion=Poista webkoukku
settings.webhook.test_delivery=Testitoimitus
settings.webhook.request=Pyyntö
settings.webhook.response=Vastaus
-settings.webhook.headers=Otsikot
+settings.webhook.headers=Otsakkeet
settings.webhook.payload=Sisältö
settings.webhook.body=Sisältö
settings.githook_edit_desc=Jos koukku ei ole käytössä, esitellään esimerkkisisältö. Sisällön jättäminen tyhjäksi arvoksi poistaa tämän koukun käytöstä.
settings.githook_name=Koukun nimi
settings.githook_content=Koukun sisältö
settings.update_githook=Päivitä koukku
-settings.payload_url=Kohde URL
+settings.payload_url=Kohde-URL
settings.http_method=HTTP-menetelmä
-settings.secret=Salaus
-settings.slack_username=Käyttäjätunnus
-settings.slack_icon_url=Kuvakkeen URL
-settings.discord_username=Käyttäjätunnus
+settings.secret=Salaisuus
+settings.slack_username=Käyttäjänimi
+settings.slack_icon_url=Kuvakkeen URL-osoite
+settings.discord_username=Käyttäjänimi
settings.event_desc=Laukaisu päällä:
settings.event_send_everything=Kaikki tapahtumat
settings.event_choose=Mukautetut tapahtumat…
@@ -1506,29 +1545,29 @@ settings.event_create_desc=Haara tai tagi luotu.
settings.event_delete=Poista
settings.event_delete_desc=Haara tai tagi poistettu.
settings.event_wiki=Wiki
-settings.event_release_desc=Julkaisu julkaistu, päivitetty tai poistettu varastosta.
+settings.event_release_desc=Julkaisu julkaistu, päivitetty tai poistettu tietovarastosta.
settings.event_push=Työnnä
-settings.event_push_desc=Git push repoon.
-settings.event_repository=Repo
-settings.event_repository_desc=Repo luotu tai poistettu.
+settings.event_push_desc=Git-työntö tietovarastoon.
+settings.event_repository=Tietovarasto
+settings.event_repository_desc=Tietovarasto luotu tai poistettu.
settings.event_header_issue=Ongelmien tapahtumat
settings.event_issues=Muokkaus
settings.event_issues_desc=Ongelma avattu, suljettu, avattu uudelleen tai muokattu.
settings.event_issue_assign=Toimeksianto
settings.event_issue_assign_desc=Ongelma osoitettu tai osoitus poistettu.
-settings.event_issue_label_desc=Viannimikkeet lisätty tai poistettu.
+settings.event_issue_label_desc=Ongelmanimilaput lisätty tai poistettu.
settings.event_issue_milestone_desc=Merkkipaalu lisätty, poistettu tai muokattu.
settings.event_issue_comment_desc=Ongelman kommentti luotu, muokattu tai poistettu.
settings.event_header_pull_request=Vetopyyntöjen tapahtumat
settings.event_pull_request=Muokkaus
-settings.event_package_desc=Paketti on luotu tai poistettu repossa.
+settings.event_package_desc=Paketti on luotu tai poistettu tietovarastossa.
settings.active_helper=Tiedot käynnistetyistä tapahtumista lähetetään tähän webkoukun URL-osoitteeseen.
settings.add_hook_success=Uusi webkoukku on lisätty.
settings.update_webhook=Päivitä webkoukku
settings.delete_webhook=Poista webkoukku
settings.recent_deliveries=Viimeisimmät toimitukset
settings.hook_type=Koukun tyyppi
-settings.slack_token=Pääsymerkki
+settings.slack_token=Poletti
settings.slack_domain=Verkkotunnus
settings.slack_channel=Kanava
settings.add_web_hook_desc=Integroi %s repoon.
@@ -1543,36 +1582,36 @@ settings.web_hook_name_matrix=Matrix
settings.web_hook_name_feishu_only =Feishu
settings.web_hook_name_larksuite_only =Lark Suite
settings.web_hook_name_packagist=Packagist
-settings.deploy_keys=Julkaisuavaimet
-settings.add_deploy_key=Lisää julkaisuavain
-settings.deploy_key_desc=Julkaisuavaimilla on vain-luku oikeudet repoon.
-settings.is_writable_info=Salli tämän julkaisuavaimen puskea repoon.
-settings.no_deploy_keys=Julkaisuavaimia ei ole käytössä vielä.
+settings.deploy_keys=Toimitusavaimet
+settings.add_deploy_key=Lisää toimitusavain
+settings.deploy_key_desc=Toimitusavaimilla on pelkkä lukuoikeus tietovarastoon.
+settings.is_writable_info=Salli tämän toimitusavaimen työntää tietovarastoon.
+settings.no_deploy_keys=Toimitusavaimia ei ole käytössä vielä.
settings.title=Otsikko
settings.deploy_key_content=Sisältö
-settings.key_been_used=Julkaisuavain identtisellä sisällöllä on jo käytössä.
-settings.key_name_used=Julkaisuavain samalla nimellä on jo olemassa.
-settings.deploy_key_deletion=Poista julkaisuavain
-settings.deploy_key_deletion_desc=Julkaisuavaimen poistaminen kumoaa sen pääsyn tähän repoon. Jatketaanko?
-settings.deploy_key_deletion_success=Julkaisuavain on poistettu.
+settings.key_been_used=Toimitusavain identtisellä sisällöllä on jo käytössä.
+settings.key_name_used=Toimitusavain samalla nimellä on jo olemassa.
+settings.deploy_key_deletion=Poista toimitusavain
+settings.deploy_key_deletion_desc=Toimitusavaimen poistaminen kumoaa sen pääsyn tähän tietovarastoon. Jatketaanko?
+settings.deploy_key_deletion_success=Toimitusavain on poistettu.
settings.branches=Haarat
settings.protected_branch=Haaran suojaus
settings.branch_protection=Haaran "%s" suojaussäännöt
settings.protect_this_branch=Ota haaran suojaus käyttöön
-settings.protect_whitelist_deploy_keys=Lisää julkaisuavaimet sallittujen listalle mahdollistaaksesi repohin kirjoituksen.
-settings.protect_whitelist_users=Sallitut käyttäjät suhteessa työntämiseen
+settings.protect_whitelist_deploy_keys=Lisää toimitusavaimet sallittujen listalle mahdollistaaksesi tietovarastoihin kirjoituksen.
+settings.protect_whitelist_users=Työntämiseen oikeutettujen käyttäjien lista
settings.protect_whitelist_search_users=Etsi käyttäjiä…
settings.protect_merge_whitelist_committers_desc=Salli vain listaan merkittyjen käyttäjien ja tiimien yhdistää vetopyynnöt tähän haaraan.
-settings.protect_merge_whitelist_users=Sallitut käyttäjät suhteessa yhdistämiseen
+settings.protect_merge_whitelist_users=Yhdistämiseen oikeutettujen käyttäjien lista
settings.protect_required_approvals=Vaadittavat hyväksynnät
-settings.protect_approvals_whitelist_users=Sallittujen tarkastajien lista
+settings.protect_approvals_whitelist_users=Sallittujen katselmoijien lista
settings.choose_branch=Valitse haara…
settings.no_protected_branch=Suojattuja haaroja ei ole.
settings.edit_protected_branch=Muokkaa
-settings.protected_branch_required_approvals_min=Vaadittavat hyväksynnät ei voi olla negatiivinen.
+settings.protected_branch_required_approvals_min=Vaadittavat hyväksynnät eivät voi olla negatiivisia.
settings.tags=Tagit
-settings.tags.protection=Tagien suojaaminen
-settings.tags.protection.pattern=Tagin kuvio
+settings.tags.protection=Tagien suojaus
+settings.tags.protection.pattern=Tagin kaava
settings.tags.protection.allowed=Sallitut
settings.tags.protection.allowed.users=Sallitut käyttäjät
settings.tags.protection.allowed.teams=Sallitut tiimit
@@ -1585,13 +1624,13 @@ settings.archive.button=Arkistoi tietovarasto
settings.archive.header=Arkistoi tämä tietovarasto
settings.archive.tagsettings_unavailable=Tagi-asetukset eivät ole käytettävissä arkistoiduissa tietovarastoissa.
settings.lfs=LFS
-settings.lfs_filelist=LFS-tiedostot tallennettu tähän repoon
-settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän repoon.
-settings.lfs_findcommits=Etsi commitit
-settings.lfs_lfs_file_no_commits=Tälle LFS-tiedostolle ei löytynyt sitoumuksia
+settings.lfs_filelist=Tähän tietovarastoon tallennetut LFS-tiedostot
+settings.lfs_no_lfs_files=LFS-tiedostoja ei ole tallennettu tähän tietovarastoon.
+settings.lfs_findcommits=Etsi kommitteja
+settings.lfs_lfs_file_no_commits=Tälle LFS-tiedostolle ei löytynyt kommitteja
settings.lfs_noattribute=Tällä polulla ei ole lukittavaa attribuuttia oletushaarassa
settings.lfs_delete=Poista LFS-tiedosto OID:lla %s
-settings.lfs_delete_warning=LFS-tiedoston poistaminen saattaa aiheuttaa "objektia ei ole olemassa" -virheitä uloskirjauksessa. Oletko varma?
+settings.lfs_delete_warning=LFS-tiedoston poistaminen saattaa aiheuttaa "objektia ei ole olemassa"-virheitä uloskuittauksessa. Oletko varma?
settings.lfs_findpointerfiles=Etsi osoitintiedostoja
settings.lfs_locks=Lukot
settings.lfs_invalid_locking_path=Virheellinen polku: %s
@@ -1601,7 +1640,7 @@ settings.lfs_lock_path=Lukittavan tiedostopolku…
settings.lfs_locks_no_locks=Ei lukkoja
settings.lfs_lock_file_no_exist=Lukittua tiedostoa ei ole olemassa oletushaarassa
settings.lfs_force_unlock=Pakota lukituksen avaus
-settings.lfs_pointers.found=Löytyi %d blob osoitinta - %d yhdistettyö, %d yhdistämätöntä (%d puuttuu varastosta)
+settings.lfs_pointers.found=Löytyi %d blob-osoitinta - %d assosioitu, %d assosioitumaton (%d puuttuu varastosta)
settings.lfs_pointers.sha=Blob-tiiviste
settings.lfs_pointers.oid=OID
settings.lfs_pointers.inRepo=Tietovarastossa
@@ -1610,8 +1649,8 @@ settings.lfs_pointers.accessible=Saatavilla käyttäjälle
diff.browse_source=Selaa lähdekoodia
diff.parent=vanhempi
-diff.commit=commit
-diff.git-notes=Muistiinpanot
+diff.commit=kommitti
+diff.git-notes=Huomautukset
diff.options_button=Vertailun asetukset
diff.show_split_view=Jaettu näkymä
diff.show_unified_view=Yhdistetty näkymä
@@ -1620,7 +1659,7 @@ diff.whitespace_show_everything=Näytä kaikki muutokset
diff.whitespace_ignore_all_whitespace=Ohita tyhjämerkit rivejä verratessa
diff.whitespace_ignore_amount_changes=Ohita tyhjämerkin määrän muutokset
diff.whitespace_ignore_at_eol=Ohita muutokset rivin lopun tyhjämerkeissä
-diff.stats_desc=%d muutettua tiedostoa jossa %d lisäystä ja %d poistoa
+diff.stats_desc=%d muutettua tiedostoa joissa %d lisäystä ja %d poistoa
diff.bin=BIN
diff.view_file=Näytä tiedosto
diff.file_image_width=Leveys
@@ -1629,7 +1668,7 @@ diff.file_byte_size=Koko
diff.comment.markdown_info=Muotoilu Markdownilla on tuettu.
diff.comment.add_single_comment=Lisää yksittäinen kommentti
diff.comment.add_review_comment=Lisää kommentti
-diff.comment.start_review=Aloita tarkistus
+diff.comment.start_review=Aloita katselmointi
diff.comment.reply=Vastaa
diff.review.header=Lähetä katselmointi
diff.review.placeholder=Katselmoinnin kommentti
@@ -1640,14 +1679,14 @@ diff.review.reject=Pyydä muutoksia
release.releases=Julkaisut
release.tags=Tagit
release.new_release=Uusi julkaisu
-release.draft=Työversio
+release.draft=Luonnos
release.prerelease=Esijulkaisu
release.stable=Vakaa
release.edit=Muokkaa
release.source_code=Lähdekoodi
release.new_subheader=Julkaisut organisoivat projektien versioita.
release.edit_subheader=Julkaisut organisoivat projektien versioita.
-release.tag_name=Taginimi
+release.tag_name=Tagin nimi
release.target=Kohde
release.tag_helper=Valitse olemassa oleva tagi tai luo uusi tagi.
release.prerelease_desc=Merkitse esijulkaisuksi
@@ -1659,7 +1698,7 @@ release.edit_release=Päivitä julkaisu
release.delete_release=Poista julkaisu
release.delete_tag=Poista tagi
release.deletion=Poista julkaisu
-release.deletion_tag_desc=Poistetaanko tämä tagi reposta? Repon sisältö ja historia pysyvät muuttumattomina. Jatketaanko?
+release.deletion_tag_desc=Poistetaan tämä tagi tietovarastosta. Tietovaraston sisältö ja historia pysyvät muuttumattomina. Jatketaanko?
release.deletion_tag_success=Tagi on poistettu.
release.tag_name_invalid=Tagin nimi ei ole kelvollinen.
release.downloads=Lataukset
@@ -1675,23 +1714,23 @@ topic.done=Valmis
already_forked = Olet jo forkannut %s
fork_to_different_account = Forkkaa toiselle tilille
release.compare = Vertaa
-release.ahead.commits = %d sitoumusta
+release.ahead.commits = %d kommittia
all_branches = Kaikki haarat
n_tag_few = %s tagia
-settings.event_fork_desc = Tietovaraston haarukka luotu.
+settings.event_fork_desc = Tietovarasto forkattu.
actions = Toiminnat
-fork_guest_user = Kirjaudu sisään luodaksesi tämän tietovaraston haarukan.
-fork_from_self = Et voi luoda omistamasi tietovaraston haarukkaa.
+fork_guest_user = Kirjaudu sisään forkataksesi tämän tietovaraston.
+fork_from_self = Et voi forkata omistamaasi tietovarastoa.
visibility_fork_helper = (Tämän muuttaminen vaikuttaa kaikkien forkkien näkyvyyteen.)
fork = Forkkaa
-activity.git_stats_commit_n = %d sitoumusta
+activity.git_stats_commit_n = %d kommittia
commits.search_branch = Tämä haara
n_branch_few = %s haaraa
-pulls.show_all_commits = Näytä kaikki sitoumukset
+pulls.show_all_commits = Näytä kaikki kommitit
commit_graph.select = Valitse haarat
-activity.navbar.recent_commits = Viimeaikaiset sitoumukset
+activity.navbar.recent_commits = Viimeaikaiset kommitit
settings.branches.add_new_rule = Lisää uusi sääntö
-n_commit_few = %s sitoumusta
+n_commit_few = %s kommittia
issues.force_push_compare = Vertaa
commits.desc = Selaa lähdekoodin muutoshistoriaa.
clone_helper = Tarvitseko apua kloonauksen kanssa? Siirry tukisivulle.
@@ -1716,7 +1755,7 @@ release.detail = Julkaisun tiedot
diff.hide_file_tree = Piilota tiedostopuu
issues.role.owner_helper = Tämä käyttäjä on tämän tietovaraston omistaja.
issues.all_title = Kaikki
-issues.label_archived_filter = Näytä arkistoidut tunnisteet
+issues.label_archived_filter = Näytä arkistoidut nimilaput
pulls.close = Sulje vetopyyntö
branch.already_exists = Haara nimellä "%s" on jo olemassa.
diff.show_file_tree = Näytä tiedostopuu
@@ -1739,7 +1778,7 @@ settings.event_issue_comment = Kommentit
diff.download_patch = Lataa patch-tiedosto
issues.filter_milestone_none = Ei merkkipaaluja
issues.filter_milestone_open = Avoimet merkkipaalut
-new_repo_helper = Tietovarasto sisältää kaikki projektitiedostot, mukaan lukien tarkistushistoria. Järjestätkö jo sellaisen muualla? Siirrä tietovarasto.
+new_repo_helper = Tietovarasto sisältää kaikki projektitiedostot, mukaan lukien versiohistorian. Onko sinulla tietovarasto jo muualla? Siirrä tietovarasto.
use_template = Käytä tätä mallipohjaa
star_guest_user = Kirjaudu sisään lisätäksesi tähden tähän tietovarastoon.
watch_guest_user = Kirjaudu sisään tarkkaillaksesi tätä tietovarastoa.
@@ -1765,12 +1804,12 @@ milestones.deletion_success = Merkkipaalu on poistettu.
project = Projektit
pulls.delete.title = Poistetaanko tämä vetopyyntö?
activity.title.issues_1 = %d ongelma
-contributors.contribution_type.filter_label = Avustuksen tyyppi:
+contributors.contribution_type.filter_label = Kontribuution tyyppi:
settings.protected_branch.delete_rule = Poista sääntö
settings.archive.success = Tietovarasto arkistoitiin onnistuneesti.
diff.comment.placeholder = Jätä kommentti
release.message = Kuvaile tätä julkaisua
-branch.delete_desc = Haaran poistaminen on pysyvä toimenpide. Vaikka poistettu haara voi jäädä olemaan lyhyeksi ajaksi, ennen kuin todellisesti poistetaan, poistoa EI VOI perua useimmiten. Jatketaanko?
+branch.delete_desc = Haaran poistaminen on pysyvä toimenpide. Vaikka poistettu haara voi jäädä olemaan lyhyeksi ajaksi, ennen kuin se todellisesti poistetaan, poistoa EI VOI perua useimmiten. Jatketaanko?
branch.protected_deletion_failed = Haara "%s" on suojattu. Sitä ei voi poistaa.
open_with_editor = Avaa sovelluksella %s
download_bundle = Lataa BUNDLE
@@ -1785,7 +1824,7 @@ issues.new.closed_projects = Suljetut projektit
settings.event_issue_milestone = Merkkipaalut
branch.branch_already_exists = Haara "%s" on jo olemassa tässä tietovarastossa.
projects.card_type.images_and_text = Kuvat ja teksti
-default_branch_helper = Oletushaara on kantahaara vetopyyntöjä ja koodisitoumuksia varten.
+default_branch_helper = Oletushaara on kantahaara vetopyyntöjä ja koodikommitteja varten.
author_search_tooltip = Näyttää enintään 30 käyttäjää
migrate_options_mirror_helper = Tästä tietovarastosta tulee peili
commit_graph.color = Väri
@@ -1804,7 +1843,7 @@ issues.dependency.pr_remove_text = Riippuvuus poistetaan tästä vetopyynnöstä
release.download_count_few = %s latausta
diff.data_not_available = Diff-sisältö ei ole saatavilla
diff.image.side_by_side = Rinnakkain
-release.ahead.target = projektiin %s tämän julkaisun jälkeen
+release.ahead.target = haaraan %s tämän julkaisun jälkeen
issues.close = Sulje ongelma
issues.no_content = Ei kuvausta.
pulls.reject_count_1 = %d muutospyyntö
@@ -1818,7 +1857,7 @@ find_file.no_matching = Vastaavaa tiedostoa ei löytynyt
editor.file_delete_success = Tiedosto "%s" on poistettu.
settings.transfer.button = Siirrä omistajuus
settings.slack_color = Väri
-release.tag_name_already_exist = Julkaisu tällä taginimellä on jo olemassa.
+release.tag_name_already_exist = Julkaisu tällä tagin nimellä on jo olemassa.
pulls.allow_edits_from_maintainers_err = Päivittäminen epäonnistui
stars = Tähdet
editor.branch_already_exists = Haara "%s" on jo olemassa tässä tietovarastossa.
@@ -1832,12 +1871,12 @@ wiki.back_to_wiki = Takaisin wikisivulle
wiki.delete_page_notice_1 = Wikisivun "%s" poistamista ei voi perua. Jatketaanko?
activity.merged_prs_count_1 = Yhdistetty vetopyyntö
activity.merged_prs_count_n = Yhdistettyä vetopyyntöä
-activity.opened_prs_count_1 = ehdotettu vetopyyntö
-activity.opened_prs_count_n = ehdotettua vetopyyntöä
+activity.opened_prs_count_1 = Ehdotettu vetopyyntö
+activity.opened_prs_count_n = Ehdotettua vetopyyntöä
activity.title.user_1 = %d käyttäjä
activity.title.prs_n = %d vetopyyntöä
settings.sourcehut_builds.secrets = Salaisuudet
-commit_graph = Sitoumuskaavio
+commit_graph = Kommittikaavio
visibility_helper = Tee tietovarastosta yksityinen
pulls.approve_count_1 = %d hyväksyntä
settings.confirm_delete = Poista tietovarasto
@@ -1852,7 +1891,7 @@ pull.deleted_branch = (poistettu):%s
settings.transfer.rejected = Tietovaraston siirto hylättiin.
settings.transfer.modal.title = Siirrä omistajuus
settings.event_pull_request_sync = Synkronoitu
-editor.commit_empty_file_text = Tiedosto, jonka olet aikeissa sitoa, on tyhjä. Edetäänkö?
+editor.commit_empty_file_text = Tiedosto, jonka olet aikeissa kommitoida, on tyhjä. Jatketaanko?
diff.load = Lataa diff
branch.create_branch_operation = Luo haara
activity.title.releases_n = %d julkaisua
@@ -1869,11 +1908,11 @@ pulls.expand_files = Laajenna kaikki tiedostot
issues.content_history.delete_from_history = Poista historiasta
milestones.filter_sort.name = Nimi
issues.filter_milestone_all = Kaikki merkkipaalut
-issues.filter_label_select_no_label = Ei tunnistetta
+issues.filter_label_select_no_label = Ei nimilappua
projects.column.set_default = Aseta oletukseksi
projects.edit_success = Projekti "%s" on päivitetty.
desc.sha256 = SHA256
-n_commit_one = %s sitoumus
+n_commit_one = %s kommitti
transfer.accept = Hyväksy siirto
transfer.reject = Hylkää siirto
default_branch_label = oletus
@@ -1886,7 +1925,7 @@ need_auth = Valtuutus
migrate_options = Migraatioasetukset
projects.create_success = Projekti "%s" on luotu.
projects.description = Kuvaus (valinnainen)
-editor.commit_empty_file_header = Sitoudu tyhjä tiedosto
+editor.commit_empty_file_header = Kommitoi tyhjä tiedosto
editor.branch_does_not_exist = Haaraa "%s" ei ole olemassa tässä tietovarastossa.
editor.delete = Poista %s
editor.patching = Paikkaus:
@@ -1914,7 +1953,7 @@ settings.branches.update_default_branch = Päivitä oletushaara
settings.transfer.success = Tietovaraston siirto onnistui.
settings.transfer_abort = Peru siirto
settings.sync_mirror = Synkronoi nyt
-settings.mirror_settings.docs.doc_link_title = Kuinka peilaan tietovarastot?
+settings.mirror_settings.docs.doc_link_title = Kuinka peilaan tietovarastoja?
tag.create_tag_operation = Luo tagi
branch.rename = Nimeä haara "%s" uudelleen
branch.download = Lataa haara "%s"
@@ -1954,18 +1993,18 @@ stored_lfs = Talletettu Git LFS:llä
activity.git_stats_author_1 = %d tekijä
issues.choose.blank_about = Luo ongelma oletusarvoisesta mallipohjasta.
pulls.made_using_agit = AGit
-editor.cannot_edit_lfs_files = LFS-tiedostoja ei voi muokata web-käyttöliittymässä.
+editor.cannot_edit_lfs_files = LFS-tiedostoja ei voi muokata selainkäyttöliittymässä.
pulls.cmd_instruction_hint = Näytä komentoriviohjeet
settings.wiki_globally_editable = Salli kenen tahansa muokata wikiä
pulls.rebase_conflict_summary = Virheviesti
wiki.search = Etsi wikistä
-activity.commit = Sitoutumistoiminta
-editor.cannot_edit_non_text_files = Binääritiedostoja ei voi muokata web-käyttöliittymässä.
+activity.commit = Kommittitoiminta
+editor.cannot_edit_non_text_files = Binääritiedostoja ei voi muokata selainkäyttöliittymässä.
projects.template.desc_helper = Valitse projektin mallipohja aloittaaksesi
-commit.contained_in_default_branch = Tämä sitoumus on osa oletushaaraa
+commit.contained_in_default_branch = Tämä kommitti on osa oletushaaraa
activity.git_stats_exclude_merges = Poissulkien yhdistämiset
-activity.no_git_activity = Tällä ajanjaksolla ei ole ollut sitoutumistoimintaa.
-activity.git_stats_commit_1 = %d sitoumus
+activity.no_git_activity = Tällä ajanjaksolla ei ole ollut kommitointitoimintaa.
+activity.git_stats_commit_1 = %d kommitin
activity.git_stats_push_to_all_branches = kaikkiin haaroihin.
settings.graphql_url = GraphQL:n URL-osoite
branch.create_new_branch = Luo haara haarasta:
@@ -1984,45 +2023,45 @@ migrate.forgejo.description = Tee migraatio codeberg.orgista tai muista Forgejo-
migrate.gitbucket.description = Tee migraatio GitBucket-instansseista.
migrate.onedev.description = Tee migraatio code.onedev.io:sta tai muista OneDev-instansseista.
migrate.codebase.description = Tee migraatio codebasehq.comista.
-migrate.git.description = Siirrä tietovarasto mistä tahansa Git-palvelusta.
+migrate.git.description = Suorita tietovaraston migraatio mistä tahansa Git-palvelusta.
migrate.gitlab.description = Tee migraatio gitlab.comista tai muista GitLab-instansseista.
migrate.gitea.description = Tee migraatio gitea.comista tai muista Gitea-instansseista.
repo_gitignore_helper_desc = Valitse mitä tiedostoja ei seurata yleisimpien kielten mallipohjista. Tyypilliset artefaktit, joita eri kielten koostamistyökalut tuottavat, lisätään .gitignore-tiedostoon oletusarvoisesti.
-milestones.filter_sort.latest_due_date = Kaukaisin määräpäivä
+milestones.filter_sort.latest_due_date = Kaukaisin eräpäivä
license_helper_desc = Lisenssi määrää, mitä muut voivat ja eivät voi tehdä koodillasi. Etkö ole varma, mikä lisenssi soveltuu projektillesi? Lue ohje lisenssin valinnasta.
-milestones.filter_sort.earliest_due_data = Lähin määräpäivä
+milestones.filter_sort.earliest_due_data = Lähin eräpäivä
issues.filter_type.reviewed_by_you = Katselmoitu toimestasi
settings.units.overview = Yleisnäkymä
-settings.remove_team_success = Joukkueen pääsy tietovarastoon on poistettu.
+settings.remove_team_success = Tiimin pääsy tietovarastoon on poistettu.
migrate.cancel_migrating_confirm = Haluatko perua tämän migraation?
settings.units.units = Yksiköt
settings.update_settings_no_unit = Tietovaraston tulisi sallia edes jonkinlainen vuorovaikutus.
settings.units.add_more = Ota lisää käyttöön
-settings.add_team_success = Joukkueella on nyt pääsy tietovarastoon.
-settings.use_external_issue_tracker = Käytä ulkoista ongelmienseurantaa
-settings.transfer_started = Tämä tietovarasto on merkitty siirrettäväksi ja se odottaa vahvistusta "%s":lta
-signing.wont_sign.pubkey = Sitoumusta ei allekirjoiteta, koska sinulla ei ole julkista avainta liitetty tiliisi.
+settings.add_team_success = Tiimillä on nyt pääsy tietovarastoon.
+settings.use_external_issue_tracker = Käytä ulkoista ongelmanseurantaa
+settings.transfer_started = Tämä tietovarasto on merkitty siirrettäväksi ja se odottaa vahvistusta käyttäjältä "%s"
+signing.wont_sign.pubkey = Kommittia ei allekirjoiteta, koska sinulla ei ole julkista avainta liitetty tiliisi.
settings.transfer_succeed = Tietovarasto on siirretty.
activity.git_stats_on_default_branch = Haarassa %s,
settings.tracker_issue_style.regexp = Säännöllinen lauseke
wiki.reserved_page = Wikisivun nimi "%s" on varattu.
pulls.recently_pushed_new_branches = Työnsit haaraan %[1]s %[2]s
-signing.will_sign = Tämä sitoumus allekirjoitetaan avaimella "%s".
-signing.wont_sign.never = Sitoumukset eivät ole koskaan allekirjoitettuja.
+signing.will_sign = Tämä kommitti allekirjoitetaan avaimella "%s".
+signing.wont_sign.never = Kommitit eivät ole koskaan allekirjoitettuja.
settings.mirror_settings.direction = Suunta
settings.mirror_settings.push_mirror.remote_url = Git-etätietovaraston URL-osoite
-settings.issues_desc = Ota tietovaraston vianseuranta käyttöön
-settings.use_internal_issue_tracker = Käytä sisäänrakennettua ongelmienseurantaa
-settings.external_tracker_url = Ulkoisen ongelmienseurannan URL-osoite
-settings.transfer_abort_success = Tietovaraston siirto %s:hen peruttiin.
+settings.issues_desc = Ota tietovaraston ongelmanseuranta käyttöön
+settings.use_internal_issue_tracker = Käytä sisäänrakennettua ongelmanseurantaa
+settings.external_tracker_url = Ulkoisen ongelmanseurannan URL-osoite
+settings.transfer_abort_success = Tietovaraston siirto käyttäjälle %s peruttiin.
settings.transfer_quota_exceeded = Uusi omistaja (%s) on ylittänyt kiintiön. Tietovarastoa ei ole siirretty.
settings.projects_desc = Ota tietovarastoprojektit käyttöön
settings.releases_desc = Ota tietovaraston julkaisut käyttöön
settings.packages_desc = Ota tietovarastopakettien rekisteri käyttöön
activity.git_stats_push_to_branch = haaraan %s ja
wiki.wiki_page_revisions = Sivun versiot
-settings.wiki_desc = Ota tietovaraston Wiki käyttöön
-signing.wont_sign.always = Sitoumukset ovat aina allekirjoitettuja.
+settings.wiki_desc = Ota tietovaraston wiki käyttöön
+signing.wont_sign.always = Kommitit ovat aina allekirjoitettuja.
milestones.edit_subheader = Merkkipaalut järjestävät ongelmia ja seuraavat edistymistä.
view_git_blame = Näytä git blame
editor.push_rejected = Tämä muutos hylättiin palvelimen toimesta. Tarkista Git-koukut.
@@ -2034,26 +2073,26 @@ releases.desc = Seuraa projektin versioita ja latauksia.
settings.protect_patterns = Kaavat
branch.new_branch_from = Luo uusi haara kohteesta "%s"
settings.matrix.message_type = Viestin tyyppi
-diff.committed_by = Sitoumuksen toimijana
+diff.committed_by = kommitoinut
invisible_runes_line = `Tällä rivillä on näkymättömiä Unicode-merkkejä`
-editor.fork_before_edit = Sinun on luotava tämän tietovaraston haarukka voidaksesi tehdä tai ehdottaa muutoksia tähän tiedostoon.
+editor.fork_before_edit = Sinun täytyy forkata tämä tietovarasto tehdäksesi tai ehdottaaksesi muutoksia tähän tiedostoon.
editor.file_deleting_no_longer_exists = Poistettavaa tiedostoa "%s" ei enää ole tässä tietovarastossa.
editor.add_tmpl.filename = tiedostonimi
editor.fail_to_apply_patch = Ei voitu toteuttaa paikkaa "%s"
editor.propose_file_change = Ehdota tiedostomuutosta
-editor.new_branch_name = Nimeä uusi haara tätä sitoumusta varten
+editor.new_branch_name = Nimeä uusi haara tätä kommittia varten
editor.new_branch_name_desc = Uuden haaran nimi…
editor.file_editing_no_longer_exists = Muokattavaa tiedostoa "%s" ei enää ole tässä tietovarastossa.
-editor.cannot_commit_to_protected_branch = Suojattuun haaraan "%s" ei voi sitoutua.
+editor.cannot_commit_to_protected_branch = Suojattuun haaraan "%s" ei voi kommitoida.
issues.remove_request_review = Poista katselmointipyyntö
issues.remove_request_review_block = Katselmointipyyntöä ei voi poistaa
-pulls.require_signed_wont_sign = Haara vaatii allekirjoitettuja sitoumuksia, mutta tätä yhdistämistä ei allekirjoiteta
+pulls.require_signed_wont_sign = Haara vaatii allekirjoitettuja kommitteja, mutta tätä yhdistämistä ei allekirjoiteta
pulls.push_rejected_summary = Koko hylkäysviesti
settings.unarchive.button = Kumoa tietovaraston arkistointi
release.type_attachment = Liite
tag.create_tag_from = Luo uusi tagi kohteesta"%s"
topic.count_prompt = Voit valita korkeintaan 25 aihetta
-settings.require_signed_commits = Vaadi allekirjoitettuja sitoumuksia
+settings.require_signed_commits = Vaadi allekirjoitetut kommitit
editor.push_rejected_summary = Koko hylkäysviesti:
release.title = Julkaisun nimi
release.tag_helper_existing = Olemassa oleva tagi.
@@ -2065,7 +2104,7 @@ editor.must_have_write_access = Sinulla täytyy olla kirjoitusoikeus tehdäksesi
issues.re_request_review = Pyydä katselmointia uudelleen
pulls.status_checks_details = Yksityiskohdat
release.title_empty = Nimi ei voi olla tyhjä.
-archive.title = Tämä tietovarasto on arkistoitu. Voit tarkastella sen tiedostoja ja kloonata sen, mutta et voi tehdä muutoksia sen tilaan, kuten lähettää tai luoda uusia vikalippuja, vetopyyntöjä tai kommentteja.
+archive.title = Tämä tietovarasto on arkistoitu. Voit tarkastella sen tiedostoja ja kloonata sen, mutta et voi tehdä muutoksia sen tilaan, kuten tehdä työntöjä tai luoda uusia ongelmia, vetopyyntöjä tai kommentteja.
reactions_more = ja %d lisää
mirror_address = Kloonaa URL-osoitteesta
migrate_items_merge_requests = Yhdistämispyynnöt
@@ -2077,9 +2116,9 @@ settings.discord_icon_url.exceeds_max_length = Kuvakkeen URL-osoite voi sisält
settings.event_wiki_desc = Wiki-sivu luotu, nimetty uudelleen, muokattu tai poistettu.
settings.event_pull_request_desc = Vetopyyntö avattu, suljettu, avattu uudelleen tai muokattu.
settings.protect_branch_name_pattern = Suojatun haaran nimen kaava
-issues.dependency.add_error_dep_not_same_repo = Molempien vikojen tulee olla samassa tietovarastossa.
+issues.dependency.add_error_dep_not_same_repo = Molempien ongelmien tulee olla samassa tietovarastossa.
settings.event_release = Julkaisu
-pulls.merge_pull_request = Luo yhdistämissitoumus
+pulls.merge_pull_request = Luo yhdistämiskommitti
settings.pull_mirror_sync_quota_exceeded = Kiintiö ylitetty, ei vedetä muutoksia.
settings.wiki_rename_branch_main_notices_1 = Tätä toimintoa EI VOI perua.
settings.webhook.test_delivery_desc_disabled = Aktivoi webkoukku testataksesi sitä tekaistulla tapahtumalla.
@@ -2092,31 +2131,31 @@ pulls.switch_comparison_type = Vaihda vertailutyyppiä
settings.hooks_desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun jotkin Forgejo-tapahtumat käynnistyvät. Lue lisää webkoukkujen oppaasta.
issues.num_participants_one = %d osallistuja
issues.reference_link = Viittaus: %s
-settings.transfer_desc = Siirrä tämä tietovarasto käyttäjälle tai organisaatiolle, johon sinulla on hallintaoikeudet.
+settings.transfer_desc = Siirrä tämä tietovarasto käyttäjälle tai organisaatiolle, johon sinulla on ylläpito-oikeudet.
settings.add_collaborator = Lisää avustaja
-settings.mirror_settings.push_mirror.none = Push-peilejä ei ole määritetty
-settings.collaborator_deletion_desc = Yhteistyöhenkilön poistaminen peruuttaa hänen pääsynsä tähän tietovarastoon. Jatketaanko?
-settings.archive.text = Tietovaraston arkistointi tekee siitä kokonaan vain-lukuisen. Se piilotetaan kojelaudalta. Kukaan –et edes sinä– ei voi tehdä uusia sitoumuksia tai avata vianlippuja tai vetopyyntöjä.
-settings.mirror_settings.docs = Määritä tietovarastosi synkronoimaan sitoumukset, tagit ja haarat automaattisesti toisen tietovaraston kanssa.
-settings.add_collaborator_duplicate = Yhteistyöhenkilö on jo lisätty tähän tietovarastoon.
-settings.add_collaborator_blocked_them = Yhteistyöhenkilöä ei voida lisätä, koska hän on estänyt tietovaraston omistajan.
-settings.add_collaborator_blocked_our = Yhteistyöhenkilöä ei voi lisätä, koska tietovaraston omistaja on estänyt hänet.
-settings.default_branch_desc = Valitse oletustietovaraston haara vetopyyntöjä ja koodin sitoumuksia varten:
+settings.mirror_settings.push_mirror.none = Työntöpeilejä ei ole määritetty
+settings.collaborator_deletion_desc = Avustajan poistaminen peruuttaa hänen pääsynsä tähän tietovarastoon. Jatketaanko?
+settings.archive.text = Tietovaraston arkistointi asettaa sen pelkkään lukutilaan. Se piilotetaan kojelaudalta. Kukaan ei voi tehdä (et edes sinä) uusia kommitteja, tai avata ongelmia tai vetopyyntöjä.
+settings.mirror_settings.docs = Määritä tietovarastosi synkronoimaan kommitit, tagit ja haarat automaattisesti toisen tietovaraston kanssa.
+settings.add_collaborator_duplicate = Avustaja on jo lisätty tähän tietovarastoon.
+settings.add_collaborator_blocked_them = Avustajaa ei voi lisätä, koska hän on estänyt tietovaraston omistajan.
+settings.add_collaborator_blocked_our = Avustajaa ei voi lisätä, koska tietovaraston omistaja on estänyt hänet.
+settings.default_branch_desc = Valitse tietovaraston oletushaara vetopyyntöjä ja koodin kommitteja varten:
issues.role.collaborator = Avustaja
-settings.trust_model.collaboratorcommitter.long = Yhteistyöhenkilö + Sitoumuksen toimija: Luota yhteistyöhenkilöiden allekirjoituksiin, jotka vastaavat sitoumuksen toimijaa
+settings.trust_model.collaboratorcommitter.long = Avustaja+kommitoija: Luota avustajien allekirjoituksiin, jotka vastaavat kommitoijaa
settings.collaborator_deletion = Poista avustaja
wiki.desc = Kirjoita ja jaa dokumentaatiota avustajien kesken.
settings.trust_model.collaborator = Avustaja
-mirror_sync_on_commit = Synkronoi, kun sitoumuksia työnnetään
-settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi työntämään sitoumukset, tagit ja haarat automaattisesti toiseen tietovarastoon. Sivustosi järjestelmänvalvoja on poistanut vetopeilit käytöstä.
-settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja push- ja pull-peileistä täältä:
-settings.mirror_settings.push_mirror.add = Lisää push-peili
+mirror_sync_on_commit = Synkronoi, kun kommitteja työnnetään
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = Määritä projektisi työntämään kommitit, tagit ja haarat automaattisesti toiseen tietovarastoon. Sivustosi järjestelmänvalvoja on poistanut vetopeilit käytöstä.
+settings.mirror_settings.docs.more_information_if_disabled = Löydät lisätietoja työntö- ja vetopeileistä täältä:
+settings.mirror_settings.push_mirror.add = Lisää työntöpeili
settings.mirror_settings.push_mirror.edit_sync_time = Muokkaa peilin synkronoinnin aikaväliä
-settings.trust_model.collaboratorcommitter = Yhteistyöhenkilö + Sitoumuksen toimija
+settings.trust_model.collaboratorcommitter = Avustaja+kommitoija
settings.trust_model.default = Oletusarvoinen luottamusmalli
settings.admin_enable_health_check = Ota tietovaraston terveystarkastukset käyttöön (git fsck)
settings.remove_collaborator_success = Avustaja on poistettu.
-issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu yhteistyöhön tietovaraston parissa.
+issues.role.collaborator_helper = Tämä käyttäjä on kutsuttu avustajaksi tietovarastoon.
settings.pulls_desc = Ota tietovaraston vetopyynnöt käyttöön
mirror_interval_invalid = Peilauksen aikaväli ei ole kelvollinen.
settings.collaboration = Avustajat
@@ -2126,56 +2165,56 @@ mirror_interval = Peilauksen aikaväli (kelvolliset yksiköt ovat "h", "m", "s")
settings.add_collaborator_success = Avustaja on lisätty.
settings.add_collaborator_owner = Omistajaa ei voi lisätä avustajaksi.
settings.signing_settings = Allekirjoituksen vahvistuksen asetukset
-settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään sitoumukset, tagit ja haarat toisesta tietovarastosta.
+settings.mirror_settings.docs.disabled_push_mirror.instructions = Määritä projektisi automaattisesti vetämään kommitit, tagit ja haarat toisesta tietovarastosta.
settings.trust_model.collaborator.long = Avustaja: Luota avustajien allekirjoituksiin
issues.dependency.setting = Käytä riippuvuuksia ongelmiin ja vetopyyntöihin
settings.allow_only_contributors_to_track_time = Salli vain avustajien seurata aikaa
settings.actions_desc = Käytä integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen
-settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje vianlippu muussa kuin oletushaarassa tehdyllä sitoumuksella
+settings.admin_enable_close_issues_via_commit_in_any_branch = Sulje ongelma muussa kuin oletushaarassa tehdyllä kommitilla
settings.mirror_settings.pushed_repository = Työnnetty tietovarasto
pulls.compare_changes_desc = Valitse haara, johon yhdistetään, ja haara, josta vedetään.
no_eol.text = Ei EOL:ää
auto_init_description = Aloita Git-historia README-tiedostolla ja valinnaisesti License- ja .gitignore-tiedostoilla.
new_from_template = Käytä mallipohjaa
-new_from_template_description = Voit valita olemassa olevan tietovarastomallipohjan tässä ilmentymässä ja käyttää sen asetuksia.
+new_from_template_description = Voit valita olemassa olevan tietovarastomallipohjan tässä instanssissa ja käyttää sen asetuksia.
new_advanced = Lisäasetukset
new_advanced_expand = Laajenna napsauttamalla
template_description = Mallipohjaisten tietovarastojen avulla käyttäjät voivat luoda uusia tietovarastoja, joilla on sama hakemistorakenne, tiedostot ja valinnaiset asetukset.
settings.enter_repo_name = Syötä omistajan ja tietovaraston nimi täsmälleen kuten esitetty:
settings.confirmation_string = Vahvistusteksti
-settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi %s tietovaraston, joka sisältää koodin, viat, kommentit, Wiki-tiedot ja yhteistyöhenkilön asetukset.
+settings.delete_notices_2 = - Tämä toiminto poistaa pysyvästi tietovaraston %s mukaan lukien koodin, ongelmat, kommentit, wikidatan ja avustaja-asetukset.
issues.filter_assginee_no_select = Kaikki käsittelijät
issues.new.assign_to_me = Osoita itselle
-pulls.closed_at = `sulki tämän vetopyynnön %[2]s`
+pulls.closed_at = `sulki tämän vetopyynnön %s`
tree_path_not_found_branch = Polkua %[1]s ei ole olemassa haarassa %[2]s
transfer.no_permission_to_reject = Sinulla ei ole oikeutta hylätä tätä siirtoa.
generate_repo = Luo tietovarasto
-tree_path_not_found_commit = Polkua %[1]s ei ole olemassa sitoumuksessa %[2]s
-archive.pull.noreview = Tämä tietovarasto on arkistoitu. Et voi arvioida vetopyyntöjä.
+tree_path_not_found_commit = Polkua %[1]s ei ole olemassa kommitissa %[2]s
+archive.pull.noreview = Tämä tietovarasto on arkistoitu. Et voi katselmoida vetopyyntöjä.
tree_path_not_found_tag = Polkua %[1]s ei ole olemassa tagissa %[2]s
transfer.no_permission_to_accept = Sinulla ei ole oikeutta hyväksyä tätä siirtoa.
settings.web_hook_name_feishu = Feishu / Lark Suite
issues.review.reviewers = Katselmoijat
issues.new.no_reviewers = Ei katselmoijia
-issues.add_label = lisäsi tunnisteen %s %s
-issues.due_date_added = lisäsi määräpäivän %s %s
+issues.add_label = lisäsi nimilapun %s %s
+issues.due_date_added = lisäsi eräpäivän %s %s
issues.review.add_review_request = pyysi katselmointia käyttäjältä %[1]s %[2]s
-issues.ref_pull_from = `viittasi tähän vetopyyntöön %[4]s %[2]s`
-pulls.commit_ref_at = `viittasi tähän vetopyyntöön sitoumuksesta %[2]s`
+issues.ref_pull_from = `viittasi tähän vetopyyntöön %[3]s %[1]s`
+pulls.commit_ref_at = `viittasi tähän vetopyyntöön kommitista %s`
issues.review.comment = katselmoi %s
-issues.add_labels = lisäsi tunnisteet %s %s
+issues.add_labels = lisäsi nimilaput %s %s
issues.review.add_review_requests = pyysi katselmointeja käyttäjiltä %[1]s %[2]s
pulls.blocked_by_official_review_requests = Tämä vetopyyntö on estetty, koska siltä puuttuu hyväksyntä yhdeltä tai useammalta viralliselta katselmoijalta.
issues.author.tooltip.issue = Tämä käyttäjä on tämän ongelman tekijä.
issues.author.tooltip.pr = Tämä käyttäjä on tämän vetopyynnön tekijä.
-issues.role.contributor_helper = Tämä käyttäjä on aiemmin sitoutunut tähän tietovarastoon.
-settings.event_pull_request_label = Tunnisteet
-issues.due_date_remove = poisti määräpäivän %s %s
-settings.event_issue_label = Tunnisteet
+issues.role.contributor_helper = Tämä käyttäjä on aiemmin kommitoinut tähän tietovarastoon.
+settings.event_pull_request_label = Nimilaput
+issues.due_date_remove = poisti eräpäivän %s %s
+settings.event_issue_label = Nimilaput
settings.authorization_header = Authorization-otsake
diff.has_escaped = Tällä rivillä on piilotettuja Unicode-merkkejä
issues.max_pinned = Et voi kiinnittää enempää ongelmia
-settings.external_tracker_url_error = Ulkoisen ongelmienseurannan URL-osoite ei ole kelvollinen.
+settings.external_tracker_url_error = Ulkoisen ongelmanseurannan URL-osoite ei ole kelvollinen.
settings.event_pull_request_review = Katselmoinnit
settings.event_pull_request_review_request = Katselmointipyynnöt
issues.num_reviews_one = %d katselmointi
@@ -2183,8 +2222,8 @@ issues.num_reviews_few = %d katselmointia
issues.filter_no_results = Ei tuloksia
issues.filter_no_results_placeholder = Kokeile määrittää eri hakusuodattimet.
projects.edit_subheader = Projektit organisoivat ongelmia ja seuraavat edistymistä.
-issues.label_templates.title = Lataa tunnisteen esiasetus
-issues.label_deletion_desc = Tunnisteen poistaminen poistaa sen kaikista ongelmista. Jatketaanko?
+issues.label_templates.title = Lataa nimilapun esiasetus
+issues.label_deletion_desc = Nimilapun poistaminen poistaa sen kaikista ongelmista. Jatketaanko?
issues.attachment.download = `Napsauta ladataksesi "%s"`
issues.review.option.hide_outdated_comments = Piilota vanhentuneet kommentit
issues.review.show_outdated = Näytä vanhentuneet
@@ -2195,8 +2234,8 @@ issues.unpin_issue = Poista ongelman kiinnitys
issues.review.outdated_description = Sisältö on muuttunut siitä ajanhetkestä, kun tämä kommentti luotiin
issues.review.option.show_outdated_comments = Näytä vanhentuneet kommentit
issues.review.outdated = Vanhentunut
-issues.label_templates.use = Käytä tunnisteen esiasetusta
-issues.label_deletion_success = Tunniste on poistettu.
+issues.label_templates.use = Käytä nimilapun esiasetusta
+issues.label_deletion_success = Nimilappu on poistettu.
issues.cancel_tracking = Hylkää
issues.choose.get_started = Aloitetaan
settings.event_fork = Forkkaus
@@ -2206,27 +2245,338 @@ delete_preexisting = Poista olemassa olevat tiedostot
issues.reaction.add = Lisää reaktio
pulls.merged_by = %[3]s:n yhdistettiin %[1]s
pulls.merged_by_fake = %[2]s:n yhdistettiin %[1]s
-delete_preexisting_success = Poistetut omaksumattomat tiedostot %s:ssa
+delete_preexisting_success = Poistetut omaksumattomat tiedostot kohteesta %s
pulls.no_merge_wip = Tätä vetopyyntöä ei voida yhdistää, koska se on merkitty keskeneräiseksi työksi.
pulls.clear_merge_message = Tyhjennä yhdistämisviesti
activity.title.prs_merged_by = %s yhdisti %s
-settings.protect_status_check_patterns_desc = Syötä kuviot määrittääksesi, mitkä tilatarkistukset on läpäistävä ennen kuin haarat voidaan yhdistää tätä sääntöä vastaavaan haaraan. Jokainen rivi määrittää kuvion. Kuviot eivät saa olla tyhjiä.
-adopt_search = Syötä käyttäjänimi etsiäksesi omaksumattomia tietovarastoja (jätä tyhjäksi löytääksesi kaikki)
+settings.protect_status_check_patterns_desc = Syötä kaavat määrittääksesi, mitkä tilatarkistukset on läpäistävä, ennen kuin haarat voidaan yhdistää tätä sääntöä vastaavaan haaraan. Jokainen rivi määrittää kaavan. Kaavat eivät saa olla tyhjiä.
+adopt_search = Syötä käyttäjänimi etsiäksesi omaksumattomia tietovarastoja… (jätä tyhjäksi löytääksesi kaikki)
pulls.cmd_instruction_merge_warning = Varoitus: Asetusta ”Tunnista manuaalinen yhdistäminen automaattisesti” ei ole otettu käyttöön tässä tietovarastossa. Sinun on merkittävä tämä vetopyyntö manuaalisesti yhdistetyksi jälkikäteen.
pulls.cmd_instruction_merge_desc = Yhdistä muutokset ja päivitä Forgejossa.
pulls.cannot_auto_merge_desc = Tätä vetopyyntöä ei voida yhdistää automaattisesti ristiriitojen vuoksi.
-adopt_preexisting_success = Omaksutut tiedostot ja luotu tietovarasto %s:lta
-issues.comment_manually_pull_merged_at = manuaalisesti yhdistetty sitoumus %[1]s %[2]s:hen %[3]s
+adopt_preexisting_success = Omaksuttu tiedostot ja luotu tietovarasto lähteestä %s
+issues.comment_manually_pull_merged_at = manuaalisesti yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s
pulls.cmd_instruction_merge_title = Yhdistä
pulls.has_merged = Epäonnistui: vetopyyntö on yhdistetty, joten et voi yhdistää uudelleen tai muuttaa kohdehaaraa.
pulls.cmd_instruction_checkout_title = Uloskuittaus
-pulls.cmd_instruction_checkout_desc = Projektitietovarastostasi, kuita ulos uusi haara ja testaa muutokset.
-pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain sitoumusviestin sisällön ja säilyttää luodut git-trailerit, kuten "Yhteistekijänä …".
-settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun se on otettu käyttöön, sitoumukset on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen sitoumuksen on oltava onnistunut kontekstista riippumatta.
-issues.comment_pull_merged_at = yhdistetty sitoumus %[1]s %[2]s :hen %[3]s
+pulls.cmd_instruction_checkout_desc = Kuittaa ulos uusi haara projektitietovarastostasi ja testaa muutokset.
+pulls.clear_merge_message_hint = Yhdistämisviestin tyhjentäminen poistaa vain kommittiviestin sisällön ja säilyttää luodut git-trailerit, kuten "Co-Authored-By…".
+settings.protect_check_status_contexts_desc = Vaadi tilatarkistusten läpäisy ennen yhdistämistä. Kun käytössä, kommitit on ensin työnnettävä toiseen haaraan ja sitten yhdistettävä tai työnnettävä suoraan tätä sääntöä vastaavaan haaraan tilantarkistuksen jälkeen. Jos konteksteja ei löydy, viimeisen kommitin on oltava onnistunut kontekstista riippumatta.
+issues.comment_pull_merged_at = yhdistetty kommitti %[1]s %[2]s tietovarastoon %[3]s
settings.pulls.enable_autodetect_manual_merge = Ota Tunnista manuaalinen yhdistäminen automaattisesti -asetus käyttöön (Huomaa: joissakin erityistapauksissa voi esiintyä virhearviointeja)
pulls.no_merge_desc = Tätä vetopyyntöä ei voida yhdistää, koska kaikki tietovaraston yhdistämisvaihtoehdot ovat poistettu käytöstä.
-pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista arvioinnin tila ja tilantarkistukset.
+pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. Tarkista katselmoinnin tila ja tilantarkistukset.
+issues.is_stale = Tähän vetopyyntöön on kohdistunut muutoksia tämän katselmoinnin jälkeen
+migrate.repo_desc_helper = Jätä tyhjäksi tuodaksesi olemassa olevan kuvauksen
+issues.role.first_time_contributor = Avustaja ensimmäistä kertaa
+issues.role.contributor = Avustaja
+activity.opened_prs_label = Ehdotettu
+settings.require_signed_commits_desc = Hylkää työnnöt tähän haaraan, jos niitä ei ole allekirjoitettu tai ne eivät ole vahvistettuja.
+issues.role.first_time_contributor_helper = Tämä on käyttäjän ensimmäinen kontribuutio tähän tietovarastoon.
+editor.upload_files_to_dir = Lähetä tiedostot hakemistoon "%s"
+adopt_preexisting = Omaksu olemassa olevat tiedostot
+issues.dismiss_review_warning = Haluatko hylätä katselmoinnin?
+commit.operations = Toimenpiteet
+commits.view_single_diff = Näytä tässä kommitissa tähän tiedostoon kohdistuneet muutokset
+issues.choose.ignore_invalid_templates = Virheelliset mallipohjat on jätetty huomiotta
+migrate.migrating_milestones = Suoritetaan merkkipaalujen migraatiota
+migrate.migrating_issues = Suoritetaan ongelmien migraatiota
+migrate.clone_local_path = tai paikallisen palvelimen polku
+pulls.filter_changes_by_commit = Suodata kommitin perusteella
+pulls.show_changes_since_your_last_review = Näytä viimeisimmän katselmointisi jälkeiset muutokset
+pulls.cant_reopen_deleted_branch = Tätä vetopyyntöä ei voi avata uudelleen, koska haara poistettiin.
+mirror_sync = synkronoitu
+mirror_lfs_endpoint = LFS-päätepiste
+language_other = Muu
+adopt_preexisting_label = Omaksu tiedostot
+issues.role.member_helper = Tämä käyttäjä on tietovaraston omistavan organisaation jäsen.
+migrate.invalid_local_path = Paikallinen polku on virheellinen. Sitä ei ole olemassa tai se ei ole hakemisto.
+migrate.invalid_lfs_endpoint = LFS-päätepiste ei ole kelvollinen.
+issues.new.clear_projects = Tyhjennä projektit
+mirror_denied_combination = Julkiseen avaimeen ja salasanaan pohjautuvaa todennusta ei voi käyttää yhdessä.
+template.git_content = Git-sisältö (Oletushaara)
+migrate.migrating_releases = Suoritetaan julkaisujen migraatiota
+unit_disabled = Sivuston ylläpitäjä on poistanut käytöstä tämän tietovarasto-osion.
+issues.filter_sort.relevance = Asiaankuuluvuus
+pulls.reopen_to_merge = Avaa tämä vetopyyntö uudelleen suorittaaksesi yhdistämisen.
+archive.nocomment = Kommentointi ei ole mahdollista, koska tietovarasto on arkistoitu.
+projects.column.set_default_desc = Aseta tämä sarake oletukseksi luokittelemattomille ongelmille ja vedoille
+issues.review.remove_review_request_self = kieltäytyi katselmoimasta %s
+from_comment = (kommentti)
+issues.dismiss_review = Hylkää katselmointi
+editor.file_changed_while_editing = Tiedoston sisältö on muuttunut sen avaamisen jälkeen. Napsauta tästä nähdäksesi muutokset tai kommitoi muutokset uudelleen korvataksesi muutokset.
+sync_fork.button = Synkronoi
+migrated_from = Suoritettu migraatio lähteestä %[2]s
+migrate.migrating_topics = Suoritetaan aiheiden migraatiota
+migrate.migrating_pulls = Suoritetaan vetopyyntöjen migraatiota
+migrate.cancel_migrating_title = Peruuta migraatio
+file_follow = Seuraa symbolista linkkiä
+commit.load_referencing_branches_and_tags = Lataa haarat ja tagit, jotka viittaavat tähän kommittiin
+editor.commit_id_not_matching = Tiedosto muuttui sillä aikaa, kun muokkasit sitä. Kommitoi uuteen haaraan ja yhdistä sen jälkeen.
+projects.new_subheader = Koordinoi, seuraa ja päivitä työtä yhdessä paikassa, jotta projektit pysyvät läpinäkyvinä ja aikataulussa.
+issues.del_time_history = `poisti käytetyn ajan %s`
+issues.dependency.removed_dependency = `poisti riippuvuuden %s`
+issues.dependency.add_error_same_issue = Et voi tehdä ongelmaa riippuvaiseksi itsestään.
+projects.card_type.desc = Korttiesikatselut
+issues.dependency.added_dependency = `lisäsi uuden riippuvuuden %s`
+fork_no_valid_owners = Tätä tietovarastoa ei voi forkata, koska sillä ei ole kelvollisia omistajia.
+fork_branch = Forkkiin kloonattava haara
+editor.must_be_on_a_branch = Sinun tulee olla haarassa, jotta voit tehdä tai ehdottaa muutoksia tähän tiedostoon.
+editor.commit_message_desc = Lisää valinnainen, laajennettu kuvaus…
+migrate_options_lfs = Tee migraatio LFS-tiedostoille
+migrate_options_lfs_endpoint.label = LFS-päätepiste
+commits.browse_further = Selaa kauemmas
+issues.filter_projects = Suodata projekti
+issues.filter_labels = Suodata nimilappu
+commits.no_commits = Ei yhteisiä kommitteja. "%s" ja "%s" omaavat täysin eri historiat.
+projects.column.deletion_desc = Projektin sarakkeen poistaminen siirtää kaikki siihen liittyvät ongelmat oletussarakkeeseen. Jatketaanko?
+issues.del_time = Poista tämä aikaloki
+migrated_from_fake = Suoritettu migraatio lähteestä %[1]s
+migrate.migrate = Tee migraatio lähteestä %s
+migrate.migrating_labels = Suoritetaan nimilappujen migraatiota
+file_view_rendered = Näytä renderöitynä
+editor.invalid_commit_mail = Virheellinen sähköposti kommitin luomista varten.
+sync_fork.branch_behind_one = Tämä haara on %[1]d kommitin jäljessä %[2]s
+sync_fork.branch_behind_few = Tämä haara on %[1]d kommittia jäljessä %[2]s
+no_eol.tooltip = Tämä tiedosto ei sisällä lopussa olevaa rivin loppu -merkkiä.
+issues.filter_reviewers = Suodata katselmoija
+commits.view_path = Näytä tässä historian kohdassa
+commit.revert = Palauta
+commit.revert-header = Palauta: %s
+mirror_use_ssh.not_available = SSH-todennus ei ole käytettävissä.
+pulls.showing_specified_commit_range = Näytetään vain muutokset välillä %[1]s..%[2]s
+pulls.select_commit_hold_shift_for_range = Valitse kommitti. Pidä pohjassa shift + napsauta valitaksesi alueen
+blame_prior = Näytä blame ennen tätä muutosta
+migrate.migrating_failed.error = Migraatio epäonnistui: %s
+editor.no_commit_to_branch = Kommitointi suoraan haaraan ei onnistu syystä:
+editor.user_no_push_to_branch = Käyttäjä ei voi työntää haaraan
+issues.delete.text = Haluatko varmasti poistaa tämän ongelman? (Sisältö poistetaan pysyvästi. Harkitse sen sijaan sulkemista, jos haluat pitää ongelman arkistoituna)
+issues.context.menu = Kommenttivalikko
+archive.title_date = Tämä tietovarasto arkistoitiin %s. Voit tarkastella sen tiedostoja ja kloonata sen, mutta et voi tehdä muutoksia sen tilaan, kuten tehdä työntöjä tai luoda uusia ongelmia, vetopyyntöjä tai kommentteja.
+pulls.cannot_auto_merge_helper = Yhdistä manuaalisesti selvittääksesi konfliktit.
+pulls.merge_conflict = Yhdistäminen epäonnistui: Yhdistämisen aikana tapahtui ristiriita. Vihje: Kokeile eri strategiaa
+pulls.is_checking = Yhdistämisen ristiriidan tarkistus on meneillään. Kokeile uudelleen hetken kuluttua.
+pulls.is_empty = Tässä haarassa olevat muutokset ovat jo kohdehaarassa. Tästä tulee tyhjä kommitti.
+pulls.required_status_check_administrator = Ylläpitäjänä voit silti yhdistää tämän vetopyynnön.
+pulls.required_status_check_failed = Jotkin vaaditut tarkistukset eivät onnistuneet.
+pulls.required_status_check_missing = Jotkin vaaditut tarkistukset puuttuvat.
+pulls.status_checks_failure = Jotkin tarkistukset epäonnistuivat
+pulls.status_checks_show_all = Näytä kaikki tarkistukset
+pulls.auto_merge_cancel_schedule = Peru automaattinen yhdistäminen
+pulls.auto_merge_newly_scheduled = Tämä vetopyyntö aikataulutettiin yhdistettäväksi, kun kaikki tarkistukset onnistuvat.
+pulls.auto_merge_not_scheduled = Tätä vetopyyntöä ei ole aikataulutettu automaattisesti yhdistettäväksi.
+comments.edit.already_changed = Muutosten tallentaminen kommenttiin epäonnistui. Vaikuttaa siltä, että sisältöä on jo muutettu toisen käyttäjän toimesta. Päivitä sivu ja muokkaa uudelleen välttääksesi ylikirjoittamasta muiden muutoksia
+signing.wont_sign.nokey = Tässä instanssissa ei ole avainta tämän kommitin allekirjoittamiseksi.
+pulls.is_ancestor = Tämä haara on jo sisällytetty kohdehaaraan. Yhdistettävää ei ole.
+pulls.blocked_by_rejection = Tämä vetopyyntö sisältää virallisen katselmoijan vaatimisia muutoksia.
+pulls.status_checks_success = Kaikki tarkistukset onnistuivat
+pulls.agit_explanation = Luotu käyttäen AGit-työnkulkua. AGit antaa avustajien ehdottaa muutoksia käyttämällä "git push" ilman, että uutta forkkia tai uutta haaraa luodaan.
+milestones.invalid_due_date_format = Eräpäivän muodon tulee olla "yyyy-mm-dd".
+wiki.original_git_entry_tooltip = Näytä alkuperäinen Git-tiedosto sen sijaan, että ystävällistä linkkiä käytetään.
+pulls.blocked_by_approvals = Tällä vetopyynnöllä ei ole riittävästi hyväksyntöjä. %d/%d hyväksyntää myönnetty.
+pulls.status_checks_hide_all = Piilota kaikki tarkistukset
+pulls.blocked_by_user = Et voi luoda vetopyyntöä tähän tietovarastoon, koska tietovarastojan omistaja on estänyt sinut.
+pulls.delete.text = Haluatko varmasti poistaa tämän vetopyynnön? (Kaikki sisältö poistetaan pysyvästi. Harkitse sen sijaan sulkemista, jos haluat pitää arkistoituna)
+wiki.page_name_desc = Kirjoita tämän wikisivun nimi. Joitain erikoisnimiä ovat: "Home", "_Sidebar" ja "_Footer".
+pulls.blocked_by_changed_protected_files_1 = Tämä vetopyyntö sisältää suojatun tiedoston ja on siksi estetty:
+pulls.status_checks_warning = Jotkin tarkistukset raportoivat varoituksia
+pulls.status_checks_error = Jotkin tarkistukset raportoivat virheitä
+pulls.reopened_at = `avasi uudelleen tämän vetopyynnön %s`
+pulls.auto_merge_when_succeed = Yhdistä automaatisesti kun kaikki tarkistukset onnistuvat
+signing.wont_sign.error = Tapahtui virhe tarkistaessa voiko kommitin allekirjoittaa.
+signing.wont_sign.twofa = Sinulla tulee olla kaksivaiheinen todennus käytössä, jotta kommitit voi allekirjoittaa.
+pulls.data_broken = Tämä vetopyyntö on rikki johtuen puuttuvasta forkkitiedosta.
+pulls.files_conflicted = Tämä vetopyyntö sisältää muutoksia, jotka ovat ristiriidassa kohdehaaran kanssa.
+pulls.auto_merge_button_when_succeed = (Kun tarkistukset onnistuvat)
+pulls.blocked_by_outdated_branch = Tämä vetopyyntö on vanhentunut ja siksi estetty.
+pulls.blocked_by_changed_protected_files_n = Tämä vetopyyntö on estetty, koske se muuttaa suojattuja tiedostoja:
+pulls.status_checking = Jotkin tarkistukset odottavat
+pulls.auto_merge_canceled_schedule = Tämän vetopyynnön automaattinen yhdistäminen peruttiin.
+activity.title.prs_opened_by = %s ehdottanut %s
+settings.convert_fork = Konvertoi tavalliseksi tietovarastoksi
+settings.convert_fork_confirm = Konvertoi tietovarasto
+settings.add_collaborator_inactive_user = Inaktiivista käyttäjää ei voi lisätä avustajaksi.
+settings.mirror_settings.docs.pulling_remote_title = Etätietovarastosta vetäminen
+settings.pull_mirror_sync_in_progress = Vedetään muutoksia etäpuolelta %s tällä hetkellä.
+settings.convert = Konvertoi tavalliseksi tietovarastoksi
+settings.transfer_in_progress = Meneillään on jo siirto. Peruuta siirto, jos haluat siirtää tämän tietovaraston toiselle käyttäjälle.
+settings.trust_model.collaborator.desc = Tämän tietovaraston avustajien kelvolliset allekirjoitukset merkitään luotetuiksi ("trusted") - (ottamatta kantaa, vastaavatko he kommitoijaa vai eivät). Muussa tapauksessa allekirjoitetukset merkitään ei-luotetuiksi ("untrusted"), jos allekirjoitus vastaa kommitoijaa, ja vastaamaton ("unmatched") jos ei.
+settings.confirm_wiki_branch_rename = Nimeä uudelleen wikin haara
+settings.event_pull_request_assign = Toimeksianto
+settings.event_pull_request_assign_desc = Vetopyynnön toimeksianto luotu tai toimeksiannon osoitus poistettu.
+settings.event_pull_request_label_desc = Vetopyynnön nimilappuja lisätty tai poistettu.
+settings.active = Aktiivinen
+settings.packagist_api_token = API-poletti
+settings.protect_whitelist_committers = Sallittujen listalla rajoitettu työntö
+settings.protect_enable_merge = Ota yhdistäminen käyttöön
+settings.protect_enable_merge_desc = Kenen tahansa kirjoituspääsyllä sallitaan yhdistää vetopyynnöt tähän haaraan.
+settings.protect_status_check_patterns = Tilatarkistuskaavat
+settings.protect_invalid_status_check_pattern = Virheellinen tilatarkistuksen kaava: "%s".
+settings.protect_no_valid_status_check_patterns = Ei kelvollisia tilatarkistuksen kaavoja.
+settings.protect_required_approvals_desc = Salli yhdistäminen vain vetopyynnöille, joilla on riittävästi positiivisia katselmointeja.
+settings.protect_protected_file_patterns = Suojattujen tiedostojen kaavat (erotettu puolipisteellä ";")
+settings.remove_protected_branch_success = Haaran suojaus säännölle "%s" on poistettu.
+settings.enforce_on_admins = Pakota tämä sääntö tietovaraston ylläpitäjiin
+settings.add_key_success = Toimitusavain "%s" on lisätty.
+settings.update_mirror_settings = Päivitä peilin asetukset
+settings.tracker_url_format_error = Ulkoisen ongelmanseurannan URL-muoto ei ole kelvollinen URL-osoite.
+settings.wiki_rename_branch_main = Normalisoi Wiki-haaran nimi
+settings.wiki_delete_notices_1 = - Tämä poistaa pysyvästi wikin ja poistaa tietovaraston %s wikin käytöstä.
+settings.webhook.replay.description_disabled = Toista webkoukku aktivoimalla se.
+settings.add_webhook_desc = Forgejo lähettää POST
-pyyntöjä määritetyllä "Content-Type":llä kohde-URL-osoitteeseen. Lue lisää webkoukkujen oppaasta.
+activity.title.unresolved_conv_n = %d selvittämätöntä keskustelua
+activity.title.releases_published_by = %s julkaissut %s
+settings.desc = Asetuksissa voit hallita tietovaraston asetuksia
+settings.external_tracker_url_desc = Kävijät ohjataan ulkoisen ongelmanseurannan URL-osoitteeseen, kun Ongelmat-välilehteä napsautetaan.
+settings.tracker_issue_style = Ulkoisen ongelmanseurannan numeromuoto
+settings.tracker_issue_style.regexp_pattern = Säännöllisen lausekkeen kaava
+settings.convert_confirm = Konvertoi tietovarasto
+settings.webhook.delivery.success = Tapahtuma on lisätty toimitusjonoon. Saattaa kestää muutama sekunti, ennen kuin se näkyy toimitushistoriassa.
+settings.event_pull_request_approvals = Vetopyynnön hyväksynnät
+settings.protect_enable_push = Ota työntö käyttöön
+settings.protect_whitelist_committers_desc = Vain sallittujen listalla olevat käyttäjät tai tiimit sallitaan työntää tähän haaraan (mutta ei työntää väkisin).
+settings.block_rejected_reviews = Estä yhdistäminen hylätyillä katselmoinneilla
+settings.is_writable = Ota kirjoituspääsy käyttöön
+settings.delete_notices_fork_1 = - Poistamisen jälkeen tämän tietovaraston forkeista tulee itsenäisiä.
+settings.event_pull_request_review_request_desc = Vetopyynnön katselmointi pyydetty tai katselmointipyyntö poistettu.
+settings.event_pull_request_merge = Vetopyynnön yhdistäminen
+settings.protect_approvals_whitelist_enabled = Rajoita hyväksynnät vain sallittujen käyttäjien tai tiimien listoilla oleviin
+settings.packagist_package_url = Packagist-paketin URL-osoite
+settings.packagist_username = Packagist-käyttäjänimi
+settings.sourcehut_builds.manifest_path = Koontimanifestin polku
+settings.event_pull_request_sync_desc = Haara päivitetty automaattisesti kohdehaaralla.
+settings.trust_model.committer = Kommitoija
+settings.convert_succeed = Peili on konvertoitu tavalliseksi tietovarastoksi.
+settings.transfer_notices_1 = - Menetät pääsyn tähän tietovarastoon, jos siirrät sen yksittäiselle käyttäjälle.
+settings.githooks_desc = Git-koukuista vastaa Git itse. Voit muokata koukkutiedostoja alla määrittääksesi omavalintaisia toimenpiteitä.
+settings.update_protect_branch_success = Haaran suojaus säännölle "%s" on päivitetty.
+settings.mirror_settings.direction.push = Työntö
+settings.convert_desc = Voit konvertoida tämän peilin tavalliseksi tietovarastoksi. Tätä ei voi perua.
+settings.trust_model.committer.long = Kommitoija: Luota allekirjoituksiin, jotka vastaavat kommitoijia (Tämä vastaa GitHubia ja pakottaa Forgejo-allekirjoitetut kommitit olemaan Forgejo-käyttäjän kommitoimia)
+settings.protected_branch_deletion_desc = Haaran suojauksen poistaminen käytöstä sallii käyttäjien kirjoitusoikeudella työntää haaraan. Jatketaanko?
+settings.admin_code_indexer = Koodin indeksoija
+settings.remove_protected_branch_failed = Haaran suojaussäännön "%s" poistaminen epäonnistui.
+settings.block_outdated_branch = Estä yhdistäminen jos vetopyyntö on vanhentunut
+settings.protect_branch_name_pattern_desc = Suojattujen haarojen nimien kaavat. Lue dokumentaatio kaavojen syntaksista. Esimerkkejä: main, release/**
+settings.block_rejected_reviews_desc = Yhdistäminen ei ole mahdollista, kun viralliset katselmoijat pyytävät muutoksia, siitä huolimatta että hyväksyntöjä olisi riittävästi.
+settings.convert_notices_1 = Tämä toimenpide konvertoi peilin tavalliseksi tietovarastoksi, eikä toimenpidettä voi perua.
+settings.convert_fork_notices_1 = Tämä toimenpide konvertoi forkin tavalliseksi tietovarastoksi, eikä toimenpidettä voi perua.
+settings.convert_fork_succeed = Forkki on konvertoitu tavalliseksi tietovarastoksi.
+settings.transfer_abort_invalid = Et voi perua olematonta tietovaraston siirtoa.
+settings.trust_model.default.desc = Käytä oletusarvoista tietovaraston luottamusmallia tälle asennukselle.
+settings.enforce_on_admins_desc = Tietovaraston ylläpitäjät eivät voi ohittaa tätä sääntöä.
+settings.reindex_requested = Uudelleenindeksointi pyydetty
+settings.admin_stats_indexer = Kooditilastojen indeksoija
+settings.admin_indexer_commit_sha = Viimeksi indeksoitu kommitti
+settings.webhook.replay.description = Toista webkoukku uudelleen.
+settings.event_push_only = Työntötapahtumat
+settings.authorization_header_desc = Sisällytetään Authorization-otsakkeeseen pyynnöissä. Esimerkkejä: %s.
+settings.protect_approvals_whitelist_teams = Katselmointeihin oikeutettujen tiimien lista
+settings.federation_not_enabled = Federaatiota ei ole käytössä käyttämässäsi instanssissa.
+settings.mirror_settings.push_mirror.none_ssh = Ei mitään
+settings.mirror_settings.direction.pull = Veto
+settings.push_mirror_sync_in_progress = Työnnetään muutoksia etäpuoleen %s tällä hetkellä.
+settings.transfer_notices_2 = - Säilytät pääsyn tietovarastoon, jos siirrät sen organisaatiolle, jonka omistat kokonaan tai osittain.
+settings.protect_merge_whitelist_teams = Yhdistämiseen oikeutettujen tiimien lista
+settings.protect_check_status_contexts_list = Tilatarkistuksia löytyi tälle tietovarastolle viime viikolta
+settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = Tällä hetkellä tämä on mahdollista vain valitsemalla "Uusi migraatio" valikosta. Saadaksesi lisätietoja:
+settings.mirror_settings.docs.disabled_push_mirror.info = Työntöpeilit on poistettu käytöstä sivuston ylläpidon toimesta.
+settings.mirror_settings.mirrored_repository = Peilattu tietovarasto
+settings.protect_check_status_contexts = Ota tilatarkistus käyttöön
+settings.pulls.default_delete_branch_after_merge = Poista vetopyynnön haara yhdistämisen jälkeen oletusarvoisesti
+settings.content_type = POST-sisältötyyppi
+settings.event_pull_request_comment_desc = Vetopyynnön kommentti luotu, muokattu tai poistettu.
+settings.event_pull_request_review_desc = Vetopyyntö hyväksytty, hylätty tai katselmoinnin kommentteja lisätty.
+settings.admin_indexer_unindexed = Indeksöimätön
+settings.reindex_button = Lisää uudelleenindeksoinnin jonoon
+settings.web_hook_name_wechatwork = WeCom (Wechat Work)
+settings.delete_team_tip = Tällä tiimillä on pääsy kaikkiin tietovarastoihin, eikä sitä voi poistaa
+settings.sourcehut_builds.visibility = Työn näkyvyys
+settings.sourcehut_builds.access_token_helper = Pääsypoletti, jolla on myöntö JOBS:RW. Luo builds.sr.ht-poletti tai builds.sr.ht-poletti pääsyllä salaisuuksiin meta.sr.ht:ssä.
+settings.team_not_in_organization = Tiimi ei ole samassa organisaatiossa kuin tietovarasto
+settings.add_team_duplicate = Tiimillä on jo tietovarasto
+settings.add_webhook.invalid_channel_name = Webkoukun kanavan nimi ei voi olla tyhjä, eikä se voi sisältää vain merkkiä #.
+settings.sourcehut_builds.secrets_helper = Anna työlle pääsy koontisalaisuuksiin (vaatii myönnön SECRETS:RO)
+settings.protect_disable_push_desc = Tähän haaraan ei sallita työntämistä.
+settings.protect_disable_push = Poista työntö käytöstä
+activity.unresolved_conv_desc = Näitä äskettäin muuttuneita ongelmia ja vetopyyntöjä ei ole vielä selvitetty.
+activity.title.unresolved_conv_1 = %d selvittämätön keskustelu
+activity.git_stats_files_changed_1 = on muuttunut
+settings.convert_fork_desc = Voit konvertoida tämän forkin tavalliseksi tietovarastoksi. Tätä ei voi perua.
+settings.protect_merge_whitelist_committers = Ota yhdistämiseen sallittu lista käyttöön
+settings.protect_whitelist_teams = Työntämiseen oikeutettujen tiimien lista
+settings.protect_enable_push_desc = Kenen tahansa kirjoituspääsyllä sallitaan työntää tähän haaraan (mutta ei työntää väkisin).
+settings.change_team_access_not_allowed = Tiimin pääsyn muuttaminen tietovarastoon on rajoitettu organisaation omistajaan
+settings.change_team_permission_tip = Tiimin käyttöoikeus on asetettu tiimin asetussivulla, eikä sitä voi muuttaa tietovarastokohtaisesti
+settings.rename_branch_failed_protected = Haaraa %s ei voi nimetä uudelleen, koska se on suojattu haara.
+release.hide_archive_links = Piilota automaattisesti luodut arkistot
+diff.review.self_reject = Vetopyyntöjen tekijät eivät voi pyytää muutoksia omiin vetopyyntöihinsä
+settings.unarchive.text = Tietovaraston arkistoinnin kumoaminen palauttaa mahdollisuuden vastaanottaa kommitteja ja työntöjä, sekä luoda uusia ongelmia ja vetopyyntöjä.
+settings.unarchive.success = Tietovaraston arkistointi kumottiin.
+settings.update_avatar_success = Tietovaraston profiilikuva päivitettiin.
+diff.review.self_approve = Vetopyyntöjen tekijät eivät voi hyväksyä omia vetopyyntöjään
+tag.ahead.target = haaraan %s tämän tagin jälkeen
+release.add_tag_msg = Käytä otsikkoa ja julkaisun sisältöä tagin viestinä.
+branch.rename_branch_to = Aseta haaran "%s" uudeksi nimeksi:
+error.csv.too_large = Tätä tiedostoa ei voi renderöidä, koska se on liian suuri.
+settings.unarchive.error = Tietovaraston arkistointia kumotessa tapahtui virhe. Katso lisätietoja lokista.
+settings.rename_branch_failed_exist = Haaraa ei voi nimetä uudelleen, koska kohdehaara %s on olemassa.
+release.tag_helper_new = Uusi tagi. Tämä tagi luodaan kohteesta.
+diff.review = Viimeistele katselmointi
+error.broken_git_hook = Tämän tietovaraston Git-koukut vaikuttavat olevan rikki. Seuraa dokumentaation ohjeita korjataksesi koukut, sen jälkeen työnnä kommitteja päivittääksesi tilan.
+error.csv.unexpected = Tätä tiedostoa ei voi renderöidä, koska se sisältää odottamattoman merkin rivillä %d ja sarakkeessa %d.
+settings.archive.error = Tietovarastoa arkistoitaessa tapahtui virhe. Katso lisätietoja lokista.
+diff.comment.add_line_comment = Lisää rivikommentti
+settings.lfs_lock = Lukitse
+settings.chat_id = Keskustelun ID-tunniste
+settings.thread_id = Ketjun ID-tunniste
+settings.archive.mirrors_unavailable = Peilit eivät ole saatavilla arkistoiduissa tietovarastoissa.
+branch.tag_collision = Haaraa "%s" ei voi luoda, koska tagi samalla nimellä on jo olemassa tietovarastossa.
+diff.git-notes.remove-header = Poista huomautus
+diff.git-notes.remove-body = Tämä huomautus poistetaan.
+diff.git-notes.add = Lisää huomautus
+release.invalid_external_url = Virheellinen ulkoinen URL-osoite: "%s"
+release.asset_external_url = Ulkoinen URL-osoite
+branch.delete_branch_has_new_commits = Haaraa "%s" ei voi poistaa, koska uusia kommitteja on lisätty yhdistämisen jälkeen.
+branch.branch_name_conflict = Haaran nimi "%s" on ristiriidassa olemassa olevan haaran "%s" kanssa.
+settings.unarchive.header = Kumoa tämän tietovaraston arkistointi
+settings.matrix.room_id = Huoneen ID-tunniste
+issues.blocked_by_user = Et voi luoda ongelmia tähän tietovarastoon, koska tietovaraston omistaja on estänyt sinut.
+pulls.desc = Ota vetopyynnöt ja koodikatselmoinnit käyttöön.
+pulls.push_rejected = Työntö epäonnistui: Työntö hylättiin. Katselmoi tämän tietovaraston Git-koukut.
+form.name_reserved = Tietovaraston nimi "%s" on varattu.
+form.reach_limit_of_creation_1 = Omistajan %d tietovaraston rajoitus on jo täynnä.
+form.reach_limit_of_creation_n = Omistajan %d tietovaraston rajoitus on jo täynnä.
+form.string_too_long = Merkkijono on pidempi kuin %d merkkiä.
+mirror_address_protocol_invalid = Määritetty URL-osoite on virheellinen. Vain http(s):// tai git:// -sijainteja voi käyttää peilaukseen.
+form.name_pattern_not_allowed = Kaava "%s" ei ole sallittu tietovaraston nimessä.
+migrate_options_lfs_endpoint.description.local = Paikallinen palvelinpolku on myös tuettu.
+pulls.showing_only_single_commit = Näytetään vain kommitin %[1]s muutokset
+pulls.invalid_merge_option = Et voi käyttää tätä yhdistämisvalintaa tälle vetopyynnölle.
+pulls.squash_merge_pull_request = Luo squash-kommitti
+issues.label_templates.info = Nimilappuja ei ole. Luo nimilappu napsauttamalla "Uusi nimilappu" tai käytä nimilapun esiasetusta:
+issues.label_archive = Arkistoi nimilappu
+mirror_lfs_desc = Aktivoi LFS-datan peilaaminen.
+editor.directory_is_a_file = Hakemiston nimi "%s" on jo käytössä tiedoston nimenä tässä tietovarastossa.
+projects.desc = Hallitse ongelmia ja vetoja projektitauluilla.
+ext_issues = Ulkoiset ongelmat
+issues.label_archive_tooltip = Arkistoidut nimilaput on suljettu pois ehdotuksista oletusarvoisesti, kun haku suoritetaan nimilapulla.
+issues.ref_reopened_from = `avasi uudelleen tämän ongelman %[4]s %[2]s`
+issues.ref_closed_from = `sulki tämän ongelman %[4]s %[2]s`
+migrate_options_lfs_endpoint.description = Migraatio yrittää käyttää Git-etätietovarastoasi LFS-palvelimen määrittämiseen. Voit määrittää omavalintaisen päätepisteen, jos tietovarastosi LFS-data on talletettu jonnekin muualle.
+settings.mirror_settings.docs.pull_mirror_instructions = Vetopeilin määrittämiseksi konsultoi:
+issues.archived_label_description = (Arkistoitu) %s
+editor.filename_is_a_directory = Tiedoston nimi "%s" on jo käytössä hakemiston nimenä tässä tietovarastossa.
+pulls.fast_forward_only_merge_pull_request = Pelkkä fast-forward
+pulls.rebase_merge_commit_pull_request = Rebase, luo sitten yhdistämiskommitti
+pulls.rebase_merge_pull_request = Rebase, sitten fast-forward
+admin.enabled_flags = Tässä tietovarastossa käytössä olevat liput:
+admin.update_flags = Päivitä liput
+admin.failed_to_replace_flags = Tietovaraston lippujen korvaaminen epäonnistui
+admin.flags_replaced = Tietovaraston liput korvattu
+admin.manage_flags = Hallitse lippuja
+editor.file_is_a_symlink = `"%s" on symbolinen linkki. Symbolisia linkkejä ei voi muokata selainkäyttöliittymän editorissa`
+rss.must_be_on_branch = Sinun täytyy olla haarassa saadaksesi RSS-syötteen.
@@ -2234,8 +2584,8 @@ pulls.no_merge_not_ready = Tämä vetopyyntö ei ole valmis yhdistettäväksi. T
component_loading_info = Tämä saattaa kestää hetken…
component_failed_to_load = Odottamaton virhe.
component_loading = Ladataan %s…
-contributors.what = panokset
-recent_commits.what = viimeaikaiset sitoumukset
+contributors.what = kontribuutiot
+recent_commits.what = viimeaikaiset kommitit
code_frequency.what = koodifrekvenssi
component_loading_failed = Ei voitu ladata %s
@@ -2248,7 +2598,7 @@ repo_updated=Päivitetty %s
members=Jäsenet
teams=Tiimit
lower_members=jäsentä
-lower_repositories=repot
+lower_repositories=tietovarastot
create_new_team=Uusi tiimi
create_team=Luo tiimi
org_desc=Kuvaus
@@ -2263,10 +2613,10 @@ team_unit_desc=Salli pääsy tietovaraston osioihin
settings=Asetukset
settings.options=Organisaatio
settings.full_name=Koko nimi
-settings.website=Nettisivu
+settings.website=Verkkosivusto
settings.location=Sijainti
settings.permission=Käyttöoikeudet
-settings.repoadminchangeteam=Repon ylläpitäjä voi lisätä ja poistaa pääsyn tiimeihin
+settings.repoadminchangeteam=Tietovaraston ylläpitäjä voi lisätä ja poistaa pääsyn tiimeihin
settings.visibility=Näkyvyys
settings.visibility.public=Julkinen
settings.visibility.limited_shortname=Rajattu
@@ -2276,10 +2626,10 @@ settings.visibility.private_shortname=Yksityinen
settings.update_settings=Päivitä asetukset
settings.delete=Poista organisaatio
settings.delete_account=Poista tämä organisaatio
-settings.delete_prompt=Organisaatio poistetaan pysyvästi, ja tätä EI VOI peruuttaa myöhemmin!
+settings.delete_prompt=Organisaatio poistetaan pysyvästi, ja tätä EI VOI perua myöhemmin!
settings.confirm_delete_account=Vahvista poisto
settings.delete_org_title=Poista organisaatio
-settings.hooks_desc=Lisää webkoukkuja, jotka suoritetaan kaikissa repoissa tässä organisaatiossa.
+settings.hooks_desc=Lisää webkoukkuja, jotka suoritetaan kaikissa tietovarastoissa tässä organisaatiossa.
members.membership_visibility=Jäsenyyden näkyvyys:
@@ -2292,52 +2642,52 @@ members.owner=Omistaja
members.member=Jäsen
members.remove=Poista
members.leave=Poistu
-members.invite_desc=Lisää uusi jäsen %s:
+members.invite_desc=Lisää uusi jäsen organisaatioon %s:
members.invite_now=Kutsu nyt
teams.join=Liity
teams.leave=Poistu
-teams.read_access=Luettu
+teams.read_access=Lue
teams.read_access_helper=Tiimin jäsenet voivat katsella ja kloonata tiimin varastoja.
teams.write_access_helper=Tiimin jäsenet voivat lukea ja työntää tiimin varastoja/varastoihin.
-teams.admin_access=Järjestelmänvalvojan pääsy
-teams.admin_access_helper=Tiimin jäsenet voivat työntää (push) ja vetää (pull) tiimin varastoista/varastoihin ja lisätä yhteistyökumppaneita.
+teams.admin_access=Ylläpitopääsy
+teams.admin_access_helper=Tiimin jäsenet voivat työntää (push) ja vetää (pull) tiimin varastoista/varastoihin ja lisätä avustajia.
teams.no_desc=Tällä tiimillä ei ole kuvausta
teams.settings=Asetukset
-teams.owners_permission_desc=Omistajilla on täydet käyttöoikeudet kaikkiin organisaation repoihin sekä organisaation ylläpitäjän oikeudet.
+teams.owners_permission_desc=Omistajilla on täydet käyttöoikeudet kaikkiin organisaation tietovarastoihin sekä organisaation ylläpitäjän oikeudet.
teams.members=Tiimin jäsenet
teams.update_settings=Päivitä asetukset
teams.delete_team=Poista tiimi
teams.add_team_member=Lisää tiimin jäsen
teams.delete_team_title=Poista tiimi
-teams.delete_team_desc=Tiimin poisto peruuttaa sen jäseniltä oikeuden päästä tiimin varastoihin. Jatketaanko?
+teams.delete_team_desc=Tiimin poisto peruuttaa sen jäseniltä oikeuden päästä tiimin tietovarastoihin. Jatketaanko?
teams.delete_team_success=Tiimi on poistettu.
-teams.read_permission_desc=Tämä tiimi myöntää jäsenille Luku oikeudet: tiimin jäsenet voivat katsella ja kloonata tiimin varastoja.
-teams.write_permission_desc=Tämä tiimi myöntää jäsenille Kirjoitus oikeuden: tiimin jäsenet voivat lukea ja kirjoittaa tiimin repoihin.
-teams.admin_permission_desc=Tämä joukkue myöntää järjestelmänvalvojapääsyn: jäsenet voivat lukea joukkueen tietovarastoista, vetää ja lisätä yhteistyöhenkilöitä niihin.
-teams.repositories=Joukkueen tietovarastot
+teams.read_permission_desc=Tämä tiimi myöntää jäsenille Lue-oikeuden: tiimin jäsenet voivat katsella ja kloonata tiimin tietovarastoja.
+teams.write_permission_desc=Tämä tiimi myöntää jäsenille Kirjoita-oikeuden: tiimin jäsenet voivat lukea ja kirjoittaa tiimin tietovarastoihin.
+teams.admin_permission_desc=Tämä tiimi myöntää Ylläpito-oikeuden: jäsenet voivat lukea tiimin tietovarastoista, työntää ja lisätä avustajia niihin.
+teams.repositories=Tiimin tietovarastot
teams.members.none=Ei jäseniä tässä tiimissä.
-teams.all_repositories=Kaikki repot
+teams.all_repositories=Kaikki tietovarastot
teams.invite.by = Kutsunut %s
members.leave.detail = Haluatko varmasti poistua organisaatiosta "%s"?
teams.add_all_repos_title = Lisää kaikki tietovarastot
teams.invite_team_member.list = Odottavat kutsut
teams.invite.description = Napsauta alla olevaa painiketta liittyäksesi tiimiin.
-settings.update_setting_success = Organisaatioasetukset on päivitetty.
+settings.update_setting_success = Organisaation asetukset on päivitetty.
form.create_org_not_allowed = Sinulla ei ole oikeutta luoda organisaatiota.
teams.leave.detail = Haluatko varmasti poistua tiimistä "%s"?
teams.invite.title = Sinut on kutsuttu tiimiin %s organisaatiossa %s.
-teams.add_duplicate_users = Käyttäjä on jo tiimijäsen.
+teams.add_duplicate_users = Käyttäjä on jo tiimin jäsen.
settings.visibility.limited = Rajattu (näkyvissä vain kirjautuneille käyttäjille)
code = Koodi
-teams.remove_all_repos_title = Poista kaikki joukkueen tietovarastot
+teams.remove_all_repos_title = Poista kaikki tiimin tietovarastot
form.name_reserved = Organisaation nimi "%s" on varattu.
settings.delete_org_desc = Organisaatio poistetaan pysyvästi. Jatketaanko?
team_access_desc = Tietovarastopääsy
teams.specific_repositories = Määritetyt tietovarastot
open_dashboard = Avaa kojelauta
-teams.remove_all_repos_desc = Tämä poistaa kaikki tietovarastot joukkueelta.
-teams.add_all_repos_desc = Tämä lisää kaikki organisaation tietovarastot joukkueelle.
+teams.remove_all_repos_desc = Tämä poistaa kaikki tietovarastot tiimiltä.
+teams.add_all_repos_desc = Tämä lisää kaikki organisaation tietovarastot tiimille.
team_unit_disabled = (Pois käytöstä)
follow_blocked_user = Et voi seurata tätä organisaatiota, koska organisaatio on estänyt sinut.
teams.can_create_org_repo = Luo tietovarastoja
@@ -2347,12 +2697,21 @@ settings.email = Yhteydenoton sähköposti
teams.general_access = Mukautettu pääsy
settings.change_orgname_redirect_prompt = Vanha nimi uudelleenohjaa, kunnes nimi otetaan uudelleen käyttöön.
settings.change_orgname_prompt = Huomio: organisaation nimen vaihtaminen vaihtaa myös organisaation URL-osoitteen ja vapauttaa vanhan nimen.
+teams.write_access = Kirjoita
+settings.update_avatar_success = Organisaation profiilikuva on päivitetty.
+teams.can_create_org_repo_helper = Jäsenet voivat luoda uusia tietovarastoja organisaatiossa. Tietovaraston luonut saa ylläpito-oikeuden uuteen tietovarastoon.
+teams.create_repo_permission_desc = Lisäksi tämä tiimi myöntää Luo tietovarasto -oikeuden: jäsenet voivat luoda uusia tietovarastoja organisaatiossa.
+teams.add_nonexistent_repo = Tietovarasto, jota yrität lisätä, ei ole olemassa. Luo se ensin.
+teams.repos.none = Tällä tiimillä ei ole pääsyä tietovarastoihin.
+settings.change_orgname_redirect_prompt.with_cooldown.one = Vanha organisaation nimi on kenen tahansa saatavilla %[1]d päivän suojaamisjakson jälkeen. Voit palauttaa organisaation nimen itsellesi suojaamisjakson aikana.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Vanha organisaation nimi on kenen tahansa saatavilla %[1]d päivän suojaamisjakson jälkeen. Voit palauttaa organisaation nimen itsellesi suojaamisjakson aikana.
+teams.all_repositories_helper = Tiimillä on pääsy kaikkiin tietovarastoihin. Tämän valitseminen lisää kaikki olemassa olevat tietovarastot tiimiin.
[admin]
dashboard=Kojelauta
users=Käyttäjätilit
organizations=Organisaatiot
-repositories=Repot
+repositories=Tietovarastot
authentication=Todennuslähteet
emails=Käyttäjien sähköpostit
config=Asetukset
@@ -2365,10 +2724,10 @@ total=Yhteensä: %d
dashboard.statistic=Yhteenveto
dashboard.operations=Huoltotoimet
dashboard.system_status=Järjestelmän tila
-dashboard.operation_name=Toiminnon nimi
+dashboard.operation_name=Toimenpiteen nimi
dashboard.operation_switch=Vaihda
dashboard.operation_run=Suorita
-dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat käyttäjät
+dashboard.delete_inactive_accounts=Poista kaikki aktivoimattomat tilit
dashboard.delete_repo_archives=Poista kaikki tietovarastojen arkistot (ZIP, TAR.GZ, jne.)
dashboard.server_uptime=Palvelimen uptime
dashboard.current_goroutine=Nykyiset goroutinet
@@ -2400,13 +2759,13 @@ dashboard.gc_times=Roskienkeruuajat
users.user_manage_panel=Käyttäjätilien hallinta
users.new_account=Luo käyttäjätili
-users.name=Käyttäjätunnus
+users.name=Käyttäjänimi
users.full_name=Koko nimi
users.activated=Aktivoitu
users.admin=Ylläpito
users.restricted=Rajoitettu
users.2fa=2FA
-users.repos=Repot
+users.repos=Tietovarastot
users.created=Luotu
users.last_login=Viimeksi kirjautunut
users.never_login=Ei koskaan kirjautunut
@@ -2466,7 +2825,7 @@ repos.size=Koko
packages.owner=Omistaja
packages.name=Nimi
packages.type=Tyyppi
-packages.repository=Repo
+packages.repository=Tietovarasto
packages.size=Koko
@@ -2488,7 +2847,7 @@ auths.user_base=Käyttäjähakukanta
auths.user_dn=Käyttäjä DN
auths.search_page_size=Sivukoko
auths.filter=Käyttäjäsuodatin
-auths.admin_filter=Järjestelmänvalvojasuodatin
+auths.admin_filter=Ylläpitosuodatin
auths.restricted_filter=Rajoitettu suodatin
auths.smtp_auth=SMTP-todennustyyppi
auths.smtphost=SMTP-isäntä
@@ -2496,7 +2855,7 @@ auths.smtpport=SMTP-portti
auths.allowed_domains=Sallitut verkkotunnukset
auths.skip_tls_verify=Ohita TLS-vahvistus
auths.pam_service_name=PAM-palvelun nimi
-auths.oauth2_tokenURL=Pääsymerkki URL
+auths.oauth2_tokenURL=Pääsypoletin URL-osoite
auths.enable_auto_register=Ota käyttöön automaattinen rekisteröinti
auths.tips=Vinkit
auths.tips.oauth2.general=OAuth2-autentikointi
@@ -2509,7 +2868,7 @@ auths.delete_auth_desc=Todennuslähteen poisto estää käyttäjiä käyttämäs
auths.deletion_success=Todennuslähde on poistettu.
config.server_config=Palvelimen asetukset
-config.app_name=Ilmentymän otsikko
+config.app_name=Instanssin otsikko
config.app_ver=Forgejo-versio
config.disable_router_log=Poista reitittimen lokinkirjaaminen käytöstä
config.run_mode=Suoritustila
@@ -2524,7 +2883,7 @@ config.ssh_port=Portti
config.ssh_listen_port=Kuuntele porttia
config.ssh_root_path=Juuren polku
config.ssh_key_test_path=Avaimen testipolku
-config.ssh_keygen_path=Keygen ('ssh-keygen') polku
+config.ssh_keygen_path=Keygen-polku ('ssh-keygen')
config.ssh_minimum_key_size_check=Avaimen vähimmäiskoon tarkistus
config.ssh_minimum_key_sizes=Avaimen vähimmäiskoot
@@ -2534,7 +2893,7 @@ config.db_config=Tietokannan asetukset
config.db_type=Tyyppi
config.db_host=Isäntä
config.db_name=Nimi
-config.db_user=Käyttäjätunnus
+config.db_user=Käyttäjänimi
config.db_ssl_mode=SSL
config.db_path=Polku
@@ -2573,12 +2932,12 @@ config.https_only=Vain HTTPS
config.cookie_life_time=Evästeen elinikä
config.picture_service=Kuvapalvelu
-config.disable_gravatar=Poista käytöstä Gravatar
+config.disable_gravatar=Poista Gravatar käytöstä
config.git_gc_args=Roskienkeruu-argumentit
-config.git_migrate_timeout=Siirron aikakatkaisu
+config.git_migrate_timeout=Migraation aikakatkaisu
config.git_mirror_timeout=Peilin päivityksen aikakatkaisu
-config.git_clone_timeout=Kloonitoiminnon aikakatkaisu
+config.git_clone_timeout=Kloonaustoimenpiteen aikakatkaisu
config.git_gc_timeout=Roskienkeruun aikakatkaisu
config.log_config=Lokiasetukset
@@ -2609,12 +2968,12 @@ notices.inverse_selection=Käänteinen valinta
notices.delete_selected=Poista valitut
notices.delete_all=Poista kaikki ilmoitukset
notices.type=Tyyppi
-notices.type_1=Repo
+notices.type_1=Tietovarasto
notices.desc=Kuvaus
notices.op=Toiminta
auths.sspi_auto_create_users = Luo käyttäjät automaattisesti
integrations = Integraatiot
-emails.change_email_header = Päivitä sähköpostiominaisuudet
+emails.change_email_header = Päivitä sähköpostin ominaisuudet
emails.change_email_text = Haluatko varmasti päivittää tämän sähköpostiosoitteen?
emails.updated = Sähköpostiosoite päivitetty
users.organization_creation.description = Salli uusien organisaatioiden luonti.
@@ -2630,8 +2989,8 @@ auths.force_smtps = Pakota SMTPS
config.mailer_use_sendmail = Käytä Sendmailia
users.new_success = Käyttäjätili "%s" on luotu.
config.disable_register = Poista itserekisteröinti käytöstä
-config.enable_openid_signin = Käytä OpenID-kirjautumista
-config.enable_openid_signup = Käytä OpenID-itserekisteröintiä
+config.enable_openid_signin = Ota OpenID-kirjautuminen käyttöön
+config.enable_openid_signup = Ota OpenID-itserekisteröinti käyttöön
monitor.queue.settings.changed = Asetukset päivitetty
config.db_schema = Skeema
settings = Ylläpitäjän asetukset
@@ -2647,7 +3006,7 @@ users.details = Käyttäjän tiedot
config_summary = Yhteenveto
config.send_test_mail = Lähetä testisähköposti
auths.oauth2_icon_url = Kuvakkeen URL-osoite
-config.mail_notify = Käytä sähköposti-ilmoituksia
+config.mail_notify = Ota sähköposti-ilmoitukset käyttöön
config.send_test_mail_submit = Lähetä
systemhooks = Järjestelmän webkoukut
packages.total_size = Koko yhteensä: %s
@@ -2676,7 +3035,7 @@ repos.lfs_size = LFS:n koko
config.lfs_config = LFS-asetukset
config.register_email_confirm = Vaadi sähköpostivahvistus rekisteröitymiseen
config.ssh_domain = SSH-palvelimen verkkotunnus
-config.app_slogan = Ilmentymän tunnuslause
+config.app_slogan = Instanssin tunnuslause
config.lfs_content_path = LFS-sisällön polku
users.max_repo_creation = Tietovarastojen enimmäismäärä
defaulthooks.update_webhook = Päivitä oletusarvoinen webkoukku
@@ -2701,31 +3060,116 @@ monitor.download_diagnosis_report = Lataa diagnostiikkaraportti
monitor.duration = Kesto (s)
monitor.last_execution_result = Tulos
users.bot = Botti
-auths.syncenabled = Käytä käyttäjäsynkronointia
-auths.enable_ldap_groups = Käytä LDAP-ryhmiä
+auths.syncenabled = Ota käyttäjäsynkronointi käyttöön
+auths.enable_ldap_groups = Ota LDAP-ryhmät käyttöön
dashboard.sync_branch.started = Haarasynkronointi aloitettu
dashboard.sync_tag.started = Tagisynkronointi aloitettu
auths.login_source_exist = Todennuslähde "%s" on jo olemassa.
-config.enable_timetracking = Ota ajan seuranta käyttöön
-config.default_enable_timetracking = Ota ajan seuranta käyttöön oletuksena
-config.no_reply_address = Piilotetun sähköpostin toimialue
+config.enable_timetracking = Ota ajanseuranta käyttöön
+config.default_enable_timetracking = Ota ajanseuranta käyttöön oletuksena
+config.no_reply_address = Piilotetun sähköpostin verkkotunnus
config.allow_dots_in_usernames = Salli käyttäjien käyttää pisteitä käyttäjänimissään. Ei vaikuta olemassa oleviin tileihin.
repos.unadopted.no_more = Omaksumattomia tietovarastoja ei löytynyt.
repos.unadopted = Omaksumattomat tietovarastot
+dashboard.repo_health_check = Tee terveystarkastus kaikille tietovarastoille
+users.reserved = Varattu
+users.purge = Hävitä käyttäjä
+dashboard.cron.process = Cron: %[1]s
+auths.tip.github = Rekisteröi uusi OAuth-sovellus %sissa
+config.app_data_path = Sovellusdatan polku
+config.cache_test_slow = Välimuistin testi onnistui, mutta vastaus on hidas: %s.
+dashboard.delete_repo_archives.started = Poista kaikki tietovarastojen arkistot -tehtävä aloitettu.
+dashboard.check_repo_stats = Tarkista kaikkien tietovarastojen tilastot
+users.still_own_packages = Tämä käyttäjä omistaa yhden tai useamman paketin. Poista paketit ensin.
+users.block.description = Estä tätä käyttäjää olemasta vuorovaikutuksessa tämän palvelun kanssa tilinsä välityksellä ja estä sisäänkirjautuminen.
+auths.attribute_username = Käyttäjänimen attribuutti
+auths.oauth2_emailURL = Sähköpostin URL-osoite
+auths.tip.discord = Rekisteröi uusi sovellus %sissa
+config.default_enable_dependencies = Ota ongelmariippuvuudet käyttöön oletuksena
+config.mailer_config = Postittimen asetukset
+config.cache_test_succeeded = Välimuistin testi onnistui, vastauksen saamisessa kesti %s.
+dashboard.sync_external_users = Synkronoi ulkoinen käyttäjädata
+auths.tip.gitea = Rekisteröi uusi OAuth2-sovellus. Ohje on osoitteessa %s
+config.test_mail_failed = Testisähköpostin lähettäminen osoitteeseen "%s" epäonnistui: %v
+auths.attribute_surname = Sukunimen attribuutti
+config.mailer_enable_helo = Ota HELO käyttöön
+auths.attribute_username_placeholder = Jätä tyhjäksi käyttääksesi Forgejo:ssa asetettua käyttänimeä.
+auths.oauth2_authURL = Valtuutuksen URL-osoite
+auths.new_success = Todennus "%s" on lisätty.
+users.still_own_repo = Tämä käyttäjä omistaa yhden tai useamman tietovaraston. Poista tai siirrä nämä tietovarastot ensin.
+dashboard.cleanup_hook_task_table = Siivoa hook_task-taulu
+dashboard.delete_old_actions = Poista kaikki vanhat aktiviteetit tietokannasta
+auths.attribute_mail = Sähköpostiosoitteen attribuutti
+auths.attribute_ssh_public_key = Julkisen SSH-avaimen attribuutti
+auths.group_attribute_list_users = Ryhmäattribuutti sisältäen listan käyttäjistä
+auths.oauth2_profileURL = Profiilin URL-osoite
+auths.skip_local_two_fa = Ohita paikallinen 2FA
+auths.oauth2_scopes = Lisäskoopit
+auths.tip.gitlab_new = Rekisteröi uusi sovellus %sissa
+config.cache_test = Testaa välimuisti
+auths.still_in_used = Todennuslähde on edelleen käytössä. Konvertoi tai poista ensin käyttäjät, jotka käyttävät tätä todennuslähdettä.
+users.admin.description = Myönnä tälle käyttäjälle täydet oikeudet selainkäyttöliittymän ja rajapinnan kautta saatavilla oleviin ylläpito-ominaisuuksiin.
+dashboard.delete_inactive_accounts.started = Poista kaikki aktivoimattomat tilit -tehtävä aloitettu.
+config.run_user = Suorita käyttäjänä
+config.mailer_sendmail_args = Lisäargumentit Sendmailille
+dashboard.archive_cleanup = Poista vanhat tietovarastojen arkistot
+dashboard.deleted_branches_cleanup = Siivoa poistetut haarat
+dashboard.update_checker = Päivitysten tarkistaja
+auths.allowed_domains_helper = Jätä tyhjäksi salliaksesi kaikki verkkotunnukset. Erota useat verkkotunnukset pilkulla (",").
+auths.activated = Tämä todennuslähde on aktivoitu
+auths.login_source_of_type_exist = Tätä tyyppiä oleva todennuslähde on jo olemassa.
+dashboard.memory_allocate_times = Muistiallokaatiot
+users.send_register_notify = Ilmoita rekisteröitymisestä sähköpostitse
+config.offline_mode = Paikallinen tila
+config.cache_item_ttl = Välimuistitietueen TTL
+config.log_file_root_path = Lokipolku
+config.lfs_root_path = LFS-juuren polku
+users.allow_import_local = Voi tuoda paikallisia tietovarastoja
+users.still_has_org = Tämä käyttäjä on organisaation jäsen. Poista käyttäjä organisaatiosta ensin.
+packages.creator = Luoja
+auths.attribute_avatar = Profiilikuvan attribuutti
+users.remote = Etä
+auths.disable_helo = Poista HELO käytöstä
+defaulthooks.desc = Webkoukut tekevät automaattisesti HTTP POST -pyyntöjä palvelimelle, kun tietyt Forgejo-tapahtumat ilmenevät. Tässä määritetyt webkoukut ovat oletusarvot ja ne kopioidaan kaikkiin uusiin tietovarastoihin. Lue lisää webkoukkujen oppaasta.
+auths.attribute_name = Etunimen attribuutti
+users.local_import.description = Salli tietovarastojen tuominen palvelimen paikallisesta tiedostojärjestelmästä. Tämä voi olla tietoturvaongelma.
+emails.not_updated = Pyydetyn sähköpostiosoitteen päivittäminen epäonnistui: %v
+dashboard.update_mirrors = Päivitä peilit
+config.mailer_protocol = Protokolla
+users.activated.description = Sähköpostivahvistuksen valmistuminen. Aktivoimattoman tilin omistaja ei voi kirjautua sisään, ennen kuin sähköpostivahvistus on suoritettu.
+users.purge_help = Poista käyttäjä pakottaen, sekä kaikki käyttäjän omistamat tietovarastot, organisaatiot ja paketit. Kaikki käyttäjän luomat kommentit ja ongelmat poistetaan myös.
+users.restricted.description = Salli vuorovaikutus vain niihin tietovarastoihin ja organisaatioihin, joissa käyttäjä on avustajan roolissa. Tämä estää pääsyn tässä instanssissa oleviin julkisiin tietovarastoihin.
+config.git_pull_timeout = Vetotoimenpiteen aikakatkaisu
+monitor.process.cancel_desc = Prosessin peruuttaminen saattaa aiheuttaa datan menetyksen
+self_check.no_problem_found = Ongelmia ei ole vielä löytynyt.
+config.git_disable_diff_highlight = Poista diff-syntaksin korostus käytöstä
+config.git_max_diff_lines = Diff-rivejä enintään tiedostoa kohden
+config.access_log_template = Pääsylokin mallipohja
+monitor.process.cancel_notices = Perutaanko: %s?
+config.enable_federated_avatar = Ota federoidut profiilikuvat käyttöön
+notices.operations = Toimenpiteet
+config.xorm_log_sql = Lokita SQL
+monitor.queue.settings.remove_all_items_done = Kaikki jonossa olleet tietueet on poistettu.
+config.logger_name_fmt = Lokittaja: %s
+config.git_max_diff_line_characters = Diff-merkkejä enintään riviä kohden
+config.git_max_diff_files = Diff-tiedostoja enintään näytettäväksi
+config.access_log_mode = Pääsylokin tila
+config.picture_config = Kuvan ja avatarin asetukset
+notices.delete_success = Järjestelmäilmoitukset on poistettu.
[action]
create_repo=loi tietovaraston %s
-rename_repo=uudelleennimetty repo %[1]s
nimelle %[3]s
-transfer_repo=siirretty repo %s
kohteeseen %s
+rename_repo=asetti tietovaraston %[1]s
uudeksi nimeksi %[3]s
+transfer_repo=siirsi tietovaraston %s
käyttäjälle %s
push_tag=työnsi tagin %[3]s kohteeseen %[4]s
delete_tag=poisti tagin %[2]s kohteesta %[3]s
-compare_commits_general=Vertaa committeja
-create_branch=loi haaran %[3]s repossa %[4]s
-compare_commits = Vertaa %d sitoumukset
+compare_commits_general=Vertaa kommitteja
+create_branch=loi haaran %[3]s tietovarastossa %[4]s
+compare_commits = Vertaa %d kommittia
compare_branch = Vertaa
review_dismissed_reason = Syy:
-commit_repo = työnsi haaraan %[3]s %[4]s:ssa
+commit_repo = työnsi haaraan %[3]s tietovarastossa %[4]s
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`
@@ -2735,7 +3179,12 @@ 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`
-auto_merge_pull_request = `automaattisesti yhdistetty vetopyyntö %[3]s#%[2]s`
+auto_merge_pull_request = `automaattisesti yhdisti vetopyynnön %[3]s#%[2]s`
+delete_branch = poisti haaran %[2]s tietovarastosta %[3]s
+watched_repo = aloitti tietovaraston %[2]s tarkkailun
+approve_pull_request = `hyväksyi %[3]s#%[2]s`
+starred_repo = lisäsi tähden tietovarastolle %[2]s
+reject_pull_request = `ehdotti muutoksia kohteeseen %[3]s#%[2]s`
[tool]
now=nyt
@@ -2757,8 +3206,8 @@ raw_seconds=sekuntia
raw_minutes=minuuttia
[dropzone]
-default_message=Pudota tiedostot tähän tai klikkaa aluetta ladataksesi tiedoston.
-invalid_input_type=Tämäntyyppisiä tiedostoja ei voi ladata.
+default_message=Pudota tiedostot tähän tai napsauta tästä lähettääksesi tiedoston.
+invalid_input_type=Tätä tyyppiä olevia tiedostoja ei voi lähettää.
remove_file=Poista tiedosto
file_too_big = Tiedoston koko ({{filesize}} Mt) ylittää enimmäisrajan ({{maxFilesize}} Mt).
@@ -2768,7 +3217,7 @@ unread=Lukematon
read=Luettu
no_unread=Ei lukemattomia ilmoituksia.
no_read=Ei luettuja ilmoituksia.
-pin=Merkitse ilmoitus
+pin=Kiinnitä ilmoitus
mark_as_read=Merkitse luetuksi
mark_as_unread=Merkitse lukemattomaksi
mark_all_as_read=Merkitse kaikki luetuiksi
@@ -2777,19 +3226,24 @@ no_subscriptions = Ei tilauksia
subscriptions = Tilaukset
[gpg]
-error.no_committer_account=Committaajan sähköpostiosoitteeseen ei ole linkitetty tiliä
-error.not_signed_commit=Ei allekirjoitettu sitoumus
+error.no_committer_account=Kommitin tekijän sähköpostiosoitteeseen ei ole linkitetty tiliä
+error.not_signed_commit=Kommitti ei ole allekirjoitettu
error.extract_sign = Allekirjoituksen purkaminen epäonnistui
default_key = Allekirjoitettu oletusavaimella
-error.failed_retrieval_gpg_keys = Sitoumuksen toimijan tiliin liitetyn avaimen nouto epäonnistui
-error.generate_hash = Sitoumuksen tiivisteen luominen epäonnistui
+error.failed_retrieval_gpg_keys = Ei saatu yhtäkään kommitin tekijän tiliin liitettyä avainta
+error.generate_hash = Kommitin tiivisteen luominen epäonnistui
+error.probable_bad_signature = VAROITUS! Vaikka tietokannassa on avain tällä ID-tunnistella, se ei vahvista tätä kommittia! Tämä kommitti on EPÄILYTTÄVÄ.
+error.probable_bad_default_signature = VAROITUS! Vaikka oletusavaimella on tämä ID-tunniste, se ei vahvista tätä kommittia! Tämä kommitti on EPÄILYTTÄVÄ.
+error.no_gpg_keys_found = Tälle allekirjoitukselle ei löytynyt tunnettua avainta tietokannasta
[units]
unit = Yksikkö
+error.unit_not_allowed = Sinulla ei ole pääsyä tähän tietovaraston osioon.
+error.no_unit_allowed_repo = Sinulla ei ole pääsyä mihinkään tämän tietovaraston osioon.
[packages]
title=Paketit
-desc=Hallitse repon paketteja.
+desc=Hallitse tietovaraston paketteja.
empty=Täällä ei vielä ole paketteja.
filter.type=Tyyppi
filter.type.all=Kaikki
@@ -2797,12 +3251,12 @@ filter.no_result=Suodattimesi ei tuottanut tuloksia.
installation=Asennus
details.author=Tekijä
alpine.repository.branches=Haarat
-alpine.repository.repositories=Repot
-conan.details.repository=Repo
+alpine.repository.repositories=Tietovarastot
+conan.details.repository=Tietovarasto
owner.settings.cleanuprules.enabled=Käytössä
details.license = Lisenssi
about = Tietoja tästä paketista
-debian.install = Asenna paketti seuraavalla komennolla:
+debian.install = Asenna paketti komennolla:
owner.settings.cleanuprules.edit = Muokkaa siivoussääntöä
arch.version.groups = Ryhmä
details.project_site = Projektin verkkosivusto
@@ -2814,11 +3268,11 @@ keywords = Avainsanat
dependencies = Riippuvuudet
container.labels.key = Avain
container.labels.value = Arvo
-pypi.install = Asenna paketti pipillä seuraavalla komennolla:
-npm.install = Asenna paketti npm:llä seuraavalla komennolla:
+pypi.install = Asenna paketti pipillä komennolla:
+npm.install = Asenna paketti npm:llä komennolla:
npm.install2 = tai lisää se package.json-tiedostoon:
empty.documentation = Lisätietoja pakettirekisteristä on saatavilla dokumentaatiossa.
-helm.install = Asenna paketti seuraavalla komennolla:
+helm.install = Asenna paketti komennolla:
owner.settings.chef.keypair = Luo avainpari
settings.delete.error = Paketin poistaminen epäonnistui.
requirements = Vaatimukset
@@ -2826,7 +3280,7 @@ published_by_in = Julkaistu %[1]s, julkaisija %[3]s projekti
pypi.requires = Vaatii Pythonin
alpine.install = Asenna paketti seuraavalla komennolla:
debian.repository.components = Komponentit
-cran.install = Asenna paketti seuraavalla komennolla:
+cran.install = Asenna paketti komennolla:
settings.link.select = Valitse tietovarasto
owner.settings.chef.title = Chef-rekisteri
owner.settings.cleanuprules.add = Lisää siivoussääntö
@@ -2835,7 +3289,7 @@ versions.view_all = Näytä kaikki
debian.repository.architectures = Arkkitehtuurit
container.details.type = Levykuvan tyyppi
arch.version.properties = Version ominaisuudet
-rpm.install = Asenna paketti seuraavalla komennolla:
+rpm.install = Asenna paketti komennolla:
owner.settings.cleanuprules.none = Siivoussääntöjä ei vielä ole.
container.details.platform = Alusta
npm.dependencies = Riippuvuudet
@@ -2847,47 +3301,47 @@ settings.delete.success = Paketti on poistettu.
npm.dependencies.optional = Valinnaiset riippuvuudet
debian.repository.distributions = Jakelut
composer.dependencies = Riippuvuudet
-chef.install = Asenna paketti seuraavalla komennolla:
+chef.install = Asenna paketti komennolla:
details.documentation_site = Dokumentaation verkkosivusto
go.install = Asenna paketti komentoriviltä:
alpine.repository.architectures = Arkkitehtuurit
composer.registry = Määritä tämä rekisteri ~/.composer/config.json
-tiedostossa:
debian.registry = Määritä tämä rekisteri komentoriviltä:
rpm.registry = Määritä rekisteri komentoriviltä:
-maven.install = Käytä pakettia sisällyttämällä seuraava dependencies
-lohkoon pom.xml
-tiedostossa:
+maven.install = Käytä pakettia sisällyttämällä seuraava sisältö dependencies
-lohkoon pom.xml
-tiedostossa:
npm.registry = Määritä rekisteri projektin .npmrc
-tiedostossa:
alpine.repository = Tietovaraston tiedot
cargo.registry = Määritä tämä rekisteri Cargon asetustiedostossa (esimerkiksi ~/.cargo/config.toml
):
cargo.install = Asenna paketti Cargolla suorittamalla seuraava komento:
-composer.install = Asenna paketti Composerilla suorittamalla seuraava komento:
+composer.install = Asenna paketti Composerilla suorittamalla komento:
rpm.distros.redhat = RedHatiin pohjautuvilla jakeluilla
rpm.distros.suse = SUSE:en pohjautuvilla jakeluilla
rpm.repository.architectures = Arkkitehtuurit
cran.registry = Määritä rekisteri Rprofile.site
-tiedostossa:
-swift.install2 = ja suorita seuraava komento:
+swift.install2 = ja suorita komento:
maven.registry = Määritä tämä rekisteri projektin pom.xml
-tiedostossa:
maven.install2 = Suorita komentoriviltä:
nuget.registry = Määritä rekisteri komentoriviltä:
-nuget.install = Asenna paketti NuGetillä suorittamalla seuraava komento:
-rubygems.install = Asenna paketti gemillä suorittamalla seuraava komento:
+nuget.install = Asenna paketti NuGetillä suorittamalla komento:
+rubygems.install = Asenna paketti gemillä suorittamalla komento:
rubygems.install2 = tai lisää se Gemfileen:
swift.registry = Määritä rekisteri komentoriviltä:
swift.install = Lisää paketti Package.swift
-tiedostoon:
owner.settings.cleanuprules.keep.count.1 = 1 versio per paketti
owner.settings.cleanuprules.keep.count.n = %d versiota per paketti
-conan.install = Asenna paketti Conanilla suorittamalla seuraava komento:
+conan.install = Asenna paketti Conanilla suorittamalla komento:
chef.registry = Määritä tämä rekisteri ~/.chef/config.rb
-tiedostossa:
conan.registry = Määritä tämä rekisteri komentoriviltä:
-conda.install = Asenna paketti Condalla suorittamalla seuraava komento:
+conda.install = Asenna paketti Condalla suorittamalla komento:
helm.registry = Määritä tämä rekisteri komentoriviltä:
-pub.install = Asenna paketti Dartilla suorittamalla seuraava komento:
-owner.settings.cargo.title = Cargon rekisteri-indeksi
+pub.install = Asenna paketti Dartilla suorittamalla komento:
+owner.settings.cargo.title = Cargo-rekisterin indeksi
settings.delete.description = Paketin poistaminen on peruuttamaton toimenpide, sitä ei voi perua.
settings.link.success = Tietovaraston linkki päivitettiin onnistuneesti.
settings.link.button = Päivitä tietovaraston linkki
owner.settings.cleanuprules.preview.overview = %d pakettia on ajastettu poistettavaksi.
owner.settings.cargo.initialize.success = Cargo-indeksi luotiin onnistuneesti.
-vagrant.install = Lisää Vagrant-boksi suorittamalla seuraava komento:
+vagrant.install = Lisää Vagrant-boksi suorittamalla komento:
rubygems.dependencies.development = Kehitysriippuvuudet
owner.settings.cleanuprules.preview = Siivoussäännön esikatselu
npm.dependencies.development = Kehitysriippuvuudet
@@ -2899,7 +3353,7 @@ maven.download = Lataa riippuvuus suorittamalla komentorivillä:
registry.documentation = Lisätietoja %s-rekisteristä on dokumentaatiossa.
owner.settings.chef.keypair.description = Chef-rekisteriin lähetettävät pyynnöt on allekirjoitettava salauskirjoituksella todennuskeinona. Avainparia luotaessa vain julkinen avain tallennetaan Forgejoon. Yksityinen avain toimitetaan sinulle käytettäväksi knifen kanssa. Uuden avainparin luominen korvaa edellisen.
owner.settings.cleanuprules.keep.pattern = Säilytä kaavaa vastaavat versiot
-owner.settings.cleanuprules.pattern_full_match = Toteuta kaavio paketin koko nimeen
+owner.settings.cleanuprules.pattern_full_match = Toteuta kaava paketin koko nimeen
owner.settings.cleanuprules.keep.title = Näitä sääntöjä vastaavat versiot säilytetään, vaikka ne vastaisivat alla olevaa poistosääntöä.
owner.settings.cleanuprules.keep.count = Säilytä viimeisimmät
owner.settings.cleanuprules.remove.pattern = Poista kaavaa vastaavat versiot
@@ -2919,7 +3373,7 @@ alpine.registry = Aseta tämä rekisteri lisäämällä URL-osoite tiedostoon .condarc
-tiedostossa:
+container.labels = Nimilaput
+settings.link.description = Jos linkität paketin tietovarastoon, paketti listataan tietovaraston pakettilistalla.
[secrets]
creation.failed = Salaisuuden lisääminen epäonnistui.
@@ -2942,16 +3411,18 @@ secrets = Salaisuudet
deletion.description = Salaisuuden poistaminen on pysyvä toimenpide, eikä sitä voi perua. Jatketaanko?
deletion.success = Salaisuus on poistettu.
description = Salaisuudet välitetään tietyille toimenpiteille, eikä niitä voi muuten lukea.
+creation.name_placeholder = kirjoinkoolla ei merkitystä, vain aakkosnumeerisia merkkejä ja alaviivoja, ei voi alkaa GITEA_ tai GITHUB_
+creation.value_placeholder = Syötä mitä tahansa sisältöä. Tyhjätila alussa ja lopussa jätetään huomiotta.
[actions]
runners.name=Nimi
runners.owner_type=Tyyppi
runners.description=Kuvaus
runners.task_list.run=Suorita
-runners.task_list.repository=Repo
-runners.task_list.commit=Commit
+runners.task_list.repository=Tietovarasto
+runners.task_list.commit=Kommitti
-runs.commit=Commit
+runs.commit=Kommitti
status.success = Onnistunut
status.unknown = Tuntematon
status.waiting = Odotustilassa
@@ -2966,21 +3437,21 @@ runners.update_runner = Päivitä muutokset
runners.edit_runner = Muokkaa testinajajaa
runners.update_runner_success = Testinajaja päivitetty onnistuneesti
runners.delete_runner_success = Testinajaja poistettu onnistuneesti
-runners.reset_registration_token = Uudelleenaseta rekisteröintiavain
+runners.reset_registration_token = Uudelleenaseta rekisteröintipoletti
runs.scheduled = Ajastettu
runs.status = Tila
-runs.empty_commit_message = (tyhjä sitoumusviesti)
+runs.empty_commit_message = (tyhjä kommittiviesti)
variables.deletion = Poista muuttuja
runners.new_notice = Testinajajan aloitusohjeet
workflow.dispatch.input_required = Arvo syötteelle "%s" vaadittu.
runners.status.active = Aktiivinen
runs.no_workflows.documentation = Katso lisätietoja Forgejo Actions -ohjelmistosta dokumentaatiosta.
variables.description = Muuttujat asetetaan tietyille toiminnoille eikä niitä voida lukea muutoin.
-runners.labels = Tunnisteet
+runners.labels = Nimilaput
runners.delete_runner_failed = Testinajajan poisto epäonnistui
runners.delete_runner_header = Varmista testinajajan poisto
runners.task_list.status = Tila
-runners.reset_registration_token_success = Testiajajan rekisteröintiavain uudelleenasetettu onnistuneesti
+runners.reset_registration_token_success = Testiajajan rekisteröintipoletti asetettu uudelleen onnistuneesti
variables.none = Ei muuttujia vielä.
runners.id = Tunniste
runners.status = Tila
@@ -2989,21 +3460,21 @@ runners.task_list.no_tasks = Tehtäviä ei ole vielä määritelty.
runners.last_online = Viimeisin käynnissäoloajankohta
runners.runner_title = Testinajaja
runners.task_list.done_at = Valmistunut ajankohtana
-runs.no_matching_online_runner_helper = Testiajajaa tunnisteella %s ei löytynyt
+runs.no_matching_online_runner_helper = Testiajajaa nimilapulla %s ei löytynyt
runs.no_results = Ei tuloksia.
runners.delete_runner = Poista testinajaja
-variables.deletion.description = Muuttujan poistaminen on lopullista eikä sitä voi peruuttaa. Jatketaanko?
+variables.deletion.description = Muuttujan poistaminen on lopullista, eikä sitä voi perua. Jatketaanko?
workflow.dispatch.invalid_input_type = Syötetyyppi "%s" ei kelpaa.
workflow.dispatch.warn_input_limit = Näytetään vain ensimmäiset %d syötettä.
runners.runner_manage_panel = Hallinnoi testinajajia
variables = Muuttujat
-variables.management = Hallinnoi muuttujia
+variables.management = Hallitse muuttujia
variables.creation = Lisää muuttuja
runs.no_workflows.quick_start = Etkö tiedä kuinka Forgejo Actions toimii? Katso aloitusohje.
runners.new = Luo uusi testinajaja
runners.version = Versio
runs.expire_log_message = Lokitiedostot on tyhjätty vanhenemisen vuoksi.
-runners.delete_runner_notice = Jos tehtävä on käynnissä tällä suorittajalla, se lopetetaan ja merkitään epäonnistuneeksi. Se voi rikkoa koonnin työnkulun.
+runners.delete_runner_notice = Jos tehtävä on käynnissä tällä testinajajalla, se lopetetaan ja merkitään epäonnistuneeksi. Se voi rikkoa koonnin työnkulun.
runners.update_runner_failed = Testinajajan päivitys epäonnistui
variables.deletion.success = Muuttuja poistettu.
variables.edit = Muokkaa muuttujaa
@@ -3015,11 +3486,11 @@ variables.update.success = Muuttuja muokattu.
variables.id_not_exist = Muuttujaa tunnisteella %d ei ole olemassa.
runs.all_workflows = Kaikki työnkulut
workflow.dispatch.run = Suorita työnkulku
-workflow.enable = Käytä työnkulkua
+workflow.enable = Ota työnkulku käyttöön
runs.no_workflows = Ei työnkulkuja vielä.
runs.actors_no_select = Kaikki toimijat
runs.workflow = Työnkulku
-workflow.enable_success = Työnkulku "%s" otettu käyttöön.
+workflow.enable_success = Työnkulku "%s" on otettu käyttöön.
workflow.disabled = Työnkulku on poistettu käytöstä.
runs.actor = Toimija
workflow.disable = Poista työnkulku käytöstä
@@ -3028,11 +3499,15 @@ runs.no_job = Työnkulun tulee sisältää vähintään yksi työ
runs.invalid_workflow_helper = Työnkulun asetustiedosto on virheellinen. Tarkista asetustiedosto: %s
runners = Ajajat
actions = Actions
-unit.desc = Hallitse integroituja CI/CD-putkia Forgejo Actionsia hyödyntäen.
+unit.desc = Hallitse integroituja CI-/CD-putkia Forgejo Actionsia hyödyntäen.
runs.pushed_by = työntänyt
runs.no_workflows.help_no_write_access = Lisätietoja Forgejo Actionsista on saatavilla dokumentaatiosta.
-runners.status.idle = Tyhjäkäynti
+runners.status.idle = Jouten
runners.status.offline = Ei-verkkotilassa
+runs.no_job_without_needs = Työnkulun tulee sisältää vähintään yksi työ ilman riippuvuuksia.
+runs.no_runs = Työnkululla ei ole vielä suorituksia.
+variables.not_found = Muuttujaa ei löytynyt.
+runs.no_workflows.help_write_access = Etkö tiedä, miten aloittaa Forgejo Actionsin käyttö? Lue pikaopas kirjoittaaksesi ensimmäisen työnkulun, sen jälkeen määritä Forgejo-ajaja suorittamaan asettamiasi töitä.
@@ -3040,13 +3515,16 @@ runners.status.offline = Ei-verkkotilassa
[projects]
type-1.display_name = Yksittäinen projekti
deleted.display_name = Poistettu projekti
+type-3.display_name = Organisaatioprojekti
+type-2.display_name = Tietovarastoprojekti
[git.filemode]
changed_filemode = %[1]s -> %[2]s
-executable_file = Ajettava tiedosto
+executable_file = Suoritettava tiedosto
symbolic_link = Symbolinen linkki
normal_file = Tavallinen tiedosto
-directory = Kansio
+directory = Hakemisto
+submodule = Alimoduuli
[search]
search = Hae…
@@ -3059,20 +3537,38 @@ exact = Täsmällinen
exact_tooltip = Sisällytä vain täsmälleen hakusanaa vastaavat tulokset
team_kind = Etsi tiimejä…
code_kind = Etsi koodia…
-code_search_unavailable = Koodihaku ei tällä hetkellä ole saatavilla. Ota yhteyttä järjestelmänvalvojaan.
+code_search_unavailable = Koodihaku ei tällä hetkellä ole saatavilla. Ota yhteyttä sivuston ylläpitoon.
union = yhdistelmähaku
union_tooltip = Sisällytä tulokset, jotka vastaavat minkä tahansa välilyönnillä erotetuista avainsanoista
project_kind = Etsi projekteja…
no_results = Hakutuloksia ei löytynyt.
-keyword_search_unavailable = Avainsanahaku ei tällä hetkellä ole saatavilla. Ota yhteyttä järjestelmänvalvojaan.
+keyword_search_unavailable = Avainsanahaku ei tällä hetkellä ole saatavilla. Ota yhteyttä sivuston ylläpitoon.
repo_kind = Etsi tietovarastoja…
user_kind = Etsi käyttäjiä…
org_kind = Etsi organisaatioita…
branch_kind = Etsi haaroja…
-issue_kind = Etsi vikoja…
+issue_kind = Etsi ongelmia…
milestone_kind = Etsi merkkipaaluja...
-pull_kind = Etsi pull-vetoja…
-commit_kind = Etsi sitoutumisia…
+pull_kind = Etsi vetoja…
+commit_kind = Etsi kommitteja…
fuzzy = Sumea
runner_kind = Etsi ajajia…
code_search_by_git_grep = Nykyiset koodin hakutulokset pohjautuvat komentoon "git grep". Parempia tuloksia on mahdollista saada, jos sivuston ylläpitäjä ottaa käyttöön koodin indeksoijan.
+
+
+[repo.permissions]
+code.read = Lue: Pääsy koodiin ja tietovaraston kloonaaminen.
+code.write = Kirjoita: Työnnä tietovarastoon, luo haaroja ja tageja.
+issues.read = Lue: Lue ja luo ongelmia ja kommentteja.
+releases.read = Lue: Katsele ja lataa julkaisuja.
+pulls.read = Lue: Vetopyyntöjen lukeminen ja luominen.
+ext_issues = Pääsy ulkoisen ongelmanseurannan linkkiin. Käyttöoikeuksia hallitaan ulkoisesti.
+ext_wiki = Pääsy ulkoisen wikin linkkiin. Käyttöoikeuksia hallitaan ulkoisesti.
+projects.read = Lue: Pääsy tietovaraston projektitauluille.
+wiki.write = Kirjoita: Luo, päivitä ja poista integroidun wikin sivuja.
+
+[markup]
+filepreview.truncated = Esikatselu on typistetty
+
+[translation_meta]
+test = This is a test string. It is not displayed in Forgejo UI but is used for testing purposes. Feel free to enter "ok" to save time (or a fun fact of your choice) to hit that sweet 100% completion mark :) :) :)
\ No newline at end of file
diff --git a/options/locale/locale_fil.ini b/options/locale/locale_fil.ini
index 6c338e1583..8c9badb04b 100644
--- a/options/locale/locale_fil.ini
+++ b/options/locale/locale_fil.ini
@@ -38,9 +38,9 @@ logo = Logo
sign_in = Mag-sign in
sign_in_with_provider = Mag-sign in gamit ang %s
sign_in_or = o
-sign_out = Mag-Sign Out
+sign_out = Mag-sign out
sign_up = Magrehistro
-link_account = Mag-link ng Account
+link_account = Mag-link ng account
template = Template
tracked_time_summary = Buod ng mga nakasubaybay na oras base sa filter ng listahan ng isyu
webauthn_sign_in = Pindutin ang button ng iyong security key. Kung walang button ang iyong security key, ilagay muli.
@@ -365,7 +365,7 @@ table_modal.label.columns = Mga Column
link_modal.header = Magdagdag ng link
link_modal.url = Url
link_modal.description = Deskripsyon
-link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maari mong direktang i-paste sa editor para gumawa ng link.
+link_modal.paste_reminder = Pahiwatig: Kapag may URL sa clipboard, maaari mong direktang i-paste sa editor para gumawa ng link.
[filter]
string.asc = A - Z
@@ -432,7 +432,7 @@ openid_connect_desc = Ang piniling OpenID URI ay hindi alam. Iugnay iyan sa bago
invalid_code = Ang iyong confirmation code ay hindi wasto o nag-expire na.
oauth_signin_title = Mag-sign in para pahintulutan ang naka-link na account
invalid_code_forgot_password = Ang iyong confirmation code ay hindi wasto o nag-expire na. Mag-click dito para magsimula ng bagong session.
-confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address.
+confirmation_mail_sent_prompt = Ang isang bagong email na pang-kumpirma ay ipinadala sa %s. Para kumpletuhin ang proseso ng pagrehistro, pakisuri ang iyong inbox at sundan ang ibinigay na link sa loob ng %s. Kung mali ang email, maaari kang mag-log in, at humingi ng isa pang email pang-kumpirma na ipapadala sa ibang address.
invalid_password = Ang iyong password ay hindi tugma sa password na ginamit para gawin ang account.
twofa_scratch_used = Ginamit mo na ang scratch code. Na-redirect ka sa two-factor settings page para tanggalin ang device enrollment o mag-generate ng bagong scratch code.
manual_activation_only = Makipag-ugnayan sa tagapangangasiwa ng site para kumpletuhin ang pagrehistro.
@@ -484,7 +484,7 @@ admin.new_user.text = Mangyaring mag-click dito para ipamahala
register_notify = Maligayang Pagdating sa %s
register_notify.title = %[1]s, maligayang pagdating sa %[2]s
register_notify.text_1 = ito ang iyong registration confirmation email para sa %s!
-register_notify.text_2 = Maari kang mag-sign in sa iyong account gamit ng iyong username: %s
+register_notify.text_2 = Maaari kang mag-sign in sa iyong account gamit ng iyong username: %s
reset_password = I-recover ang iyong account
reset_password.title = %s, nagkaroon kami ng hiling para i-recover ang iyong account
reset_password.text = Kung ikaw ito, paki-click ang sumusunod na link para i-recover ang iyong account sa loob ng %s:
@@ -535,7 +535,7 @@ totp_disabled.text_1 = Ngayon lang na-disable ang Time-based one-time password (
totp_disabled.no_2fa = Wala nang mga ibang paraan ng 2FA ang naka-configure, nangangahulugan na hindi na kailangang mag-log in sa iyong account gamit ang 2FA.
removed_security_key.subject = May tinanggal na security key
removed_security_key.text_1 = Tinanggal ngayon lang ang security key na "%[1]s" sa iyong account.
-account_security_caution.text_1 = Kung ikaw ito, maari mong ligtas na huwag pansinin ang mail na ito.
+account_security_caution.text_1 = Kung ikaw ito, maaari mong ligtas na huwag pansinin ang mail na ito.
account_security_caution.text_2 = Kung hindi ito ikaw, nakompromiso ang iyong account. Mangyaring makipag-ugnayan sa mga tagapangasiwa ng site na ito.
totp_enrolled.subject = Nag-activate ka ng TOTP bilang paraan ng 2FA
totp_enrolled.text_1.has_webauthn = Na-enable mo lang ang TOTP para sa iyong account. Nangangahulugan ito na para sa lahat ng mga hinaharap na pag-login sa iyong account, kailangan mong gumamit ng TOTP bilang paraan ng 2FA o gamitin ang iyong mga security key.
@@ -644,7 +644,7 @@ 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.
+username_claiming_cooldown = Hindi ma-claim ang username na ito, dahil hindi pa tapos ang panahon ng cooldown. Maaari 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]
@@ -685,7 +685,7 @@ followers.title.few = Mga tagasunod
following.title.one = Sinusundan
followers.title.one = Tagasunod
public_activity.visibility_hint.self_public = Nakikita ng lahat ang iyong aktibidad, maliban sa mga interaksyon sa pribadong espasyo. I-configure.
-public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maari mo ring makita ang mga interaksyon sa mga pribadong espasyo.
+public_activity.visibility_hint.admin_public = Nakikita ng lahat ang aktibidad na ito, ngunit bilang tagapangasiwa maaari mo ring makita ang mga interaksyon sa mga pribadong espasyo.
public_activity.visibility_hint.self_private = Nakikita mo lang at mga tagapangasiwa ng instansya ang iyong aktibidad. I-configure.
public_activity.visibility_hint.admin_private = Nakikita mo ang aktibidad na ito dahil isa kang tagapangasiwa, ngunit gusto ng user na panatilihin itong pribado.
public_activity.visibility_hint.self_private_profile = Ikaw lang at ang mga tagapangasiwa ng instansya ang makakakita ng iyong aktibidad dahil pribado ang iyong profile. I-configure.
@@ -701,7 +701,7 @@ ssh_gpg_keys = Mga SSH / GPG key
applications = Mga Aplikasyon
orgs = Ipamahala ang mga organisasyon
repos = Mga Repositoryo
-delete = Burahin ang Account
+delete = Burahin ang account
twofa = Authentikasyong two-factor (TOTP)
account_link = Mga naka-link na account
uid = UID
@@ -842,7 +842,7 @@ gpg_key_verify = I-verify
gpg_invalid_token_signature = Ang ibinigay na GPG key, signature, at token ay hindi tumutugma o luma.
gpg_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
gpg_token = Token
-gpg_token_help = Maari kang mag-generate ng signature gamit ng:
+gpg_token_help = Maaari kang mag-generate ng signature gamit ng:
gpg_token_signature = Naka-armor na GPG signature
key_signature_gpg_placeholder = Nagsisimula sa "-----BEGIN PGP SIGNATURE-----"
verify_gpg_key_success = Na-verify na ang GPG key na "%s".
@@ -851,7 +851,7 @@ ssh_key_verify = I-verify
ssh_invalid_token_signature = Ang ibinigay na SSH key, signature, o token ay hindi tumutugma o luma.
ssh_token_required = Kailangan mong magbigay ng signature para sa token sa ibaba
ssh_token = Token
-ssh_token_help = Maari kang mag-generate ng signature gamit ng:
+ssh_token_help = Maaari kang mag-generate ng signature gamit ng:
ssh_token_signature = Naka-armor na SSH signature
key_signature_ssh_placeholder = Nagsisimula sa "-----BEGIN SSH SIGNATURE-----"
verify_ssh_key_success = Na-verify na ang SSH key na "%s".
@@ -912,10 +912,10 @@ create_oauth2_application_success = Matagumpay kang gumawa ang bagong OAuth2 app
oauth2_confidential_client = Kumpidensyal na kliyente. Piliin para sa mga app na pinapatilihing kumpidensyal ang sikreto, tulad ng mga web app. Huwag piliin para sa mga web app kasama ang mga desktop at mobile app.
twofa_desc = Para protektahin ang iyong account laban sa pagnanakaw ng password, pwede mo gamitin ang iyong smartphone o ibang device para sa pagtanggap ng time-based one-time password ("TOTP").
twofa_scratch_token_regenerated = Ang iyong isang-beses na paggamit na recovery key ngayon ay %s. Ilagay ito sa ligtas na lugar, dahil hindi na ito ipapakita muli.
-regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maari mong i-reset dito.
+regenerate_scratch_token_desc = Kapag nawala mo ang iyong recovery key o ginamit mo na oara mag-sign in, maaari mong i-reset dito.
twofa_disable_desc = Ang pag-disable ng authentikasyong two-factor ay gagawing hindi gaanong ligtas ang iyong account. Magpatuloy?
twofa_enrolled = Matagumpay na na-enroll ang iyong account. Ilagay ang iyong isang-beses na paggamit na recovery key (%s) sa isang ligtas na lugar, dahil hindi na ito ipapakita muli.
-webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard.
+webauthn_desc = Ang mga security key ay isang hardware device na naglalaman ng mga cryptographic key. Maaari silang gamitin para sa authentikasyong two-factor. Ang mga security key ay dapat suportahan ang WebAuthn Authenticator na standard.
remove_oauth2_application = Tanggalin ang OAuth2 Application
remove_oauth2_application_desc = Ang pagtanggal ng OAuth2 application ay babawiin ang access sa lahat ng mga naka-sign na access token. Magpatuloy?
remove_oauth2_application_success = Binura na ang application.
@@ -931,13 +931,13 @@ oauth2_regenerate_secret = I-regenerate ang sikreto
oauth2_regenerate_secret_hint = Nawala mo ang iyong sikreto?
oauth2_client_secret_hint = Ang sikreto ay hindi ipapakita muli pagkatapos umalis ka o i-refresh ang page na ito. Mangyaring siguraduhin na na-save mo iyan.
oauth2_application_edit = I-edit
-twofa_recovery_tip = Kapag mawala mo ang iyong device, maari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account.
+twofa_recovery_tip = Kapag mawala mo ang iyong device, maaari kang gumamit ng isang isang-beses na paggamit na recovery key para makakuha muli ng access sa iyong account.
twofa_is_enrolled = Ang iyong account ay kasalukuyang naka-enroll sa autentikasyong two-factor.
twofa_not_enrolled = Kasalukuyang hindi naka-enroll ang iyong account sa authentikasyong two-factor.
twofa_disable = I-disable ang authentikasyong two-factor
twofa_scratch_token_regenerate = I-regenerate ang isang-beses na paggamit na recovery key
twofa_enroll = Mag-enroll sa authentikasyong two-factor
-twofa_disable_note = Maari mong i-disable ang authentikasyong two-factor kapag kinakailangan.
+twofa_disable_note = Maaari mong i-disable ang authentikasyong two-factor kapag kinakailangan.
twofa_disabled = Na-disable na ang authentikasyong two-factor.
scan_this_image = I-scan ang image na ito gamit ng iyong aplikasyong pang-authentikasyon:
or_enter_secret = O ilagay ang sikreto: %s
@@ -1005,8 +1005,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 maaaring 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.
+change_username_redirect_prompt.with_cooldown.one = Magiging available ang lumang username sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari 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. Maaari mo pa ring ma-claim muli ang lumang username sa panahon ng panahon ng cooldown.
keep_pronouns_private = Ipakita lang ang mga panghalip sa mga naka-authenticate na user
keep_pronouns_private.description = Itatago nito ang iyong mga panghalip mula sa mga bisita na hindi naka-log in.
quota.applies_to_user = Nag-aapply ang mga sumusunod na panuntunan ng quota sa iyong account
@@ -1071,7 +1071,7 @@ readme_helper_desc = Ito ang lugar kung saan makakasulat ka ng kumpletong deskri
trust_model_helper_collaborator_committer = Katulong+Committer: I-trust ang mga signature batay sa mga katulong na tumutugma sa committer
mirror_interval = Interval ng mirror (ang mga wastong unit ng oras ay "h", "m", "s"). 0 para i-disable ang periodic sync. (Pinakamababang interval: %s)
transfer.reject_desc = Kanselahin ang pag-transfer mula sa "%s"
-mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar.
+mirror_lfs_endpoint_desc = Ang sync ay susubukang gamitin ang clone url upang matukoy ang LFS server. Maaari ka rin tumukoy ng isang custom na endpoint kapag ang LFS data ng repositoryo ay nilalagay sa ibang lugar.
adopt_search = Ilagay ang username para maghanap ng mga unadopted na repositoryo… (iwanang walang laman para hanapin lahat)
object_format = Format ng object
readme_helper = Pumili ng README file template
@@ -1164,8 +1164,8 @@ tree_path_not_found_commit = Hindi umiiral ang path na %[1]s sa commit %[2]s
tree_path_not_found_branch = Hindi umiiral ang daanang %[1]s sa branch %[2]s
migrate_items_pullrequests = Mga hiling sa paghila
archive.pull.nocomment = Naka-archive ang repositoryong ito. Hindi ka makakakomento sa mga pull request.
-archive.title = Naka-archive ang repositoryong ito. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento.
-archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento.
+archive.title = Naka-archive ang repositoryong ito. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado ito, tulad ng pagtulak at paggawa ng mga isyu, pull request o mga komento.
+archive.title_date = Naka-archive ang repositoryo na ito noong %s. Maaari mong itignan ang mga file at i-clone ito, pero hindi ka makakagawa ng anumang pagbabago sa estado nito, tulad ng pagtulak o paggawa ng mga bagong isyu, mga pull request, o komento.
pulls = Mga hiling sa paghila
activity.merged_prs_count_n = Mga naisamang hiling sa paghila
wiki.last_updated = Huling binago %s
@@ -1183,7 +1183,7 @@ issues.action_open = Buksan
issues.closed_title = Sarado
issues.reopen_issue = Buksang muli
pulls.merged = Naisama na
-pulls.merged_info_text = Maari nang burahin ang branch %s.
+pulls.merged_info_text = Maaari nang burahin ang branch %s.
milestones.update_ago = Binago %s
activity.closed_issue_label = Sarado
activity.merged_prs_label = Naisama
@@ -1205,7 +1205,7 @@ migrate.clone_address_desc = Ang HTTP(S) o Git "clone" URL ng umiiral na reposit
need_auth = Awtorisasyon
migrate.github_token_desc = Maaari kang maglagay ng isa o higit pang mga token na hinihiwalay ng kuwit dito upang gawing mas-mabilis ang pagmigrate dahil sa rate limit ng GitHub API. BABALA: Ang pagabuso ng feature na ito ay maaaring maglabag sa patakaran ng tagapagbigay ng serbisyo at maaaring magdulot ng pag-block ng account.
template.invalid = Kailangang pumili ng kahit isang template na repositoryo
-migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar.
+migrate_options_lfs_endpoint.description = Susubukan ng migration na gamitin ang iyong Git remote upang matukoy ang LFS server. Maaari mong magtiyak ng custom na endpoint kapag ang LFS data ng repositoryo ay nakalagay sa ibang lugar.
blame.ignore_revs.failed = Nabigong hindi pansinin ang mga rebisyon sa .git-blame-ignore-revs.
tree_path_not_found_tag = Hindi umiiral ang path na %[1]s sa tag %[2]s
form.reach_limit_of_creation_n = Naabot na ng may-ari ang limitasyon na %d mga repositoryo.
@@ -1471,10 +1471,10 @@ activity.new_issue_label = Nabuksan
activity.merged_prs_count_1 = Naisamang hiling sa paghila
activity.opened_prs_count_1 = Inimungkahing hiling sa paghila
activity.opened_prs_label = Inimungkahi
-pulls.reopened_at = `nabuksang muli ang hiling sa paghatak na %[2]s`
+pulls.reopened_at = `binuksan muli ang hiling sa paghila %s`
issues.opened_by_fake = binuksan ang %[1]s ni/ng %[2]s
pulls.reopen_failed.base_branch = Hindi mabuksang muli ang hiling sa paghatak na ito dahil hindi na umiiral ang base branch.
-issues.reopened_at = `binuksang muli ang isyung ito %[2]s`
+issues.reopened_at = `binuksang muli ang isyung ito %s`
pulls.reopen_failed.head_branch = Hindi mabubuksan muli ang hiling sa paghila, dahil hindi na umiiral ang head branch.
settings.event_pull_request_desc = Binuksan, sinara, muling binuksan, o binago ang hiling sa paghatak.
activity.opened_prs_count_n = Mga inimungkahing hiling sa paghila
@@ -1500,7 +1500,7 @@ issues.content_history.created = ginawa
editor.patching = Pina-patch:
editor.fail_to_apply_patch = Hindi malapat ang patch na "%s"
settings.danger_zone = Mapanganib na lugar
-issues.closed_at = `isinara ang isyung %[2]s`
+issues.closed_at = `isinara ang isyung ito %s`
settings.collaboration.admin = Tagapangasiwa
settings.admin_settings = Mga setting ng tagapangasiwa
issues.start_tracking_history = `sinimulan ang trabaho %s`
@@ -1627,7 +1627,7 @@ projects.column.edit_title = Pangalan
projects.column.new_title = Pangalan
projects.card_type.desc = Mga preview ng card
commits.desc = I-browse ang history ng pagbabago ng source code.
-commits.search.tooltip = Maari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09".
+commits.search.tooltip = Maaari kang mag-prefix ng mga keyword gamit ang "author:", "committer:", "after:", o "before:", hal. "revert author:Nijika before:2022-10-09".
issues.force_push_codes = `puwersahang itinulak ang %[1]s mula %[2]s
sa %[4]s
%[6]s`
issues.push_commit_1 = idinagdag ang %d commit %s
issues.push_commits_n = idinagdag ang %d mga commit %s
@@ -1674,10 +1674,10 @@ issues.new_label = Bagong label
issues.label_templates.title = Mag-load ng isang label preset
issues.new.clear_milestone = I-clear ang milestone
issues.new.open_milestone = Mga bukas na milestone
-issues.filter_milestones = I-filter ang Milestone
-issues.filter_projects = I-filter ang Proyekto
-issues.filter_labels = I-filter ang Label
-issues.filter_reviewers = I-filter ang Tagasuri
+issues.filter_milestones = I-filter ang milestone
+issues.filter_projects = I-filter ang proyekto
+issues.filter_labels = I-filter ang label
+issues.filter_reviewers = I-filter ang tagasuri
issues.remove_labels = tinanggal ang mga label na %s %s
issues.add_remove_labels = idinagdag ang %s at tinanggal ang %s na mga label %s
issues.add_milestone_at = `idinagdag ito sa %s na milestone %s`
@@ -1688,7 +1688,7 @@ issues.add_label = idinagdag ang %s na label %s
issues.add_labels = idinagdag ang mga label na %s %s
issues.remove_label = tinanggal ang %s na label %s
issues.desc = Ayusin ang mga ulat ng bug, gawain, at milestone.
-issues.filter_assignees = I-filter ang Mangangasiwa
+issues.filter_assignees = I-filter ang mangangasiwa
issues.new.labels = Mga label
issues.new.no_label = Walang mga label
issues.new.clear_labels = I-clear ang mga label
@@ -1707,7 +1707,7 @@ issues.action_milestone = Milestone
issues.action_milestone_no_select = Walang milestone
issues.delete_branch_at = `binura ang branch na %s %s`
issues.filter_label = Label
-issues.filter_label_exclude = `Gamitin ang alt
+ click/enter
para hindi isama ang mga label`
+issues.filter_label_exclude = `Gamitin ang Alt + Click para hindi isama ang mga label`
issues.filter_label_no_select = Lahat ng mga label
issues.filter_milestone_closed = Mga nakasarang milestone
issues.filter_assignee = Mangangasiwa
@@ -1771,7 +1771,7 @@ issues.lock = I-lock ang usapan
issues.unlock = I-unlock ang usapan
issues.unlock_comment = na-unlock ang usapang ito %s
issues.unlock.notice_1 = - Makakakomento muli ang lahat ng mga tao sa isyung ito.
-issues.unlock.notice_2 = - Maari mong i-lock muli ang isyung ito sa hinaharap.
+issues.unlock.notice_2 = - Maaari mong i-lock muli ang isyung ito sa hinaharap.
issues.comment_on_locked = Hindi ka makakakomento sa naka-lock na isyu.
issues.closed_by_fake = ni/ng %[2]s ay isinara %[1]s
issues.comment_manually_pull_merged_at = manwal na isinama ang commit %[1]s sa %[2]s %[3]s
@@ -1787,10 +1787,10 @@ issues.label_archive_tooltip = Ang mga naka-archive na label ay hindi isasama bi
issues.is_stale = May mga pagbabago sa PR na ito mula sa pagsuri na ito
issues.role.first_time_contributor = Unang-beses na contributor
issues.lock.notice_1 = - Hindi makakadagdag ng mga bagong komento ang mga ibang user sa isyu na ito.
-issues.lock.notice_3 = - Maari mong i-unlock muli ang isyung ito sa hinaharap.
+issues.lock.notice_3 = - Maaari mong i-unlock muli ang isyung ito sa hinaharap.
issues.label_deletion_desc = Ang pagbura ng label ay tatanggalin ito sa lahat ng mga isyu. Magpatuloy?
-issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %[2]s`
-issues.ref_issue_from = `isinangguni ang isyu na ito sa %[4]s %[2]s`
+issues.commit_ref_at = `isinangguni ang isyu na ito mula sa commit %s`
+issues.ref_issue_from = `isinangguni ang isyu na ito sa %[3]s %[1]s`
issues.num_participants_one = %d kasali
issues.attachment.download = `I-click para i-download ang "%s" `
issues.num_participants_few = %d mga kasali
@@ -1815,10 +1815,10 @@ issues.sign_in_require_desc = Mag-sign in upang sumali sa usapa
issues.num_comments = %d mga komento
issues.role.contributor_helper = Nakaraang nag-commit ang user na ito sa repositoryo na ito.
issues.comment_pull_merged_at = isinama ang commit %[1]s sa %[2]s %[3]s
-pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %[2]s`
+pulls.commit_ref_at = `isinangguni ang hiling sa paghila mula sa isang commit %s`
wiki.last_commit_info = Binago ni %s ang pahinang ito %s
issues.content_history.edited = binago
-issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[4]s %[2]s`
+issues.ref_pull_from = `isinangguni ang hiling sa paghila na ito %[3]s %[1]s`
pulls.merged_title_desc_few = isinali ang %[1]d mga commit mula sa %[2]s
patungong %[3]s
%[4]s
settings.org_not_allowed_to_be_collaborator = Hindi maaaring idagdag ang mga organisasyon bilang tagatulong.
settings.add_collaborator_success = Naidagdag ang tagatulong.
@@ -1828,7 +1828,7 @@ pulls.create = Gumawa ng hiling sa paghila
issues.dependency.pr_close_blocked = Kailangan mong isara ang lahat ng mga isyu na humaharang sa hiling sa paghila na ito bago mo ito isama.
pulls.delete.title = Burahin ang hiling sa paghila na ito?
issues.dependency.pr_closing_blockedby = Hinarang ng mga sumusunod na isyu mula sa pagsara ng hiling sa paghila na ito
-pulls.closed_at = `isinara ang hiling sa paghila na %[2]s`
+pulls.closed_at = `isinara ang hiling sa paghila na ito %s`
pulls.close = Isara ang hiling sa paghila
pulls.cmd_instruction_hint = Tingnan ang mga panuto para sa command line
project = Mga proyekto
@@ -1836,8 +1836,8 @@ issues.content_history.deleted = binura
pulls.no_results = Walang mga nahanap na resulta.
pulls.closed = Sarado ang hiling sa paghila
pulls.is_closed = Naisara na ang hiling sa paghila.
-issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[4]s na magsasara sa isyu, %[2]s`
-issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[4]s na muling bubukas, %[2]s`
+issues.ref_closing_from = `nagsangguni ang isyu mula sa hiling sa paghila %[3]s na magsasara sa isyu, %[1]s`
+issues.ref_reopening_from = `nagsangguni ang isyu na ito mula sa hiling sa paghila %[3]s na muling bubukas nito, %[1]s`
issues.ref_closed_from = `isinara ang isyung ito %[4]s%[2]s`
issues.review.wait = hiniling sa pagsuri %s
issues.review.reject = hinihiling ang mga pagbago %s
@@ -1893,7 +1893,7 @@ settings.collaboration.owner = May-ari
pulls.showing_only_single_commit = Ipinapakita lamang ang mga pagbago ng commit na %[1]s
comments.edit.already_changed = Hindi maimbak ang mga pagbabago sa komento. Mukhang nabago na ng ibang tagagamit ang nilalaman. Mangyaring i-refresh ang pahina at subukang baguhin muli upang maiwasang ma-overwrite ang kanilang pagbago
milestones.completeness = %d%% nakumpleto
-wiki.welcome = Maligayang pagdating sa Wiki.
+wiki.welcome = Maligayang pagdating sa wiki.
wiki.create_first_page = Gawin ang unang pahina
pulls.switch_comparison_type = Ilipat ang uri ng pagkumpara
settings.collaboration.read = Basahin
@@ -2015,14 +2015,14 @@ wiki.cancel = Kanselahin
settings.collaboration.undefined = Hindi Natukoy
settings.federation_settings = Mga Setting ng Federation
settings = Mga Setting
-settings.desc = Ang mga setting ang lugar kung saan maari mong ipamahala ang mga setting para sa repositoryo
+settings.desc = Ang mga setting ang lugar kung saan maaari mong ipamahala ang mga setting para sa repositoryo
pulls.collapse_files = I-collapse ang lahat ng mga file
pulls.add_prefix = Magdagdag ng %s na prefix
pulls.still_in_progress = Ginagawa pa?
activity.title.prs_1 = %d hiling sa paghila
activity.active_issues_count_n = %d mga aktibong isyu
pulls.required_status_check_missing = Nawawala ang ilang mga kinakailangang pagsusuri.
-pulls.required_status_check_administrator = Bilang tagapangasiwa, maari mo pa ring isama ang hiling sa paghila na ito.
+pulls.required_status_check_administrator = Bilang tagapangasiwa, maaari mo pa ring isama ang hiling sa paghila na ito.
pulls.blocked_by_approvals = Wala pang sapat na pag-apruba ang hiling sa paghila na ito. %d ng %d na pag-apruba ang ibinigay.
settings.options = Repositoryo
wiki.back_to_wiki = Bumalik sa pahina ng wiki
@@ -2110,7 +2110,7 @@ settings.actions_desc = I-enable ang mga kasamang CI/CD pipeline gamit ang Forge
settings.admin_indexer_commit_sha = Huling na-index na commit
settings.admin_indexer_unindexed = Hindi naka-index
settings.transfer_notices_3 = - Kung pribado ang repositoryo at ilipat sa isang indibidwal na user, ang aksyon na ito ay sinisigurado na ang user ay may pahintulot na basahin (at palitan ang mga pahintulot kung kailangan).
-settings.convert_desc = Maari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi.
+settings.convert_desc = Maaari mong i-convert ang repositoryo na ito sa regular na repositoryo. Hindi ito mababawi.
settings.transfer.button = Ilipat ang pagmamay-ari
settings.signing_settings = Mga setting sa pagpapatunay ng pag-sign
settings.admin_enable_close_issues_via_commit_in_any_branch = Isara ang isyu sa pamamagitan ng commit na ginawa sa hindi default na branch
@@ -2137,7 +2137,7 @@ settings.deploy_key_deletion = Tanggalin ang deploy key
settings.protect_enable_push = I-enable ang pagtulak
settings.discord_icon_url.exceeds_max_length = Kailangang bababa o equal sa 2048 characters ang URL ng icon
settings.protected_branch.save_rule = I-save ang rule
-settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maari mo pa rin gamitin ang iyong umiiral na mirror.
+settings.mirror_settings.docs.can_still_use = Bagama't na hindi ka makakabago ng mga umiiral na mirror o gumawa ng bago, maaari mo pa rin gamitin ang iyong umiiral na mirror.
settings.slack_color = Kulay
settings.discord_icon_url = URL ng icon
settings.convert_fork_confirm = I-convert ang repositoryo
@@ -2254,7 +2254,7 @@ settings.pulls.allow_rebase_update = I-enable ang pag-update ng hiling sa paghil
settings.admin_enable_health_check = I-enable ang pagsusuri ng kalusugan ng repositoryo (git fsck)
settings.new_owner_has_same_repo = Ang bagong may-ari ay may repositoryo na may katulad na pangalan. Mangyaring pumili ng ibang pangalan.
settings.convert = I-convert sa regular na repositoryo
-settings.convert_fork_desc = Maari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi.
+settings.convert_fork_desc = Maaari mong i-convert ang fork na ito bilang regular na repositoryo. Hindi ito mababawi.
settings.convert_fork_notices_1 = Ang operasyon na ito ay ico-convert ang fork bilang regular na repositoryo at hindi mababawi.
settings.transfer_abort_invalid = Hindi mo makakansela ang isang hindi umiiral na paglipat ng repositoryo.
settings.transfer_quota_exceeded = Ang bagong may-ari (%s) ay lumalagpas sa quota. Hindi nailipat ang repositoryo.
@@ -2278,7 +2278,7 @@ settings.add_collaborator = Magdagdag ng katulong
settings.add_collaborator_duplicate = Nadagdag na ang tagatulong na ito sa repositoryo.
settings.add_collaborator_blocked_our = Hindi madagdag ang tagatulong, dahil hinarang siya ng may-ari ng repositoryo.
settings.add_collaborator_blocked_them = Hindi madagdag ang tagatulong, dahil hinarang niya ang may-ari ng repositoryo.
-settings.collaborator_deletion = Tanggalin ang Tagatulong
+settings.collaborator_deletion = Tanggalin ang tagatulong
settings.team_not_in_organization = Ang koponan ay hindi nasa katulad na organisasyon sa repositoryo
settings.teams = Mga Koponan
settings.add_team_success = May access na ang koponan sa repositoryo na ito.
@@ -2290,8 +2290,8 @@ settings.webhook.headers = Mga header
settings.webhook.payload = Nilalaman
settings.webhook.body = Katawan
settings.webhook.replay.description = I-replay ang webhook na ito.
-settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maari magtagal ng ilang segundo bago makita sa delivery history.
-settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon.
+settings.webhook.delivery.success = May nadagdag na event sa delivery queue. Maaari magtagal ng ilang segundo bago makita sa delivery history.
+settings.githooks_desc = Pinapagana ng Git ang mga Git hook. Maaari mong baguhin ang mga hook file sa ibaba para mag-set up ng mga custom na operasyon.
settings.githook_name = Pangalan ng hook
settings.githook_content = Nilalaman ng hook
settings.update_githook = I-update ang hook
@@ -2362,7 +2362,7 @@ settings.mirror_settings.docs.pull_mirror_instructions = Para mag-set up ng pull
milestones.invalid_due_date_format = Kailangang "yyyy-mm-dd" na format ang takdang petsa.
signing.wont_sign.nokey = Walang key ang instansya na ito para i-sign ang commit na ito.
activity.title.releases_1 = %d paglabas
-settings.mirror_settings.docs.more_information_if_disabled = Maari kang matuto pa tungkol sa mga push at pull na mirror dito:
+settings.mirror_settings.docs.more_information_if_disabled = Maaari kang matuto pa tungkol sa mga push at pull na mirror dito:
settings.branches.switch_default_branch = Magpalit ng default branch
settings.convert_notices_1 = Ang operasyon na ito ay ico-covert ang mirror sa regular na repositoryo at hindi mababawi.
settings.convert_fork_succeed = Na-convert na ang fork sa regular na repositoryo.
@@ -2732,7 +2732,7 @@ settings.protect_protected_file_patterns = Mga pattern ng nakaprotektang file (h
settings.update_protect_branch_success = Binago na ang branch protection rule na "%s".
settings.remove_protected_branch_success = Tinanggal ang branch protection rule na "%s".
settings.tags.protection.pattern = Pattern ng tag
-settings.tags.protection.pattern.description = Maari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag.
+settings.tags.protection.pattern.description = Maaari kang gumamit ng iisang pangalan o glob pattern o regular expression para magtugma ng maraming tag. Magbasa pa sa guide ng mga nakaprotektang tag.
settings.thread_id = ID ng thread
settings.matrix.room_id = ID ng room
diff.has_escaped = May mga nakatagong Unicode character ang linya na ito
@@ -2746,7 +2746,7 @@ diff.bin = BIN
settings.default_update_style_desc = Ang default na istilio na gagamitin sa pag-update ng mga hiling sa paghila na nalilipas sa base branch.
pulls.sign_in_require = Mag-sign in para gumawa ng bagong hiling sa paghila.
new_from_template = Gumamit ng template
-new_from_template_description = Maari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
+new_from_template_description = Maaari kang pumili ng umiiral na repository template sa instansya na ito at i-apply ang mga setting nito.
new_advanced = Mga advanced na setting
new_advanced_expand = I-click para i-expand
auto_init_description = Simulan ang kasaysayan ng Git gamit ang README at opsyonal na magdagdag ng mga lisensya at .gitignore na file.
@@ -2773,6 +2773,14 @@ comment.blocked_by_user = Hindi posible ang pagkomento dahil hinarang ka ng may-
sync_fork.button = I-sync
sync_fork.branch_behind_one = Ang branch na ito ay %[1]d commit sa likod ng %[2]s
sync_fork.branch_behind_few = Ang branch na ito ay %[1]d mga commit sa likod ng %[2]s
+settings.event_header_action = Mga event sa run ng aksyon
+settings.event_action_failure = Pagkabigo
+settings.event_action_failure_desc = Natapos ang action run bilang pagkabigo.
+settings.event_action_recover = I-recover
+settings.event_action_success = Matagumpay
+settings.event_action_success_desc = Matagumpay na natapos ang Action Run.
+settings.event_action_recover_desc = Matagumpay na natapos ang Action Run pagkatapos na nabigo ang huling Action Run sa katulad na workflow.
+issues.filter_type.all_pull_requests = Lahat ng mga hiling sa paghila
[search]
commit_kind = Maghanap ng mga commit…
@@ -3198,7 +3206,7 @@ self_check.database_collation_mismatch = Inaasahan ang database na gamitin ang c
auths.oauth2_admin_group = Group claim value para sa mga tagapangasiwa. (Opsyonal - kinakailangan ang claim name sa itaas)
auths.tip.facebook = Magrehistro ng bagong application sa %s at idagdag ang produktong "Facebook Login"
users.restricted.description = Payagan lamang ang interaksyon sa mga repositoryo at organisasyon kung saan ang user ay dinagdag bilang tagatulong. Iniiwasan nito ang pag-access sa publikong repositoryo sa instansya na ito.
-users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maari itong maging isyu sa seguridad.
+users.local_import.description = Payagan ang pag-import ng mga repositoryo mula sa local file system ng user. Maaari itong maging isyu sa seguridad.
emails.delete = Burahin ang Email
emails.deletion_success = Binura na ang email address.
auths.oauth2_required_claim_value = Kinakailangan na claim value
@@ -3443,8 +3451,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 pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown.
-settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw, maari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown.
+settings.change_orgname_redirect_prompt.with_cooldown.few = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan sa panahon ng cooldown.
+settings.change_orgname_redirect_prompt.with_cooldown.one = Magiging available ang lumang pangalan ng organisasyon sa lahat pagkatapos ng panahon ng cooldown ng %[1]d araw. Maaari mo pa ring ma-claim muli ang lumang pangalan ng panahon ng cooldown.
[packages]
@@ -3568,8 +3576,8 @@ npm.details.tag = Tag
swift.install = Idagdag ang package sa iyong Package.swift
na file:
vagrant.install = Para magdagdag ng Vagrant box, patakbuhin ang sumusunod na command:
settings.link = I-link ang package na ito sa repository
-settings.link.select = Pumili ng Repositoryo
-settings.link.button = I-update ang Link ng Repositoryo
+settings.link.select = Pumili ng repositoryo
+settings.link.button = I-update ang link ng repositoryo
settings.link.error = Nabigong i-update ang link ng repositoryo.
settings.delete = Burahin ang package
owner.settings.cargo.initialize = I-initialize ang index
@@ -3712,7 +3720,7 @@ runners.reset_registration_token = I-reset ang token ng pagrehistro
runners.status.offline = Offline
workflow.dispatch.invalid_input_type = Hindi wastong input type "%s".
runners.task_list.commit = Commit
-runners.task_list.done_at = Natapos Sa
+runners.task_list.done_at = Natapos sa
runners.reset_registration_token_success = Matagumpay na na-reset ang token ng pagrehistro ng runner
workflow.dispatch.input_required = Kumailangan ng value para sa input na "%s".
workflow.dispatch.warn_input_limit = Pinapakita lamang ang unang %d na mga input.
@@ -3830,7 +3838,7 @@ deletion.success = Natanggal na ang lihim.
deletion.failed = Nabigong tanggalin ang lihim.
creation.failed = Nabigong idagdag ang lihim.
deletion = Tanggalin ang lihim
-creation = Idagdag ang Lihim
+creation = Idagdag ang lihim
description = Ang mga sikreto ay ipapasa sa ilang mga aksyon at hindi mababasa kung hindi.
none = Wala pang mga sikreto sa ngayon.
creation.name_placeholder = case-insensitive, alphanumeric character o underscore lamang, hindi dapat magsimula sa GITEA_ o GITHUB_
@@ -3844,7 +3852,7 @@ filepreview.truncated = Na-truncate ang preview
filepreview.lines = Mga linya %[1]d hanggang %[2]d sa %[3]s
[projects]
-deleted.display_name = Binurang Proyekto
+deleted.display_name = Binurang proyekto
type-2.display_name = Proyekto ng repositoryo
type-1.display_name = Indibidwal na proyekto
type-3.display_name = Proyekto ng organisasyon
diff --git a/options/locale/locale_fr-FR.ini b/options/locale/locale_fr-FR.ini
index c4b0aa832e..1cb7103bc0 100644
--- a/options/locale/locale_fr-FR.ini
+++ b/options/locale/locale_fr-FR.ini
@@ -9,7 +9,7 @@ sign_in_with_provider=Se connecter avec %s
sign_in_or=ou
sign_out=Déconnexion
sign_up=S'inscrire
-link_account=Lier un Compte
+link_account=Lier un compte
register=S'inscrire
version=Version
powered_by=Propulsé par %s
@@ -1062,8 +1062,8 @@ language.localization_project = Aidez-nous à traduire Forgejo dans votre langue
language.description = Cette langue sera enregistrée dans votre compte et utilisée comme langue par défaut après votre connexion.
user_block_yourself = Vous ne pouvez pas vous bloquer vous même.
pronouns_custom_label = Pronoms personnalisés
-change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période.
-change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période.
+change_username_redirect_prompt.with_cooldown.one = L'ancien pseudonyme sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période.
+change_username_redirect_prompt.with_cooldown.few = L'ancien pseudonyme sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien pseudonyme pendant cette période.
quota.rule.exceeded = Dépassé
regenerate_token = Régénérer
access_token_regeneration = Régénérer le token d'accès
@@ -1516,7 +1516,7 @@ issues.desc=Organiser les rapports de bug, les tâches et les jalons.
issues.filter_assignees=Filtrer par assignation
issues.filter_milestones=Filtrer le jalon
issues.filter_projects=Filtrer par projet
-issues.filter_labels=Filtrer par labels
+issues.filter_labels=Filtrer par étiquettes
issues.filter_reviewers=Filtrer par évaluateur
issues.new=Nouveau ticket
issues.new.title_empty=Le titre ne peut pas être vide
@@ -1653,13 +1653,13 @@ issues.close_comment_issue=Fermer avec le commentaire
issues.reopen_issue=Rouvrir
issues.reopen_comment_issue=Réouvrir avec le commentaire
issues.create_comment=Commenter
-issues.closed_at=`a fermé ce ticket %[2]s.`
-issues.reopened_at=`a rouvert ce ticket %[2]s.`
-issues.commit_ref_at=`a référencé ce ticket depuis une révision %[2]s.`
-issues.ref_issue_from=`a fait référence à %[4]s ce ticket %[2]s.`
-issues.ref_pull_from=`a fait référence à cette demande d'ajout %[4]s %[2]s.`
-issues.ref_closing_from=`a fait référence à une demande d'ajout %[4]s qui clora ce ticket, %[2]s.`
-issues.ref_reopening_from=`a référencé une pull request %[4]s qui va ré-ouvrir ce ticket %[2]s`
+issues.closed_at=`a fermé ce ticket %s`
+issues.reopened_at=`a rouvert ce ticket %s`
+issues.commit_ref_at=`a référencé ce ticket depuis une révision %s`
+issues.ref_issue_from=`a fait référence à ce ticket %[3]s %[1]s`
+issues.ref_pull_from=`a fait référence à cette demande d'ajout %[3]s %[1]s`
+issues.ref_closing_from=`a fait référence à une demande d'ajout %[3]s qui clora ce ticket, %[1]s`
+issues.ref_reopening_from=`a référencé ce ticket dans une pull request %[3]s qui va ré-ouvrir ce ticket, %[1]s`
issues.ref_closed_from=`a fermé ce ticket %[4]s %[2]s`
issues.ref_reopened_from=`a rouvert ce ticket %[4]s %[2]s.`
issues.ref_from=`de %[1]s`
@@ -1967,8 +1967,8 @@ pulls.update_branch_success=La mise à jour de la branche a réussi
pulls.update_not_allowed=Vous n'êtes pas autorisé à mettre à jour la branche
pulls.outdated_with_base_branch=Cette branche est désynchronisée avec la branche de base
pulls.close=Fermer la demande d’ajout
-pulls.closed_at=`a fermé cette demande d'ajout %[2]s.`
-pulls.reopened_at=`a rouvert cette demande d'ajout %[2]s.`
+pulls.closed_at=`a fermé cette demande d'ajout %s`
+pulls.reopened_at=`a rouvert cette demande d'ajout %s`
pulls.cmd_instruction_hint=Voir les instructions en ligne de commande
pulls.cmd_instruction_checkout_title=Basculer
pulls.cmd_instruction_checkout_desc=Depuis votre dépôt, basculer sur une nouvelle branche et tester des modifications.
@@ -2044,7 +2044,7 @@ ext_wiki=Wiki externe
ext_wiki.desc=Lier un wiki externe.
wiki=Wiki
-wiki.welcome=Bienvenue sur le Wiki.
+wiki.welcome=Bienvenue sur le wiki.
wiki.welcome_desc=Le wiki vous permet d'écrire ou de partager de la documentation avec vos collaborateurs.
wiki.desc=Écrire et partager de la documentation avec vos collaborateurs.
wiki.create_first_page=Créer la première page
@@ -2762,7 +2762,7 @@ issues.blocked_by_user = Vous ne pouvez pas créer de tickets sur ce dépôt car
pulls.blocked_by_user = Vous ne pouvez pas créer une pull request sur ce dépôt car vous êtes bloqué par son propriétaire.
wiki.cancel = Annuler
settings.wiki_globally_editable = Permettre l'édition du wiki a tout le monde
-pulls.commit_ref_at = `a référencé cette pull request depuis le commit %[2]s`
+pulls.commit_ref_at = `a référencé cette pull request depuis un commit %s`
settings.new_owner_blocked_doer = Le nouveau propriétaire vous a bloqué.
settings.enter_repo_name = Confirmez en entrant le propriétaire et le nom du dépôt exactement comme affiché :
settings.wiki_rename_branch_main = Normalise le nom de la branche du Wiki
@@ -2913,6 +2913,14 @@ pulls.editable_explanation = Cette pull request peut être éditée par les main
sync_fork.branch_behind_one = Cette branche a %[1]d commits de retard sur %[2]s
sync_fork.branch_behind_few = Cettte branche a %[1]d commits de retard sur %[2]s
sync_fork.button = Sync
+settings.event_action_failure = Échec
+settings.event_action_recover = Récupérer
+settings.event_action_success = Réussite
+settings.event_header_action = Événements d'exécution d'action
+settings.event_action_success_desc = L'exécution de l'action a réussi.
+settings.event_action_failure_desc = L'exécution de l'action a échoué.
+settings.event_action_recover_desc = L'exécution de l'action a réussi après l'échec de la dernière exécution de l'action dans le même workflow.
+issues.filter_type.all_pull_requests = Toutes les demandes d'ajout
[graphs]
component_loading = Chargement %s…
@@ -2921,7 +2929,7 @@ component_loading_failed = Échec de chargement de %s
component_loading_info = Cela peut prendre du temps…
component_failed_to_load = Une erreur inattendue s'est produite.
contributors.what = contributions
-code_frequency.what = fŕequence de code
+code_frequency.what = fréquence de code
recent_commits.what = commits récents
@@ -3050,8 +3058,8 @@ teams.invite.by=Invité par %s
teams.invite.description=Veuillez cliquer sur le bouton ci-dessous pour rejoindre l’équipe.
follow_blocked_user = Vous ne pouvez pas suivre cette organisation car elle vous a bloqué.
open_dashboard = Ouvrir le tableau de bord
-settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période.
-settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour, vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période.
+settings.change_orgname_redirect_prompt.with_cooldown.few = L'ancien nom d'organisation sera disponible pour n'importe qui après une période de %[1]d jours. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période.
+settings.change_orgname_redirect_prompt.with_cooldown.one = L'ancien nom d'organisation sera disponible pour n'importe qui après une période d'%[1]d jour. Vous pouvez toujours réclamer votre ancien nom d'organisation pendant cette période.
[admin]
dashboard=Tableau de bord
@@ -4004,7 +4012,7 @@ variables.not_found = La variable n'a pas été trouvée.
type-1.display_name=Projet personnel
type-2.display_name=Projet du dépôt
type-3.display_name=Projet de l'organisation
-deleted.display_name = Projet Supprimé
+deleted.display_name = Projet supprimé
[git.filemode]
changed_filemode=%[1]s → %[2]s
@@ -4083,4 +4091,4 @@ issues.write = Écrire : Fermer des tickets et gérer les métadonnées t
pulls.read = Lire : Lire et créer des demandes de tirage.
[translation_meta]
-test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce doux 100 % de complétion. :-)
+test = Ceci est une chaîne de test. Elle n'est pas affichée dans l'interface de Forgejo mais est utilisée à des fins de test. N'hésitez pas à entrer 'ok' pour gagner du temps (ou un fait amusant de votre choix) pour atteindre ce difficile 100 % de complétion. :-)
diff --git a/options/locale/locale_ga-IE.ini b/options/locale/locale_ga-IE.ini
index d2d960b627..3bb06e8c21 100644
--- a/options/locale/locale_ga-IE.ini
+++ b/options/locale/locale_ga-IE.ini
@@ -1219,11 +1219,11 @@ issues.close_comment_issue = Dún le trácht
issues.reopen_issue = Athoscail
issues.reopen_comment_issue = Athoscail le trácht
issues.create_comment = Trácht
-issues.closed_at = `dhún an cheist seo %[2]s`
-issues.reopened_at = `athoscail an t-eagrán seo %[2]s`
-issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %[2]s`
-issues.ref_issue_from = `rinne dagairt don cheist seo %[4]s %[2]s`
-issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[4]s %[ 2]s`
+issues.closed_at = `dhún an cheist seo %s`
+issues.reopened_at = `athoscail an t-eagrán seo %s`
+issues.commit_ref_at = `rinne tagairt don cheist seo ó ghealltanas %s`
+issues.ref_issue_from = `rinne dagairt don cheist seo %[3]s %[1]s`
+issues.ref_pull_from = `rinne dagairt don iarratas tarraingthe seo %[3]s %[1]s`
issues.ref_closed_from = `dhún an cheist seo %[4]s %[2]s`
issues.ref_reopened_from = `d'athoscail an eagrán seo %[4]s %[2]s`
issues.ref_from = `ó %[1]s`
@@ -1456,8 +1456,8 @@ pulls.update_branch_success = Bhí nuashonrú brainse rathúil
pulls.update_not_allowed = Ní cheadaítear duit brainse a nuashonrú
pulls.outdated_with_base_branch = Tá an brainse seo as dáta leis an mbunbhrainse
pulls.close = Dún Iarratas Tarraing
-pulls.closed_at = `dhún an t-iarratas tarraingthe seo %[2]s`
-pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %[2]s`
+pulls.closed_at = `dhún an t-iarratas tarraingthe seo %s`
+pulls.reopened_at = `athoscail an t-iarratas tarraingthe seo %s`
pulls.cmd_instruction_checkout_title = Seiceáil
pulls.cmd_instruction_checkout_desc = Ó stór tionscadail, seiceáil brainse nua agus déan tástáil ar na hathruithe.
pulls.cmd_instruction_merge_title = Cumaisc
diff --git a/options/locale/locale_gl.ini b/options/locale/locale_gl.ini
index 7730782a0a..3854b375af 100644
--- a/options/locale/locale_gl.ini
+++ b/options/locale/locale_gl.ini
@@ -190,6 +190,7 @@ table_modal.placeholder.header = Cabeceira
link_modal.header = Engadir ligazón
link_modal.url = Url
link_modal.description = Descrición
+link_modal.paste_reminder = Consello: Coa URL no portapapeis, podes pegala directamente no editor para crear unha ligazón.
[search]
@@ -225,6 +226,8 @@ app_desc = Um servizo Git autoxestionado e fácil de usar
install = Fácil de instalar
install_desc = Simplemente executa o binario para a túa plataforma, envíao con Docker ou consígueo empaquetado.
license = Código aberto
+lightweight_desc = Forgejo precisa duns requerimentos mínimos e pode funcionar nunha Raspberry Pi barata. Aforra enerxía na túa máquina!
+lightweight = Lixeiro
[error]
occurred = Ocorreu un erro
@@ -291,6 +294,7 @@ app_slogan = Slogan da instancia
app_slogan_helper = Escribe o slogan da túa instancia aqui. Ou deixao baleiro para desabilitala.
domain = Dominio do servidor
ssh_port = Porto do servidor SSH
+require_db_desc = Forgejo precisa MySQL, PostgreSQL, SQLite3 ou TiDB (protocolo MySQL).
[repo]
sync_fork.branch_behind_few = Esta rama ten %d achegas por detrás de %s
diff --git a/options/locale/locale_he.ini b/options/locale/locale_he.ini
index bff7682a95..19c4815277 100644
--- a/options/locale/locale_he.ini
+++ b/options/locale/locale_he.ini
@@ -663,4 +663,10 @@ issues.label_archived_filter = הצגת תוויות מהארכיון
issues.label_archive_tooltip = תוויות בארכיון לא מוצעות בחיפוש על־בסיס תווית כברירת מחדל.
[translation_meta]
-test = ואהבת לרעך כמוך
\ No newline at end of file
+test = ואהבת לרעך כמוך
+
+[git.filemode]
+executable_file = קובץ הרצה
+directory = תיקיה
+normal_file = קובץ רגיל
+symbolic_link = קישור סמלי
\ No newline at end of file
diff --git a/options/locale/locale_hu-HU.ini b/options/locale/locale_hu-HU.ini
index 411bad835a..3e93ee8ba9 100644
--- a/options/locale/locale_hu-HU.ini
+++ b/options/locale/locale_hu-HU.ini
@@ -932,7 +932,7 @@ issues.close_comment_issue=Hozzászólás és lezárás
issues.reopen_issue=Újranyitás
issues.reopen_comment_issue=Hozzászólás és újranyitás
issues.create_comment=Hozzászólás
-issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %[2]s`
+issues.commit_ref_at=`hivatkozott erre a hibajegyre egy commit-ból %s`
issues.role.owner=Tulajdonos
issues.role.member=Tag
issues.re_request_review=Véleményezés újrakérése
diff --git a/options/locale/locale_id-ID.ini b/options/locale/locale_id-ID.ini
index 673d1464b1..f1a392105e 100644
--- a/options/locale/locale_id-ID.ini
+++ b/options/locale/locale_id-ID.ini
@@ -796,7 +796,7 @@ issues.close_comment_issue=Komentar dan Tutup
issues.reopen_issue=Buka kembali
issues.reopen_comment_issue=Komentar dan Buka Kembali
issues.create_comment=Komentar
-issues.commit_ref_at=`merujuk masalah dari komit %[2]s`
+issues.commit_ref_at=`merujuk masalah dari komit %s`
issues.role.owner=Pemilik
issues.role.member=Anggota
issues.sign_in_require_desc=Masuk untuk bergabung dengan percakapan ini.
diff --git a/options/locale/locale_is-IS.ini b/options/locale/locale_is-IS.ini
index 9b1d56fed9..baf8286923 100644
--- a/options/locale/locale_is-IS.ini
+++ b/options/locale/locale_is-IS.ini
@@ -805,8 +805,8 @@ issues.close_comment_issue=Senda ummæli og Loka
issues.reopen_issue=Enduropna
issues.reopen_comment_issue=Senda ummæli og Enduropna
issues.create_comment=Senda Ummæli
-issues.closed_at=`lokaði þessu vandamáli %[2]s`
-issues.reopened_at=`enduropnaði þetta vandamál %[2]s`
+issues.closed_at=`lokaði þessu vandamáli %s`
+issues.reopened_at=`enduropnaði þetta vandamál %s`
issues.ref_reopened_from=`enduropnaði þetta vandamál %[4]s %[2]s`
issues.author=Höfundur
issues.role.owner=Eigandi
diff --git a/options/locale/locale_it-IT.ini b/options/locale/locale_it-IT.ini
index c4083f0ce8..d46f709cde 100644
--- a/options/locale/locale_it-IT.ini
+++ b/options/locale/locale_it-IT.ini
@@ -8,7 +8,7 @@ sign_in=Accedi
sign_in_or=o
sign_out=Esci
sign_up=Registrati
-link_account=Collega Profilo
+link_account=Collega profilo
register=Registrati
version=Versione
powered_by=Gestito da %s
@@ -54,7 +54,7 @@ mirror=Mirror
new_repo=Nuovo repository
new_migrate=Nuova migrazione
new_mirror=Nuovo mirror
-new_fork=Nuova derivazione
+new_fork=Nuova biforcazione
new_org=Nuova organizzazione
new_project=Nuovo progetto
manage_org=Gestisci le organizzazioni
@@ -99,7 +99,7 @@ preview=Anteprima
loading=Caricamento…
error=Errore
-error404=La pagina che stai cercando di raggiungere non esiste oppure non sei autorizzato a visualizzarla.
+error404=La pagina che stai cercando di raggiungere non esiste, è stata rimossa oppure non sei autorizzato a visualizzarla.
never=Mai
@@ -143,12 +143,12 @@ confirm_delete_selected = Confermare l'eliminazione di tutti gli elementi selezi
sign_in_with_provider = Accedi con %s
new_project_column = Nuova colonna
toggle_menu = Mostra/Nascondi menu
-filter.not_fork = Non fork
+filter.not_fork = Non biforcazioni
filter = Filtro
filter.clear = Rimuovi filtri
filter.is_archived = Archiviato
filter.not_archived = Non archiviato
-filter.is_fork = Da fork
+filter.is_fork = Biforcazioni
filter.is_mirror = Mirror
filter.not_mirror = Non mirror
filter.is_template = Modelli
@@ -209,6 +209,7 @@ table_modal.label.columns = Colonne
link_modal.header = Aggiungi collegamento
link_modal.url = Url
link_modal.description = Descrizione
+link_modal.paste_reminder = Suggerimento: se hai già copiato un URL negli appunti, puoi incollarlo direttamente nell’editor per creare un collegamento.
[filter]
string.asc = A - Z
@@ -232,6 +233,7 @@ lightweight_desc=Forgejo ha requisiti minimi bassi e può funzionare su un econo
license=Open Source
license_desc=Ottieni Forgejo! Partecipa per contribuire a rendere questo progetto ancora più bello. Non aver paura di diventare collaborante!
install_desc = Semplicemente avvia l'eseguibile per la tua piattaforma, distribuiscilo con Docker, oppure scarica il pacchetto.
+platform_desc = È stato verificato che Forgejo è pienamente compatibile con sistemi operativi liberi, come Linux e FreeBSD, nonché con diverse architetture CPU. Scegli liberamente la piattaforma che preferisci!
[install]
install=Installazione
@@ -396,12 +398,12 @@ go_to = Vai a
search.type.tooltip = Tipo di ricerca
search.fuzzy.tooltip = Includi anche i risultati che corrispondono parzialmente ai termini di ricerca
code_search_results = Risultati di ricerca per "%s"
-relevant_repositories_tooltip = I repositori derivati o che non hanno argomento, icona, né descrizione sono nascosti.
+relevant_repositories_tooltip = I repositori che sono biforcazioni o che non hanno argomento, icona, né descrizione sono nascosti.
relevant_repositories = Sono visibili solo i repositori pertinenti, mostra risultati non filtrati.
search.match.tooltip = Includi solo risultati che combaciano perfettamente con i termini di ricerca
stars_few = %d stelle
-forks_one = %d fork
-forks_few = %d fork
+forks_one = %d biforcazioni
+forks_few = %d biforcazioni
stars_one = %d stella
[auth]
@@ -485,6 +487,8 @@ sign_in_openid = Procedi con OpenID
hint_login = Hai già un'utenza? Accedi!
hint_register = Non hai un'utenza? Registrati ora.
sign_up_button = Registrati ora.
+unauthorized_credentials = Le credenziali non sono corrette o sono scadute. Controlla il comando o vedi %s per maggiori informazioni
+use_onetime_code = Usa un codice monouso
[mail]
view_it_on=Visualizza su %s
@@ -680,6 +684,8 @@ Location = Posizione
AccessToken = Token di accesso
FullName = Nome e cognome
To = Nome del ramo
+email_domain_is_not_allowed = Il dominio dell'indirizzo email dell'utente %s è in conflitto con EMAIL_DOMAIN_ALLOWLIST o EMAIL_DOMAIN_BLOCKLIST. Assicurati di aver inserito correttamente l'indirizzo email.
+username_claiming_cooldown = Il nome utente non può essere assegnato, poiché il periodo di attesa non è ancora terminato. Sarà disponibile il %[1]s.
[user]
@@ -723,6 +729,7 @@ followers.title.one = Seguace
followers.title.few = Seguaci
following.title.one = Seguito
following.title.few = Osservato
+public_activity.visibility_hint.self_private_profile = Poiché il tuo profilo è privato, la tua attività è visibile solo a te e agli amministratori dell'istanza. Configura.
[settings]
@@ -1045,7 +1052,7 @@ added_on = Aggiunto su %s
additional_repo_units_hint = Suggerisci l'attivazione di unità aggiuntive nel repositorio
update_hints = Aggiorna suggerimenti
update_hints_success = I suggerimenti sono stati aggiornati.
-additional_repo_units_hint_description = Mostra un pulsante "Aggiungi più sezioni..." per i repositori che non hanno tutte le sezioni disponibili aggiunte.
+additional_repo_units_hint_description = Visualizza un suggerimento “Abilita altro” per i repositori che non hanno tutte le unità disponibili abilitate.
hints = Suggerimenti
pronouns = Pronomi
pronouns_custom = Personalizzato
@@ -1053,6 +1060,34 @@ pronouns_unspecified = Non specificato
language.title = Lingua predefinita
language.description = Questa lingua verrà salvata nella tua utenza e verrà usata come predefinita ogni volta che farai l'accesso.
language.localization_project = Aiutaci a tradurre Forgejo nella tua lingua! Più informazioni.
+quota.sizes.assets.attachments.all = Allegati
+quota.rule.no_limit = Illimitato
+quota.sizes.assets.attachments.releases = Allegati del rilascio
+quota.rule.exceeded = Superato
+regenerate_token = Rigenera
+access_token_regeneration = Rigenera il token d'accesso
+access_token_regeneration_desc = Rigenerare un token comporterà la revoca dell'accesso al tuo account per tutte le applicazioni che lo utilizzano. Questa operazione è irreversibile. Vuoi procedere?
+regenerate_token_success = Il token è stato rigenerato. Le applicazioni che lo utilizzano non hanno più accesso alla tua utenza e devono essere aggiornate con il nuovo token.
+user_block_yourself = Non puoi bloccare te stesso.
+quota.applies_to_user = Le seguenti regole di quota si applicano al tuo account
+quota.applies_to_org = Le seguenti regole di quota si applicano a questa organizzazione
+quota.rule.exceeded.helper = La dimensione totale degli oggetti per questa regola ha superato la quota.
+quota.sizes.all = Tutti
+quota.sizes.repos.all = Repositori
+quota.sizes.repos.public = Repositori pubblici
+quota.sizes.repos.private = Repositori privati
+quota.sizes.git.all = Contenuto git
+quota.sizes.git.lfs = Git LFS
+quota.sizes.assets.all = Risorse
+quota.sizes.assets.attachments.issues = Allegati della segnalazione
+quota.sizes.assets.artifacts = Artefatti
+quota.sizes.assets.packages.all = Pacchetti
+quota.sizes.wiki = Wiki
+keep_pronouns_private = Mostra i pronomi solo agli utenti che hanno effettuato il login
+keep_pronouns_private.description = Questa impostazione nasconderà i tuoi pronomi agli utenti non ancora autenticati.
+storage_overview = Panoramica spazio di archiviazione
+quota = Quota
+change_username_redirect_prompt.with_cooldown.one = Il vecchio nome utente sarà disponibile per tutti dopo un periodo di protezione di %\[1]d giorni. Durante questo periodo di attesa potrai comunque tornare al vecchio nome utente.
[repo]
owner=Proprietario
@@ -1067,10 +1102,10 @@ template_description=I modelli di repositori consentono allɜ utenti di generare
visibility=Visibilità
visibility_description=Solo il proprietario o i membri dell'organizzazione se hanno diritti, saranno in grado di vederlo.
visibility_helper_forced=L'amministratorə del sito impone che i nuovi repositori siano privati.
-visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutti i fork.)
+visibility_fork_helper=(Questa modifica influenzerà la visibilità di tutte le biforcazioni.)
clone_helper=Hai bisogno di aiuto per la clonazione? Visita Help.
fork_repo=Deriva repositorio
-fork_from=Deriva da
+fork_from=Biforcazione di
already_forked=Hai già fatto il fork di %s
fork_to_different_account=Fai Fork a un account diverso
fork_visibility_helper=La visibilità di un repositorio derivato non può essere modificata.
@@ -1514,13 +1549,13 @@ issues.close_comment_issue=Commenta e chiudi
issues.reopen_issue=Riapri
issues.reopen_comment_issue=Commenta e riapri
issues.create_comment=Commento
-issues.closed_at=`ha chiuso questa segnalazione %[2]s`
-issues.reopened_at=`ha riaperto questa segnalazione %[2]s`
-issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %[2]s`
-issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[4]s %[2]s`
-issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[4]s %[2]s`
-issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la chiuderà, %[2]s`
-issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[4]s che la riaprirà, %[2]s`
+issues.closed_at=`ha chiuso questa segnalazione %s`
+issues.reopened_at=`ha riaperto questa segnalazione %s`
+issues.commit_ref_at=`ha fatto riferimento a questa segnalazione dal commit %s`
+issues.ref_issue_from=`ha fatto riferimento a questa segnalazione %[3]s %[1]s`
+issues.ref_pull_from=`ha fatto riferimento a questa richiesta di modifica %[3]s %[1]s`
+issues.ref_closing_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la chiuderà, %[1]s`
+issues.ref_reopening_from=`ha fatto riferimento a questa segnalazione da una richiesta di modifica %[3]s che la riaprirà, %[1]s`
issues.ref_closed_from=`chiuso questa segnalazione %[4]s %[2]s`
issues.ref_reopened_from=`ha riaperto questa segnalazione %[4]s %[2]s`
issues.ref_from=`da %[1]s`
@@ -1718,7 +1753,7 @@ pulls.cannot_merge_work_in_progress=Questa richiesta di modifica è contrassegna
pulls.still_in_progress=Ancora in corso?
pulls.add_prefix=Aggiungi prefisso %s
pulls.remove_prefix=Rimuovi il prefisso %s
-pulls.data_broken=Questa richiesta di modifica è rovinata a causa di informazioni mancanti riguardo la derivazione.
+pulls.data_broken=Questa richiesta di modifica non è valida a causa di informazioni mancanti sulla biforcazione.
pulls.files_conflicted=Questa richiesta di modifica va in conflitto con il ramo di destinazione.
pulls.is_checking=Verifica dei conflitti di fusione in corso. Riprova tra qualche istante.
pulls.is_ancestor=Questo ramo è già incluso nel ramo di destinazione. Non c'è nulla da fondere.
@@ -1776,8 +1811,8 @@ pulls.update_branch_rebase=Aggiorna il ramo per cambio base
pulls.update_branch_success=Ramo aggiornato con successo
pulls.update_not_allowed=Non ti è permesso aggiornare il ramo
pulls.outdated_with_base_branch=Questo ramo non è aggiornato con il ramo di base
-pulls.closed_at=`ha chiuso questa richiesta di modifica %[2]s`
-pulls.reopened_at=`ha riaperto questa richiesta di modifica %[2]s`
+pulls.closed_at=`ha chiuso questa richiesta di modifica %s`
+pulls.reopened_at=`ha riaperto questa richiesta di modifica %s`
pulls.auto_merge_button_when_succeed=(Quando i controlli sono superati)
pulls.auto_merge_when_succeed=Unione automatica quando tutti i controlli sono superati
@@ -2100,7 +2135,7 @@ settings.event_create_desc=Ramo o etichetta creati.
settings.event_delete=Elimina
settings.event_delete_desc=Ramo o etichetta eliminati.
settings.event_fork=Deriva
-settings.event_fork_desc=Repository derivato.
+settings.event_fork_desc=Creata una biforcazione del repositorio.
settings.event_wiki=Wiki
settings.event_release=Release
settings.event_release_desc=Release pubblicata, aggiornata o rimossa in una repository.
@@ -2137,7 +2172,7 @@ settings.event_pull_request_sync_desc=Pull request sincronizzata.
settings.event_package=Pacchetto
settings.event_package_desc=Pacchetto creato o eliminato in un repository.
settings.branch_filter=Filtro rami
-settings.branch_filter_desc=Whitelist dei rami per gli eventi di spinta, creazione dei rami e cancellazione dei rami, specificati come modello globo. Se vuoto o *
, gli eventi per tutti i rami sono segnalati. Vedi la documentazione %[2]s per la sintassi. Esempi: master
, {master,release*}
.
+settings.branch_filter_desc=Filtro, scritto come pattern glob, da applicare ai rami per gli eventi di tipo immissione, creazione di rami e rimozione di rami. Se vuoto o *
, vengono considerati tutti gli eventi di tutti i rami. Maggiori dettagli sulla sintassi presso %[2]s. Esempi: master
, {master,release*}
.
settings.active=Attivo
settings.active_helper=Le informazioni sugli eventi innescati saranno inviate a questo URL del webhook.
settings.add_hook_success=Il webhook è stato aggiunto.
@@ -2167,8 +2202,8 @@ settings.web_hook_name_packagist=Packagist
settings.packagist_username=Nome utente Packagist
settings.packagist_api_token=API token
settings.packagist_package_url=Url pacchetto pacchetti
-settings.deploy_keys=Dispiega chiavi
-settings.add_deploy_key=Aggiungi chiave di dispiego
+settings.deploy_keys=Chiavi di distribuzione
+settings.add_deploy_key=Aggiungi chiave di distribuzione
settings.deploy_key_desc=Le deploy key possiedono l'accesso solamente alla lettura di un repository.
settings.is_writable=Abilita accesso scrittura
settings.is_writable_info=Permetti a questa deploy key di pushare nella repository.
@@ -2177,7 +2212,7 @@ settings.title=Titolo
settings.deploy_key_content=Contenuto
settings.key_been_used=Una deploy key con contenuto identico è già in uso.
settings.key_name_used=Esiste già una deploy key con questo nome.
-settings.deploy_key_deletion=Rimuovi chiave di dispiego
+settings.deploy_key_deletion=Rimuovi chiave di distribuzione
settings.deploy_key_deletion_desc=Rimuovere una chiave di distribuzione ne revocherà l'accesso a questo repository. Continuare?
settings.deploy_key_deletion_success=La chiave di distribuzione è stata rimossa.
settings.branches=Rami
@@ -2620,7 +2655,7 @@ issues.filter_type.reviewed_by_you = Revisionati da te
projects.edit_success = Il progetto "%s" è stato aggiornato.
issues.keyword_search_unavailable = La ricerca per parola chiave non è attualmente disponibile. Contatta l'amministratore del sito.
issues.role.collaborator_helper = Quest*utente è statə invitatə a collaborare al progetto.
-pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %[2]s`
+pulls.commit_ref_at = `ha fatto riferimento a questa richiesta di modifica da un commit %s`
settings.thread_id = ID della discussione
release.title = Titolo del rilascio
visibility_helper = Rendi il repositorio privato
@@ -2660,7 +2695,7 @@ wiki.page_title = Titolo della pagina
wiki.page_content = Contenuto della pagina
settings.mirror_settings.pushed_repository = Repositorio immesso
settings.mirror_settings.push_mirror.edit_sync_time = Modifica intervallo di sincronizzazione degli specchi
-settings.units.units = Unità della repository
+settings.units.units = Sezioni del repositorio
settings.units.add_more = Aggiungi ancora...
settings.wiki_globally_editable = Consenti a tutti di modificare la wiki
settings.pull_mirror_sync_in_progress = Prelevando cambiamenti dal progetto remoto %s.
@@ -2732,7 +2767,7 @@ pulls.merged_title_desc_one = ha fuso %[1]d commit da %[2]s
in /etc/pacman.conf
:
+alt.setup = Aggiungi il repositorio alla lista dei repositori in rete (seleziona l'architettura necessaria al posto di "_arch_"):
+container.images.title = Immagini
+arch.version.properties = Proprietà della versione
+alt.registry.install = Per installare il pacchetto, esegui il comando seguente:
+alt.install = Installa pacchetto
+alt.registry = Configura questo registro dalla riga di comando:
+arch.pacman.helper.gpg = Aggiungi il certificato a pacman:
+arch.pacman.repo.multi = %s ha la stessa versione in diverse distribuzioni.
+arch.pacman.repo.multi.item = Configurazione per %s
+arch.pacman.sync = Sincronizza il paccketto con pacman:
+arch.version.description = Descrizione
+alt.repository = Informazioni del repositorio
+alt.repository.architectures = Architetture
+alt.repository.multiple_groups = Questo pacchetto è disponibile per più gruppi.
[secrets]
secrets = Segreti
@@ -3834,7 +3973,7 @@ runs.empty_commit_message = (messaggio di commit vuoto)
runs.no_runs = Il flusso di lavoro non è stato ancora eseguito.
variables.creation.success = La variabile "%s" è stata aggiunta.
variables.description = Le variabili saranno passate a determinate azioni e non possono essere lette altrimenti.
-need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da derivazioni.
+need_approval_desc = È necessaria l'approvazione per eseguire flussi di lavoro per richieste di modifica da biforcazioni.
runs.no_workflows.documentation = Per ulteriori informazioni sulle Forgejo Actions vedi la documentazione.
runs.no_workflows.quick_start = Non sai come iniziare con le Forgejo Actions? Vedi la guida rapida.
runners.delete_runner_notice = Se un'attività è in esecuzione su questo esecutore sarà terminata ed etichettata fallito. Potrebbe rompere flussi di lavoro di costruzione.
@@ -3848,6 +3987,8 @@ workflow.dispatch.invalid_input_type = Tipo ingresso "%s" non valido.
workflow.dispatch.warn_input_limit = Visualizzati solo i primi %d ingressi.
runs.no_job = Il flusso di lavoro deve contenere almeno un incarico
workflow.dispatch.use_from = Usa flusso di lavoro da
+variables.not_found = Non è stato possibile trovare la variabile.
+runs.expire_log_message = I log sono stati eliminati in quanto troppo vecchi.
@@ -3856,6 +3997,7 @@ workflow.dispatch.use_from = Usa flusso di lavoro da
type-3.display_name = Progetto dell'organizzazione
type-1.display_name = Progetto individuale
type-2.display_name = Progetto
+deleted.display_name = Progetto eliminato
[git.filemode]
symbolic_link=Link Simbolico
@@ -3869,7 +4011,7 @@ changed_filemode = %[1]s → %[2]s
[search]
type_tooltip = Tipo ricerca
-search = Cerca...
+search = Cerca…
fuzzy = Approssimativa
match = Precisa
org_kind = Cerca organizzazioni...
@@ -3896,6 +4038,7 @@ milestone_kind = Ricerca tappe...
regexp_tooltip = Interpreta i termini di ricerca come un'espressione regolare
regexp = Espressione Regolare
union_tooltip = Include i risultati che combaciano con una qualsiasi delle parole chiave separata da spazi
+union = Parole chiavi
[munits.data]
gib = GiB
@@ -3914,4 +4057,16 @@ filepreview.line = Linea %[1]d in %[2]s
[repo.permissions]
issues.write = Scrittura: Chiudere segnalazioni e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze.
-pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze.
\ No newline at end of file
+pulls.write = Scrittura: Chiudere richieste di modifica e gestire metadati come etichette, traguardi, assegnatarɜ, scadenze e dipendenze.
+releases.write = Scrittura: Può pubblicare, modificare ed eliminare rilasci e le risorse ad essi allegate.
+code.write = Scrittura: Può aggiungere commit al repositorio, creare rami ed etichette.
+wiki.read = Lettura: Può leggere la wiki integrata e la sua cronologia.
+releases.read = Lettura: Può visualizzare e scaricare i rilasci.
+projects.read = Lettura: Può accedere alle board di progetto del repositorio.
+code.read = Lettura: Può accedere e clonare il codice del repositorio.
+wiki.write = Scrittura: Può creare, aggiornare ed eliminare pagine nella wiki integrata.
+issues.read = Lettura: Può leggere e creare segnalazioni e commenti.
+pulls.read = Lettura: Può leggere e creare richieste di modifica.
+
+[translation_meta]
+test = daje Roma
\ No newline at end of file
diff --git a/options/locale/locale_ja-JP.ini b/options/locale/locale_ja-JP.ini
index d4d7024f5d..555f5c6a75 100644
--- a/options/locale/locale_ja-JP.ini
+++ b/options/locale/locale_ja-JP.ini
@@ -1610,13 +1610,13 @@ issues.close_comment_issue=コメントしてクローズ
issues.reopen_issue=再オープンする
issues.reopen_comment_issue=コメントして再オープン
issues.create_comment=コメントする
-issues.closed_at=`がイシューをクローズ %[2]s`
-issues.reopened_at=`がイシューを再オープン %[2]s`
-issues.commit_ref_at=`がコミットでこのイシューを参照 %[2]s`
-issues.ref_issue_from=`が%[4]s、このイシューを参照 %[2]s`
-issues.ref_pull_from=`が%[4]s、このプルリクエストを参照 %[2]s`
-issues.ref_closing_from=`が%[4]s、プルリクエストがこのイシューをクローズするよう参照 %[2]s`
-issues.ref_reopening_from=`が%[4]s、プルリクエストがこのイシューを再オープンするよう参照 %[2]s`
+issues.closed_at=`がイシューをクローズ %s`
+issues.reopened_at=`がイシューを再オープン %s`
+issues.commit_ref_at=`がコミットでこのイシューを参照 %s`
+issues.ref_issue_from=`が%[3]s、このイシューを参照 %[1]s`
+issues.ref_pull_from=`が%[3]s、このプルリクエストを参照 %[1]s`
+issues.ref_closing_from=`が%[3]s、プルリクエストがこのイシューをクローズするよう参照 %[1]s`
+issues.ref_reopening_from=`が%[3]s、プルリクエストがこのイシューを再オープンするよう参照 %[1]s`
issues.ref_closed_from=`が%[4]s、このイシューをクローズ %[2]s`
issues.ref_reopened_from=`が%[4]s、このイシューを再オープン %[2]s`
issues.ref_from=` %[1]s にて`
@@ -1923,8 +1923,8 @@ pulls.update_branch_success=ブランチの更新が成功しました
pulls.update_not_allowed=ブランチを更新する権限がありません
pulls.outdated_with_base_branch=このブランチはベースブランチに対して最新ではありません
pulls.close=プルリクエストをクローズ
-pulls.closed_at=`がプルリクエストをクローズ %[2]s`
-pulls.reopened_at=`がプルリクエストを再オープン %[2]s`
+pulls.closed_at=`がプルリクエストをクローズ %s`
+pulls.reopened_at=`がプルリクエストを再オープン %s`
pulls.cmd_instruction_hint=コマンドラインの手順を表示
pulls.cmd_instruction_checkout_title=チェックアウト
pulls.cmd_instruction_checkout_desc=プロジェクトリポジトリから新しいブランチをチェックアウトし、変更内容をテストします。
@@ -2721,7 +2721,7 @@ settings.wiki_rename_branch_main = wikiのブランチ名を正規化する
settings.wiki_rename_branch_main_desc = wikiによって内部的に使われているブランチ名を "%s" に変更します。これは恒久的で元に戻すことはできません。
contributors.contribution_type.additions = 追加
vendored = vendor済み
-pulls.commit_ref_at = `このプルリクエストを言及するコミット %[2]s`
+pulls.commit_ref_at = `このプルリクエストを言及するコミット %s`
pulls.fast_forward_only_merge_pull_request = Fast-forwardのみ
admin.manage_flags = フラグ管理
admin.update_flags = フラグを更新
diff --git a/options/locale/locale_jbo.ini b/options/locale/locale_jbo.ini
new file mode 100644
index 0000000000..947bb298de
--- /dev/null
+++ b/options/locale/locale_jbo.ini
@@ -0,0 +1,13 @@
+
+
+
+[common]
+home = zdani
+dashboard = jitypalna
+explore = sisku
+help = se sidju
+logo = se'isni
+sign_in = co'a nerkla
+sign_in_with_provider = co'a nerka sepi'o la .%s.
+sign_out = co'a cliva
+sign_up = co'a gumri
\ No newline at end of file
diff --git a/options/locale/locale_ko-KR.ini b/options/locale/locale_ko-KR.ini
index 91c7c02d64..be0400bea4 100644
--- a/options/locale/locale_ko-KR.ini
+++ b/options/locale/locale_ko-KR.ini
@@ -312,7 +312,7 @@ default_allow_create_organization=조직 생성 허용을 기본값으로 설정
default_allow_create_organization.description=신규 사용자에게 기본적으로 조직 생성 권한을 부여합니다. 이 옵션이 꺼져있다면, 관리자가 신규 사용자에게 조직 생성 권한을 부여해야합니다.
default_enable_timetracking=시간 기록 기능을 기본적으로 사용
default_enable_timetracking.description=신규 저장소가 시간기록 기능을 기본적으로 사용할 수 있습니다.
-no_reply_address=가려진 이메일 도메인
+no_reply_address=숨겨진 이메일 도메인
no_reply_address_helper=이메일을 가린 사용자에게 적용될 이메일 도메인입니다. 예를 들어, 사용자명 'joe'가 도메인'noreply.example.org'로 이메일을 가리면 Git에 'joe@noreply.example.org'로 로그인 하게 됩니다.
db_schema_helper = 데이터베이스 기본값 ("공개")를 사용하려면 빈 칸으로 두세요.
require_db_desc = Forgejo를 사용하려면 MySQL, PostgreSQL, SQLite3 또는 TiDB (MySQL 프로토콜) 이 설치되어 있어야 합니다.
@@ -330,6 +330,12 @@ app_slogan_helper = 인스턴스의 슬로건을 입력하세요. 비워두면
reinstall_confirm_check_1 = app.ini의 SECRET_KEY로 암호화 되어있는 데이터를 잃을 수 있습니다: 2FA/OTP를 통해 로그인 할 수 없으며 & 미러가 제대로 작동하지 않게됩니다. app.ini 파일에 정확한 SECRET_KEY가 있는것이 확실하다면 체크하세요.
run_user_helper = Forgejo를 구동하는 운영체제의 사용자명입니다. 이 사용자는 저장소 루트 경로에 접근권한이 있어야 합니다.
reinstall_confirm_check_2 = 저장소와 설정에 재동기화가 요구될 수 있습니다. 이 박스에 체크하면 저장소의 훅과 authorized_key 들을 수동으로 재동기화해야 한다는 것을 인지한다는 것을 의미합니다. 저장소와 미러의 설정이 올바른지 확인하세요.
+password_algorithm = 암호 해시 알고리즘
+enable_update_checker = 업데이트 확인 활성화
+secret_key_failed = 비밀 키 생성 실패: %v
+env_config_keys = 환경 설정
+invalid_password_algorithm = 올바르지 않은 암호 해시 알고리즘
+invalid_db_table = 데이터베이스 테이블 "%s"이(가) 올바르지 않습니다: %v
[home]
uname_holder=사용자명 또는 이메일 주소
@@ -347,6 +353,8 @@ search_repos=저장소 찾기..
show_private=비공개
issues.in_your_repos=당신의 저장소에
+feed_of = "%s"의 피드
+filter = 다른 필터
[explore]
repos=저장소
@@ -935,7 +943,7 @@ issues.close_comment_issue=클로즈 및 코멘트
issues.reopen_issue=다시 열기
issues.reopen_comment_issue=다시 오픈 및 코멘트
issues.create_comment=코멘트
-issues.commit_ref_at=` 커밋 %[2]s에서 이 이슈 언급`
+issues.commit_ref_at=` 커밋 %s에서 이 이슈 언급`
issues.role.owner=소유자
issues.role.member=멤버
issues.sign_in_require_desc=로그인하여 이 대화에 참여하세요.
@@ -1370,7 +1378,7 @@ issues.closed_by_fake = %[2]s님이 %[1]s에 닫음
issues.new.closed_projects = 닫힌 프로젝트
pulls.merged_by_fake = %[2]s님이 %[1]s 병합함
issues.closed_by = %[3]s님이 %[1]s에 닫음
-issues.closed_at = `%[2]s`에 이 이슈를 닫음
+issues.closed_at = `%s`에 이 이슈를 닫음
issues.filter_milestone_closed = 닫힌 마일스톤
issues.opened_by_fake = %[2]s님이 %[1]s에 열음
issues.filter_project_none = 프로젝트 없음
diff --git a/options/locale/locale_lv-LV.ini b/options/locale/locale_lv-LV.ini
index a7604220e0..98baff217b 100644
--- a/options/locale/locale_lv-LV.ini
+++ b/options/locale/locale_lv-LV.ini
@@ -162,7 +162,7 @@ filter.not_archived = Nav arhivētas
filter.is_fork = Atzarojumi
filter.not_fork = Nav atzarojumi
filter.is_mirror = Spoguļglabātavas
-filter.public = Atklātas
+filter.public = Publiskas
filter.private = Privātas
filter.clear = Notīrīt atlasi
confirm_delete_artifact = Vai tiešām izdzēst artefaktu '%s'?
@@ -374,9 +374,9 @@ show_only_archived=Attēlot tikai arhivētos
show_only_unarchived=Attēlot tikai nearhivētos
show_private=Privāts
-show_both_private_public=Rāda gan atklātās, gan privātās
+show_both_private_public=Rāda gan publiskās, gan privātās
show_only_private=Attēlot tikai privātos
-show_only_public=Attēlo tikai atklātās
+show_only_public=Tiek rādītas tikai publiskās
issues.in_your_repos=Manās glabātavās
@@ -690,7 +690,7 @@ email_domain_is_not_allowed = Lietotāja e-pasta adreses %s domēna vārd
change_avatar=Mainīt profila attēlu…
joined_on=Pievienojās %s
repositories=Glabātavas
-activity=Atklāti notikumi
+activity=Publiskas darbības
followers_few=%d sekotāji
starred=Izlasei pievienotās glabātavas
watched=Vērotās glabātavas
@@ -701,7 +701,7 @@ following_few=%d seko
follow=Sekot
unfollow=Pārtraukt sekot
user_bio=Apraksts par sevi
-disabled_public_activity=Šis lietotājs ir atspējojis darbību redzamību visiem.
+disabled_public_activity=Šis lietotājs ir atspējojis darbību redzamību citiem.
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ē
@@ -749,7 +749,7 @@ organization=Apvienības
uid=UID
webauthn=Divpakāpju pieteikšanās (drošības atslēgas)
-public_profile=Visiem pieejamais profils
+public_profile=Publiskais profils
biography_placeholder=Pastāsti citiem mazliet par sevi! (Tiek atbalstīts Markdown)
location_placeholder=Kopīgot savu aptuveno atrašanās vietu ar citiem
profile_desc=Par Tevi
@@ -940,8 +940,8 @@ access_token_deletion_confirm_action=Dzēst
access_token_deletion_desc=Pilnvaras izdzēšana atsauks lietotņu, kas to izmanto, piekļuvi kontam. Šo darbību nevar atsaukt. Turpināt?
delete_token_success=Pilnvara tika izdzēsta. Lietotnēm, kas to izmanto, vairs nav piekļuves kontam.
repo_and_org_access=Glabātavas un apvienības piekļuve
-permissions_public_only=Tikai atklātās
-permissions_access_all=Visas (atklātās, privātās un ierobežotās)
+permissions_public_only=Tikai publiskās
+permissions_access_all=Visas (publiskās, privātās un ierobežotās)
select_permissions=Atlasīt atļaujas
permission_no_access=Nav piekļuves
permission_read=Lasīt
@@ -1035,14 +1035,14 @@ email_notifications.submit=Iestatīt e-pasta iestatījumus
email_notifications.andyourown=Un manus paziņojumus
visibility=Lietotāja redzamība
-visibility.public=Atklāta
+visibility.public=Publiska
visibility.public_tooltip=Redzams ikvienam
visibility.limited=Ierobežota
visibility.limited_tooltip=Redzams tikai lietotājiem, kuri ir pieteikušies
visibility.private=Privāta
visibility.private_tooltip=Redzams tikai apvienību, kurās pievienojies, dalībniekiem
change_password = Mainīt paroli
-keep_activity_private.description = Tavas atklātās darbības būs redzamas tikai Tev un servera pārvaldītājiem.
+keep_activity_private.description = Tavas publiskās darbības būs redzamas tikai Tev un servera pārvaldītājiem.
update_hints = Atjaunināt norādes
update_hints_success = Norādes tika atjauninātas.
user_block_success = Lietotājs tika sekmīgi liegts.
@@ -1083,7 +1083,7 @@ quota.applies_to_org = Uz apvienību attiecas zemāk esošās ierobežojuma kār
quota.rule.no_limit = Neierobežots
quota.sizes.all = Viss
quota.sizes.repos.all = Glabātavas
-quota.sizes.repos.public = Atklātās glabātavas
+quota.sizes.repos.public = Publiskās glabātavas
quota.sizes.repos.private = Privātās glabātavas
regenerate_token = Izveidot no jauna
access_token_regeneration = Izveidot piekļuves pilnvaru no jauna
@@ -1195,7 +1195,7 @@ transfer.no_permission_to_accept=Nav atļaujas pieņemt šo nodošanu.
transfer.no_permission_to_reject=Nav atļaujas noraidīt šo nodošanu.
desc.private=Privāts
-desc.public=Atklāts
+desc.public=Publisks
desc.template=Sagatave
desc.internal=Iekšējs
desc.archived=Arhivēts
@@ -1464,7 +1464,7 @@ commit.cherry-pick-content=Atlasīt zaru, uz kuru izlasīt:
commitstatus.error=Kļūda
commitstatus.failure=Atteice
commitstatus.pending=Nav iesūtīts
-commitstatus.success=Pabeigts
+commitstatus.success=Sekmīgs
ext_issues=Ārēji pieteikumi
ext_issues.desc=Saite uz ārējo problēmu sekotāju.
@@ -1515,7 +1515,7 @@ issues.filter_assignees=Atlasīt pēc atbildīgajiem
issues.filter_milestones=Atlasīt pēc atskaites punkta
issues.filter_projects=Atlasīt pēc projekta
issues.filter_labels=Atlasīt pēc iezīmes
-issues.filter_reviewers=Atlasīt izskatītājus
+issues.filter_reviewers=Atlasīt pēc izskatītājiem
issues.new=Jauns pieteikums
issues.new.title_empty=Nosaukums nevar būt tukšs
issues.new.labels=Iezīmes
@@ -1651,13 +1651,13 @@ issues.close_comment_issue=Aizvērt ar piebildi
issues.reopen_issue=Atvērt atkārtoti
issues.reopen_comment_issue=Atkārtoti atvērt ar piebildi
issues.create_comment=Pievienot piebildi
-issues.closed_at=`aizvēra šo pieteikumu %[2]s`
-issues.reopened_at=`atkārtoti atvēra šo pieteikumu %[2]s`
-issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %[2]s`
-issues.ref_issue_from=`atsaucās uz šo pieteikumu %[4]s %[2]s`
-issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[4]s %[2]s`
-issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas aizvērs to, %[2]s`
-issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[4]s, kas atkārtoti atvērs to, %[2]s`
+issues.closed_at=`aizvēra šo pieteikumu %s`
+issues.reopened_at=`atkārtoti atvēra šo pieteikumu %s`
+issues.commit_ref_at=`atsaucās uz šo pieteikumu iesūtījumā %s`
+issues.ref_issue_from=`atsaucās uz šo pieteikumu %[3]s %[1]s`
+issues.ref_pull_from=`atsaucās uz šo izmaiņu pieprasījumu %[3]s %[1]s`
+issues.ref_closing_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas aizvērs to, %[1]s`
+issues.ref_reopening_from=`atsaucās uz šo pieteikumu izmaiņu pieprasījumā %[3]s, kas atkārtoti atvērs to, %[1]s`
issues.ref_closed_from=`aizvēra pieteikumu %[4]s %[2]s`
issues.ref_reopened_from=`atkārtoti atvēra pieteikumu %[4]s %[2]s`
issues.ref_from=`no %[1]s`
@@ -1964,8 +1964,8 @@ pulls.update_branch_success=Zara atjaunināšana bija sekmīga
pulls.update_not_allowed=Nav ļauts atjaunināt zaru
pulls.outdated_with_base_branch=Šis zars ir novecojis salīdzinājumā ar pamata zaru
pulls.close=Aizvērt izmaiņu pieprasījumu
-pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %[2]s`
-pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %[2]s`
+pulls.closed_at=`aizvēra šo izmaiņu pieprasījumu %s`
+pulls.reopened_at=`atkārtoti atvēra šo izmaiņu pieprasījumu %s`
pulls.cmd_instruction_hint=Apskatīt komandrindas izmantošanas norādes
pulls.cmd_instruction_checkout_title=Paņemt
pulls.cmd_instruction_checkout_desc=Projekta glabātavā jāizveido jauns zars un jāpārbauda izmaiņas.
@@ -2041,7 +2041,7 @@ ext_wiki=Ārēja vikivietne
ext_wiki.desc=Ārējā vikivietne norāda uz ārējo vikivietnes adresi.
wiki=Vikivietne
-wiki.welcome=Laipni lūdzam vikivietnē.
+wiki.welcome=Laipni lūdzam vikivietnē!
wiki.welcome_desc=Vikivietne ļauj rakstīt un kopīgot dokumentāciju ar līdzdalībniekiem.
wiki.desc=Dokumentācijas rakstīšana un kopīgošana ar līdzdalībniekiem.
wiki.create_first_page=Izveidot pirmo lapu
@@ -2769,7 +2769,7 @@ no_eol.text = Nav EOL
size_format = %[1]s: %[2]s; %[3]s: %[4]s
mirror_public_key = Publiskā SSH atslēga
mirror_use_ssh.text = Izmantot SSH autentificēšanos
-mirror_use_ssh.helper = Forgejo spoguļos glabātavu ar Git un SSH un izveidos atslēgu pāri, kad tiks atlasīta šī iespēja. Jānodrošina, ka izveidotais atslēgu pāris ir pilnvarots aizgādāt mērķa glabātavā. Nevarēs izmantot pilnvarošanu ar paroli, kad šis tiek atlasīts.
+mirror_use_ssh.helper = Forgejo spoguļos glabātavu ar Git un SSH un izveidos atslēgu pāri, kad tiks atlasīta šī iespēja. Jānodrošina, ka izveidotā publiskāš atslēga ir pilnvarota aizgādāt mērķa glabātavā. Nevarēs izmantot pilnvarošanu ar paroli, kad šis tiek atlasīts.
mirror_use_ssh.not_available = SSH autentificēšanās nav pieejama.
mirror_denied_combination = Nevar izmantot autentificēšanos ar publiskās atslēgas un paroles apvienojumu.
migrate.forgejo.description = Pārcelt datus no codeberg.org vai citiem Fogejo serveriem.
@@ -2826,7 +2826,7 @@ issues.author.tooltip.pr = Šis lietotājs ir šī izmaiņu pieprasījuma izveid
pulls.edit.already_changed = Neizdevās saglabāt izmaiņu pieprasījuma izmaiņas. Izskatās, ka saturu jau ir mainījis kāds cits lietotājs. Lūgums atsvaidzināt lapu un mēģināt labot vēlreiz, lai izvairītos no izmaiņu pārrakstīšanas
pulls.blocked_by_user = Tu nevari izveidot izmaiņu pieprasījumu šajā glabātavā, jo tās īpašnieks ir Tevi liedzis.
issues.all_title = Visi
-pulls.commit_ref_at = ` atsaucāš uz šo izmaiņu pieprasījumu iesūtījumā %[2]s`
+pulls.commit_ref_at = ` atsaucās uz šo izmaiņu pieprasījumu iesūtījumā %s`
issues.num_participants_one = %d dalībnieks
pulls.title_desc_one = vēlas iekļaut %[1]d iesūtījumu no %[2]s
%[3]s
issues.archived_label_description = (Arhivēts) %s
@@ -2913,6 +2913,14 @@ comment.blocked_by_user = Piebilžu pievienošana nav iespējama, jo glabātavas
sync_fork.branch_behind_one = Šis zars ir %[1]d iesūtījumu aiz %[2]s
sync_fork.button = Sinhronizēt
sync_fork.branch_behind_few = Šis zars ir %[1]d iesūtījumus aiz %[2]s
+settings.event_action_failure = Kļūme
+settings.event_action_failure_desc = Darbības izpilde beidzās ar kļūmi.
+settings.event_header_action = Darbības izpildes notikumi
+settings.event_action_recover = Atgūt
+settings.event_action_recover_desc = Darbības izpilde bija sekmīga pēc kļūmes iepriekšējā darbības izpildē tajā pašā darbplūsmā.
+settings.event_action_success = Sekmīgi
+settings.event_action_success_desc = Darbības izpilde bija sekmīga.
+issues.filter_type.all_pull_requests = Visi izmaiņu pieprasījumi
[graphs]
component_loading=Ielādē %s…
@@ -2959,7 +2967,7 @@ settings.location=Atrašanās vieta
settings.permission=Tiesības
settings.repoadminchangeteam=Glabātavas pārvaldītājs var pievienot un noņemt komandu piekļuvi
settings.visibility=Redzamība
-settings.visibility.public=Atklāta
+settings.visibility.public=Publiska
settings.visibility.limited=Ierobežota (redzama tikai lietotājiem, kuri ir pieteikušies)
settings.visibility.limited_shortname=Ierobežota
settings.visibility.private=Privāta (redzama tikai apvienības dalībniekiem)
@@ -3594,7 +3602,7 @@ self_check.database_collation_mismatch = Sagaidīt, ka datubāzē tiek izmantota
self_check.database_fix_mysql = MySQL/MariaDB lietotāji var izmantot komandu "forgejo doctor convert", lai novērstu salīdzināšanas sarežģījumus, vai arī tos var pašrocīgi novērst ar "ALTER ... COLLATE ..." vaicājumiem.
config.app_slogan = Servera sauklis
config.allow_dots_in_usernames = Ļaut lietotājiem izmantot punktus savā lietotājvārdā. Neietekmē esošos kontus.
-users.restricted.description = Ļaut mijiedarbību tikai ar glabātavām un apvienībām, kurās šis lietotājs ir pievienots kā līdzdalībnieks. Tas neļauj piekļūt šī servera atklātajām glabātavām.
+users.restricted.description = Ļaut mijiedarbību tikai ar glabātavām un apvienībām, kurās šis lietotājs ir pievienots kā līdzdalībnieks. Tas neļauj piekļūt šī servera publiskajām glabātavām.
dashboard.sync_tag.started = Uzsākta birku sinhronizēšana
users.organization_creation.description = Ļaut jaunu apvienību izveidošanu.
users.block.description = Liegt šī lietotāja mijiedarbību ar šo serveri caur tā kontu un neļaut pieteikšanos.
@@ -3925,7 +3933,7 @@ runners.task_list.run=Izpildījums
runners.task_list.status=Stāvoklis
runners.task_list.repository=Glabātava
runners.task_list.commit=Iesūtījums
-runners.task_list.done_at=Beigu laiks
+runners.task_list.done_at=Pabeigts
runners.edit_runner=Labot izpildītāju
runners.update_runner=Atjaunināt izmaiņas
runners.update_runner_success=Izpildītājs sekmīgi atjaunināts
diff --git a/options/locale/locale_nds.ini b/options/locale/locale_nds.ini
index d059c85064..68fe899d6e 100644
--- a/options/locale/locale_nds.ini
+++ b/options/locale/locale_nds.ini
@@ -1347,7 +1347,7 @@ issues.change_title_at = `hett %[3]s de Titel vun Alt
+Klick/Enter
, um Vermarkens uttosluten`
+issues.filter_label_exclude = Bruuk Alt + Klick, um Vermarkens uttosluten
issues.filter_label_no_select = All Vermarkens
issues.filter_label_select_no_label = Keen Vermark
issues.filter_milestone = Marksteen
@@ -1434,12 +1434,12 @@ issues.comment_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s tosamenfö
issues.close_comment_issue = Mit Kommentaar dichtmaken
issues.reopen_comment_issue = Mit Kommentaar weer opmaken
issues.create_comment = Kommenteren
-issues.reopened_at = `hett deeses Gefall %[2]s weer opmaakt`
+issues.reopened_at = `hett deeses Gefall %s weer opmaakt`
issues.comment_manually_pull_merged_at = hett Kommitteren %[1]s in %[2]s %[3]s vun Hand tosamenföhrt
issues.reopen_issue = Weer opmaken
-issues.closed_at = `hett deeses Gefall %[2]s dichtmaakt`
-issues.commit_ref_at = `hett deeses Gefall %[2]s vun eenem Kommitteren benöömt`
-issues.ref_closing_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s dichtmaken word, %[2]s benöömt`
+issues.closed_at = `hett deeses Gefall %s dichtmaakt`
+issues.commit_ref_at = `hett deeses Gefall %s vun eenem Kommitteren benöömt`
+issues.ref_closing_from = `hett deeses Gefall %[1]s vun eenem Haalvörslag, wat ’t %[3]s dichtmaken word, benöömt`
issues.ref_closed_from = `hett deeses Gefall %[4]s %[2]s dichtmaakt`
issues.ref_reopened_from = `hett deeses Gefall %[4]s %[2]s weer opmaakt`
issues.ref_from = `vun %[1]s`
@@ -1477,12 +1477,12 @@ issues.label.filter_sort.reverse_alphabetically = Umdreiht na de Alphabeet
issues.label.filter_sort.by_size = Lüttste Grött
issues.num_participants_one = %d Mitmaker
issues.num_participants_few = %d Mitmakers
-issues.ref_pull_from = `hett deesen Haalvörslag %[4]s %[2]s benöömt`
+issues.ref_pull_from = `hett deesen Haalvörslag %[3]s %[1]s benöömt`
issues.label_title = Naam
issues.label_archived_filter = Archiveert Vermarkens wiesen
issues.archived_label_description = (Archiveert) %s
-issues.ref_issue_from = `hett deeses Gefall %[4]s %[2]s benöömt`
-issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[4]s weer opmaken word, %[2]s benöömt`
+issues.ref_issue_from = `hett deeses Gefall %[3]s %[1]s benöömt`
+issues.ref_reopening_from = `hett deeses Gefall vun eenem Haalvörslag, wat ’t %[3]s weer opmaken word, %[1]s benöömt`
issues.author.tooltip.issue = Deeser Bruker is de Autor vun deesem Gefall.
issues.role.member_helper = Deeser Bruker is een Liddmaat vun de Vereenigung, wat de Eegner vun deesem Repositorium is.
issues.role.collaborator_helper = Deeser Bruuker is inladen worden, in deesem Repositorium mittoarbeiden.
@@ -1740,8 +1740,8 @@ pulls.status_checks_show_all = All Överprüfens wiesen
pulls.update_branch_rebase = Twieg mit Umbaseren vernejen
pulls.outdated_with_base_branch = De Twieg is tegen de Grund-Twieg verollt
pulls.close = Haalvörslag dichtmaken
-pulls.closed_at = `hett deesen Haalvörslag %[2]s dichtmaakt`
-pulls.reopened_at = `hett deesen Haalvörslag %[2]s weer opmaakt`
+pulls.closed_at = `hett deesen Haalvörslag %s dichtmaakt`
+pulls.reopened_at = `hett deesen Haalvörslag %s weer opmaakt`
pulls.cmd_instruction_hint = Wies Oorderreeg-Instruksjes
pulls.cmd_instruction_checkout_title = Utchecken
pulls.cmd_instruction_merge_title = Tosamenföhren
@@ -1771,7 +1771,7 @@ milestones.deletion = Marksteen lösken
pulls.has_merged = Fehlslagen: De Haalvörslag is tosamenföhrt worden, du kannst nich noch eenmaal tosamenföhren of de Enn-Twieg ännern.
pulls.unrelated_histories = Tosamenföhren fehlslagen: De Tosamenföhrens-Kopp un -Grund hebben keene gemeensame Histoorje. Wenk: Versöök eene anner Tosamenföhrens-Aard
pulls.update_not_allowed = Du düürst deesen Twieg nich vernejen
-pulls.commit_ref_at = `hett deesen Haalvörslag %[2]s vun eenem Kommitteren benöömt`
+pulls.commit_ref_at = `hett deesen Haalvörslag %s vun eenem Kommitteren benöömt`
pulls.auto_merge_newly_scheduled = De Haalvörslag weer sett, sik tosamentoföhren, wenn all Överprüfens kumpleet sünd.
milestones.clear = Leeg maken
pulls.push_rejected_no_message = Schuven fehlslagen: Dat Schuven is sünner feerne Naricht oflehnt worden. Bidde överprüüf de Git-Hakens för deeses Repositorium
@@ -2614,6 +2614,14 @@ archive.nocomment = Kommenteren gaht hier nich, denn dat Repositorium is archive
sync_fork.button = Vernejen
sync_fork.branch_behind_one = Deeser Twieg is %[1]d Kommitteren achter %[2]s
sync_fork.branch_behind_few = Deeser Twieg is %[1]d Kommitterens achter %[2]s
+settings.event_action_failure = Fehlslagen
+settings.event_action_success = Daankregen
+settings.event_action_success_desc = Aktioons-Loop is all daankregen worden.
+settings.event_action_recover = Verhaalt
+settings.event_header_action = Aktioons-Loop-Vörfallen
+settings.event_action_failure_desc = Aktioons-Loop is as fehlslagen ennt.
+settings.event_action_recover_desc = Aktioons-Loop is daankregen worden, nadeem de leste Aktioons-Loop in de sülven Warkwies fehlslagen is.
+issues.filter_type.all_pull_requests = All Haalvörslagen
[repo.permissions]
code.read = Lesen: De Quelltext vun deesem Repositorium ankieken un klonen.
diff --git a/options/locale/locale_nl-NL.ini b/options/locale/locale_nl-NL.ini
index 68f84ee2df..48442bc39f 100644
--- a/options/locale/locale_nl-NL.ini
+++ b/options/locale/locale_nl-NL.ini
@@ -8,7 +8,7 @@ sign_in=Aanmelden
sign_in_or=of
sign_out=Uitloggen
sign_up=Registreren
-link_account=Account Koppelen
+link_account=Account koppelen
register=Registreren
version=Versie
powered_by=Mogelijk gemaakt door %s
@@ -1554,13 +1554,13 @@ issues.close_comment_issue=Sluit met commentaar
issues.reopen_issue=Heropen
issues.reopen_comment_issue=Heropen met commentaar
issues.create_comment=Reageer
-issues.closed_at=`heeft dit probleem gesloten %[2]s`
-issues.reopened_at=`heropende dit probleem %[2]s`
-issues.commit_ref_at=`verwees naar dit probleem vanuit commit %[2]s'`
-issues.ref_issue_from=`refereerde aan dit issue %[4]s %[2]s`
-issues.ref_pull_from=`refereerde aan deze pull request %[4]s %[2]s`
-issues.ref_closing_from=`verwees naar deze issue van een pull request %[4]s dat het zal sluiten, %[2]s`
-issues.ref_reopening_from=`verwees naar een pull request %[4]s dat dit issue heropent %[2]s `
+issues.closed_at=`heeft dit probleem gesloten %s`
+issues.reopened_at=`heropende dit probleem %s`
+issues.commit_ref_at=`verwees naar dit probleem vanuit commit %s`
+issues.ref_issue_from=`refereerde aan dit issue %[3]s %[1]s`
+issues.ref_pull_from=`refereerde aan deze pull request %[3]s %[1]s`
+issues.ref_closing_from=`verwees naar deze issue van een pull request %[3]s dat het zal sluiten, %[1]s`
+issues.ref_reopening_from=`verwees naar een pull request %[3]s dat dit issue heropent %[1]s `
issues.ref_closed_from=`sloot dit issue %[4]s %[2]s`
issues.ref_reopened_from=`heropende dit issue %[4]s %[2]s`
issues.ref_from=`van %[1]s`
@@ -1815,8 +1815,8 @@ pulls.update_branch_rebase=Update branch via herbaseren
pulls.update_branch_success=Branch update is geslaagd
pulls.update_not_allowed=Je hebt geen toestemming om branch bij te werken
pulls.outdated_with_base_branch=Deze branch is verouderd met de basis branch
-pulls.closed_at=`heeft deze pull request gesloten %[2]s`
-pulls.reopened_at=`heropende deze pull request %[2]s`
+pulls.closed_at=`heeft deze pull request gesloten %s`
+pulls.reopened_at=`heropende deze pull request %s`
pulls.auto_merge_button_when_succeed=(Bij geslaagde controles)
pulls.auto_merge_when_succeed=Automatisch samenvoegen wanneer alle controles gelukt zijn
@@ -2031,7 +2031,7 @@ settings.add_collaborator_success=De medewerker is toegevoegd.
settings.add_collaborator_inactive_user=Kan geen inactieve gebruiker toevoegen als medewerker.
settings.add_collaborator_duplicate=De collaborator is al toegevoegd aan deze repository.
settings.delete_collaborator=Verwijder
-settings.collaborator_deletion=Verwijder medewerker
+settings.collaborator_deletion=Verwijder samenwerker
settings.collaborator_deletion_desc=Het verwijderen van een collaborator zal hun toegang tot deze repository intrekken. Doorgaan?
settings.remove_collaborator_success=De medewerker is verwijderd.
settings.search_user_placeholder=Zoek gebruiker…
@@ -2627,7 +2627,7 @@ projects.column.set_default_desc = Stel deze kolom in als standaard voor ongecat
issues.action_check = Aanvinken/uitvinken
issues.dependency.issue_batch_close_blocked = Het is niet mogelijk om de issues die u gekozen heeft in bulk te sluiten, omdat issue #%d nog open afhankelijkheden heeft
pulls.review_only_possible_for_full_diff = Beoordeling is alleen mogelijk bij het bekijken van de volledige diff
-pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %[2]s`
+pulls.commit_ref_at = `heeft naar deze pull request verwezen vanuit een commit %s`
pulls.cmd_instruction_hint = Bekijk opdrachtregelinstructies
pulls.cmd_instruction_checkout_desc = Vanuit uw project repository, schakel over naar een nieuwe branch en test de veranderingen.
pulls.showing_specified_commit_range = Alleen veranderingen weergeven tussen %[1]s..%[2]s
@@ -3914,7 +3914,7 @@ runners.task_list.no_tasks = Er is nog geen taak.
runners.labels = Labels
runners.last_online = Laatste online tijd
runners.task_list.status = Status
-runners.task_list.done_at = Gedaan Op
+runners.task_list.done_at = Gedaan op
runners.id = ID
runs.actor = Acteur
actions = Actions
diff --git a/options/locale/locale_pl-PL.ini b/options/locale/locale_pl-PL.ini
index 86a333a886..189e663618 100644
--- a/options/locale/locale_pl-PL.ini
+++ b/options/locale/locale_pl-PL.ini
@@ -1460,13 +1460,13 @@ issues.close_comment_issue=Zamknij z komentarzem
issues.reopen_issue=Otwórz ponownie
issues.reopen_comment_issue=Otwórz ponownie z komentarzem
issues.create_comment=Skomentuj
-issues.closed_at=`zamknął(-ęła) to zgłoszenie %[2]s`
-issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %[2]s`
-issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %[2]s`
-issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[4]s %[2]s`
-issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[4]s %[2]s`
-issues.ref_closing_from=`odwołał(-a) się do pull requesta %[4]s, który zamknie to zgłoszenie %[2]s`
-issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[4]s, który otworzy na nowo to zgłoszenie %[2]s`
+issues.closed_at=`zamknął(-ęła) to zgłoszenie %s`
+issues.reopened_at=`otworzył(-a) ponownie to zgłoszenie %s`
+issues.commit_ref_at=`wspomniał(-a) to zgłoszenie z commita %s`
+issues.ref_issue_from=`odwołał(-a) się do tego zgłoszenia %[3]s %[1]s`
+issues.ref_pull_from=`odwołał(-a) się do tego Pull Requesta %[3]s %[1]s`
+issues.ref_closing_from=`odwołał(-a) się do pull requesta %[3]s, który zamknie to zgłoszenie %[1]s`
+issues.ref_reopening_from=`odwołał(-a) się z pull requesta %[3]s, który otworzy na nowo to zgłoszenie %[1]s`
issues.ref_closed_from=`zamknął(-ęła) to zgłoszenie %[4]s %[2]s`
issues.ref_reopened_from=`ponownie otworzył(-a) to zgłoszenie %[4]s %[2]s`
issues.ref_from=`z %[1]s`
@@ -1679,8 +1679,8 @@ pulls.update_branch_rebase=Aktualizuj branch przez rebase
pulls.update_branch_success=Aktualizacja gałęzi powiodła się
pulls.update_not_allowed=Nie masz uprawnień do aktualizacji gałęzi
pulls.outdated_with_base_branch=Ta gałąź jest przestarzała w stosunku do gałęzi bazowej
-pulls.closed_at=`zamknął(-ęła) ten pull request %[2]s`
-pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %[2]s`
+pulls.closed_at=`zamknął(-ęła) ten pull request %s`
+pulls.reopened_at=`otworzył(-a) ponownie ten Pull Request %s`
@@ -2643,7 +2643,7 @@ pulls.closed = Pull request zamknięty
pulls.blocked_by_outdated_branch = Ten pull request jest zablokowany ponieważ jest przedawniony.
pulls.blocked_by_changed_protected_files_1 = Ten pull request jest zablokowany ponieważ wprowadza zmiany do chronionego pliku:
pulls.push_rejected_no_message = Wypchnięcie nie powiodło się: Wypchnięcie zostało odrzucone, ale nie otrzymano zdalnej wiadomości. Sprawdź hooki Git dla tego repozytorium.=
-pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %[2]s`
+pulls.commit_ref_at = `odniósł się do tego pull requesta z commita %s`
pulls.cmd_instruction_checkout_desc = Ze swojego repozytorium projektu, utwórz nową gałąź i przetestuj zmiany.
pulls.clear_merge_message_hint = Wyczyszczenie wiadomości scalenia usunie tylko treść wiadomości commitu pozostawiając wygenerowane przez git dopiski takie jak "Co-Authored-By ...".
pulls.delete_after_merge.head_branch.insufficient_branch = Nie masz uprawnień by usunąć head gałęzi.
diff --git a/options/locale/locale_pt-BR.ini b/options/locale/locale_pt-BR.ini
index fdaccce641..8de0374eb2 100644
--- a/options/locale/locale_pt-BR.ini
+++ b/options/locale/locale_pt-BR.ini
@@ -1063,8 +1063,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.
+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 proteção de %[1]d dia. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção.
+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 proteção de %[1]d dias. Você ainda pode recuperar o nome de usuário antigo durante este período de proteção.
quota.applies_to_user = As seguintes regras de cota se aplicam à sua conta
quota.rule.exceeded.helper = O tamanho total de objetos para esta regra excedeu a cota.
keep_pronouns_private = Mostrar pronomes apenas para usuários autenticados
@@ -1503,11 +1503,11 @@ projects.card_type.images_and_text=Imagens e texto
projects.card_type.text_only=Somente texto
issues.desc=Organize relatórios de bugs, tarefas e marcos.
-issues.filter_assignees=Filtrar Atribuição
-issues.filter_milestones=Filtrar Marco
-issues.filter_projects=Filtrar Projeto
-issues.filter_labels=Filtrar Rótulo
-issues.filter_reviewers=Filtrar Revisor
+issues.filter_assignees=Filtrar atribuição
+issues.filter_milestones=Filtrar marco
+issues.filter_projects=Filtrar projeto
+issues.filter_labels=Filtrar rótulo
+issues.filter_reviewers=Filtrar revisor
issues.new=Novo issue
issues.new.title_empty=Título não pode ser em branco
issues.new.labels=Etiquetas
@@ -1568,7 +1568,7 @@ issues.remove_ref_at=`removeu a referência %s %s`
issues.add_ref_at=`adicionou a referência %s %s`
issues.delete_branch_at=`excluiu branch %s %s`
issues.filter_label=Etiqueta
-issues.filter_label_exclude=`Use alt
+ clique/enter
para excluir etiquetas`
+issues.filter_label_exclude=Use Alt + Clique para excluir etiquetas
issues.filter_label_no_select=Todas as etiquetas
issues.filter_label_select_no_label=Sem etiqueta
issues.filter_milestone=Marco
@@ -1642,13 +1642,13 @@ issues.close_comment_issue=Comentar e fechar
issues.reopen_issue=Reabrir
issues.reopen_comment_issue=Comentar e reabrir
issues.create_comment=Comentar
-issues.closed_at=`fechou esta issue %[2]s`
-issues.reopened_at=`reabriu esta issue %[2]s`
-issues.commit_ref_at=`citou esta issue em um commit %[2]s`
-issues.ref_issue_from=`referenciado esta issue %[4]s %[2]s`
-issues.ref_pull_from=`referenciado este pull request %[4]s %[2]s`
-issues.ref_closing_from=`referenciado esta issue de um pull request %[4]s que a fechará %[2]s`
-issues.ref_reopening_from=`referenciado esta issue de um pull request %[4]s que a reabrirá %[2]s`
+issues.closed_at=`fechou esta issue %s`
+issues.reopened_at=`reabriu esta issue %s`
+issues.commit_ref_at=`citou esta issue de um commit %s`
+issues.ref_issue_from=`citou esta issue %[3]s %[1]s`
+issues.ref_pull_from=`citou este pull request %[3]s %[1]s`
+issues.ref_closing_from=`citou esta issue de um pull request %[3]s que a fechará %[1]s`
+issues.ref_reopening_from=`citou esta issue de um pull request %[3]s que a reabrirá, %[1]s`
issues.ref_closed_from=`fechou esta issue %[4]s %[2]s`
issues.ref_reopened_from=`reabriu esta issue %[4]s %[2]s`
issues.ref_from=`de %[1]s`
@@ -1942,8 +1942,8 @@ pulls.update_branch_success=Atualização do branch foi bem-sucedida
pulls.update_not_allowed=Você não tem permissão para atualizar o branch
pulls.outdated_with_base_branch=Este branch está desatualizado com o branch base
pulls.close=Fechar pull request
-pulls.closed_at=`fechou este pull request %[2]s`
-pulls.reopened_at=`reabriu este pull request %[2]s`
+pulls.closed_at=`fechou este pull request %s`
+pulls.reopened_at=`reabriu este pull request %s`
pulls.clear_merge_message=Limpar mensagem do merge
pulls.clear_merge_message_hint=Limpar a mensagem de merge só irá remover o conteúdo da mensagem de commit e manter trailers git gerados, como "Co-Authored-By …".
@@ -2013,7 +2013,7 @@ ext_wiki=Wiki Externa
ext_wiki.desc=Link para uma wiki externa.
wiki=Wiki
-wiki.welcome=Bem-vindo a wiki.
+wiki.welcome=Bem-vindo à wiki.
wiki.welcome_desc=A wiki permite que você escreva e compartilhe a documentação com os colaboradores.
wiki.desc=Escrever e compartilhar a documentação com os colaboradores.
wiki.create_first_page=Criar a primeira página
@@ -2719,7 +2719,7 @@ issues.label_archive_tooltip = Etiquetas arquivadas não serão exibidas nas sug
activity.navbar.pulse = Recente
settings.units.overview = Geral
settings.units.add_more = Habilitar mais
-pulls.commit_ref_at = `referenciou este pedido de mesclagem no commit %[2]s`
+pulls.commit_ref_at = `citou este pull request de um commit %s`
pulls.cmd_instruction_merge_title = Mesclar
settings.units.units = Unidades
vendored = Externo
@@ -2913,6 +2913,14 @@ comment.blocked_by_user = Não é possível comentar pois você foi bloqueado pe
sync_fork.branch_behind_few = Este branch está %[1]d commits atrás de %[2]s
sync_fork.branch_behind_one = Este branch está %[1]d commit atrás de %[2]s
sync_fork.button = Sincronizar
+settings.event_header_action = Eventos de execução de Actions
+settings.event_action_failure = Falha
+settings.event_action_failure_desc = Execução da Action terminou com falha.
+settings.event_action_recover = Recuperar
+settings.event_action_recover_desc = A execução da Action teve sucesso após a última execução no mesmo workflow ter falhado.
+settings.event_action_success = Sucesso
+settings.event_action_success_desc = A execução da Action foi bem sucedida.
+issues.filter_type.all_pull_requests = Todos os pull requests
[graphs]
component_loading = Carregando %s…
@@ -3049,8 +3057,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 organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de proteção.
-settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de espera de %[1]d dia, você ainda pode recuperar o nome antigo durante este período de espera.
+settings.change_orgname_redirect_prompt.with_cooldown.one = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção.
+settings.change_orgname_redirect_prompt.with_cooldown.few = O nome de organização antigo ficará disponível para qualquer pessoa após um período de proteção de %[1]d dia. Você ainda pode recuperar o nome antigo durante este período de proteção.
[admin]
dashboard=Painel
@@ -3808,8 +3816,8 @@ swift.install2=e execute o seguinte comando:
vagrant.install=Para adicionar uma Vagrant box, execute o seguinte comando:
settings.link=Vincular este pacote a um repositório
settings.link.description=Se você vincular um pacote a um repositório, o pacote será listado na lista de pacotes do repositório.
-settings.link.select=Selecionar Repositório
-settings.link.button=Atualizar Link do Repositório
+settings.link.select=Selecionar repositório
+settings.link.button=Atualizar link do repositório
settings.link.success=Link do repositório foi atualizado com sucesso.
settings.link.error=Falha ao atualizar o link do repositório.
settings.delete=Excluir o pacote
@@ -4004,7 +4012,7 @@ variables.not_found = Não foi possível encontrar a variável.
type-1.display_name=Projeto individual
type-2.display_name=Projeto do repositório
type-3.display_name=Projeto da organização
-deleted.display_name = Projeto Apagado
+deleted.display_name = Projeto apagado
[git.filemode]
symbolic_link=Ligação simbólica
diff --git a/options/locale/locale_pt-PT.ini b/options/locale/locale_pt-PT.ini
index df7af1b542..0e8f2d485e 100644
--- a/options/locale/locale_pt-PT.ini
+++ b/options/locale/locale_pt-PT.ini
@@ -9,7 +9,7 @@ sign_in_with_provider=Iniciar sessão com %s
sign_in_or=ou
sign_out=Terminar sessão
sign_up=Fazer inscrição
-link_account=Vincular conta
+link_account=Associar conta
register=Inscrição
version=Versão
powered_by=Implementado com %s
@@ -20,18 +20,18 @@ notifications=Notificações
active_stopwatch=Cronómetro em andamento
tracked_time_summary=Resumo do tempo rastreado com base em filtros da lista de questões
create_new=Criar…
-user_profile_and_more=Perfil e configurações…
+user_profile_and_more=Perfil e definições…
signed_in_as=Sessão iniciada como
enable_javascript=Este sítio Web requer JavaScript.
toc=Índice
licenses=Licenças
-return_to_forgejo=Retornar ao Forgejo
+return_to_forgejo=Voltar ao Forgejo
username=Nome de utilizador
email=Endereço de email
password=Senha
access_token=Código de acesso
-re_type=Confirme a senha
+re_type=Confirme a palavra-passe
captcha=CAPTCHA
twofa=Autenticação com dois passos
twofa_scratch=Código de uso único em dois passos
@@ -59,10 +59,10 @@ new_migrate=Nova migração
new_mirror=Nova réplica
new_fork=Nova derivação do repositório
new_org=Nova organização
-new_project=Novo planeamento
+new_project=Novo projeto
new_project_column=Nova coluna
manage_org=Gerir organizações
-admin_panel=Administração do sítio
+admin_panel=Administração do site
account_settings=Configurações da conta
settings=Configurações
your_profile=Perfil
@@ -155,7 +155,7 @@ invalid_data = Dados inválidos: %v
filter.clear = Retirar filtros
filter.is_archived = Arquivado
filter.not_template = Não modelos
-toggle_menu = Comutar menu
+toggle_menu = Alternar menu
filter = Filtrar
copy_generic = Copiar para a área de transferência
test = Teste
@@ -233,7 +233,7 @@ platform_desc=Está confirmado que Forgejo corre em sistemas operativos livres,
lightweight=Leve
lightweight_desc=Forgejo requer poucos recursos e pode correr num simples Raspberry Pi. Economize a energia da sua máquina!
license=Código aberto
-license_desc=Vá buscá-lo em Forgejo! Junte-se a nós dando a sua contribuição para tornar este programa ainda melhor. Não se acanhe e contribua!
+license_desc=Todas as fontes estão disponíveis no Forgejo! Junte-se a nós e contribua para tornar este projeto ainda melhor. Não receie tornar-se colaborador!
[install]
install=Instalação
@@ -291,7 +291,7 @@ smtp_port=Porto do SMTP
smtp_from=Email do remetente
smtp_from_helper=Endereço de email que o Forgejo vai usar. Insira um endereço de email simples ou use o formato "Nome" alt
+ click/enter
, чтобы исключить метки`
-issues.filter_label_no_select=Все метки
-issues.filter_label_select_no_label=Нет метки
+issues.filter_label=Метки
+issues.filter_label_exclude=Исключайте метки с помощью Alt + ЛКМ
+issues.filter_label_no_select=Любые метки
+issues.filter_label_select_no_label=Без меток
issues.filter_milestone=Этап
issues.filter_milestone_all=Все этапы
issues.filter_milestone_none=Нет этапов
@@ -1637,13 +1637,13 @@ issues.close_comment_issue=Закрыть комментарием
issues.reopen_issue=Открыть снова
issues.reopen_comment_issue=Открыть снова комментарием
issues.create_comment=Комментировать
-issues.closed_at=`задача была закрыта %[2]s`
-issues.reopened_at=`задача была открыта снова %[2]s`
-issues.commit_ref_at=`упоминание этой задачи в коммите %[2]s`
-issues.ref_issue_from=`упоминание этой задачи %[4]s %[2]s`
-issues.ref_pull_from=`упоминание этого запроса слияния %[4]s %[2]s`
-issues.ref_closing_from=`упоминание из запроса на слияние %[4]s, который закроет эту задачу %[2]s`
-issues.ref_reopening_from=`упоминание из запроса на слияние %[4]s, который повторно откроет эту задачу %[2]s`
+issues.closed_at=`задача была закрыта %s`
+issues.reopened_at=`задача была открыта снова %s`
+issues.commit_ref_at=`упоминание этой задачи в коммите %s`
+issues.ref_issue_from=`упоминание этой задачи %[3]s %[1]s`
+issues.ref_pull_from=`упоминание этого запроса слияния %[3]s %[1]s`
+issues.ref_closing_from=`упоминание из запроса на слияние %[3]s, который закроет эту задачу %[1]s`
+issues.ref_reopening_from=`упоминание из запроса на слияние %[3]s, который повторно откроет эту задачу %[1]s`
issues.ref_closed_from=`закрыл этот запрос %[4]s %[2]s`
issues.ref_reopened_from=`задача была открыта снова %[4]s %[2]s`
issues.ref_from=`из %[1]s`
@@ -1943,8 +1943,8 @@ pulls.update_branch_success=Ветвь успешно обновлена
pulls.update_not_allowed=Недостаточно прав для обновления ветви
pulls.outdated_with_base_branch=Эта ветвь отстает от базовой ветви
pulls.close=Закрыть запрос слияния
-pulls.closed_at=`закрыл этот запрос на слияние %[2]s`
-pulls.reopened_at=`переоткрыл этот запрос на слияние %[2]s`
+pulls.closed_at=`закрыл этот запрос на слияние %s`
+pulls.reopened_at=`переоткрыл этот запрос на слияние %s`
pulls.cmd_instruction_hint=Показать инструкции для командной строки
pulls.cmd_instruction_merge_title=Слейте изменения
pulls.cmd_instruction_merge_desc=Слейте изменения и отправьте их обратно.
@@ -2772,7 +2772,7 @@ settings.ignore_stale_approvals = Игнорировать устаревшие
contributors.contribution_type.additions = Добавления
contributors.contribution_type.deletions = Удаления
contributors.contribution_type.filter_label = Вид деятельности:
-pulls.commit_ref_at = `упоминание этого запроса слияния в коммите %[2]s`
+pulls.commit_ref_at = `сослался на этот запрос слияния в коммите %s`
settings.thread_id = ИД обсуждения
pulls.made_using_agit = AGit
activity.navbar.contributors = Соавторы
@@ -2916,6 +2916,14 @@ comment.blocked_by_user = Комментирование невозможно,
sync_fork.branch_behind_few = Эта ветвь отстаёт от %[2]s на %[1]d коммитов
sync_fork.button = Синхронизировать
sync_fork.branch_behind_one = Эта ветвь отстаёт от %[2]s на %[1]d коммит
+settings.event_header_action = События выполнений Действий
+settings.event_action_failure = Неудача
+settings.event_action_failure_desc = Выполнение завершилось неудачно.
+settings.event_action_recover = Восстановлен
+settings.event_action_recover_desc = После неудачи повторное выполнение рабочего потока было успешно.
+settings.event_action_success = Успех
+settings.event_action_success_desc = Выполнение завершилось успешно.
+issues.filter_type.all_pull_requests = Все запросы на слияние
[graphs]
component_loading_failed = Не удалось загрузить %s
@@ -3914,10 +3922,10 @@ unit.desc=Управление встроенными конвейерами CI/
status.unknown=Неизвестно
status.waiting=Ожидает
status.running=Запущено
-status.success=Успешно
+status.success=Успех
status.failure=Неудача
status.cancelled=Отменено
-status.skipped=Пропущено
+status.skipped=Пропущен
status.blocked=Заблокировано
runners=Исполнители
@@ -3938,7 +3946,7 @@ runners.task_list.run=Запуск
runners.task_list.status=Состояние
runners.task_list.repository=Репозиторий
runners.task_list.commit=Коммит
-runners.task_list.done_at=Время завершения
+runners.task_list.done_at=Завершено
runners.edit_runner=Изменить исполнитель
runners.update_runner=Обновить изменения
runners.update_runner_success=Исполнитель успешно обновлён
@@ -3960,7 +3968,7 @@ runners.reset_registration_token_success=Токен регистрации ис
runs.all_workflows=Все рабочие потоки
runs.commit=коммит
runs.scheduled=Запланировано
-runs.pushed_by=отправлено
+runs.pushed_by=отправлен
runs.invalid_workflow_helper=Файл конфигурации рабочего потока некорректен. Пожалуйста, проверьте конфигурационный файл: %s
runs.actor=Автор
runs.status=Состояние
diff --git a/options/locale/locale_si-LK.ini b/options/locale/locale_si-LK.ini
index d55b238b1c..54b0b246db 100644
--- a/options/locale/locale_si-LK.ini
+++ b/options/locale/locale_si-LK.ini
@@ -1100,12 +1100,12 @@ issues.close_comment_issue=අදහස් දක්වා වසන්න
issues.reopen_issue=නැවත විවෘත කරන්න
issues.reopen_comment_issue=අදහස් දක්වා විවෘත කරන්න
issues.create_comment=අදහස
-issues.closed_at=`මෙම ගැටළුව වසා %[2]s`
-issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %[2]s`
-issues.ref_issue_from=`මෙම නිකුතුව %[4]s හි %[2]s`
-issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[4]s %[2]s`
-issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[4]s මෙම ගැටළුව %[2]s`
-issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[4]s මෙම ගැටළුව %[2]s`
+issues.closed_at=`මෙම ගැටළුව වසා %s`
+issues.reopened_at=`මෙම ගැටළුව නැවත විවෘත කරන ලදි %s`
+issues.ref_issue_from=`මෙම නිකුතුව %[3]s හි %[1]s`
+issues.ref_pull_from=`මෙම අදින්න ඉල්ලීම%[3]s %[1]s`
+issues.ref_closing_from=`මෙම ගැටළුව වසා දමනු ඇත%[3]s මෙම ගැටළුව %[1]s`
+issues.ref_reopening_from=`මෙම ගැටළුව නැවත විවෘත කරනු ඇත%[3]s මෙම ගැටළුව %[1]s`
issues.ref_closed_from=`මෙම නිකුතුව%[4]s %[2]s`
issues.ref_reopened_from=`මෙම නිකුතුව%[4]s %[2]sනැවත විවෘත කරන ලදි`
issues.ref_from=`හිම%[1]s`
@@ -1342,8 +1342,8 @@ pulls.update_branch_rebase=රිබේස් මගින් ශාඛාව
pulls.update_branch_success=ශාඛා යාවත්කාලීන කිරීම සාර්ථක විය
pulls.update_not_allowed=ශාඛාව යාවත්කාලීන කිරීමට ඔබට අවසර නැත
pulls.outdated_with_base_branch=මෙම ශාඛාව මූලික ශාඛාව සමඟ දිවයයි
-pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %[2]s`
-pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %[2]s`
+pulls.closed_at=`මෙම අදින්න ඉල්ලීම වසා %s`
+pulls.reopened_at=`මෙම අදින්න ඉල්ලීම නැවත විවෘත කරන ලදි %s`
diff --git a/options/locale/locale_sr-SP.ini b/options/locale/locale_sr-SP.ini
index 56c1a7e650..b14fdc1a35 100644
--- a/options/locale/locale_sr-SP.ini
+++ b/options/locale/locale_sr-SP.ini
@@ -326,7 +326,7 @@ issues.no_content=Још нема садржаја.
issues.close_issue=Затвори
issues.reopen_issue=Поново отвори
issues.create_comment=Коментирај
-issues.commit_ref_at=`поменуо овај задатак у комит %[2]s`
+issues.commit_ref_at=`поменуо овај задатак у комит %s`
issues.poster=Аутор
issues.collaborator=Коаутор
issues.owner=Власник
diff --git a/options/locale/locale_sv-SE.ini b/options/locale/locale_sv-SE.ini
index e2d82ee28b..8b43cb29b8 100644
--- a/options/locale/locale_sv-SE.ini
+++ b/options/locale/locale_sv-SE.ini
@@ -200,6 +200,10 @@ table_modal.placeholder.header = Sidhuvud
table_modal.placeholder.content = Innehåll
table_modal.label.rows = Rader
table_modal.label.columns = Kolumner
+buttons.switch_to_legacy.tooltip = Använd legacy-redigeraren istället
+link_modal.url = Url
+link_modal.description = Beskrivning
+link_modal.header = Lägg till en länk
[filter]
string.asc = A - Ö
@@ -328,6 +332,7 @@ invalid_app_data_path = Sökvägen för appdata är ogiltig: %v
internal_token_failed = Misslyckades att generera intern token: %v
password_algorithm = Hashalgoritm för lösenord
invalid_password_algorithm = Ogiltig hashalgoritm för lösenord
+env_config_keys_prompt = Följande miljövariabler kommer också att tillämpas på din konfigurationsfil:
[home]
uname_holder=Användarnamn eller e-postadress
@@ -461,6 +466,41 @@ reply = eller svara på detta e-postmeddelande direkt
hi_user_x = Hej %s,
admin.new_user.user_info = Användarinformation
admin.new_user.text = Vänligen klicka här för att hantera denna användare från administratörspanelen.
+admin.new_user.subject = Ny användare %s har just registrerat sig
+totp_disabled.no_2fa = Det finns inga andra 2FA-metoder konfigurerade längre, vilket innebär att det inte längre är nödvändigt att logga in på ditt konto med 2FA.
+removed_security_key.text_1 = Säkerhetsnyckeln ”%[1]s” har just tagits bort från ditt konto.
+repo.transfer.to_you = dig
+repo.transfer.body = För att acceptera eller avvisa det, besök %s eller ignorera det helt enkelt.
+removed_security_key.no_2fa = Det finns inga andra 2FA-metoder konfigurerade längre, vilket innebär att det inte längre är nödvändigt att logga in på ditt konto med 2FA.
+release.note = Notera:
+totp_enrolled.subject = Du har aktiverat TOTP som 2FA-metod
+totp_enrolled.text_1.no_webauthn = Du har just aktiverat TOTP för ditt konto. Det innebär att du måste använda TOTP som 2FA-metod vid alla framtida inloggningar på ditt konto.
+totp_enrolled.text_1.has_webauthn = Du har just aktiverat TOTP för ditt konto. Det innebär att du vid alla framtida inloggningar på ditt konto kan använda TOTP som 2FA-metod eller någon av dina säkerhetsnycklar.
+link_not_working_do_paste = Fungerar inte länken? Prova att kopiera och klistra in den i webbläsarens adressfält.
+primary_mail_change.text_1 = Den primära e-postadressen för ditt konto har just ändrats till %[1]s. Det innebär att denna e-postadress inte längre kommer att ta emot e-postmeddelanden för ditt konto.
+totp_disabled.subject = TOTP har inaktiverats
+totp_disabled.text_1 = Tidsbaserat engångslösenord (TOTP) på ditt konto har just inaktiverats.
+account_security_caution.text_2 = Om detta inte var du, har ditt konto blivit kompromitterat. Kontakta administratören för denna webbplats.
+account_security_caution.text_1 = Om detta var du, kan du tryggt ignorera detta meddelande.
+activate_account.text_2 = Klicka på följande länk för att aktivera ditt konto inom %s:
+activate_email.text = Klicka på följande länk för att verifiera din e-postadress inom %s:
+register_notify.text_3 = Om någon annan har skapat det här kontot åt dig måste du först ställa in ditt lösenord.
+issue.x_mentioned_you = @%s2 nämnde dig:
+repo.collaborator.added.subject = %s har lagt till dig som medarbetare i %s
+repo.collaborator.added.text = Du har lagts till som medarbetare i förrådet:
+team_invite.subject = %[1]s har bjudit in dig att gå med i organisationen %[2]s
+register_notify.text_1 = detta är din registreringsbekräftelse via e-post för %s!
+release.downloads = Hämtningar:
+release.download.zip = Källkod (ZIP)
+release.download.targz = Källkod (TAR.GZ)
+repo.transfer.subject_to = %s vill överföra förrådet ”%s” till %s
+removed_security_key.subject = En säkerhetsnyckel har tagits bort
+issue_assigned.pull = @%[1] har tilldelat dig pull-begäran %[2]s i förrådet %[3]s.
+issue_assigned.issue = @%[1] har tilldelat dig ärendet %[2] i förrådet %[3].
+register_notify.text_2 = Du kan logga in på ditt konto med ditt användarnamn: %s
+reset_password.text = Om detta var du, klicka på följande länk för att återställa ditt konto inom %s:
+issue.action.force_push = %[1]s2 gjorde en force-push av %[2]s från %[3]s till %[4]s.
+repo.transfer.subject_to_you = %s vill överföra förrådet ”%s” till dig
@@ -544,6 +584,12 @@ auth_failed=Autentisering misslyckades: %v
target_branch_not_exist=Målgrenen finns inte.
+org_still_own_repo = Denna organisation äger fortfarande ett eller flera förråd, ta bort eller överför dem först.
+must_use_public_key = Den nyckel du angav är en privat nyckel. Skicka inte upp din privata nyckel någonstans. Använd istället din publika nyckel.
+unable_verify_ssh_key = SSH-nyckeln kan inte verifieras. Kontrollera att den är korrekt.
+still_own_repo = Ditt konto äger ett eller flera förråd, ta bort eller överför dem först.
+still_has_org = Ditt konto är medlem i en eller flera organisationer. Lämna dem först.
+still_own_packages = Ditt konto har ett eller flera paket, ta bort dem först.
[user]
@@ -559,6 +605,13 @@ follow=Följ
unfollow=Sluta följa
user_bio=Biografi
disabled_public_activity=Den här användaren har inaktiverat den publika synligheten av aktiviteten.
+code = Kod
+watched = Övervakade förråd
+unblock = Avblockera
+email_visibility.limited = Din e-postadress är synlig för alla autentiserade användare
+show_on_map = Visa denna plats på en karta
+settings = Användarinställningar
+block = Blockera
[settings]
@@ -759,6 +812,17 @@ email_notifications.submit=Ställ in e-postpreferenser
visibility.public=Offentlig
visibility.private=Privat
change_password = Byt lösenord
+user_block_success = Användaren har blockerats.
+blocked_since = Blockerad sedan %s
+user_unblock_success = Användaren har blivit avblockerad.
+visibility.limited = Begränsad
+visibility.limited_tooltip = Synlig endast för inloggade användare
+visibility.private_tooltip = Synlig endast för medlemmar i organisationer som du har gått med i
+select_permissions = Välj behörigheter
+permission_no_access = Ingen åtkomst
+permission_write = Läs och skriv
+user_block_yourself = Du kan inte blockera dig själv.
+gpg_token_help = Du kan skapa en signatur med hjälp av:
[repo]
owner=Ägare
@@ -1093,13 +1157,13 @@ issues.close_comment_issue=Stäng med kommentar
issues.reopen_issue=Återöppna
issues.reopen_comment_issue=Öppna igen med kommentar
issues.create_comment=Kommentera
-issues.closed_at=`stängde ärendet %[2]s`
-issues.reopened_at=`återöppnade detta ärende %[2]s`
-issues.commit_ref_at=`refererade till detta ärende från en incheckning %[2]s`
-issues.ref_issue_from=`refererade till detta ärende %[4]s %[2]s`
-issues.ref_pull_from=`refererade till denna pull-förfrågan %[4]s %[2]s`
-issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att stänga det %[2]s`
-issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[4]s som kommer att öppna ärendet på nytt %[2]s`
+issues.closed_at=`stängde ärendet %s`
+issues.reopened_at=`återöppnade detta ärende %s`
+issues.commit_ref_at=`refererade till detta ärende från en incheckning %s`
+issues.ref_issue_from=`refererade till detta ärende %[3]s %[1]s`
+issues.ref_pull_from=`refererade till denna pull-förfrågan %[3]s %[1]s`
+issues.ref_closing_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att stänga det %[1]s`
+issues.ref_reopening_from=`hänvisade till detta ärende från en pull-förfrågan %[3]s som kommer att öppna ärendet på nytt %[1]s`
issues.ref_closed_from=`stängde detta ärende %[4]s %[2]s`
issues.ref_reopened_from=`öpnnade detta ärende igen %[4]s %[2]s`
issues.ref_from=`från %[1]s`
@@ -1692,6 +1756,21 @@ topic.manage_topics=Hantera ämnen
topic.done=Klar
topic.count_prompt=Du kan inte välja fler än 25 ämnen
settings.enter_repo_name = Ange ägar- och utvecklingskatalog-namnet exakt som det visas:
+release = Utgåva
+commitstatus.success = Lyckades
+visibility_helper = Gör förrådet privat
+download_bundle = Hämta BUNDLE
+download_zip = Hämta ZIP
+download_tar = Hämta TAR.GZ
+repo_desc_helper = Ange kort beskrivning (valfritt)
+all_branches = Alla grenar
+fork_no_valid_owners = Detta förråd kan inte förgrenas eftersom det inte finns några giltiga ägare.
+fork_to_different_account = Förgrena till ett annat konto
+size_format = %[1]s: %[2]s, %[3]s: %[4]s
+already_forked = Du har redan förgrenat %s
+commitstatus.failure = Fel
+ext_issues = Externa fel
+open_with_editor = Öppna med %s
@@ -2254,7 +2333,7 @@ project_kind = Sök projekt...
search = Sök…
type_tooltip = Söktyp
team_kind = Sök lag...
-org_kind = Sök organisationer...
+org_kind = Sök organisationer…
issue_kind = Sök ärenden...
regexp_tooltip = Tolka söktermen som ett reguljärt uttryck
code_search_unavailable = Kodsökning är för närvarande inte tillgänglig. Vänligen kontakta webbplatsadministratören.
diff --git a/options/locale/locale_tr-TR.ini b/options/locale/locale_tr-TR.ini
index 0945d64752..c07cefdab9 100644
--- a/options/locale/locale_tr-TR.ini
+++ b/options/locale/locale_tr-TR.ini
@@ -296,7 +296,7 @@ federated_avatar_lookup.description=Libravatar kullanarak federe profil resmi ar
disable_registration=Kendi Kendine Kaydolmayı Devre Dışı Bırak
disable_registration.description=Kullanıcının kendi kendine kaydolmasını devre dışı bırak. Yalnızca yöneticiler yeni hesaplar oluşturabilecek.
allow_only_external_registration.description=Sadece belirlenen dış hizmetler aracılığıyla kullanıcı kaydına izin ver.
-openid_signin=OpenID Oturum Açmayı Etkinleştiriniz
+openid_signin=OpenID Oturum Açmayı Etkinleştir
openid_signin.description=OpenID ile kullanıcı girişini etkinleştir.
openid_signup=OpenID ile Kendi Kendine Kaydı Etkinleştir
openid_signup.description=OpenID Tabanlı Kendi Kendi Kullanıcı Kaydını Etkinleştir.
@@ -668,6 +668,7 @@ username_error_no_dots = ` sadece alfanumerik karakterler ("0-9","a-z","A-Z"), t
unset_password = Oturum açma kullanıcısı parola belirlemedi.
unsupported_login_type = Oturum açma türü hesap silmeyi desteklemiyor.
+email_domain_is_not_allowed = Kullanıcı e-posta adresi %s alan adı EMAIL_DOMAIN_ALLOWLIST veya EMAIL_DOMAIN_BLOCKLIST ile çelişiyor. Lütfen işleminizin beklendiğinden emin olun.
[user]
change_avatar=Profil resmini değiştir…
@@ -1593,13 +1594,13 @@ issues.close_comment_issue=Yorum Yap ve Kapat
issues.reopen_issue=Yeniden aç
issues.reopen_comment_issue=Yorum Yap ve Yeniden Aç
issues.create_comment=Yorum yap
-issues.closed_at=`%[2]s konusunu kapattı`
-issues.reopened_at=`%[2]s konusunu yeniden açtı`
-issues.commit_ref_at=`%[2]s işlemesinde bu konuyu işaret etti`
-issues.ref_issue_from=`bu konuya referansta bulundu %[4]s %[2]s`
-issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[4]s %[2]s`
-issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu kapatılacak %[2]s`
-issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[4]s bu konu yeniden açılacak %[2]s`
+issues.closed_at=`%s konusunu kapattı`
+issues.reopened_at=`%s konusunu yeniden açtı`
+issues.commit_ref_at=`%s işlemesinde bu konuyu işaret etti`
+issues.ref_issue_from=`bu konuya referansta bulundu %[3]s %[1]s`
+issues.ref_pull_from=`bu değişiklik isteğine referansta bulundu %[3]s %[1]s`
+issues.ref_closing_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu kapatılacak %[1]s`
+issues.ref_reopening_from=`bir değişiklik isteğine referansta bulundu %[3]s bu konu yeniden açılacak %[1]s`
issues.ref_closed_from=`bu konuyu kapat%[4]s %[2]s`
issues.ref_reopened_from=`konuyu yeniden aç%[4]s %[2]s`
issues.ref_from=`%[1]s'den`
@@ -1906,8 +1907,8 @@ pulls.update_branch_success=Dal güncellemesi başarıyla gerçekleştirildi
pulls.update_not_allowed=Dalı güncelleme izniniz yok
pulls.outdated_with_base_branch=Bu dal, temel dal ile güncel değil
pulls.close=Değişiklik İsteğini Kapat
-pulls.closed_at=`%[2]s değişiklik isteğini kapattı`
-pulls.reopened_at=`%[2]s değişiklik isteğini yeniden açtı`
+pulls.closed_at=`%s değişiklik isteğini kapattı`
+pulls.reopened_at=`%s değişiklik isteğini yeniden açtı`
pulls.cmd_instruction_hint=`Komut satırı talimatlarını görüntüleyin.`
pulls.cmd_instruction_checkout_title=Çekme
pulls.cmd_instruction_checkout_desc=Proje deponuzdan yeni bir dalı çekin ve değişiklikleri test edin.
@@ -2163,7 +2164,7 @@ settings.pulls.allow_rebase_update=Değişiklik isteği dalının yeniden yapıl
settings.pulls.default_delete_branch_after_merge=Varsayılan olarak birleştirmeden sonra değişiklik isteği dalını sil
settings.pulls.default_allow_edits_from_maintainers=Bakımcıların düzenlemelerine izin ver
settings.releases_desc=Depo Sürümlerini Etkinleştir
-settings.packages_desc=Depo Paket Kütüğünü Etkinleştir
+settings.packages_desc=Depo paket kütüğünü etkinleştir
settings.projects_desc=Depo Projelerini Etkinleştir
settings.actions_desc=Depo İşlemlerini Etkinleştir
settings.admin_settings=Yönetici Ayarları
@@ -3061,13 +3062,13 @@ packages.repository=Depo
packages.size=Boyut
packages.published=Yayınlandı
-defaulthooks=Varsayılan Web İstemcileri
-defaulthooks.desc=Web İstemcileri, belirli Forgejo olayları tetiklendiğinde otomatik olarak HTTP POST isteklerini sunucuya yapar. Burada tanımlanan Web İstemcileri varsayılandır ve tüm yeni depolara kopyalanır. web istemcileri kılavuzunda daha fazla bilgi edinin.
+defaulthooks=Varsayılan web kancaları
+defaulthooks.desc=Web Kancaları, belirli Forgejo olayları tetiklendiğinde otomatik olarak HTTP POST isteklerini sunucuya yapar. Burada tanımlanan Web kancaları varsayılandır ve tüm yeni depolara kopyalanır. web kancaları kılavuzunda daha fazla bilgi edinin.
defaulthooks.add_webhook=Varsayılan Web İstemcisi Ekle
defaulthooks.update_webhook=Varsayılan Web İstemcisini Güncelle
-systemhooks=Sistem Web İstemcileri
-systemhooks.desc=Belirli Forgejo olayları tetiklendiğinde Web istemcileri otomatik olarak bir sunucuya HTTP POST istekleri yapar. Burada tanımlanan web istemcileri sistemdeki tüm depolar üzerinde çalışır, bu yüzden lütfen bunun olabilecek tüm performans sonuçlarını göz önünde bulundurun. web istemcileri kılavuzunda daha fazla bilgi edinin.
+systemhooks=Sistem web kancaları
+systemhooks.desc=Belirli Forgejo olayları tetiklendiğinde Web kancaları otomatik olarak bir sunucuya HTTP POST istekleri yapar. Burada tanımlanan web kancaları sistemdeki tüm depolar üzerinde çalışır, bu yüzden lütfen bunun olabilecek tüm performans sonuçlarını göz önünde bulundurun. web kancaları kılavuzunda daha fazla bilgi edinin.
systemhooks.add_webhook=Sistem Web İstemcisi Ekle
systemhooks.update_webhook=Sistem Web İstemcisi Güncelle
@@ -3241,7 +3242,7 @@ config.disable_register=Kullanıcı Kaydını Devre Dışı Bırak
config.allow_only_internal_registration=Kayda Sadece Forgejo'nın Kendisi Üzerinden İzin Ver
config.allow_only_external_registration=Sadece Dış Hizmetler Aracılığıyla Kullanıcı Kaydına İzin Ver
config.enable_openid_signup=OpenID Kendinden Kaydı'nı Etkinleştir
-config.enable_openid_signin=OpenID Oturum Açmayı Etkinleştiriniz
+config.enable_openid_signin=OpenID Oturum Açmayı Etkinleştir
config.show_registration_button=Kaydolma Düğmesini Göster
config.require_sign_in_view=Sayfaları Görüntülemek için Giriş Yapmaya Zorla
config.mail_notify=E-Posta Bildirimlerini Etkinleştir
@@ -3492,7 +3493,7 @@ error.unit_not_allowed=Bu depo bölümüne erişme izniniz yok.
title=Paketler
desc=Depo paketlerini yönet.
empty=Henüz hiçbir paket yok.
-empty.documentation=Paket kütüğü hakkında daha fazla bilgi için, belgeye bakabilirsiniz.
+empty.documentation=Paket deposu hakkında daha fazla bilgi için, belgeye bakabilirsiniz.
empty.repo=Bir paket yüklediniz ama burada gösterilmiyor mu? Paket ayarlarına gidin ve bu depoya bağlantı verin.
registry.documentation=%s kütüğü hakkında daha fazla bilgi için, belgeye bakabilirsiniz.
filter.type=Tür
@@ -3635,9 +3636,9 @@ owner.settings.cleanuprules.remove.days=Şundan eski sürümleri kaldır
owner.settings.cleanuprules.remove.pattern=Eşleşen sürümlari kaldır
owner.settings.cleanuprules.success.update=Temizleme kuralı güncellendi.
owner.settings.cleanuprules.success.delete=Temizleme kuralı silindi.
-owner.settings.chef.title=Chef Kütüğü
+owner.settings.chef.title=Chef deposu
owner.settings.chef.keypair=Anahtar çifti üret
-owner.settings.chef.keypair.description=Chef kütüğünde kimlik doğrulaması için bir anahtar çifti gereklidir. Eğer daha önce bir anahtar çifti ürettiyseniz, yeni bir anahtar çifti üretmek eski anahtar çiftini ıskartaya çıkartacaktır.
+owner.settings.chef.keypair.description=Chef kayıt defterine gönderilen istekler kimlik doğrulama yöntemi olarak kriptografik olarak imzalanmalıdır. Bir anahtar çifti oluştururken, yalnızca genel anahtar Forgejo'da saklanır. Özel anahtar size knife ile kullanılmak üzere sağlanır. Yeni bir anahtar çifti oluşturmak öncekini geçersiz kılar.
npm.dependencies.bundle = Paketlenmiş Bağımlılıklar
rpm.repository.multiple_groups = Bu paket birçok grupta mevcut.
diff --git a/options/locale/locale_uk-UA.ini b/options/locale/locale_uk-UA.ini
index 42773de48d..faa3f2a56e 100644
--- a/options/locale/locale_uk-UA.ini
+++ b/options/locale/locale_uk-UA.ini
@@ -694,7 +694,7 @@ disabled_public_activity=Цей користувач вимкнув публіч
joined_on = Реєстрація %s
email_visibility.private = Ваш email видно лише вам і адміністраторам
email_visibility.limited = Вашу е-пошту видно всім авторизованим
-settings = Користувацькі параметри
+settings = Користувацькі налаштування
block_user.detail_3 = Ви не зможете додати один одного в якості співавтора репозиторію.
show_on_map = Показати це місце на мапі
block_user.detail_2 = Цей користувач не зможе взаємодіяти з репозиторіями, власником яких є ви, а також із задачами та коментарями, які ви створили.
@@ -1447,7 +1447,7 @@ issues.remove_ref_at=`видалив посилання %s %s`
issues.add_ref_at=`додав посилання %s %s`
issues.delete_branch_at=`видалена гілка %s %s`
issues.filter_label=Мітка
-issues.filter_label_exclude=`Використовуйте Alt
+ клік/Enter
для виключення міток`
+issues.filter_label_exclude=Використовуйте Alt + клік для виключення міток
issues.filter_label_no_select=Всі мітки
issues.filter_milestone=Етап
issues.filter_project=Проєкт
@@ -1496,17 +1496,17 @@ issues.context.quote_reply=Цитувати відповідь
issues.context.reference_issue=Послатися в новій задачі
issues.context.edit=Редагувати
issues.context.delete=Видалити
-issues.close_comment_issue=Прокоментувати і закрити
+issues.close_comment_issue=Закрити з коментарем
issues.reopen_issue=Відкрити знову
-issues.reopen_comment_issue=Прокоментувати та відкрити знову
+issues.reopen_comment_issue=Відкрити знову з коментарем
issues.create_comment=Коментар
-issues.closed_at=`закрив цю задачу %[2]s`
-issues.reopened_at=`повторно відкрив цю задачу %[2]s`
-issues.commit_ref_at=`згадано цю задачу в коміті %[2]s`
-issues.ref_issue_from=`посилається на цю задачу %[4]s %[2]s`
-issues.ref_pull_from=`послався на цей запит злиття %[4]s %[2]s`
-issues.ref_closing_from=`згадав запит на злиття %[4]s, які закриють цю задачу %[2]s`
-issues.ref_reopening_from=`згадав запит на злиття %[4]s, які повторно відкриють цю задачу %[2]s`
+issues.closed_at=`закриває цю задачу %s`
+issues.reopened_at=`повторно відкриває цю задачу %s`
+issues.commit_ref_at=`посилається на цю задачу в коміті %s`
+issues.ref_issue_from=`посилається на цю задачу %[3]s %[1]s`
+issues.ref_pull_from=`посилається на цей запит злиття %[3]s %[1]s`
+issues.ref_closing_from=`посилається в запиті на злиття %[3]s, який закриє цю задачу, %[1]s`
+issues.ref_reopening_from=`посилається в запиті на злиття %[3]s, який повторно відкриє цю задачу, %[1]s`
issues.ref_closed_from=`закрив цю задачу %[4]s %[2]s`
issues.ref_reopened_from=`повторно відкрито цю задачу %[4]s %[2]s`
issues.ref_from=`із %[1]s`
@@ -1743,8 +1743,8 @@ pulls.update_branch_rebase=Оновити гілку перебазування
pulls.update_branch_success=Оновлення гілки пройшло успішно
pulls.update_not_allowed=Ви не можете оновити гілку
pulls.outdated_with_base_branch=Ця гілка застаріла відносно базової гілки
-pulls.closed_at=`закрив цей запит на злиття %[2]s`
-pulls.reopened_at=`повторно відкрив цей запит на злиття %[2]s`
+pulls.closed_at=`закриває цей запит на злиття %s`
+pulls.reopened_at=`повторно відкриває цей запит на злиття %s`
@@ -1780,7 +1780,7 @@ milestones.filter_sort.least_issues=Найменш задач
ext_wiki.desc=Посилання на зовнішню вікі.
wiki=Вікі
-wiki.welcome=Ласкаво просимо до Вікі.
+wiki.welcome=Ласкаво просимо до вікі.
wiki.welcome_desc=Wiki дозволяє писати та ділитися документацією з співавторами.
wiki.desc=Пишіть та обмінюйтеся документацією із співавторами.
wiki.create_first_page=Створити першу сторінку
@@ -1887,7 +1887,7 @@ settings.collaboration.owner=Власник
settings.collaboration.undefined=Не визначено
settings.hooks=Веб-хуки
settings.githooks=Git хуки
-settings.basic_settings=Базові налаштування
+settings.basic_settings=Основні налаштування
settings.mirror_settings=Налаштування дзеркала
settings.mirror_settings.mirrored_repository=Віддзеркалений репозиторій
settings.mirror_settings.direction=Напрямок
@@ -2055,12 +2055,12 @@ settings.event_issue_assign=Призначення
settings.event_issue_assign_desc=Задачу призначено або скасовано.
settings.event_issue_label=Мітки
settings.event_issue_label_desc=Додавання або видалення міток задач.
-settings.event_issue_milestone=Задача з етапом
+settings.event_issue_milestone=Етапи
settings.event_issue_milestone_desc=Етап призначено, видалено або змінено.
settings.event_issue_comment=Коментарі
settings.event_issue_comment_desc=Коментар задачі створено, видалено чи відредаговано.
settings.event_header_pull_request=Події запиту на злиття
-settings.event_pull_request=Запити до злиття
+settings.event_pull_request=Зміна
settings.event_pull_request_desc=Запит до злиття відкрито, закрито, перевідкрито або відредаговано.
settings.event_pull_request_assign=Призначення
settings.event_pull_request_assign_desc=Запит про злиття призначено або скасовано.
@@ -2485,7 +2485,7 @@ signing.will_sign = Коміт буде підписано ключем «%s».
signing.wont_sign.error = Під час перевірки можливості підписати коміт сталася помилка.
commits.search_branch = У цій гілці
ext_wiki = Зовнішня вікі
-pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %[2]s`
+pulls.commit_ref_at = `посилається на цей запит на злиття в коміті %s`
pulls.cmd_instruction_hint = Переглянути інструкції для командного рядка
issues.max_pinned = Неможливо закріпити більше задач
issues.unpin_comment = відкріпив %s
@@ -2663,6 +2663,12 @@ sync_fork.button = Синхронізувати
sync_fork.branch_behind_one = Ця гілка на %[1]d коміт позаду %[2]s
sync_fork.branch_behind_few = Ця гілка на %[1]d комітів позаду %[2]s
issues.role.first_time_contributor = Новий учасник
+settings.event_action_failure = Помилка
+settings.event_action_success = Успіх
+settings.event_action_recover = Відновлено
+commitstatus.success = Успіх
+commitstatus.failure = Збій
+issues.filter_type.all_pull_requests = Усі запити на злиття
[graphs]
contributors.what = внески
@@ -2841,7 +2847,7 @@ dashboard.update_migration_poster_id=Оновити мігровані ID авт
dashboard.git_gc_repos=Виконати очистку сміття для всіх репозиторіїв
dashboard.resync_all_sshkeys=Оновити файл «.ssh/authorized_keys» з SSH-ключами Forgejo.
dashboard.resync_all_sshprincipals=Оновити файл «.ssh/authorized_principals» з SSH даними користувача Forgejo.
-dashboard.resync_all_hooks=Пересинхронізувати перед-прийнятні, оновлюючі та пост-прийнятні хуки в усіх репозиторіях
+dashboard.resync_all_hooks=Пересинхронізувати хуки pre-receive, update та post-receive в усіх репозиторіях
dashboard.reinit_missing_repos=Переініціалізувати усі репозитрії git-файли яких втрачено
dashboard.sync_external_users=Синхронізувати дані зовнішніх користувачів
dashboard.cleanup_hook_task_table=Очистити hook_task таблицю
@@ -2851,12 +2857,12 @@ dashboard.current_memory_usage=Поточне використання пам'я
dashboard.total_memory_allocated=Виділено пам'яті загалом
dashboard.memory_obtained=Отримано пам'яті
dashboard.pointer_lookup_times=Пошуків вказівника
-dashboard.memory_allocate_times=Виділення пам'яті
+dashboard.memory_allocate_times=Виділень пам'яті
dashboard.memory_free_times=Звільнень пам'яті
dashboard.current_heap_usage=Поточне використання динамічної пам'яті
dashboard.heap_memory_obtained=Отримано динамічної пам'яті
-dashboard.heap_memory_idle=Не використовується динамічною пам'яттю
-dashboard.heap_memory_in_use=Використовується динамічною пам'яттю
+dashboard.heap_memory_idle=Динамічної пам'яті простоює
+dashboard.heap_memory_in_use=Динамічної пам'яті використовується
dashboard.heap_memory_released=Звільнено динамічної пам'яті
dashboard.heap_objects=Об'єктів динамічної пам'яті
dashboard.bootstrap_stack_usage=Використання стеку Bootstrap
@@ -2900,7 +2906,7 @@ users.edit_account=Редагувати обліковий запис
users.max_repo_creation=Максимальна кількість репозиторіїв
users.max_repo_creation_desc=(Введіть -1, щоб використовувати глобальний ліміт за замовчуванням.)
users.is_activated=Обліковий запис користувача увімкнено
-users.prohibit_login=Вимкнути вхід
+users.prohibit_login=Заблокований обліковий запис
users.is_admin=Обліковий запис адміністратора
users.is_restricted=Обмежений
users.allow_git_hook=Може створювати Git хуки
@@ -3226,7 +3232,7 @@ notices.view_detail_header=Переглянути деталі повідомл
notices.select_all=Вибрати все
notices.deselect_all=Скасувати виділення
notices.inverse_selection=Інвертувати виділене
-notices.delete_selected=Видалити обране
+notices.delete_selected=Видалити вибране
notices.delete_all=Видалити всі cповіщення
notices.type=Тип
notices.type_1=Репозиторій
@@ -3298,6 +3304,8 @@ config.mailer_protocol = Протокол
dashboard.cron.cancelled = Cron: %[1]s скасовано: %[3]s
defaulthooks.desc = Вебхуки автоматично сповіщають HTTP-сервер POST-запитами, коли в Forgejo відбуваються певні події. Вказані тут вебхуки є типовими і будуть скопійовані до всіх нових репозиторіїв. Докладніше — в посібнику з вебхуків.
assets = Ресурси коду
+auths.invalid_openIdConnectAutoDiscoveryURL = Неправильна URL-адреса автоматичного виявлення (повинна бути дійсна URL-адреса, що починається з http:// або https://)
+settings = Налаштування адміністратора
[action]
@@ -3619,6 +3627,8 @@ runners.runner_title = Ранер
runners.task_list = Нещодавні завдання ранера
runners.update_runner_success = Ранер оновлено
runners.delete_runner_header = Підтвердіть видалення ранера
+runners.status.offline = Неактивний
+runners.status.idle = Простоює
diff --git a/options/locale/locale_vi.ini b/options/locale/locale_vi.ini
index 57e592a209..28577bc3f7 100644
--- a/options/locale/locale_vi.ini
+++ b/options/locale/locale_vi.ini
@@ -9,7 +9,7 @@ sign_up = Đăng ký
link_account = Liên kết tài khoản
register = Đăng ký
version = Phiên bản
-powered_by = Sử dụng %s
+powered_by = Được cung cấp bởi %s
page = Trang
template = Mẫu
language = Ngôn ngữ
@@ -25,7 +25,7 @@ access_token = Mã truy cập
captcha = CAPTCHA
twofa = Xác thực hai lớp
webauthn_insert_key = Cắm khóa bảo mật của bạn vào
-copy_hash = Chép chuỗi băm
+copy_hash = Sao chép chuỗi băm
sign_in_with_provider = Đăng nhập bằng %s
webauthn_press_button = Hãy nhấn nút trên khóa bảo mật…
webauthn_use_twofa = Dùng mã xác thực hai lớp ở trên điện thoại
@@ -36,7 +36,7 @@ webauthn_error_insecure = WebAuthn chỉ hỗ trợ kết nối mã hóa. Nếu
webauthn_error_unable_to_process = Máy chủ không thể xử lý yêu cầu của bạn.
webauthn_error_empty = Bạn phải đặt tên cho khóa này.
webauthn_error_timeout = Hết thời gian đọc khóa mất rồi. Hãy tải lại trang và thử lại.
-copy_type_unsupported = Không chép được
+copy_type_unsupported = Không thể sao chép loại tệp này
repository = Kho mã
organization = Tổ chức
new_fork = Tạo một nhánh mới
@@ -55,17 +55,17 @@ all = Tất cả
sources = Nguồn
forks = Các phân nhánh
activities = Hoạt động
-pull_requests = Yêu cầu thêm mã
+pull_requests = Yêu cầu kéo mã
save = Lưu
-issues =
+issues =Vấn đề
enabled = Bật
disabled = Tắt
-copy = Chép
-copy_generic = Chép vào bộ nhớ tạm
-copy_url = Chép URL
-copy_content = Chép nội dung
-copy_success = Đã chép!
-copy_error = Không chép được
+copy = Sao chép
+copy_generic = Sao chép vào bộ nhớ tạm
+copy_url = Sao chép URL
+copy_content = Sao chép nội dung
+copy_success = Đã sao chép!
+copy_error = Sao chép thất bại
write = Viết
preview = Xem trước
error = Lỗi
@@ -73,7 +73,7 @@ error413 = Bạn đã dùng hết định mức.
go_back = Quay lại
invalid_data = Dữ liệu không hợp lệ: %v
never = Không bao giờ
-unknown = Không biết
+unknown = Không xác định
unpin = Bỏ ghim
pin = Ghim
archived = Đã lưu trữ
@@ -81,6 +81,60 @@ signed_in_as = Đăng nhập bằng
re_type = Xác nhận mật khẩu
webauthn_sign_in = Nhấn nút trên khóa bảo mật, nếu không có nút thì bạn hãy rút ra rồi cắm lại.
new_org.link = Tạo tổ chức
-error404 = Trang bạn đang tìm không tồn tại hoặc bạn không có quyền xem.
+error404 = Trang bạn đang tìm không tồn tại, đã bị xoá hoặc bạn không có quyền để xem nó.
edit = Chỉnh sửa
-filter = Lọc
\ No newline at end of file
+filter = Bộ lọc
+dashboard = Trang quản lý
+logo = Logo
+toc = Mục lục
+user_profile_and_more = Hồ sơ và cài đặt…
+passcode = Mã xác thực
+webauthn_error_duplicated = Khóa bảo mật không được phép cho yêu cầu này. Vui lòng đảm bảo rằng khóa chưa được đăng ký trước đó.
+mirror = Bản sao
+new_mirror = Tạo bản sao mới
+your_starred = Đã đánh sao
+mirrors = Các bản sao
+concept_system_global = Chung
+concept_user_individual = Cá nhân
+show_log_seconds = Hiện giây
+show_full_screen = Toàn màn hình
+download_logs = Tải xuống nhật ký
+confirm_delete_selected = Xác nhận xoá tất cả mục được chọn?
+name = Tên
+filter.clear = Xoá bộ lọc
+filter.not_fork = Không phải phân nhánh
+filter.not_archived = Không bị lưu trữ
+filter.is_archived = Bị lưu trữ
+filter.is_fork = Phân nhánh
+filter.is_mirror = Bản sao
+filter.is_template = Mẫu
+filter.not_template = Không phải mẫu
+filter.public = Công khai
+filter.private = Riêng tư
+twofa_scratch = Mã xác thực 2 lớp dự phòng
+collaborative = Cộng tác
+milestones = Cột mốc
+cancel = Huỷ bỏ
+retry = Thử lại
+rerun = Chạy lại
+rerun_all = Chạy lại tất cả
+ok = Đồng ý
+add = Thêm
+add_all = Thêm tất cả
+remove = Xoá
+remove_all = Xoá tất cả
+remove_label_str = Xoá "%s"
+locked = Bị khoá
+copy_branch = Sao chép tên nhánh
+loading = Đang tải…
+rss_feed = Nguồn RSS
+confirm_delete_artifact = Bạn có chắc muốn xoá "%s" ?
+value = Giá trị
+copy_path = Sao chép đường dẫn
+filter.not_mirror = Không phải bản sao
+show_timestamps = Hiện mốc thời gian
+concept_code_repository = Kho mã
+concept_user_organization = Tổ chức
+
+[search]
+search = Tìm kiếm…
\ No newline at end of file
diff --git a/options/locale/locale_zh-CN.ini b/options/locale/locale_zh-CN.ini
index a3ddf05ff9..c6c534df9f 100644
--- a/options/locale/locale_zh-CN.ini
+++ b/options/locale/locale_zh-CN.ini
@@ -7,9 +7,9 @@ logo=徽标
sign_in=登录
sign_in_with_provider=使用 %s 登录
sign_in_or=或
-sign_out=退出
+sign_out=登出
sign_up=注册
-link_account=链接账户
+link_account=链接账号
register=注册
version=当前版本
powered_by=由 %s 提供支持
@@ -743,7 +743,7 @@ social=社交帐号
applications=应用
orgs=组织
repos=仓库列表
-delete=删除帐户
+delete=删除账号
twofa=两步验证(TOTP)
account_link=已绑定的帐户
organization=组织
@@ -1062,8 +1062,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天的保护期后对所有人可用,您仍可以在此期间重新认领旧的用户名。
+change_username_redirect_prompt.with_cooldown.one = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。
+change_username_redirect_prompt.with_cooldown.few = 旧用户名将在 %[1]d 天的保护期后对所有人可用,您仍可以在此期间重新认领旧用户名。
keep_pronouns_private = 仅向已认证用户显示代词
keep_pronouns_private.description = 这将对未登录的访问者隐藏您的代词。
quota = 配额
@@ -1515,7 +1515,7 @@ projects.card_type.images_and_text=图标和文字
projects.card_type.text_only=仅文本
issues.desc=组织 bug 报告、任务和里程碑。
-issues.filter_assignees=筛选指派人
+issues.filter_assignees=筛选指派成员
issues.filter_milestones=筛选里程碑
issues.filter_projects=筛选项目
issues.filter_labels=筛选标签
@@ -1581,7 +1581,7 @@ issues.remove_ref_at=`删除了引用 %s %s`
issues.add_ref_at=`添加了引用 %s %s`
issues.delete_branch_at=`于 %[2]s 删除了分支 %[1]s`
issues.filter_label=标签筛选
-issues.filter_label_exclude=`使用 alt
+ 鼠标左键 / 回车
排除标签`
+issues.filter_label_exclude=使用 Alt + 单击 排除标签
issues.filter_label_no_select=所有标签
issues.filter_label_select_no_label=无标签
issues.filter_milestone=里程碑筛选
@@ -1653,15 +1653,15 @@ issues.comment_pull_merged_at=已合并提交 %[1]s 到 %[2]s %[3]s
issues.comment_manually_pull_merged_at=手动合并提交 %[1]s 到 %[2]s %[3]s
issues.close_comment_issue=评论并关闭
issues.reopen_issue=重新开放
-issues.reopen_comment_issue=重新打开评论
+issues.reopen_comment_issue=重新打开并评论
issues.create_comment=评论
-issues.closed_at=`于%[2]s关闭此议题`
-issues.reopened_at=`重新打开此问题 %[2]s`
-issues.commit_ref_at=`于%[2]s在代码提交中引用了该议题`
-issues.ref_issue_from=`引用了议题 %[4]s %[2]s`
-issues.ref_pull_from=`引用了合并请求 %[4]s %[2]s`
-issues.ref_closing_from=`于 %[2]s 从合并请求 %[4]s引用了此议题,将关闭此议题`
-issues.ref_reopening_from=`于 %[2]s 引用了合并请求 %[4]s 将重新讨论此议题 `
+issues.closed_at=`于 %s 关闭了此议题`
+issues.reopened_at=`于 %s 重新打开了此议题`
+issues.commit_ref_at=`于 %s 从提交中引用了此议题`
+issues.ref_issue_from=`引用了此议题 %[3]s %[1]s`
+issues.ref_pull_from=`引用了此合并请求 %[3]s %[1]s`
+issues.ref_closing_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将关闭此议题`
+issues.ref_reopening_from=`于 %[1]s 从合并请求 %[3]s 引用了此议题,将重新打开此议题 `
issues.ref_closed_from=`关闭了这个议题 %[4]s %[2]s`
issues.ref_reopened_from=`重新打开这个议题 %[4]s %[2]s`
issues.ref_from=`来自 %[1]s`
@@ -1969,8 +1969,8 @@ pulls.update_branch_success=分支更新成功
pulls.update_not_allowed=您无权更新分支
pulls.outdated_with_base_branch=此分支相比基础分支已过期
pulls.close=关闭
-pulls.closed_at=`于%[2]s关闭此合并请求 `
-pulls.reopened_at=`重新打开此合并请求 %[2]s`
+pulls.closed_at=`于 %s 关闭了此合并请求 `
+pulls.reopened_at=`于 %s 重新打开了此合并请求`
pulls.cmd_instruction_hint=查看命令行说明
pulls.cmd_instruction_checkout_title=检出
pulls.cmd_instruction_checkout_desc=从你的仓库中检出一个新的分支并测试变更。
@@ -2304,7 +2304,7 @@ settings.add_collaborator_inactive_user=无法添加未激活的用户作为合
settings.add_collaborator_owner=不能将所有者添加为协作者。
settings.add_collaborator_duplicate=合作者已经被添加到本仓库。
settings.delete_collaborator=删除
-settings.collaborator_deletion=删除协作者
+settings.collaborator_deletion=移除协作者
settings.collaborator_deletion_desc=删除协作者后他将无法再对此仓库的访问。继续?
settings.remove_collaborator_success=已成功删除协作者。
settings.search_user_placeholder=搜索用户...
@@ -2770,7 +2770,7 @@ settings.wiki_rename_branch_main = 标准化百科分支名称
settings.wiki_rename_branch_main_notices_1 = 此操作无法撤消。
settings.wiki_branch_rename_success = 百科仓库的分支名称已成功规范化。
settings.confirm_wiki_branch_rename = 重命名百科分支
-pulls.commit_ref_at = `在提交 %[2]s 中引用了此合并请求`
+pulls.commit_ref_at = `于 %s 从提交中引用了此合并请求`
settings.wiki_rename_branch_main_notices_2 = 这将永久重命名 %s 的仓库百科的内部分支。现存的检出方式需要更新。
settings.wiki_branch_rename_failure = 无法标准化仓库百科的分支名称。
settings.add_collaborator_blocked_our = 因仓库所有者已将其拉黑,不能添加该用户为协作者。
@@ -2915,6 +2915,14 @@ comment.blocked_by_user = 您无法评论,因为您已被仓库所有者或作
sync_fork.button = 同步
sync_fork.branch_behind_one = 此分支落后于 %[2]s %[1]d 个提交
sync_fork.branch_behind_few = 此分支落后于 %[2]s %[1]d 个提交
+settings.event_action_failure = 失败
+settings.event_action_recover = 恢复
+settings.event_action_recover_desc = Action运行在同一工作流上次失败后成功。
+settings.event_action_success = 成功
+settings.event_action_success_desc = Action运行以成功结束。
+settings.event_action_failure_desc = Action运行以失败结束。
+settings.event_header_action = Action运行事件
+issues.filter_type.all_pull_requests = 所有合并请求
[graphs]
component_loading=正在加载 %s…
@@ -3050,8 +3058,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天的保护期后对所有人可用,您仍可以在此期间重新认领旧名字。
+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-HK.ini b/options/locale/locale_zh-HK.ini
index e2cb0d8b2c..45534801de 100644
--- a/options/locale/locale_zh-HK.ini
+++ b/options/locale/locale_zh-HK.ini
@@ -574,7 +574,7 @@ issues.delete_comment_confirm=您確定要刪除該條評論嗎?
issues.context.edit=編輯
issues.reopen_issue=重新開啟
issues.create_comment=評論
-issues.commit_ref_at=`在代碼提交 %[2]s 中引用了該問題`
+issues.commit_ref_at=`在代碼提交 %s 中引用了該問題`
issues.role.owner=管理員
issues.role.member=普通成員
issues.sign_in_require_desc= 登入 才能加入這對話。
diff --git a/options/locale/locale_zh-TW.ini b/options/locale/locale_zh-TW.ini
index 396e1a571d..fba51a391e 100644
--- a/options/locale/locale_zh-TW.ini
+++ b/options/locale/locale_zh-TW.ini
@@ -207,6 +207,9 @@ table_modal.header = 新增表格
buttons.indent.tooltip = 使項目縮排一層
buttons.unindent.tooltip = 使項目取消縮排一層
link_modal.header = 新增連結
+link_modal.url = 網址
+link_modal.description = 描述
+link_modal.paste_reminder = 提示:當您的剪貼簿中有網址時,可以直接貼到編輯器中來建立連結。
[filter]
string.asc=A - Z
@@ -218,7 +221,7 @@ missing_csrf=錯誤的請求:未提供 CSRF 符記
invalid_csrf=錯誤的請求:無效的 CSRF 符記
not_found=找不到目標。
network_error=網路錯誤
-report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 Codeberg 上搜尋相關問題,或在必要時提出一個新問題。
+report_message = 如果您相信這是一個 Forgejo 的錯誤,請在 Codeberg 上搜尋相關議題,或在必要時提出一個新議題。
server_internal = 伺服器內部錯誤
[startpage]
@@ -711,7 +714,7 @@ show_on_map = 在地圖上顯示這個地點
settings = 使用者設定
block_user = 封鎖使用者
block_user.detail_1 = 你們將停止互相關注,並且無法互相關注。
-block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的問題和評論進行互動。
+block_user.detail_2 = 此使用者將無法與你擁有的儲存庫或由你建立的議題和評論進行互動。
followers_one = %d 位追蹤者
following_one = 追蹤 %d 個人
block_user.detail_3 = 你們將無法互相新增為儲存庫協作者。
@@ -1011,7 +1014,7 @@ uploaded_avatar_is_too_big = 上傳檔案的大小 (%d KiB)超過了上限
select_permissions = 選擇權限
permission_write = 讀寫
permissions_list = 權限:
-add_email_confirmation_sent = 我們已發送一封確認信至 「%s」。請檢查您的信箱並在 %s 內確認您的信箱地址。
+add_email_confirmation_sent = 確認信已發送至「%s」。請在接下來的 %s 內前往收件匣查看該郵件,並點擊其中的連結以完成電子郵件地址的確認。
repo_and_org_access = 儲存庫和組織存取權
permissions_public_only = 僅公開
permissions_access_all = 全部(公開、私有和受限)
@@ -1025,9 +1028,9 @@ unbind_success = 已成功移除該社群帳號。
create_oauth2_application_success = 您已成功建立一個新的 OAuth2 應用程式。
change_username_prompt = 註:更改您的使用者名稱也會更改您的帳號 URL。
change_username_redirect_prompt = 舊的使用者名稱在被其他使用者認領之前將會轉址到新的使用者名稱。
-visibility.limited_tooltip = 只有已登入的使用者能看見
+visibility.limited_tooltip = 僅對已登入的使用者可見
visibility.private_tooltip = 只有您加入的組織之成員能看見
-keep_email_private_popup = 這將在您的個人資料頁面、合併請求或網頁檔案編輯器中隱藏您的電子信箱地址。已推送的提交不會被修改。在提交中使用 %s 來將其連結至您的帳號。
+keep_email_private_popup = 您的電子郵件地址不會顯示在個人資料頁面中,也不會成為透過網頁介面(例如上傳檔案、編輯或合併提交)所建立的提交紀錄的預設地址。取而代之的是,可以使用特殊地址 %s 將這些提交關聯到您的帳號。此設定不會影響既有的提交紀錄。
ssh_signonly = 因為目前 SSH 已被停用,這個金鑰只被用來校驗提交簽署。
email_desc = 您的主要電子信箱將被用於通知、密碼復原、和網頁 Git 操作(如果您的信箱不是隱藏的)。
pronouns_custom = 自訂
@@ -1062,6 +1065,32 @@ pronouns_custom_label = 自訂代名詞
change_username_redirect_prompt.with_cooldown.one = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放,你仍然可以在冷卻期內重新獲得舊的使用者名稱。
change_username_redirect_prompt.with_cooldown.few = 舊的使用者名稱將在 %[1]d 天的冷卻期後對所有人開放,你仍然可以在冷卻期內重新獲得舊的使用者名稱。
keep_activity_private.description = 你的公開活動只有你和站點管理員可見。
+quota.rule.exceeded = 已超出
+quota.sizes.assets.packages.all = 軟體包
+storage_overview = 儲存空間概覽
+quota.rule.no_limit = 無限制
+quota.sizes.all = 全部
+regenerate_token = 重新產生
+quota.sizes.repos.all = 儲存庫
+quota.sizes.assets.all = 資產
+quota.sizes.assets.attachments.all = 附件
+quota.sizes.assets.artifacts = 製品
+quota.sizes.wiki = 百科
+quota = 配額
+access_token_regeneration = 重新產生存取符記
+access_token_regeneration_desc = 重新產生存取符記將會撤銷使用該符記的應用程式對您帳號的存取權限,此操作無法還原。是否繼續?
+regenerate_token_success = 符記已重新產生。使用該符記的應用程式將不再具有你帳號的存取權限,必須更新為新的符記後才能繼續使用。
+quota.applies_to_user = 以下配額規則適用於您的帳號
+quota.applies_to_org = 以下配額規則適用於此組織
+quota.rule.exceeded.helper = 符合此規則的物件總大小已超出配額限制。
+quota.sizes.repos.public = 公開儲存庫
+quota.sizes.repos.private = 私有儲存庫
+quota.sizes.git.all = Git 內容
+quota.sizes.git.lfs = Git LFS
+quota.sizes.assets.attachments.issues = 問題附件
+quota.sizes.assets.attachments.releases = 版本發布附件
+keep_pronouns_private = 僅向已驗證的使用者顯示代名詞
+keep_pronouns_private.description = 這將對未登入的訪客隱藏您的代名詞。
[repo]
owner=所有者
@@ -1133,7 +1162,7 @@ forks=分叉
reactions_more=和其他 %d 個
unit_disabled=網站管理員已經停用這個儲存庫區域。
language_other=其他
-adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
+adopt_search=輸入帳號以搜尋未接管的儲存庫... (留白以查詢全部)
adopt_preexisting_label=接管檔案
adopt_preexisting=接管既有的檔案
adopt_preexisting_content=從 %s 建立儲存庫
@@ -1348,7 +1377,7 @@ editor.filename_cannot_be_empty=檔案名稱不能為空。
editor.filename_is_invalid=檔名無效:「%s」。
editor.branch_does_not_exist=此儲存庫沒有名為「%s」的分支。
editor.branch_already_exists=此儲存庫已有名為「%s」的分支。
-editor.file_changed_while_editing=檔案內容在您編輯時已被更改。按一下此處來檢視被更改的地方或再次提交以覆蓋這些變更。
+editor.file_changed_while_editing=檔案內容自您開啟後已有變更。點此查看,或再次提交變更以覆寫原內容。
editor.file_already_exists=此儲存庫已有名為「%s」的檔案。
editor.commit_empty_file_header=提交空白檔案
editor.commit_empty_file_text=你準備提交的檔案是空白的,是否繼續?
@@ -1567,7 +1596,7 @@ issues.commented_at=`已留言 %s`
issues.delete_comment_confirm=您確定要刪除這則留言嗎?
issues.context.copy_link=複製連結
issues.context.quote_reply=引用回覆
-issues.context.reference_issue=新增問題並參考
+issues.context.reference_issue=在新問題中引用
issues.context.edit=編輯
issues.context.delete=刪除
issues.close=關閉問題
@@ -1575,13 +1604,13 @@ issues.close_comment_issue=留言並關閉
issues.reopen_issue=重新開放
issues.reopen_comment_issue=留言並重新開放
issues.create_comment=留言
-issues.closed_at=`關閉了這個問題 %[2]s`
-issues.reopened_at=`重新開放了這個問題 %[2]s`
-issues.commit_ref_at=`在提交中關聯了這個問題 %[2]s`
-issues.ref_issue_from=`關聯了這個問題 %[4]s %[2]s`
-issues.ref_pull_from=`關聯了這個合併請求 %[4]s %[2]s`
-issues.ref_closing_from=`關聯了合併請求 %[4]s 將關閉這個問題 %[2]s`
-issues.ref_reopening_from=`關聯了合併請求 %[4]s 將重新開放這個問題 %[2]s`
+issues.closed_at=`關閉了這個問題 %s`
+issues.reopened_at=`重新開放了這個問題 %s`
+issues.commit_ref_at=`在提交中關聯了這個問題 %s`
+issues.ref_issue_from=`關聯了這個問題 %[3]s %[1]s`
+issues.ref_pull_from=`關聯了這個合併請求 %[3]s %[1]s`
+issues.ref_closing_from=從將關閉此問題的拉取請求 %[3]s 中提及了此問題,%[1]s
+issues.ref_reopening_from=從將重新開啟此問題的拉取請求 %[3]s 中提及了此問題,%[1]s
issues.ref_closed_from=`關閉了這個問題 %[4]s %[2]s`
issues.ref_reopened_from=`重新開放了這個問題 %[4]s %[2]s`
issues.ref_from=`自 %[1]s`
@@ -1630,8 +1659,8 @@ issues.unlock=解鎖對話
issues.lock.unknown_reason=由於未知的原因而無法鎖定問題。
issues.lock_duplicate=問題無法被鎖定兩次。
issues.unlock_error=無法解鎖未被鎖定的問題。
-issues.lock_with_reason=因為 %s 而鎖定,並將對話設為協作者限定 %s
-issues.lock_no_reason=鎖定並將對話設為協作者限定 %s
+issues.lock_with_reason=因為 %s 而鎖定,並將對話限制為協作者 %s
+issues.lock_no_reason=鎖定並將對話限制為協作者 %s
issues.unlock_comment=解鎖這個對話 %s
issues.lock_confirm=鎖定
issues.unlock_confirm=解除鎖定
@@ -1725,8 +1754,8 @@ issues.review.left_comment=留下了回應
issues.review.content.empty=您必須留下訊息指出需要修正的地方。
issues.review.reject=請求了變更 %s
issues.review.wait=被請求進行審核 %s
-issues.review.add_review_request=請求了 %s 來審核 %s
-issues.review.remove_review_request=移除了對 %s 的審核請求 %s
+issues.review.add_review_request=請求 %[1]s 進行審查 %[2]s
+issues.review.remove_review_request=移除了對 %[1]s 的審查請求 %[2]s
issues.review.remove_review_request_self=拒絕了審核 %s
issues.review.pending=待處理
issues.review.review=審核
@@ -1810,7 +1839,7 @@ pulls.reject_count_1=%d 個變更請求
pulls.reject_count_n=%d 個變更請求
pulls.waiting_count_1=%d 個正在等待審核
pulls.waiting_count_n=%d 個正在等待審核
-pulls.wrong_commit_id=提交 id 必須存在於目標分支上
+pulls.wrong_commit_id=提交 ID 必須存在於目標分支上
pulls.no_merge_desc=無法進行合併,因為所有儲存庫的合併選項已被停用。
pulls.no_merge_helper=在儲存庫設定啟用合併選項或手動合併該合併請求。
@@ -1826,13 +1855,13 @@ pulls.merge_commit_id=合併提交 ID
pulls.require_signed_wont_sign=該分支需要經簽署的提交,但此合併將不會被簽署
pulls.invalid_merge_option=您無法對此合併請求使用這個合併選項。
-pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試不同的策略
+pulls.merge_conflict=合併失敗:合併時發生衝突。 提示:請嘗試其他的合併策略
pulls.merge_conflict_summary=錯誤訊息
-pulls.rebase_conflict=合併失敗:Rebase 提交時發生衝突:%[1]s。 提示:請嘗試不同的策略
+pulls.rebase_conflict=合併失敗:Rebase 提交時發生衝突:%[1]s。 提示:請嘗試其他的合併策略
pulls.rebase_conflict_summary=錯誤訊息
-pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試不同的策略
+pulls.unrelated_histories=合併失敗:要合併的 HEAD 和基底分支沒有共同的歷史。 提示:請嘗試其他的合併策略
pulls.merge_out_of_date=合併失敗:產生合併時,基底已被更新。提示:再試一次。
-pulls.head_out_of_date=合併失敗:產生合併時,head 已被更新。提示:再試一次。
+pulls.head_out_of_date=合併失敗:產生合併時,HEAD 已被更新。提示:再試一次。
pulls.push_rejected=合併失敗:此推送被拒絕。請檢查此儲存庫的 Git Hook。
pulls.push_rejected_summary=完整的拒絕訊息
pulls.push_rejected_no_message=推送失敗:此推送被拒絕但未提供其他資訊。請檢查此儲存庫的 Git Hook
@@ -1850,8 +1879,8 @@ pulls.update_branch_success=分支更新成功
pulls.update_not_allowed=您無權更新分支
pulls.outdated_with_base_branch=相對於基底分支,此分支已過時
pulls.close=關閉合併請求
-pulls.closed_at=`關閉了這個合併請求 %[2]s`
-pulls.reopened_at=`重新開放了這個合併請求 %[2]s`
+pulls.closed_at=`關閉了這個合併請求 %s`
+pulls.reopened_at=`重新開放了這個合併請求 %s`
pulls.clear_merge_message=清除合併訊息
pulls.clear_merge_message_hint=清除合併訊息將僅移除提交訊息內容,留下產生的 git 結尾,如「Co-Authored-By …」。
@@ -1900,7 +1929,7 @@ milestones.filter_sort.most_issues=問題由多到少
milestones.filter_sort.least_issues=問題由少到多
-ext_wiki=外部 Wiki
+ext_wiki=外部百科
ext_wiki.desc=連結外部 Wiki。
wiki=Wiki
@@ -1927,7 +1956,7 @@ wiki.page_already_exists=相同名稱的 Wiki 頁面已經存在。
wiki.reserved_page=「%s」是保留的 Wiki 頁面名稱。
wiki.pages=所有頁面
wiki.last_updated=最後更新於 %s
-wiki.page_name_desc=輸入此 Wiki 頁面的名稱。一些特殊名稱有:「Home」、「_Sidebar」、「_Footer」等。
+wiki.page_name_desc=輸入此百科頁面的名稱。一些特殊名稱有:「Home」、「_Sidebar」、「_Footer」等。
activity=動態
activity.period.filter_label=期間:
@@ -2036,10 +2065,10 @@ settings.update_settings=儲存設定
settings.branches.update_default_branch=更新預設分支
settings.branches.add_new_rule=增加新規則
settings.advanced_settings=進階設定
-settings.wiki_desc=啟用儲存庫 Wiki
-settings.use_internal_wiki=使用內建 Wiki
-settings.use_external_wiki=使用外部 Wiki
-settings.external_wiki_url=外部 Wiki 網址
+settings.wiki_desc=啟用儲存庫百科
+settings.use_internal_wiki=使用內建百科
+settings.use_external_wiki=使用外部百科
+settings.external_wiki_url=外部百科網址
settings.external_wiki_url_error=外部 Wiki 網址不是有效的網址。
settings.external_wiki_url_desc=點擊百科分頁時,使用者會被轉址至外部百科的 URL。
settings.issues_desc=啟用儲存庫問題追蹤器
@@ -2068,7 +2097,7 @@ settings.pulls.default_allow_edits_from_maintainers=預設允許維護者進行
settings.releases_desc=啟用儲存庫版本發佈
settings.packages_desc=啟用儲存庫軟體包註冊中心
settings.projects_desc=啟用儲存庫專案
-settings.actions_desc=啟用儲存庫 Actions
+settings.actions_desc=啟用與 Forgejo Actions 整合的 CI/CD 流程
settings.admin_settings=管理員設定
settings.admin_enable_health_check=啟用儲存庫的健康檢查(git fsck)
settings.admin_code_indexer=程式碼索引器
@@ -2118,10 +2147,10 @@ settings.trust_model.committer.desc=提交者的有效簽署將被標記為「
settings.trust_model.collaboratorcommitter=協作者 + 提交者
settings.trust_model.collaboratorcommitter.long=協作者 + 提交者:信任協作者同時是提交者的簽署
settings.trust_model.collaboratorcommitter.desc=此儲存庫協作者的有效簽署在他同時是提交者時將被標記為「受信任」,簽署只符合提交者時將標記為「不受信任」,都不符合時標記為「不符合」。這會強制 Forgejo 成為受簽署提交的提交者,實際的提交者將於提交訊息結尾被標記為「Co-Authored-By:」和「Co-Committed-By:」。預設的 Forgejo 金鑰必須符合資料庫中的一位使用者。
-settings.wiki_delete=刪除 Wiki 資料
+settings.wiki_delete=刪除百科資料
settings.wiki_delete_desc=刪除儲存庫 Wiki 資料是永久的且不可還原。
settings.wiki_delete_notices_1=- 這將會永久刪除與停用 %s 的儲存庫 Wiki。
-settings.confirm_wiki_delete=刪除 Wiki 資料
+settings.confirm_wiki_delete=刪除百科資料
settings.wiki_deletion_success=已刪除儲存庫的 Wiki 資料。
settings.delete=刪除此儲存庫
settings.delete_desc=刪除儲存庫是永久的且不可還原。
@@ -2167,7 +2196,7 @@ settings.webhook.payload=內容
settings.webhook.body=本體
settings.webhook.replay.description=再次執行此 Webhook。
settings.webhook.delivery.success=已將事件加入到傳送佇列,可能需要等待幾分鐘才會出現於傳送紀錄。
-settings.githooks_desc=Git Hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
+settings.githooks_desc=Git hook 是 Git 本身提供的功能。您可以在下方編輯 hook 檔案以設定自訂作業。
settings.githook_edit_desc=如果 Hook 未啟動,則會顯示範例文件中的內容。如果想要刪除某個 Hook,則送出空白內容即可。
settings.githook_name=Hook 名稱
settings.githook_content=Hook 內容
@@ -2218,15 +2247,15 @@ settings.event_pull_request_desc=建立、編輯、關閉及重新開放合併
settings.event_pull_request_assign=指派
settings.event_pull_request_assign_desc=指派或取消指派合併請求。
settings.event_pull_request_label=標籤
-settings.event_pull_request_label_desc=更新或清除合併請求標籤。
+settings.event_pull_request_label_desc=已新增或移除合併請求的標籤。
settings.event_pull_request_milestone=里程碑
settings.event_pull_request_milestone_desc=里程碑已新增、已移除或已修改。
settings.event_pull_request_comment=評註
settings.event_pull_request_comment_desc=建立、編輯或刪除合併請求的留言。
settings.event_pull_request_review=審核
-settings.event_pull_request_review_desc=核准、退回或提出審核留言。
+settings.event_pull_request_review_desc=合併請求已被核准、拒絕,或已有審查留言新增。
settings.event_pull_request_sync=同步
-settings.event_pull_request_sync_desc=合併請求同步。
+settings.event_pull_request_sync_desc=分支已自動與目標分支同步更新。
settings.event_package=軟體包
settings.event_package_desc=已在儲存庫中建立或刪除軟體包。
settings.branch_filter=分支篩選
@@ -2338,7 +2367,7 @@ settings.choose_branch=選擇一個分支…
settings.no_protected_branch=沒有受保護的分支。
settings.edit_protected_branch=編輯
settings.protected_branch_required_rule_name=必須填寫規則名稱
-settings.protected_branch_duplicate_rule_name=規則名稱已存在
+settings.protected_branch_duplicate_rule_name=已經存在一條針對這組分支的規則
settings.protected_branch_required_approvals_min=需要的核可數量不能為負數。
settings.tags=標籤
settings.tags.protection=標籤保護
@@ -2472,7 +2501,7 @@ release.tag_helper=新增或選擇現有的標籤。
release.tag_helper_new=新標籤,將在目標上建立此標籤。
release.tag_helper_existing=現有的標籤。
release.title_empty=標題不可為空。
-release.prerelease_desc=標記為 Pre-Release
+release.prerelease_desc=標記為預發行
release.prerelease_helper=標記此版本不適合生產使用。
release.cancel=取消
release.publish=發佈發行
@@ -2556,8 +2585,8 @@ tree_path_not_found_tag = 路徑 %[1]s 不存在於標籤 %[2]s 中
tree_path_not_found_commit = 路徑 %[1]s 不存在於提交 %[2]s 中
tree_path_not_found_branch = 路徑 %[1]s 不存在於分支 %[2]s 中
transfer.no_permission_to_accept = 您沒有權限接受這項轉讓。
-archive.title = 這個儲存庫被封存了。您可以檢視其中的檔案或是 Clone 它,但您無法推送提交,提出問題或合併請求。
-archive.title_date = 這個儲存庫在 %s 被封存了。您可以檢視其中的檔案或 clone 它,但您無法推送提交,提出問題或合併請求。
+archive.title = 這個儲存庫已被封存。您可以檢視其中的檔案或拓製儲存庫,但您無法提交推送和創建新議題、合併請求或評論。
+archive.title_date = 這個儲存庫在 %s 被封存了。您可以檢視其中的檔案或拓製儲存庫,但您無法提交推送和創建新議題、合併請求或評論。
migrate.forgejo.description = 從 codeberg.org 或其他 Forgejo 站點遷移資料。
migrate.cancel_migrating_title = 取消遷移
executable_file = 可執行檔
@@ -2605,7 +2634,7 @@ commits.search_branch = 此分支
commits.browse_further = 進一步瀏覽
commits.renamed_from = 自 %s 重新命名
issues.filter_milestone_none = 沒有里程碑
-issues.num_comments_1 = %s 則留言
+issues.num_comments_1 = %d 則留言
issues.no_content = 沒有提供敘述。
settings.new_owner_blocked_doer = 新的所有者已封鎖您。
new_repo_helper = 一個儲存庫包含專案的所有檔案和它們的修訂歷史。在別處已經有儲存庫了嗎?遷移儲存庫。
@@ -2615,10 +2644,10 @@ issues.filter_milestone_all = 所有里程碑
issues.author_helper = 此使用者是作者。
pulls.blocked_by_approvals = 此合併請求還沒有足夠的核可。已有 %d 個,總共需要 %d 個核可。
wiki.search = 搜尋百科
-settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定您的儲存庫以自動推送提交、標簽、和分支至另一個儲存庫。Pull 鏡像已被您的管理員停用。
+settings.mirror_settings.docs.disabled_pull_mirror.instructions = 設定你的專案使其自動將提交、標籤與分支推送到另一個儲存庫。您的網站管理員已停用拉取鏡像功能。
settings.mirror_settings.docs = 設定您的儲存庫以自動與另一個儲存庫同步提交、標籤、和分支。
settings.mirror_settings.docs.disabled_push_mirror.info = 推送鏡像已被您的網站管理員停用。
-settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個 pull 鏡像,請參閱:
+settings.mirror_settings.docs.pull_mirror_instructions = 如需建立一個拉取鏡像,請參閱:
blame.ignore_revs = .git-blame-ignore-revs 中的修訂已被忽略。點擊這裡來檢視一般的責任歸屬界面。
editor.file_is_a_symlink = `「%s」是一個符號連結。網頁編輯器無法編輯符號連結`
issues.label_archive = 封存標籤
@@ -2630,7 +2659,7 @@ pulls.showing_only_single_commit = 只顯示提交 %[1]s 的變更
pulls.cmd_instruction_merge_desc = 合併更改並在 Forgejo 上更新。
signing.wont_sign.pubkey = 無法簽署該提交,因為您沒有與您帳號連結的公鑰。
signing.wont_sign.twofa = 您必須啟用兩步驟認證才能簽署提交。
-signing.wont_sign.basesigned = 因為 base 提交沒有被簽署,無法簽署該提交。
+signing.wont_sign.basesigned = 合併將不會被簽署,因為其基礎提交尚未簽署。
settings.mirror_settings.docs.disabled_push_mirror.pull_mirror_warning = 目前,這個操作只能在「新的遷移」目錄完成。如需更多資訊,請參閱:
settings.mirror_settings.docs.disabled_push_mirror.instructions = 設定您的儲存庫以自動從另一個儲存庫拉取提交、標籤和分支。
issues.role.contributor_helper = 該使用者過去曾經提交至此儲存庫。
@@ -2643,14 +2672,14 @@ signing.wont_sign.error = 在檢查是否能簽署提交時發生錯誤。
issues.num_participants_one = %d 位參與者
pulls.showing_specified_commit_range = 只顯示 %[1]s 至 %[2]s 之間的變更
blame.ignore_revs.failed = 忽略 .git-blame-ignore-revs 中的修訂失敗。
-issues.blocked_by_user = 因為您被該儲存庫的所有者封鎖,您不能提出一個新的問題。
+issues.blocked_by_user = 因為您已被儲存庫擁有者封鎖,您無法在此儲存庫中建立問題。
pulls.blocked_by_user = 因為您被這個儲存庫的所有者封鎖,您不能在這裡開啟一個合併請求。
pulls.has_merged = 失敗:該合併請求已被合併,您無法再合併一次或更改目標分支。
wiki.cancel = 取消
activity.navbar.code_frequency = 寫程式頻率
settings.mirror_settings.docs.no_new_mirrors = 您的儲存庫目前是另一個儲存庫的鏡像。請記住,您目前不能建立新的鏡像。
settings.mirror_settings.docs.can_still_use = 雖然您不能建立新的鏡像,您還是可以使用既有的鏡像。
-pulls.reopen_failed.base_branch = 因為這個合併請求的 base 分支不存在,它無法被開啟。
+pulls.reopen_failed.base_branch = 因為這個合併請求的基礎分支不存在,它無法被開啟。
issues.label_archive_tooltip = 在預設情況下,標籤搜尋時會排除被封存的標籤。
signing.wont_sign.approved = 因為合併請求沒有被核可,這個合併不會被簽署。
activity.navbar.recent_commits = 最近的提交
@@ -2664,8 +2693,8 @@ signing.wont_sign.never = 永不簽署提交。
editor.push_out_of_date = 該推送似乎過期了。
issues.cancel_tracking_history = `已取消時間追蹤 %s`
issues.due_date_not_writer = 您需要有寫入這個儲存庫的權限才能更新其問題的到期日。
-pulls.commit_ref_at = `在提交 %[2]s 引用了這個合併請求`
-pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫 checkout 一個新的分支來測試這些更改。
+pulls.commit_ref_at = `在提交 %s 引用了這個合併請求`
+pulls.cmd_instruction_checkout_desc = 從您的專案儲存庫中,建立並切換到一個新分支以測試這些變更。
pulls.cmd_instruction_merge_title = 合併
pulls.ready_for_review = 可以開始審閱了嗎?
pulls.cmd_instruction_hint = `檢視命令列指示`
@@ -2690,7 +2719,7 @@ pulls.blocked_by_changed_protected_files_1 = 這個合併請求被暫止,因
pulls.blocked_by_changed_protected_files_n = 這個合併請求被暫止,因為它更改了這些受保護的檔案:
pulls.status_checks_hide_all = 隱藏所有檢查
pulls.status_checks_show_all = 顯示所有檢查
-pulls.reopen_failed.head_branch = 因為這個合併請求的 head 分支不存在,它無法被開啟。
+pulls.reopen_failed.head_branch = 因為這個合併請求的 HEAD 分支不存在,無法重新開啟此合併請求。
activity.navbar.pulse = 動態
signing.will_sign = 將以金鑰「%s」簽署這個提交。
signing.wont_sign.headsigned = 因為 head 提交沒有被簽署,這個合併不會被簽署。
@@ -2707,7 +2736,7 @@ pulls.show_changes_since_your_last_review = 顯示自您上次審閱的變更
pulls.blocked_by_rejection = 這個合併請求有正式審閱者所請求的更改。
pulls.blocked_by_official_review_requests = 因為這個合併請求還缺少至少一個正式審閱者的核可,它已被暫止。
wiki.original_git_entry_tooltip = 與其使用友善連結,檢視原始 Git 檔案。
-settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於 push 和 pull 鏡像的資訊:
+settings.mirror_settings.docs.more_information_if_disabled = 您可以在這裡找到更多關於推送和拉取鏡像的資訊:
settings.mirror_settings.docs.doc_link_title = 如何建立儲存庫鏡像?
settings.mirror_settings.docs.pulling_remote_title = 從遠端儲存庫拉取
issues.author.tooltip.pr = 此使用者是這個合併請求的作者。
@@ -2791,9 +2820,9 @@ settings.unarchive.text = 取消封存儲存庫將恢復其接收提交和推送
release.hide_archive_links = 隱藏自動產生的封存
settings.protect_no_valid_status_check_patterns = 沒有有效的狀態檢查式樣。
settings.enforce_on_admins = 為儲存庫管理員強制執行此規則
-settings.wiki_rename_branch_main_notices_2 = 這將永久重新命名儲存庫 %s 的 Wiki 的內部分支。現有的簽出將需要更新。
+settings.wiki_rename_branch_main_notices_2 = 這將永久重新命名儲存庫 %s 的百科的內部分支。現有的簽出將需要更新。
settings.discord_icon_url.exceeds_max_length = 圖示網址長度必須小於或等於 2048 個字符
-settings.wiki_branch_rename_success = 儲存庫 Wiki 的分支名稱已成功規範化。
+settings.wiki_branch_rename_success = 儲存庫百科的分支名稱已成功規範化。
commits.view_single_diff = 查看此提交中對此提交的變更
issues.new.assign_to_me = 指派給我
mirror_denied_combination = 不能組合使用公鑰和基於密碼的驗證。
@@ -2805,9 +2834,9 @@ settings.federation_following_repos = 關注儲存庫的網址。以半形分號
settings.federation_not_enabled = 你的站點上未啟用聯邦。
settings.federation_apapiurl = 此儲存庫的聯邦網址。將其複製並貼上至另一個儲存庫的聯邦設定中作為關注儲存庫的網址。
settings.enter_repo_name = 準確輸入擁有者和儲存庫名稱,如下所示:
-settings.wiki_rename_branch_main = 規範化 Wiki 分支名稱
-settings.wiki_branch_rename_failure = 無法規範化儲存庫 Wiki 的分支名稱。
-settings.confirm_wiki_branch_rename = 重新命名 Wiki 分支
+settings.wiki_rename_branch_main = 規範化百科分支名稱
+settings.wiki_branch_rename_failure = 無法規範化儲存庫百科的分支名稱。
+settings.confirm_wiki_branch_rename = 重新命名百科分支
settings.transfer_quota_exceeded = 新擁有者(%s)已超出配額。儲存庫尚未轉移。
settings.wiki_rename_branch_main_notices_1 = 此操作無法撤銷。
settings.push_mirror_sync_in_progress = 目前正在將變更推送至遠端 %s。
@@ -2818,13 +2847,13 @@ pulls.delete_after_merge.head_branch.is_protected = 你要刪除的頭分支是
pulls.delete_after_merge.head_branch.insufficient_branch = 你沒有權限刪除頭分支。
settings.pull_mirror_sync_in_progress = 目前正在從遠端 %s 拉取變更。
settings.pull_mirror_sync_quota_exceeded = 配額已超出,不拉取變更。
-settings.wiki_globally_editable = 允許任何人編輯 Wiki
+settings.wiki_globally_editable = 允許任何人編輯百科
settings.transfer_abort_success = 轉移儲存庫至 %s 已成功取消。
settings.add_collaborator_blocked_them = 無法新增協作者,因為他們已封鎖儲存庫擁有者。
settings.add_webhook.invalid_path = 路徑不能包含「.」、「..」或空字串。它不能以斜線開頭或結尾。
settings.webhook.test_delivery_desc_disabled = 要使用虛假事件測試此 Webhook,請啟動它。
settings.webhook.replay.description_disabled = 要重播此 Webhook,請啟動它。
-settings.wiki_rename_branch_main_desc = 將 Wiki 內部使用的分支重新命名為「%s」。此變更是永久性的,無法撤消。
+settings.wiki_rename_branch_main_desc = 將百科內部使用的分支重新命名為「%s」。此變更是永久性的,無法撤消。
settings.mirror_settings.push_mirror.copy_public_key = 複製公鑰
settings.default_update_style_desc = 用於更新落後於基礎分支的合併請求的預設更新模式。
summary_card_alt = 儲存庫 %s 的摘要卡
@@ -2858,12 +2887,40 @@ settings.units.units = 功能
diff.git-notes.add = 增加註釋
diff.git-notes.remove-header = 移除註釋
settings.event_pull_request_enforcement = 執行
-sync_fork.branch_behind_few = 此分支落後 %[2]s %[1]d 次提交
+sync_fork.branch_behind_few = 此分支落後 %[2]s 共 %[1]d 次提交
sync_fork.button = 同步
sync_fork.branch_behind_one = 此分支落後 %[2]s %[1]d 次提交
+issues.review.remove_review_requests = 移除了對 %[1]s 的審查請求 %[2]s
+issues.filter_no_results_placeholder = 嘗試調整您的搜尋篩選條件。
+issues.reaction.alt_add = 對留言添加 %[1]s 個反應。
+issues.reopen.blocked_by_user = 您無法重新開啟此問題,因為您已被儲存庫擁有者或此問題的發佈者封鎖。
+issues.filter_no_results = 沒有結果
+archive.nocomment = 您無法留言,因為此儲存庫已被封存。
+migrate.repo_desc_helper = 如欲匯入現有描述請留空
+comment.blocked_by_user = 您無法留言,因為您已被儲存庫擁有者或作者封鎖。
+pulls.editable_explanation = 此合併請求允許維護者進行編輯。您可以直接參與貢獻。
+pulls.agit_explanation = 此合併請求使用 AGit 工作流程建立。AGit 允許貢獻者透過「git push」提出變更,無需建立分支或分叉。
+issues.review.add_remove_review_requests = 請求 %[1]s 進行審查,並取消了對 %[2]s 的審查請求 %[3]s
+pulls.cmd_instruction_merge_warning = 警告:此儲存庫尚未啟用「自動偵測手動合併」設定,您之後需要手動標記此合併請求為已合併。
+issues.review.add_review_requests = 請求 %[1]s 進行審查 %[2]s
+settings.event_header_action = Action 執行事件
+settings.event_action_failure = 失敗
+settings.event_action_recover = 恢復
+settings.event_action_recover_desc = Action 執行成功,先前同一工作流程中的 Action 執行曾經失敗。
+settings.event_action_success = 成功
+settings.event_action_success_desc = Action 執行成功。
+settings.sourcehut_builds.manifest_path = 建置清單路徑
+settings.sourcehut_builds.visibility = 作業可見性
+settings.event_action_failure_desc = Action 執行以失敗結束。
+settings.protect_branch_name_pattern_desc = 受保護分支名稱的模式。請參閱文件說明以了解模式語法。範例:main、release/**
+settings.sourcehut_builds.access_token_helper = 具有 JOBS:RW 權限的存取權杖。請在 meta.sr.ht 上產生一個 builds.sr.ht 權杖,或一個 具有機密存取權限的 builds.sr.ht 權杖。
+settings.matrix.room_id_helper = 可從 Element 網頁版客戶端取得 Room ID:進入房間設定 > 進階 > Internal room ID。範例:%s。
+settings.web_hook_name_sourcehut_builds = SourceHut Builds
+diff.git-notes.remove-body = 此注釋將會被移除。
+settings.sourcehut_builds.secrets_helper = 授權此作業存取建置機密(需要 SECRETS:RO 權限)
[graphs]
-component_loading = %s載入中…
+component_loading = 正在載入 %s…
code_frequency.what = 寫程式頻率
recent_commits.what = 最近的提交
contributors.what = 貢獻
@@ -2906,7 +2963,7 @@ settings.permission=權限
settings.repoadminchangeteam=儲存庫管理者可增加與移除團隊權限
settings.visibility=瀏覽權限
settings.visibility.public=公開
-settings.visibility.limited=受限(只有已驗證的使用者才可以看到)
+settings.visibility.limited=受限(僅對已登入使用者可見)
settings.visibility.limited_shortname=受限
settings.visibility.private=私有(只有組織成員才能看到)
settings.visibility.private_shortname=私有
@@ -3082,8 +3139,8 @@ dashboard.total_gc_time=總 GC 暫停時間
dashboard.total_gc_pause=總 GC 暫停時間
dashboard.last_gc_pause=上次 GC 暫停時間
dashboard.gc_times=GC 執行次數
-dashboard.delete_old_actions=從資料庫刪除所有舊行為
-dashboard.delete_old_actions.started=從資料庫刪除所有舊行為的任務已啟動。
+dashboard.delete_old_actions=從資料庫刪除所有舊操作紀錄
+dashboard.delete_old_actions.started=從資料庫刪除所有舊操作紀錄的任務已啟動。
dashboard.update_checker=更新檢查器
dashboard.delete_old_system_notices=從資料庫刪除所有舊系統提示
dashboard.gc_lfs=對 LFS meta objects 進行垃圾回收
@@ -3103,7 +3160,7 @@ users.repos=儲存庫數
users.created=建立時間
users.last_login=上次登入
users.never_login=從未登入
-users.send_register_notify=寄送使用者註冊通知
+users.send_register_notify=透過電子郵件傳送註冊通知
users.new_success=已建立新帳號「%s」。
users.edit=編輯
users.auth_source=認證來源
@@ -3119,7 +3176,7 @@ users.prohibit_login=已停權帳號
users.is_admin=管理員帳號
users.is_restricted=受限制的帳號
users.allow_git_hook=可以建立 Git Hook
-users.allow_git_hook_tooltip=Git Hook 將以和 Forgejo 相同的作業系統使用者執行,並擁有同等的主機存取權限。因此擁有此特殊 Git Hook 權限的使用者可存取和修改所有的 Forgejo 儲存庫和 Forgejo 的資料庫。他們甚至能取得 Forgejo 的管理員權限。
+users.allow_git_hook_tooltip=Git hooks 會以執行 Forgejo 的作業系統使用者身分執行,並擁有相同等級的主機存取權限。因此,擁有此特殊 Git hook 權限的使用者,可以存取並修改所有 Forgejo 儲存庫,以及 Forgejo 使用的資料庫。換句話說,他們也具備取得 Forgejo 管理員權限的能力。
users.allow_import_local=可以匯入本地儲存庫
users.allow_create_organization=可以建立組織
users.update_profile=更新使用者帳號
@@ -3321,7 +3378,7 @@ config.custom_file_root_path=自訂檔案根路徑
config.domain=伺服器域名
config.offline_mode=本地模式
config.disable_router_log=停用路由日誌
-config.run_user=以使用者名稱執行
+config.run_user=以使用者執行
config.run_mode=執行模式
config.git_version=Git 版本
config.repo_root_path=儲存庫根路徑
@@ -3426,8 +3483,8 @@ config.enable_federated_avatar=啟用聯邦式大頭貼
config.git_config=Git 設定
config.git_disable_diff_highlight=停用比較語法高亮
-config.git_max_diff_lines=差異比較時顯示的最多行數 (單檔)
-config.git_max_diff_line_characters=差異比較時顯示的最多字元數 (單行)
+config.git_max_diff_lines=差異比較時顯示的最多行數
+config.git_max_diff_line_characters=差異比較時顯示的最多字元數
config.git_max_diff_files=差異比較時顯示的最多檔案數
config.git_gc_args=GC 參數
config.git_migrate_timeout=遷移逾時
@@ -3585,7 +3642,7 @@ mirror_sync_create=從鏡像同步了新參考 %[3]s 到 %[3]s 刪除了參考 %[2]s
approve_pull_request=`核可了 %[3]s#%[2]s`
reject_pull_request=`提出了修改建議 %[3]s#%[2]s`
-publish_release=`發布了 %[3]s 的 "%[4]s" `
+publish_release=`已於 %[3]s 發佈 %[4]s`
review_dismissed=`取消了 %[4]s 對 %[3]s#%[2]s 的審核`
review_dismissed_reason=原因:
create_branch=在 %[4]s 中建立了分支 %[3]s
@@ -3803,7 +3860,7 @@ arch.version.depends = 依賴
owner.settings.cargo.rebuild.no_index = 無法重建,未初始化任何索引。
cran.registry = 在你的 Rprofile.site
檔案中設定此註冊表:
debian.repository.distributions = 發行版
-owner.settings.chef.keypair.description = 需要金鑰對才能向 Chef 註冊表進行身份驗證。如果你之前已經產生過金鑰對,產生新的金鑰對將會丟棄舊的金鑰對。
+owner.settings.chef.keypair.description = 送往 Chef 註冊表的請求必須經過加密簽署,以作為驗證身分的方式。在產生金鑰對時,只有公鑰會儲存在 Forgejo 上,私鑰則會提供給你用於 knife 工具。產生新的金鑰對將會覆蓋先前的金鑰。
owner.settings.cargo.initialize.description = 使用 Cargo 註冊表需要一個特殊的索引 Git 儲存庫。使用此選項將會(重新)建立儲存庫並自動配置它。
rpm.repository.multiple_groups = 此套件可以在多個群組中使用。
rpm.distros.suse = 在基於 SUSE 的發行版上
@@ -3825,6 +3882,7 @@ registry.documentation = 有關 %s 註冊表的更多資訊,請參閱讀取:查看並建立問題與留言。
+releases.write = 寫入:發布、編輯與刪除發行版本及其資源。
+wiki.read = 讀取:查看整合的 Wiki 及其歷史紀錄。
+code.write = 寫入:推送到儲存庫,建立分支與標籤。
+code.read = 讀取:存取並複製此儲存庫的原始碼。
+issues.write = 寫入:關閉問題,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
+pulls.read = 讀取:查看並建立合併請求。
+pulls.write = 寫入:關閉合併請求,並管理標籤、里程碑、指派對象、到期日與依賴關係等中繼資料。
+releases.read = 讀取:檢視並下載發行版本。
+wiki.write = 寫入:在整合的 Wiki 中建立、更新與刪除頁面。
+projects.read = 讀取:存取儲存庫的專案看板。
+packages.write = 寫入:發布與刪除指派給此儲存庫的套件。
+projects.write = 寫入:建立專案與欄位,並編輯它們。
+packages.read = 讀取:檢視並下載指派給此儲存庫的套件。
+actions.read = 讀取:查看整合的 CI/CD 流程及其紀錄。
+actions.write = 寫入:手動觸發、重新啟動、取消或核准待處理的 CI/CD 流程。
\ No newline at end of file
diff --git a/options/locale_next/locale_bg.json b/options/locale_next/locale_bg.json
index 02144c8b38..1faf269aba 100644
--- a/options/locale_next/locale_bg.json
+++ b/options/locale_next/locale_bg.json
@@ -1,10 +1,89 @@
{
- "repo.pulls.merged_title_desc": {
- "one": "сля %[1]d подаване от %[2]s
в %[3]s
%[4]s",
- "other": "сля %[1]d подавания от %[2]s
в %[3]s
%[4]s"
- },
- "repo.pulls.title_desc": {
- "one": "иска да слее %[1]d подаване от %[2]s
в %[3]s
",
- "other": "иска да слее %[1]d подавания от %[2]s
в %[3]s
"
- }
+ "repo.pulls.merged_title_desc": {
+ "one": "сля %[1]d подаване от %[2]s
в %[3]s
%[4]s",
+ "other": "сля %[1]d подавания от %[2]s
в %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "иска да слее %[1]d подаване от %[2]s
в %[3]s
",
+ "other": "иска да слее %[1]d подавания от %[2]s
в %[3]s
"
+ },
+ "mail.actions.run_info_ref": "Клон: %[1]s (%[2]s)",
+ "mail.actions.run_info_trigger": "Задействано поради: %[1]s от: %[2]s",
+ "meta.last_line": "В България расте най-старото дърво в страната, Байкушевата мура, на възраст над 1300 години.",
+ "relativetime.1day": "вчера",
+ "relativetime.2months": "преди два месеца",
+ "home.explore_repos": "Разглеждане на хранилища",
+ "home.explore_users": "Разглеждане на потребители",
+ "home.explore_orgs": "Разглеждане на организации",
+ "relativetime.mins": {
+ "one": "преди %d минута",
+ "other": "преди %d минути"
+ },
+ "repo.form.cannot_create": "Всички пространства, в които можете да създавате хранилища, са достигнали лимита си на хранилища.",
+ "moderation.report_remarks": "Подробности",
+ "moderation.submit_report": "Изпращане на доклада",
+ "followers.incoming.list.self.none": "Никой не следва вашия профил.",
+ "followers.incoming.list.none": "Никой не следва този потребител.",
+ "relativetime.now": "сега",
+ "home.welcome.no_activity": "Няма дейност",
+ "relativetime.1year": "миналата година",
+ "moderation.abuse_category": "Категория",
+ "moderation.abuse_category.illegal_content": "Незаконно съдържание",
+ "home.welcome.activity_hint": "Все още няма нищо в емисията ви. Вашите действия и дейност от хранилищата, които наблюдавате, ще се появят тук.",
+ "stars.list.none": "Никой не е отбелязал това хранилище със звезда.",
+ "moderation.report_abuse_form.invalid": "Невалидни аргументи",
+ "moderation.report_abuse_form.already_reported": "Вече сте докладвали това съдържание",
+ "moderation.abuse_category.placeholder": "Изберете категория",
+ "moderation.abuse_category.spam": "Спам",
+ "repo.issue_indexer.title": "Индексатор на задачи",
+ "moderation.report_abuse_form.details": "Този формуляр трябва да се използва за докладване на потребители, които създават спам профили, хранилища, задачи, коментари или се държат неподходящо.",
+ "moderation.report_remarks.placeholder": "Моля, предоставете подробности относно злоупотребата, за която докладвате.",
+ "moderation.reporting_failed": "Не може да се изпрати новият доклад за злоупотреба: %v",
+ "moderation.reported_thank_you": "Благодарим ви за доклада. Администрацията е уведомена.",
+ "error.not_found.title": "Страницата не е намерена",
+ "incorrect_root_url": "Тази инстанция на Forgejo е конфигурирана да се сервира на \"%s\". В момента разглеждате Forgejo през друг URL адрес, което може да доведе до неправилно функциониране на части от приложението. Каноничният URL адрес се контролира от администраторите на Forgejo чрез настройката ROOT_URL в app.ini.",
+ "themes.names.forgejo-dark": "Forgejo тъмна",
+ "themes.names.forgejo-auto": "Forgejo (следване на системната тема)",
+ "themes.names.forgejo-light": "Forgejo светла",
+ "watch.list.none": "Никой не наблюдава това хранилище.",
+ "followers.outgoing.list.self.none": "Не следвате никого.",
+ "followers.outgoing.list.none": "%s не следва никого.",
+ "relativetime.future": "в бъдеще",
+ "relativetime.2days": "преди два дни",
+ "relativetime.1week": "миналата седмица",
+ "relativetime.2weeks": "преди две седмици",
+ "relativetime.1month": "миналия месец",
+ "relativetime.2years": "преди две години",
+ "moderation.report_abuse_form.header": "Докладване на злоупотреба до администратора",
+ "moderation.abuse_category.malware": "Зловреден софтуер",
+ "moderation.abuse_category.other_violations": "Други нарушения на правилата на платформата",
+ "alert.asset_load_failed": "Неуспешно зареждане на файлове с ресурси от {path}. Моля, уверете се, че файловете с ресурси са достъпни.",
+ "alert.range_error": " трябва да бъде число между %[1]s и %[2]s.",
+ "install.invalid_lfs_path": "Не може да се създаде LFS корен в посочения път: %[1]s",
+ "search.milestone_kind": "Търсене на етапи…",
+ "admin.config.moderation_config": "Конфигурация на модерацията",
+ "moderation.report_abuse": "Докладване на злоупотреба",
+ "moderation.report_content": "Докладване на съдържание",
+ "relativetime.hours": {
+ "one": "преди %d час",
+ "other": "преди %d часа"
+ },
+ "relativetime.days": {
+ "one": "преди %d ден",
+ "other": "преди %d дни"
+ },
+ "relativetime.weeks": {
+ "one": "преди %d седмица",
+ "other": "преди %d седмици"
+ },
+ "relativetime.months": {
+ "one": "преди %d месец",
+ "other": "преди %d месеца"
+ },
+ "relativetime.years": {
+ "one": "преди %d година",
+ "other": "преди %d години"
+ },
+ "editor.textarea.tab_hint": "Редът вече е с отстъп. Натиснете отново Tab или Escape, за да излезете от редактора.",
+ "editor.textarea.shift_tab_hint": "Няма отстъп на този ред. Натиснете отново Shift + Tab или Escape, за да излезете от редактора."
}
diff --git a/options/locale_next/locale_cs-CZ.json b/options/locale_next/locale_cs-CZ.json
index 95c230e37a..97a8536d4f 100644
--- a/options/locale_next/locale_cs-CZ.json
+++ b/options/locale_next/locale_cs-CZ.json
@@ -72,5 +72,38 @@
"one": "Před %d měsícem",
"few": "Před %d měsíci",
"other": "Před %d měsíci"
- }
+ },
+ "moderation.report_content": "Nahlásit obsah",
+ "moderation.report_abuse_form.details": "Tento formulář je určen k nahlašování uživatelů, kteří si vytvářejí spamové profily, repozitáře, problémy, komentáře nebo se chovají nevhodně.",
+ "admin.config.moderation_config": "Nastavení moderování",
+ "moderation.report_abuse": "Nahlásit zneužití",
+ "moderation.report_abuse_form.header": "Nahlásit zneužití administrátorovi",
+ "moderation.report_abuse_form.invalid": "Neplatné argumenty",
+ "moderation.report_abuse_form.already_reported": "Tento obsah jste již nahlásili",
+ "moderation.abuse_category": "Kategorie",
+ "moderation.submit_report": "Odeslat hlášení",
+ "moderation.reporting_failed": "Nepodařilo se odeslat nové hlášení zneužití: %v",
+ "moderation.report_remarks.placeholder": "Zadejte prosím podrobnosti o zneužití, které nahlašujete.",
+ "moderation.reported_thank_you": "Děkujeme za vaše hlášení. Správa platformy na ni byla upozorněna.",
+ "moderation.report_remarks": "Informace",
+ "moderation.abuse_category.placeholder": "Vyberte kategorii",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Nezákonný obsah",
+ "moderation.abuse_category.other_violations": "Jiné porušení pravidel platformy",
+ "repo.form.cannot_create": "Všechny prostory, ve kterých můžete vytvářet repozitáře, dosáhly svého limitu.",
+ "repo.issue_indexer.title": "Indexování problémů",
+ "watch.list.none": "Tento repozitář nikdo nesleduje.",
+ "followers.incoming.list.self.none": "Váš profil nikdo nesleduje.",
+ "followers.incoming.list.none": "Tohoto uživatele nikdo nesleduje.",
+ "followers.outgoing.list.none": "%s nikoho nesleduje.",
+ "stars.list.none": "Tento repozitář si nikdo nepřidal do oblíbených.",
+ "followers.outgoing.list.self.none": "Nikoho nesledujete.",
+ "editor.textarea.tab_hint": "Řádek je již odsazen. Pro opuštění editoru stiskněte znovu Tab nebo Escape.",
+ "editor.textarea.shift_tab_hint": "Na tomto řádku není žádné odsazení. Pro opuštění editoru stiskněte znovu Shift + Tab nebo Escape.",
+ "admin.dashboard.cleanup_offline_runners": "Vymazat offline runnery",
+ "settings.visibility.description": "Viditelnost profilu ovlivňuje možnost ostatních přistupovat k vašim veřejným repozitářům. Zjistit více",
+ "avatar.constraints_hint": "Velikost vlastního avataru nesmí překročit %[1]s nebo být větší než %[2]dx%[3]d pixelů",
+ "repo.diff.commit.next-short": "Další",
+ "repo.diff.commit.previous-short": "Předchozí"
}
diff --git a/options/locale_next/locale_da.json b/options/locale_next/locale_da.json
index 31e17c1d10..8315e06bcc 100644
--- a/options/locale_next/locale_da.json
+++ b/options/locale_next/locale_da.json
@@ -64,5 +64,38 @@
"other": "%d år siden"
},
"relativetime.2days": "2 dage siden",
- "relativetime.1month": "sidste måned"
+ "relativetime.1month": "sidste måned",
+ "repo.form.cannot_create": "Alle områder, hvor du kan oprette depoter, har nået grænsen for antal depoter.",
+ "repo.issue_indexer.title": "Problemindekser",
+ "moderation.report_remarks": "Bemærkninger",
+ "admin.config.moderation_config": "Moderationskonfiguration",
+ "moderation.report_abuse": "Rapportér misbrug",
+ "moderation.report_content": "Rapportér indhold",
+ "moderation.report_abuse_form.header": "Rapportér misbrug til administrator",
+ "moderation.report_abuse_form.details": "Denne formular skal bruges til at rapportere brugere, der opretter spamprofiler, arkiver, problemer, kommentarer eller opfører sig upassende.",
+ "moderation.report_abuse_form.invalid": "Ugyldige argumenter",
+ "moderation.report_abuse_form.already_reported": "Du har allerede rapporteret dette indhold",
+ "moderation.abuse_category": "Kategori",
+ "moderation.abuse_category.placeholder": "Vælg en kategori",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Ulovligt indhold",
+ "moderation.abuse_category.other_violations": "Andre overtrædelser af platformens regler",
+ "moderation.report_remarks.placeholder": "Angiv venligst nogle detaljer vedrørende det misbrug, du anmelder.",
+ "moderation.submit_report": "Indsend rapport",
+ "moderation.reporting_failed": "Den nye misbrugsrapport kunne ikke indsendes: %v",
+ "moderation.reported_thank_you": "Tak for din rapport. Administrationen er blevet gjort opmærksom på den.",
+ "stars.list.none": "Ingen har markeret dette depot med en stjerne.",
+ "watch.list.none": "Ingen ser dette depot.",
+ "followers.incoming.list.self.none": "Ingen følger din profil.",
+ "followers.incoming.list.none": "Ingen følger denne bruger.",
+ "followers.outgoing.list.self.none": "Du følger ikke nogen.",
+ "followers.outgoing.list.none": "%s følger ikke nogen.",
+ "editor.textarea.tab_hint": "Linjen er allerede indrykket. Tryk på Tab igen eller Escape for at forlade editoren.",
+ "editor.textarea.shift_tab_hint": "Ingen indrykning på denne linje. Tryk på Shift + Tab igen eller Escape for at forlade editoren.",
+ "admin.dashboard.cleanup_offline_runners": "Ryd op offline runners",
+ "settings.visibility.description": "Profilsynlighed påvirker andres adgang til dine ikke-private depoter. Læs mere",
+ "avatar.constraints_hint": "Brugerdefineret avatar må ikke overstige %[1]s i størrelse eller være større end %[2]dx%[3]d pixels",
+ "repo.diff.commit.next-short": "Næste",
+ "repo.diff.commit.previous-short": "Forrige"
}
diff --git a/options/locale_next/locale_de-DE.json b/options/locale_next/locale_de-DE.json
index cbc69826cb..3847de2b43 100644
--- a/options/locale_next/locale_de-DE.json
+++ b/options/locale_next/locale_de-DE.json
@@ -64,5 +64,43 @@
"other": "vor %d Minuten"
},
"relativetime.2days": "vorgestern",
- "relativetime.future": "in der Zukunft"
+ "relativetime.future": "in der Zukunft",
+ "admin.config.moderation_config": "Moderations-Konfiguration",
+ "moderation.report_abuse": "Missbrauch melden",
+ "moderation.report_content": "Inhalt melden",
+ "moderation.report_abuse_form.header": "Dem Administrator Missbrauch melden",
+ "moderation.report_abuse_form.details": "Dieses Formular soll genutzt werden um Benutzer zu melden die Spam-Profile, -Repositorys, -Issues, und -Kommentare erstellen, oder sich unangemessen verhalten.",
+ "moderation.report_abuse_form.invalid": "Ungültige Argumente",
+ "moderation.report_abuse_form.already_reported": "Du hast diesen Inhalt bereits gemeldet",
+ "moderation.abuse_category": "Kategorie",
+ "moderation.abuse_category.placeholder": "Eine Kategorie auswählen",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Illegaler Inhalt",
+ "moderation.abuse_category.other_violations": "Andere Verstöße gegen die Plattformregeln",
+ "moderation.report_remarks": "Anmerkungen",
+ "moderation.report_remarks.placeholder": "Bitte stelle Details über den von dir gemeldeten Missbrauch bereit.",
+ "moderation.submit_report": "Meldung absenden",
+ "moderation.reporting_failed": "Kann die neue Missbrauchsmeldung nicht absenden: %v",
+ "moderation.reported_thank_you": "Danke für deine Meldung. Die Administration wurde darüber in Kenntnis gesetzt.",
+ "repo.form.cannot_create": "Alle Orte, wo du Repositorys erstellen kannst, haben die Obergrenze an Repositorys erreicht.",
+ "repo.issue_indexer.title": "Issue-Indexer",
+ "watch.list.none": "Niemand beobachtet dieses Repo.",
+ "followers.incoming.list.self.none": "Niemand folgt deinem Profil.",
+ "followers.outgoing.list.self.none": "Du folgst niemanden.",
+ "followers.outgoing.list.none": "%s folgt niemanden.",
+ "stars.list.none": "Niemand hat dieses Repo favorisiert.",
+ "followers.incoming.list.none": "Niemand folgt diesem Benutzer.",
+ "editor.textarea.tab_hint": "Zeile bereits eingerückt. Drücke nochmals Tab oder Escape um den Editor zu verlassen.",
+ "editor.textarea.shift_tab_hint": "Keine Einrückung auf dieser Zeile. Drücke nochmals Shift + Tab oder Escape um den Editor zu verlassen.",
+ "admin.dashboard.cleanup_offline_runners": "Aufräumen der offline Runner",
+ "settings.visibility.description": "Die Profilsichtbarkeit beeinflusst die Möglichkeit anderer, auf deine nicht-privaten Repositorys zuzugreifen. Erfahre mehr",
+ "avatar.constraints_hint": "Individuelles Profilbild darf %[1]s in der Größe nicht überschreiten, und nicht größer als %[2]dx%[3]d Pixel sein",
+ "repo.diff.commit.next-short": "Nächste",
+ "repo.diff.commit.previous-short": "Vorherige",
+ "profile.edit.link": "Profil bearbeiten",
+ "feed.atom.link": "Atom-Feed",
+ "keys.ssh.link": "SSH-Schlüssel",
+ "keys.gpg.link": "GPG-Schlüssel",
+ "profile.actions.tooltip": "Mehr Aktionen"
}
diff --git a/options/locale_next/locale_en-US.json b/options/locale_next/locale_en-US.json
index ec5c313a90..b1c98e4551 100644
--- a/options/locale_next/locale_en-US.json
+++ b/options/locale_next/locale_en-US.json
@@ -4,6 +4,12 @@
"home.explore_repos": "Explore repositories",
"home.explore_users": "Explore users",
"home.explore_orgs": "Explore organizations",
+ "stars.list.none": "No one starred this repo.",
+ "watch.list.none": "No one is watching this repo.",
+ "followers.incoming.list.self.none": "No one is following your profile.",
+ "followers.incoming.list.none": "No one is following this user.",
+ "followers.outgoing.list.self.none": "You are not following anyone.",
+ "followers.outgoing.list.none": "%s isn't following anyone.",
"relativetime.now": "now",
"relativetime.future": "in future",
"relativetime.mins": {
@@ -46,6 +52,8 @@
"one": "wants to merge %[1]d commit from %[2]s
into %[3]s
",
"other": "wants to merge %[1]d commits from %[2]s
into %[3]s
"
},
+ "repo.form.cannot_create": "All spaces in which you can create repositories have reached the limit of repositories.",
+ "repo.issue_indexer.title": "Issue Indexer",
"search.milestone_kind": "Search milestones…",
"incorrect_root_url": "This Forgejo instance is configured to be served on \"%s\". You are currently viewing Forgejo through a different URL, which may cause parts of the application to break. The canonical URL is controlled by Forgejo admins via the ROOT_URL setting in the app.ini.",
"themes.names.forgejo-auto": "Forgejo (follow system theme)",
@@ -55,6 +63,11 @@
"alert.asset_load_failed": "Failed to load asset files from {path}. Please make sure the asset files can be accessed.",
"alert.range_error": " must be a number between %[1]s and %[2]s.",
"install.invalid_lfs_path": "Unable to create the LFS root at the specified path: %[1]s",
+ "profile.actions.tooltip": "More actions",
+ "profile.edit.link": "Edit profile",
+ "feed.atom.link": "Atom feed",
+ "keys.ssh.link": "SSH keys",
+ "keys.gpg.link": "GPG keys",
"admin.config.moderation_config": "Moderation configuration",
"moderation.report_abuse": "Report abuse",
"moderation.report_content": "Report content",
@@ -81,6 +94,13 @@
"mail.actions.run_info_previous_status": "Previous Run's Status: %[1]s",
"mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)",
"mail.actions.run_info_trigger": "Triggered because: %[1]s by: %[2]s",
+ "repo.diff.commit.next-short": "Next",
+ "repo.diff.commit.previous-short": "Prev",
"discussion.locked": "This discussion has been locked. Commenting is limited to contributors.",
+ "editor.textarea.tab_hint": "Line already indented. Press Tab again or Escape to leave the editor.",
+ "editor.textarea.shift_tab_hint": "No indentation on this line. Press Shift + Tab again or Escape to leave the editor.",
+ "admin.dashboard.cleanup_offline_runners": "Cleanup offline runners",
+ "settings.visibility.description": "Profile visibility affects others' ability to access your non-private repositories. Learn more",
+ "avatar.constraints_hint": "Custom avatar may not exceed %[1]s in size or be larger than %[2]dx%[3]d pixels",
"meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it."
}
diff --git a/options/locale_next/locale_fi-FI.json b/options/locale_next/locale_fi-FI.json
index b9e6208440..cb26d76e66 100644
--- a/options/locale_next/locale_fi-FI.json
+++ b/options/locale_next/locale_fi-FI.json
@@ -20,7 +20,7 @@
"themes.names.forgejo-dark": "Forgejo, tumma",
"alert.range_error": " täytyy olla numero välillä %[1]s ja %[2]s.",
"alert.asset_load_failed": "Staattisen tiedoston lataus kohteesta {path} epäonnistui. Varmista, että staattisiin tiedostoihin pääsee käsiksi.",
- "install.invalid_lfs_path": "LFS juurta ei voitu luoda polkuun: %[1]s",
+ "install.invalid_lfs_path": "LFS-juurta ei voitu luoda polkuun: %[1]s",
"mail.actions.not_successful_run_subject": "Työnkulku %[1]s epäonnistui tietovarastossa %[2]s",
"mail.actions.not_successful_run": "Työnkulku %[1]s epäonnistui tietovarastossa %[2]s",
"discussion.locked": "Tämä keskustelu on lukittu. Kommentointi on rajoitettu avustajille.",
@@ -57,7 +57,7 @@
"one": "%d viikko sitten",
"other": "%d viikkoa sitten"
},
- "meta.last_line": "Thank you for translating Forgejo! This line isn't seen by the users but it serves other purposes in the translation management. You can place a fun fact in the translation instead of translating it. Päivitä tämä käännös, jos luet tämän viestin.",
+ "meta.last_line": "Thank you for translating Forgejo! Päivitä tämä käännös, jos luet tämän viestin.",
"relativetime.2months": "kaksi kuukautta sitten",
"mail.actions.successful_run_after_failure_subject": "Työnkulku %[1]s palautettu tietovarastoon %[2]s",
"mail.actions.successful_run_after_failure": "Työnkulku %[1]s palautettu tietovarastoon %[2]s",
diff --git a/options/locale_next/locale_fil.json b/options/locale_next/locale_fil.json
index 649f9d7acb..884a7b44eb 100644
--- a/options/locale_next/locale_fil.json
+++ b/options/locale_next/locale_fil.json
@@ -21,7 +21,7 @@
"alert.asset_load_failed": "Nabigong i-load ang mga asset file mula sa {path}. Siguraduhin na maa-access ang mga asset file.",
"install.invalid_lfs_path": "Nabigong gawin ang LFS root sa tinakdang path: %[1]s",
"alert.range_error": " dapat ay numero sa pagitan ng %[1]s at %[2]s.",
- "meta.last_line": "Sayori... I love you. — MC from Doki Doki Literature Club",
+ "meta.last_line": "Every day, I imagine a future where I can be with you. In my hand is a pen that will write a poem of me and you. The ink flows down into a dark puddle... Just move your hand, write the way into his heart. But in this world of infinite choices. What will it take just to find that special day? Have I found everybody a fun assignment to do today? When you're here, everything that we do is fun for them anyway... When I can't even read my own feelings. What good are words when a smile says it all? And if this world won't write me an ending... What will it take just for me to have it all? Does my pen only write bitter words for those who are dear to me? Is it love if I take you, or is it love if I set you free? The ink flows down into a dark puddle... How can I write love into reality? If I can't hear the sound of your heartbeat What do you call love in your reality? And in your reality, if I don't know how to love you... I'll leave you be.",
"mail.actions.successful_run_after_failure": "Na-recover ang workflow na %[1]s sa repositoryong %[2]s",
"mail.actions.not_successful_run": "Nabigo ang workflow na %[1]s sa repositoryong %[2]s",
"mail.actions.run_info_previous_status": "Nakaraang Status ng Run: %[1]s",
@@ -64,5 +64,43 @@
},
"discussion.locked": "Naka-kandado ang pag-uusap na ito. Nilimitahan ang pagkomento sa mga tagatulong.",
"relativetime.1month": "nakaraang buwan",
- "relativetime.1year": "nakaraang taon"
+ "relativetime.1year": "nakaraang taon",
+ "moderation.report_abuse_form.details": "Dapat gamitin ang form na ito upang mag-ulat ng mga user na gumagawa ng mga spam na profile, repositoryo, isyu, komento, o kumikilos nang hindi naaangkop.",
+ "admin.config.moderation_config": "Pagsasaayos ng Moderation",
+ "moderation.report_abuse": "Mag-ulat ng pang aabuso",
+ "moderation.report_content": "Iulat ng nilalaman",
+ "moderation.report_abuse_form.header": "Mag-ulat ng pang aabuso sa tagapangasiwa",
+ "moderation.report_abuse_form.invalid": "Hindi wasto ang mga argumento",
+ "moderation.report_abuse_form.already_reported": "Inulat mo na ang nilalaman na ito",
+ "moderation.abuse_category": "Kategorya",
+ "moderation.abuse_category.placeholder": "Pumili ng kategorya",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Ilegal na nilalaman",
+ "moderation.abuse_category.other_violations": "Mga ibang paglabag sa mga patakaran ng platform",
+ "moderation.report_remarks": "Mga pahayag",
+ "moderation.report_remarks.placeholder": "Mangyaring magbigay ng mga detalye tungkol sa pang aabuso na inuulat mo.",
+ "moderation.submit_report": "I-submit ang ulat",
+ "moderation.reporting_failed": "Hindi ma-submit ang bagong ulat sa pang aabuso: %v",
+ "moderation.reported_thank_you": "Salamat sa iyong ulat. Naipaalam na ito sa administrasyon.",
+ "repo.form.cannot_create": "Naabot na ng lahat ng mga espasyo kung saan ka makakagawa ng mga repositoryo ang limitasyon ng mga repositoryo.",
+ "stars.list.none": "Wala pang nag-star ng repositoryong ito.",
+ "followers.incoming.list.self.none": "Walang sumusubaybay sa iyong profile.",
+ "repo.issue_indexer.title": "Indexer ng Isyu",
+ "watch.list.none": "Wala pang nanonood sa repositoryong ito.",
+ "followers.incoming.list.none": "Wala pang sumusunod sa user na ito.",
+ "followers.outgoing.list.self.none": "Hindi ka sumusunod ng anumang tao.",
+ "followers.outgoing.list.none": "Hindi sinusundan ni %s ang sinuman.",
+ "editor.textarea.tab_hint": "Naka-indent na ang linya. Pindutin ulit ang Tab o Escape para umalis sa editor.",
+ "editor.textarea.shift_tab_hint": "Walang indentation sa linyang ito. Pindutin ang Shift + Tab ulit o Escape para umalis sa editor.",
+ "admin.dashboard.cleanup_offline_runners": "Linisin ang mga offline na runner",
+ "settings.visibility.description": "Maaapektuhan ng visibility ng profile ang kakayahan ng iba na i-access ang iyong mga hindi pribadong repositoryo. Matuto pa",
+ "avatar.constraints_hint": "Hindi maaaring lumagpas sa laking %[1]s o mas malaki sa %[2]dx%[3]d pixel ang custom na avatar",
+ "repo.diff.commit.next-short": "Susunod",
+ "repo.diff.commit.previous-short": "Nakaraan",
+ "profile.edit.link": "I-edit ang profile",
+ "feed.atom.link": "Atom feed",
+ "keys.ssh.link": "Mga SSH key",
+ "keys.gpg.link": "Mga GPG key",
+ "profile.actions.tooltip": "Higit pang mga aksyon"
}
diff --git a/options/locale_next/locale_fr-FR.json b/options/locale_next/locale_fr-FR.json
index cff682b10a..da26d56107 100644
--- a/options/locale_next/locale_fr-FR.json
+++ b/options/locale_next/locale_fr-FR.json
@@ -6,7 +6,7 @@
},
"repo.pulls.title_desc": {
"one": "veut fusionner %[1]d commit depuis %[2]s
vers %[3]s
",
- "many": "souhaite fusionner %[1]d révision(s) depuis %[2]s
vers %[3]s
",
+ "many": "veut fusionner %[1]d commits depuis %[2]s
vers %[3]s
",
"other": ""
},
"search.milestone_kind": "Recherche dans les jalons…",
@@ -65,5 +65,43 @@
"error.not_found.title": "Page non trouvée",
"relativetime.1month": "le mois dernier",
"incorrect_root_url": "Cette instance Forgejo est configuré pour être servi sur \"%s\". Vous êtes actuellement en train de regarder Forgejo avec une URL différente, ce qui pourrait casser certaines parties de cette application. L'URL canonique est controllée par les administrateurs Forgejo grâce au paramètre ROOT_URL dans le app.ini.",
- "meta.last_line": "Merci de traduire Forgejo ! Cette ligne n'est pas vue par les utilisateurs mais sert à d'autres fins dans la gestion de la traduction. Vous pouvez mettre une fun fact dans la traduction au lieu de la traduire. Miaou."
+ "meta.last_line": "Merci de traduire Forgejo ! Cette ligne n'est pas vue par les utilisateurs mais sert à d'autres fins dans la gestion de la traduction. Vous pouvez mettre une fun fact dans la traduction au lieu de la traduire. Miaou.",
+ "mail.actions.successful_run_after_failure": "Workflow %[1]s récupéré dans le dépôt %[2]s",
+ "mail.actions.successful_run_after_failure_subject": "Workflow %[1]s récupéré dans le dépôt %[2]s",
+ "mail.actions.not_successful_run_subject": "Workflow %[1]s a raté dans le dépôt %[2]s",
+ "mail.actions.not_successful_run": "Workflow %[1]s raté dans le dépôt %[2]s",
+ "mail.actions.run_info_cur_status": "Statut de cette exécution : %[1]s (vient de se mettre à jour de %[2]s)",
+ "mail.actions.run_info_previous_status": "Précédent statut de l'éxecution : %[1]s",
+ "moderation.reported_thank_you": "Merci pour votre signalement. L'administration a été mise au courant.",
+ "admin.config.moderation_config": "Configuration de la modération",
+ "moderation.report_content": "Contenu du rapport",
+ "moderation.report_abuse": "Signaler un rapport",
+ "moderation.report_abuse_form.header": "Signaler le rapport à l'administrateur",
+ "moderation.report_abuse_form.details": "Ce formulaire devrait être utilisé pour signaler des utilisateurs qui spam des comptes, des dépôts, des questions, des commentaires ou qui se comportent de façon inappropriée.",
+ "moderation.report_abuse_form.invalid": "Arguments invalides",
+ "moderation.report_abuse_form.already_reported": "Vous avez déjà signalisé ce contenu",
+ "moderation.abuse_category": "Catégorie",
+ "moderation.abuse_category.placeholder": "Sélectionnez une catégorie",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "logiciel malveillant",
+ "moderation.abuse_category.illegal_content": "Contenu illégal",
+ "moderation.abuse_category.other_violations": "Autres infractions des règles de la plateforme",
+ "moderation.report_remarks": "Remarques",
+ "moderation.report_remarks.placeholder": "S'il vous plaît fournissez quelques détails en rapport avec l'abus que vous signalez.",
+ "moderation.submit_report": "Soumettre le signalement",
+ "moderation.reporting_failed": "Impossible de soumettre le nouveau signalement : %v",
+ "followers.incoming.list.self.none": "Personne ne suit votre profile.",
+ "followers.incoming.list.none": "Personne ne suit cet utilisateur.",
+ "followers.outgoing.list.self.none": "Vous ne suivez personne.",
+ "followers.outgoing.list.none": "%s ne vous suit plus.",
+ "repo.issue_indexer.title": "Indexeur de problèmes",
+ "stars.list.none": "Personne n'a mis d'étoiles sur ce dépôt.",
+ "watch.list.none": "Personne ne consulte ce dépôt.",
+ "repo.form.cannot_create": "Tous les espaces dans lesquels vous pouvez créer des dépôts ont atteint la limite de dépôts.",
+ "admin.dashboard.cleanup_offline_runners": "Nettoyer les exécuteurs hors ligne",
+ "mail.actions.run_info_trigger": "Déclenché parce que : %[1]s par : %[2]s",
+ "settings.visibility.description": "La visibilité du profil affecte la capacité des autres à accéder à vos dépôts non-privés. Voir plus",
+ "editor.textarea.shift_tab_hint": "Pas d'indentation sur cette ligne. Appuyez sur Maj + Tab une nouvelle fois ou sur Échap pour quitter l'éditeur.",
+ "avatar.constraints_hint": "L'avatar personnalisé ne doit pas dépasser une taille de %[1]s ou être plus grand que %[2]dx%[3]d pixels",
+ "editor.textarea.tab_hint": "Ligne déjà indentée. Appuyez sur Tab une nouvelle fois ou sur Échap pour quitter l'éditeur."
}
diff --git a/options/locale_next/locale_gl.json b/options/locale_next/locale_gl.json
index 0967ef424b..e83a2ecbd9 100644
--- a/options/locale_next/locale_gl.json
+++ b/options/locale_next/locale_gl.json
@@ -1 +1,39 @@
-{}
+{
+ "relativetime.now": "agora",
+ "relativetime.future": "máis adiante",
+ "repo.form.cannot_create": "Todos os espazos onde podes crear repositorios chegaron ao límite de repositorios creados.",
+ "followers.outgoing.list.self.none": "Non esas seguindo a ninguén.",
+ "followers.outgoing.list.none": "%s non está seguindo a ninguén.",
+ "relativetime.1day": "onte",
+ "relativetime.2days": "hai dous días",
+ "relativetime.1week": "a semana pasada",
+ "relativetime.2weeks": "hai dúas semanas",
+ "relativetime.1month": "hai un mes",
+ "relativetime.2months": "hai dous meses",
+ "relativetime.1year": "hai un ano",
+ "relativetime.2years": "hai dous anos",
+ "relativetime.mins": {
+ "one": "hai %d minuto",
+ "other": "hai %d minutos"
+ },
+ "relativetime.hours": {
+ "one": "hai %d hora",
+ "other": "hai %d horas"
+ },
+ "relativetime.days": {
+ "one": "hai %d día",
+ "other": "hai %d días"
+ },
+ "relativetime.weeks": {
+ "one": "hai %d semana",
+ "other": "hai %d semanas"
+ },
+ "relativetime.months": {
+ "one": "hai %d mes",
+ "other": "hai %d meses"
+ },
+ "relativetime.years": {
+ "one": "hai %d ano",
+ "other": "hai %d anos"
+ }
+}
diff --git a/options/locale_next/locale_it-IT.json b/options/locale_next/locale_it-IT.json
index 8bd6d811a0..8464d6244e 100644
--- a/options/locale_next/locale_it-IT.json
+++ b/options/locale_next/locale_it-IT.json
@@ -15,5 +15,83 @@
"home.welcome.no_activity": "Nessun'attività",
"home.explore_repos": "Esplora i repositori",
"home.explore_users": "Esplora l'utenza",
- "home.explore_orgs": "Esplora le organizzazioni"
+ "home.explore_orgs": "Esplora le organizzazioni",
+ "mail.actions.successful_run_after_failure_subject": "Il flusso di lavoro %[1] ha ripreso a funzionare nel repositorio %[2]s",
+ "mail.actions.not_successful_run_subject": "Il flusso di lavoro %[1]s è fallito nel repositorio %[2]s",
+ "relativetime.future": "nel futuro",
+ "relativetime.days": {
+ "one": "ieri",
+ "many": "%d giorni fa",
+ "other": "%d giorni fa"
+ },
+ "relativetime.1day": "ieri",
+ "repo.form.cannot_create": "Tutti gli spazi in cui puoi creare repositori hanno raggiunto il limite di repositori.",
+ "discussion.locked": "Questa discussione è stata bloccata. Solo i contributori possono commentare.",
+ "relativetime.hours": {
+ "one": "un'ora fa",
+ "many": "%d ore fa",
+ "other": "%d ore fa"
+ },
+ "relativetime.2years": "due anni fa",
+ "relativetime.now": "adesso",
+ "relativetime.weeks": {
+ "one": "una settimana fa",
+ "many": "%d settimane fa",
+ "other": "%d settimane fa"
+ },
+ "relativetime.months": {
+ "one": "un mese fa",
+ "many": "%d mesi fa",
+ "other": "%d mesi fa"
+ },
+ "relativetime.years": {
+ "one": "un anno fa",
+ "many": "%d anni fa",
+ "other": "%d anni fa"
+ },
+ "repo.issue_indexer.title": "Indicizzatore delle segnalazioni",
+ "admin.config.moderation_config": "Impostazioni di moderazione",
+ "moderation.report_abuse": "Segnala abuso",
+ "moderation.report_content": "Segnala contenuto",
+ "moderation.report_abuse_form.already_reported": "Hai già segnalato questo contenuto",
+ "moderation.abuse_category": "Categoria",
+ "moderation.abuse_category.placeholder": "Seleziona una categoria",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Contenuti illegali",
+ "moderation.abuse_category.other_violations": "Altre violazioni delle regole della piattaforma",
+ "moderation.report_remarks": "Note aggiuntive",
+ "moderation.report_remarks.placeholder": "Aggiungi dettagli riguardanti l'abuso che stai segnalando.",
+ "moderation.submit_report": "Invia segnalazione",
+ "error.not_found.title": "Pagina non trovata",
+ "themes.names.forgejo-auto": "Forgejo (segui le impostazioni di sistema)",
+ "stars.list.none": "Nessuno ha messo una stella a questo repo.",
+ "watch.list.none": "Nessuno sta osservando questo repo.",
+ "followers.incoming.list.self.none": "Nessuno sta seguendo il tuo profilo.",
+ "followers.incoming.list.none": "Nessuno sta seguendo questo utente.",
+ "followers.outgoing.list.self.none": "Non segui nessuno.",
+ "followers.outgoing.list.none": "%s non sta seguendo nessuno.",
+ "relativetime.2days": "due giorni fa",
+ "relativetime.2weeks": "due settimane fa",
+ "relativetime.1week": "la settimana scorsa",
+ "relativetime.1month": "il mese scorso",
+ "relativetime.2months": "due mesi fa",
+ "relativetime.1year": "l'anno scorso",
+ "moderation.report_abuse_form.header": "Segnala abuso all'amministratore",
+ "moderation.report_abuse_form.details": "Questo modulo dovrebbe essere utilizzato per segnalare utenti che creano profili, repositori, segnalazioni o commenti spam o che si comportano in modo non adeguato.",
+ "moderation.report_abuse_form.invalid": "Argomenti non validi",
+ "moderation.reporting_failed": "Impossibile inviare segnalazione: %v",
+ "moderation.reported_thank_you": "Grazie per la segnalazione. L'amministratore è stato avvertito.",
+ "mail.actions.run_info_ref": "Ramo: %[1]s (%[2]s)",
+ "alert.asset_load_failed": "Impossibile caricare i file di risorsa da {path}. Controlla che i file di risorsa siano accessibili.",
+ "install.invalid_lfs_path": "Non è possibile creare una root LFS nel percorso specificato: %[1]s",
+ "home.welcome.activity_hint": "Non c'è nulla nel tuo feed. Le tue azioni e le attività dei repositori che segui verranno mostrate qui.",
+ "relativetime.mins": {
+ "one": "un minuto fa",
+ "many": "%d minuti fa",
+ "other": "%d minuti fa"
+ },
+ "editor.textarea.tab_hint": "Linea già indentata. Premi di nuovo Tab o Esc per uscire dall'editor.",
+ "repo.diff.commit.previous-short": "Precedente",
+ "meta.last_line": "Ambaraba cicci cocco."
}
diff --git a/options/locale_next/locale_lv-LV.json b/options/locale_next/locale_lv-LV.json
index 66224cd567..f71cfa227d 100644
--- a/options/locale_next/locale_lv-LV.json
+++ b/options/locale_next/locale_lv-LV.json
@@ -72,5 +72,38 @@
"one": "pirms %d nedēļas",
"other": "pirms %d nedēļām"
},
- "relativetime.1month": "iepriekšējā mēnesī"
+ "relativetime.1month": "iepriekšējā mēnesī",
+ "moderation.abuse_category.other_violations": "Citi noteikumu pārkāpumi",
+ "moderation.reported_thank_you": "Paldies par ziņojumu! Pārvaldītājiem ir darīts zināms par to.",
+ "admin.config.moderation_config": "Satura pārraudzības konfigurācija",
+ "moderation.report_abuse": "Ziņot par pārkāpumu",
+ "moderation.report_content": "Ziņot par saturu",
+ "moderation.report_abuse_form.header": "Ziņot pārvaldītājam par pārkāpumu",
+ "moderation.report_abuse_form.details": "Šī veidlapa ir izmantojama, lai ziņotu par lietotājiem, kuri izveido mēstuļošanas profilus, glabātavas, pieteikumus un piebildes vai uzvedas nepienācīgi.",
+ "moderation.report_abuse_form.invalid": "Nederīgi argumenti",
+ "moderation.report_abuse_form.already_reported": "Tu jau ziņoji par šo saturu",
+ "moderation.abuse_category": "Kategorija",
+ "moderation.abuse_category.placeholder": "Atlasīt kategoriju",
+ "moderation.abuse_category.spam": "Mēstuļošana",
+ "moderation.abuse_category.malware": "Ļaunatūra",
+ "moderation.abuse_category.illegal_content": "Nelikumīgs saturs",
+ "moderation.report_remarks": "Piezīmes",
+ "moderation.report_remarks.placeholder": "Lūgums sniegt informāciju par pārkāpumu, par ko ziņo.",
+ "moderation.submit_report": "Iesniegt ziņojumu",
+ "moderation.reporting_failed": "Nevar iesniegt jauno ziņojumu par pārkāpumu: %v",
+ "repo.form.cannot_create": "Visas vietas, kurās vari izveidot glabātavas, ir sasniegušas glabātavu skaita ierobežojumu.",
+ "repo.issue_indexer.title": "Pieteikumu indeksētājs",
+ "watch.list.none": "Neviens nevēro šo glabātavu.",
+ "followers.incoming.list.none": "Neviens neseko šim lietotājam.",
+ "followers.outgoing.list.self.none": "Tu nevienam neseko.",
+ "followers.outgoing.list.none": "%s nevienam neseko.",
+ "stars.list.none": "Neviens šo glabātavu nav atzīmējis ar zvaigzni.",
+ "followers.incoming.list.self.none": "Neviens neseko Tavam profilam.",
+ "editor.textarea.tab_hint": "Rinda jau ir ar atkāpi. Spied Tab vēlreiz vai Escape, lai izietu no redaktora!",
+ "editor.textarea.shift_tab_hint": "Šajā rindā nav atkāpes. Spied Shift + Tab vēlreiz vai Escape, lai izietu no redaktora!",
+ "admin.dashboard.cleanup_offline_runners": "Notīrīt bezsaistes izpildītājus",
+ "settings.visibility.description": "Profila redzamība ietekmē iespēju citiem piekļūt Tavām glabātavām, kas nav privātas. Uzzināt vairāk",
+ "avatar.constraints_hint": "Pielāgots profila attēls nevar pārsniegt %[1]s vai būt lielāks par %[2]dx%[3]d pikseļiem",
+ "repo.diff.commit.next-short": "Nāk.",
+ "repo.diff.commit.previous-short": "Iepr."
}
diff --git a/options/locale_next/locale_nds.json b/options/locale_next/locale_nds.json
index 52c3194bfd..24268e2082 100644
--- a/options/locale_next/locale_nds.json
+++ b/options/locale_next/locale_nds.json
@@ -64,5 +64,43 @@
"one": "vör %d Dag",
"other": "vör %d Dagen"
},
- "relativetime.2days": "vörgüstern"
+ "relativetime.2days": "vörgüstern",
+ "moderation.report_abuse": "Missbruuk mellen",
+ "moderation.report_content": "Inholl mellen",
+ "moderation.report_abuse_form.invalid": "Ungültige Argumenten",
+ "moderation.report_abuse_form.already_reported": "Du hest deesen Inholl al mellt",
+ "moderation.abuse_category": "Deel",
+ "moderation.abuse_category.placeholder": "Köör een Deel ut",
+ "moderation.abuse_category.spam": "Oolkert-Tüüg",
+ "moderation.abuse_category.illegal_content": "Verboden Inholl",
+ "moderation.abuse_category.other_violations": "Anner Verstöten tegen de Plattfoorms-Regels",
+ "moderation.report_remarks": "Anmarkens",
+ "moderation.submit_report": "Mellen ofschicken",
+ "moderation.reporting_failed": "Kann dat neje Missbruuk-Mellen nich ofschicken: %v",
+ "moderation.reported_thank_you": "Wees bedankt för dien Mellen. De Sied-Chefs hebben de Naricht daaröver kregen.",
+ "moderation.report_remarks.placeholder": "Bidde giff mehr Informatioonen över de Missbruuk, wat du mellst, an.",
+ "admin.config.moderation_config": "Moderatioons-Instellens",
+ "moderation.report_abuse_form.header": "Missbruuk an de Chef mellen",
+ "moderation.report_abuse_form.details": "Deeses Formular kann bruukt worden, um Brukers to mellen, wenn se Oolkert-Profilen, -Repositoriums, -Gefallens of -Kommentaren maken of sik unanstännig verhollen.",
+ "moderation.abuse_category.malware": "Schaa-Waar",
+ "repo.form.cannot_create": "All Rumen, waar du Repositoriums maken kannst, enthollen al de grootste Tahl vun verlöövt Repositoriums.",
+ "repo.issue_indexer.title": "Gefallen-Indizerer",
+ "followers.outgoing.list.none": "%s gaht nüms na.",
+ "watch.list.none": "Nüms beluurt deeses Repositorium.",
+ "followers.incoming.list.self.none": "Nüms gaht dienem Profil na.",
+ "followers.incoming.list.none": "Nüms gaht deesem Bruker na.",
+ "followers.outgoing.list.self.none": "Du gahst nüms na.",
+ "stars.list.none": "Nüms hett up deesem Repositorium eenen Steern sett.",
+ "editor.textarea.tab_hint": "Rieg al inschuven. Drück weer Tab of Esc, um de Bewarker to verlaten.",
+ "editor.textarea.shift_tab_hint": "Keen Inschuuv in deeser Rieg. Drück weer Umschalt+Tab of Esc, um de Bewarker to verlaten.",
+ "admin.dashboard.cleanup_offline_runners": "Nich verbunnen Lopers uprümen",
+ "settings.visibility.description": "De Profil-Sichtbaarkeid maakt daar wat an, of un wo anner Lüü diene nich-privaaten Repositoriums ankieken könen. Mehr unnerhören",
+ "avatar.constraints_hint": "Dat eegene Kontobill düür nich groter as %[1]s wesen of groter as %[2]d×%[3]d Billtüttels wesen",
+ "repo.diff.commit.next-short": "Anner",
+ "repo.diff.commit.previous-short": "Vörig",
+ "feed.atom.link": "Atom-Schuuv",
+ "keys.ssh.link": "SSH-Slötels",
+ "keys.gpg.link": "GPG-Slötels",
+ "profile.actions.tooltip": "Mehr Aktioonen",
+ "profile.edit.link": "Profil bewarken"
}
diff --git a/options/locale_next/locale_nl-NL.json b/options/locale_next/locale_nl-NL.json
index 52971e734a..4f109825aa 100644
--- a/options/locale_next/locale_nl-NL.json
+++ b/options/locale_next/locale_nl-NL.json
@@ -1,11 +1,11 @@
{
"repo.pulls.merged_title_desc": {
"one": "heeft %[1]d commit van %[2]s
samengevoegd in %[3]s
%[4]s",
- "other": "heeft %[1]d commits samengevoegd van %[2]s
naar %[3]s
%[4]s"
+ "other": "heeft %[1]d commits van %[2]s
samengevoegd in %[3]s
%[4]s"
},
"repo.pulls.title_desc": {
"one": "wil %[1]d commit van %[2]s
samenvoegen in %[3]s
",
- "other": "wil %[1]d commits van %[2]s
samenvoegen met %[3]s
"
+ "other": "wil %[1]d commits van %[2]s
samenvoegen in %[3]s
"
},
"search.milestone_kind": "Zoek mijlpalen…",
"home.welcome.no_activity": "Geen activiteit",
@@ -13,22 +13,84 @@
"home.explore_repos": "Verken repositories",
"home.explore_users": "Verken gebruikers",
"home.explore_orgs": "Verken organisaties",
- "incorrect_root_url": "Deze Forgejo-instantie is geconfigureerd om geserveerd te worden op \"%s\". U bekijkt Forgejo momenteel via een andere URL, waardoor onderdelen van de applicatie kunnen breken. De canonieke URL kan worden gewijzigd door Forgejo admins via de ROOT_URL instelling in de app.ini.",
+ "incorrect_root_url": "Deze Forgejo-instantie is geconfigureerd om bereikbaar te zijn op \"%s\". U bekijkt Forgejo momenteel via een andere URL, waardoor onderdelen van de applicatie kunnen breken. De canonieke URL kan worden gewijzigd door Forgejo admins via de ROOT_URL instelling in de app.ini.",
"themes.names.forgejo-auto": "Forgejo (volg het systeemthema)",
"themes.names.forgejo-light": "Forgejo licht",
"themes.names.forgejo-dark": "Forgejo donker",
"error.not_found.title": "Pagina niet gevonden",
- "alert.asset_load_failed": "Het laden van asset-bestanden van {path} is mislukt. Controleer of de asset-bestanden toegankelijk zijn.",
- "install.invalid_lfs_path": "Kan de LFS-root niet aanmaken op het opgegeven pad: %[1]s",
+ "alert.asset_load_failed": "Het laden van hulp-bestanden vanuit {path} is mislukt. Controleer of de hulp-bestanden toegankelijk zijn.",
+ "install.invalid_lfs_path": "Kan de LFS-root niet aanmaken op de opgegeven locatie: %[1]s",
"alert.range_error": " moet een getal zijn tussen %[1]s en %[2]s.",
"meta.last_line": "Wist je dat de paprika, behalve in de bekende kleuren rood, geel, oranje en groen, ook in de kleuren wit, paars, lila, muntgroen en bruin voorkomt.",
- "mail.actions.successful_run_after_failure_subject": "Werkstroom %[1]s hersteld in repository %[2]s",
- "mail.actions.not_successful_run_subject": "Werkstroom %[1]s mislukt in repository %[2]s",
- "mail.actions.successful_run_after_failure": "Werkstroom %[1]s hersteld in repository %[2]s",
- "mail.actions.not_successful_run": "Werkstroom %[1]s mislukt in repository %[2]s",
+ "mail.actions.successful_run_after_failure_subject": "Werkstroom %[1]s hersteld in repositorie %[2]s",
+ "mail.actions.not_successful_run_subject": "Werkstroom %[1]s mislukt in repositorie %[2]s",
+ "mail.actions.successful_run_after_failure": "Werkstroom %[1]s hersteld in repositorie %[2]s",
+ "mail.actions.not_successful_run": "Werkstroom %[1]s mislukt in repositorie %[2]s",
"mail.actions.run_info_cur_status": "De status van deze run: %[1]s (zojuist bijgewerkt van %[2]s)",
"mail.actions.run_info_previous_status": "Status vorige run: %[1]s",
"mail.actions.run_info_ref": "Branch: %[1]s (%[2]s)",
"mail.actions.run_info_trigger": "Getriggerd omdat: %[1]s door: %[2]s",
- "discussion.locked": "Deze discussie is gesloten. Commentaar is beperkt tot bijdragers."
+ "discussion.locked": "Deze discussie is afgesloten. Commentaar is alleen mogelijk voor bijdragers.",
+ "relativetime.now": "nu",
+ "relativetime.future": "in de toekomst",
+ "repo.form.cannot_create": "Alle ruimtes waarin u repositories kan maken hebben hun maximum aantal repositories bereikt.",
+ "moderation.report_content": "Meldt content",
+ "moderation.report_abuse_form.header": "Meld misbruik bij de beheerder",
+ "moderation.report_abuse_form.invalid": "Ongeldige argumenten",
+ "moderation.report_abuse_form.already_reported": "U heeft deze content reeds gerapporteerd",
+ "moderation.abuse_category": "Categorie",
+ "moderation.abuse_category.placeholder": "Selecteer een categorie",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.report_abuse_form.details": "Dit formulier dient gebruikt te worden om gebruikers te rapporteren die spamprofielen, -issues, -commentaren aanmaken of zich anderszins misdragen.",
+ "moderation.submit_report": "Verzend rapport",
+ "moderation.reporting_failed": "De nieuwe misbruikrapportage kan niet worden ingediend: %v",
+ "moderation.reported_thank_you": "Dank voor uw melding. Het beheer is hierover nu geïnformeerd.",
+ "moderation.report_remarks.placeholder": "Geef a.u.b. wat details betreffende het misbruik dat u meldt.",
+ "followers.outgoing.list.none": "%s volgt niemand.",
+ "relativetime.1day": "gisteren",
+ "relativetime.2days": "twee dagen geleden",
+ "relativetime.1week": "vorige week",
+ "relativetime.2weeks": "twee weken geleden",
+ "relativetime.1month": "vorige maand",
+ "relativetime.2months": "twee maanden geleden",
+ "relativetime.1year": "vorig jaar",
+ "relativetime.2years": "twee jaar geleden",
+ "moderation.abuse_category.illegal_content": "Illegale content",
+ "moderation.abuse_category.other_violations": "Andere overtreding van platformregels",
+ "moderation.report_remarks": "Opmerkingen",
+ "editor.textarea.tab_hint": "Regel springt reeds in. Type Tab nogmaals of Escape om de editor te verlaten.",
+ "editor.textarea.shift_tab_hint": "Geen inspringing op deze regel. Type Shift + Tab nogmaals of Escape om de editor te verlaten.",
+ "relativetime.days": {
+ "one": "%d dag geleden",
+ "other": "%d dagen geleden"
+ },
+ "relativetime.weeks": {
+ "one": "%d week geleden",
+ "other": "%d weken geleden"
+ },
+ "relativetime.months": {
+ "one": "%d maand geleden",
+ "other": "%d maanden geleden"
+ },
+ "relativetime.years": {
+ "one": "%d jaar geleden",
+ "other": "%d jaren geleden"
+ },
+ "admin.config.moderation_config": "Moderatie configuratie",
+ "moderation.report_abuse": "Meld misbruik",
+ "relativetime.mins": {
+ "one": "%d minuut geleden",
+ "other": "%d minuten geleden"
+ },
+ "relativetime.hours": {
+ "one": "%d uur geleden",
+ "other": "%d uren geleden"
+ },
+ "repo.issue_indexer.title": "Issue indexer",
+ "stars.list.none": "Niemand heeft deze repo een ster gegeven.",
+ "watch.list.none": "Niemand houdt deze repo in de gaten.",
+ "followers.incoming.list.self.none": "Niemand volgt uw profiel.",
+ "followers.incoming.list.none": "Deze gebruiker wordt door niemand gevolgd.",
+ "followers.outgoing.list.self.none": "U volgt niemand."
}
diff --git a/options/locale_next/locale_pt-BR.json b/options/locale_next/locale_pt-BR.json
index a1fc84fc90..1a5eca6d34 100644
--- a/options/locale_next/locale_pt-BR.json
+++ b/options/locale_next/locale_pt-BR.json
@@ -72,5 +72,38 @@
"other": "%d horas atrás"
},
"relativetime.2weeks": "duas semanas atrás",
- "relativetime.now": "agora"
+ "relativetime.now": "agora",
+ "moderation.reported_thank_you": "Agradecemos pela sua denúncia. A administração foi notificada.",
+ "moderation.report_content": "Denunciar conteúdo",
+ "admin.config.moderation_config": "Configuração de moderação",
+ "moderation.report_abuse": "Denunciar abuso",
+ "moderation.report_abuse_form.header": "Denunciar abuso à administração",
+ "moderation.report_abuse_form.invalid": "Argumentos inválidos",
+ "moderation.report_abuse_form.already_reported": "Você já denunciou este conteúdo",
+ "moderation.abuse_category": "Categoria",
+ "moderation.abuse_category.placeholder": "Selecione uma categoria",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Conteúdo ilegal",
+ "moderation.abuse_category.other_violations": "Outras violações de regras da plataforma",
+ "moderation.report_remarks": "Observações",
+ "moderation.report_remarks.placeholder": "Por favor, forneça detalhes sobre o abuso que você está denunciando.",
+ "moderation.submit_report": "Enviar denúncia",
+ "moderation.reporting_failed": "Não foi possível enviar a denúncia: %v",
+ "moderation.report_abuse_form.details": "Este formulário deve ser utilizado para denunciar contas com perfis, repositórios, issues e comentários com spam ou que se comportam inapropriadamente.",
+ "repo.form.cannot_create": "Todos os espaços onde você pode criar repositórios atingiram o limite de repositórios.",
+ "repo.issue_indexer.title": "Indexador de Issues",
+ "watch.list.none": "Ninguém está observando este repositório.",
+ "followers.incoming.list.self.none": "Ninguém está seguindo seu perfil.",
+ "followers.incoming.list.none": "Ninguém está seguindo este perfil.",
+ "followers.outgoing.list.none": "%s não está seguindo ninguém.",
+ "stars.list.none": "Ninguém favoritou este repositório.",
+ "followers.outgoing.list.self.none": "Você não está seguindo ninguém.",
+ "editor.textarea.tab_hint": "Linha já indentada. Pressione Tab novamente ou Esc para sair do editor.",
+ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Esc para sair do editor.",
+ "admin.dashboard.cleanup_offline_runners": "Limpar runners desconectados",
+ "avatar.constraints_hint": "Imagem de perfil personalizada não pode exceder %[1]s em tamanho ou ser maior que %[2]dx%[3]d pixels",
+ "settings.visibility.description": "A visibilidade do perfil afeta a habilidade de acessarem seus repositórios não-privados. Saiba mais",
+ "repo.diff.commit.next-short": "Próximo",
+ "repo.diff.commit.previous-short": "Anterior"
}
diff --git a/options/locale_next/locale_pt-PT.json b/options/locale_next/locale_pt-PT.json
index 02d8087314..78e6dc4493 100644
--- a/options/locale_next/locale_pt-PT.json
+++ b/options/locale_next/locale_pt-PT.json
@@ -72,5 +72,36 @@
"other": "%d horas atrás"
},
"relativetime.1week": "semana passada",
- "relativetime.1day": "ontem"
+ "relativetime.1day": "ontem",
+ "moderation.report_remarks.placeholder": "Por favor forneça alguns pormenores sobre o abuso que está a denunciar.",
+ "admin.config.moderation_config": "Configuração de moderação",
+ "moderation.report_abuse": "Denunciar abuso",
+ "moderation.report_content": "Denunciar conteúdo",
+ "moderation.report_abuse_form.header": "Denunciar abuso à administração",
+ "moderation.report_abuse_form.details": "Este formulário deve ser utilizado para denunciar utilizadores que criam perfis, repositórios, questões, comentários de spam ou que se comportam de forma inadequada.",
+ "moderation.report_abuse_form.invalid": "Argumentos inválidos",
+ "moderation.report_abuse_form.already_reported": "Já denunciou este conteúdo",
+ "moderation.abuse_category": "Categoria",
+ "moderation.abuse_category.placeholder": "Escolha uma categoria",
+ "moderation.abuse_category.spam": "Spam",
+ "moderation.abuse_category.malware": "Malware",
+ "moderation.abuse_category.illegal_content": "Conteúdo ilegal",
+ "moderation.abuse_category.other_violations": "Outras violações das regras da plataforma",
+ "moderation.report_remarks": "Observações",
+ "moderation.submit_report": "Submeter denúncia",
+ "moderation.reporting_failed": "Não foi possível submeter a nova denúncia de abuso: %v",
+ "moderation.reported_thank_you": "Obrigado pela sua denúncia. A administração foi informada do facto.",
+ "repo.form.cannot_create": "Todos os espaços nos quais pode criar repositórios atingiram o limite de repositórios.",
+ "repo.issue_indexer.title": "Indexador de Questões",
+ "watch.list.none": "Ninguém está a vigiar este repositório.",
+ "followers.incoming.list.self.none": "Ninguém está a seguir o seu perfil.",
+ "followers.incoming.list.none": "Ninguém está a seguir este utilizador.",
+ "followers.outgoing.list.none": "%s não está a seguir ninguém.",
+ "followers.outgoing.list.self.none": "Não está a seguir ninguém.",
+ "editor.textarea.tab_hint": "Linha já indentada. Pressione Tab novamente ou Escape para sair do editor.",
+ "editor.textarea.shift_tab_hint": "Sem indentação nesta linha. Pressione Shift + Tab novamente ou Escape para sair do editor.",
+ "stars.list.none": "Ninguém juntou este repositório aos favoritos.",
+ "admin.dashboard.cleanup_offline_runners": "Limpeza de executores offline",
+ "settings.visibility.description": "A visibilidade do perfil afecta a capacidade de outros acederem aos seus repositórios não privados. Ler mais",
+ "avatar.constraints_hint": "O avatar personalizado não pode exceder %[1]s de tamanho ou ser maior do que %[2]dx%[3]d pixéis"
}
diff --git a/options/locale_next/locale_ru-RU.json b/options/locale_next/locale_ru-RU.json
index 86011f8ac9..922e2612af 100644
--- a/options/locale_next/locale_ru-RU.json
+++ b/options/locale_next/locale_ru-RU.json
@@ -23,7 +23,7 @@
"alert.asset_load_failed": "Не удалось получить ресурсы из {path}. Убедитесь, что файлы ресурсов доступны.",
"install.invalid_lfs_path": "Не удалось расположить корень LFS по указанному пути: %[1]s",
"alert.range_error": " - число должно быть в диапазоне от %[1]s-%[2]s.",
- "meta.last_line": "Triggering CI skip again.",
+ "meta.last_line": "Unskip..",
"mail.actions.not_successful_run_subject": "Провал раб. потока %[1]s в репозитории %[2]s",
"mail.actions.successful_run_after_failure_subject": "Возобновление раб. потока %[1]s в репозитории %[2]s",
"mail.actions.run_info_ref": "Ветвь: %[1]s (%[2]s)",
@@ -72,5 +72,43 @@
"few": "%d месяца назад",
"many": "%d месяцев назад"
},
- "relativetime.1year": "в прошлом году"
+ "relativetime.1year": "в прошлом году",
+ "repo.issue_indexer.title": "Индексатор задач",
+ "followers.incoming.list.self.none": "На вас никто не подписан.",
+ "followers.incoming.list.none": "На этого пользователя никто не подписан.",
+ "followers.outgoing.list.none": "%s ни на кого не подписан.",
+ "stars.list.none": "Никто не добавил этот репозиторий в избранное.",
+ "watch.list.none": "Никто не отслеживает этот репозиторий.",
+ "repo.form.cannot_create": "Во всех пространствах, где вы можете создавать репозитории, достигнуто ограничение количества репозиториев.",
+ "followers.outgoing.list.self.none": "Вы ни на кого не подписаны.",
+ "admin.config.moderation_config": "Настройки модерации",
+ "moderation.abuse_category": "Категория",
+ "moderation.abuse_category.placeholder": "Выберите категорию",
+ "moderation.abuse_category.spam": "Спам",
+ "moderation.abuse_category.malware": "Вредоносное ПО",
+ "moderation.abuse_category.illegal_content": "Незаконное содержимое",
+ "moderation.abuse_category.other_violations": "Прочие нарушения правил",
+ "moderation.report_remarks": "Подробности",
+ "moderation.report_abuse": "Пожаловаться",
+ "moderation.report_remarks.placeholder": "Пожалуйста, предоставьте немного подробностей о содержимом, на которое вы жалуетесь.",
+ "moderation.reporting_failed": "Не удалось отправить жалобу: %v",
+ "moderation.report_content": "Пожаловаться",
+ "moderation.report_abuse_form.already_reported": "Вы уже пожаловались на это содержимое",
+ "moderation.submit_report": "Пожаловаться",
+ "moderation.reported_thank_you": "Спасибо за ваше сообщение. Администрация оповещена.",
+ "moderation.report_abuse_form.details": "Через эту форму можно жаловаться на пользователей, распространяющих спам или ведущих себя неадекватно.",
+ "moderation.report_abuse_form.invalid": "Невалидные аргументы",
+ "moderation.report_abuse_form.header": "Жалоба администрации",
+ "editor.textarea.tab_hint": "Отступ уже добавлен. Нажмите Tab снова или Escape, чтобы покинуть редактор.",
+ "editor.textarea.shift_tab_hint": "В строке нет отступов. Нажмите Shift + Tab снова или Escape, чтобы покинуть редактор.",
+ "admin.dashboard.cleanup_offline_runners": "Удалить недоступных исполнителей",
+ "avatar.constraints_hint": "Изображение профиля не может быть более %[1]s и крупнее %[2]dx%[3]d пикселей",
+ "settings.visibility.description": "Видимость профиля влияет на доступ других до ваших не частных репозиториев. Подробнее",
+ "repo.diff.commit.previous-short": "Пред.",
+ "repo.diff.commit.next-short": "След.",
+ "profile.actions.tooltip": "Показать действия",
+ "feed.atom.link": "Atom-лента",
+ "keys.ssh.link": "Ключи SSH",
+ "keys.gpg.link": "Ключи GPG",
+ "profile.edit.link": "Изменить профиль"
}
diff --git a/options/locale_next/locale_sv-SE.json b/options/locale_next/locale_sv-SE.json
index dc41e4d6e1..9a8762212c 100644
--- a/options/locale_next/locale_sv-SE.json
+++ b/options/locale_next/locale_sv-SE.json
@@ -1,5 +1,99 @@
{
- "repo.pulls.merged_title_desc": "sammanfogade %[1]d incheckningar från %[2]s
in i %[3]s
%[4]s",
- "repo.pulls.title_desc": "vill sammanfoga %[1]d incheckningar från s[2]s
in i %[3]s
",
- "search.milestone_kind": "Sök milstolpar..."
+ "repo.pulls.merged_title_desc": {
+ "one": "sammanfogade %[1]d incheckning från %[2]s
in i %[3]s
%[4]s",
+ "other": "sammanfogade %[1]d incheckningar från %[2]s
in i %[3]s
%[4]s"
+ },
+ "repo.pulls.title_desc": {
+ "one": "vill sammanfoga %[1]d incheckning från s[2]s
in i %[3]s
",
+ "other": "vill sammanfoga %[1]d incheckningar från s[2]s
in i %[3]s
"
+ },
+ "search.milestone_kind": "Sök milstolpar…",
+ "mail.actions.not_successful_run_subject": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
+ "discussion.locked": "Denna diskussion har låsts. Kommentarer är begränsade till bidragsgivare.",
+ "relativetime.now": "nu",
+ "relativetime.1day": "igår",
+ "relativetime.2days": "för två dagar sedan",
+ "relativetime.days": {
+ "one": "%d dag sedan",
+ "other": "%d dagar sedan"
+ },
+ "admin.dashboard.cleanup_offline_runners": "Städa upp offline runners",
+ "repo.issue_indexer.title": "Indexerare för utgåvor",
+ "moderation.reported_thank_you": "Tack för din rapport. Administrationen har gjorts uppmärksam på det.",
+ "themes.names.forgejo-light": "Forgejo ljus",
+ "themes.names.forgejo-dark": "Forgejo mörk",
+ "themes.names.forgejo-auto": "Forgejo (följ systemets tema)",
+ "moderation.submit_report": "Skicka in rapport",
+ "moderation.reporting_failed": "Det gick inte att skicka in den nya övergreppsrapporten: %v",
+ "mail.actions.run_info_cur_status": "Status för denna körning: %[1]s (just uppdaterad från %[2]s)",
+ "mail.actions.run_info_previous_status": "Status för föregående körning: %[1]s",
+ "mail.actions.run_info_ref": "Gren: %[1]s (%[2]s)",
+ "mail.actions.run_info_trigger": "Utlöses på grund av: %[1]s av: %[2]s",
+ "alert.asset_load_failed": "Misslyckades med att läsa in resursfiler från {path}. Kontrollera att resursfilerna är åtkomliga.",
+ "install.invalid_lfs_path": "Det gick inte att skapa LFS-roten på den angivna sökvägen: %[1]s",
+ "alert.range_error": " måste vara ett tal mellan %[1]s och %[2]s.",
+ "stars.list.none": "Ingen har stjärnmarkerat detta förråd.",
+ "watch.list.none": "Ingen tittar på det här förrådet.",
+ "followers.incoming.list.self.none": "Ingen följer din profil.",
+ "followers.incoming.list.none": "Ingen följer den här användaren.",
+ "followers.outgoing.list.self.none": "Du följer inte någon.",
+ "followers.outgoing.list.none": "%s följer inte någon.",
+ "relativetime.future": "i framtiden",
+ "relativetime.1week": "förra veckan",
+ "relativetime.2weeks": "för två veckor sedan",
+ "relativetime.1month": "senaste månaden",
+ "relativetime.2months": "för två månader sedan",
+ "relativetime.1year": "förra året",
+ "relativetime.2years": "för två år sedan",
+ "repo.form.cannot_create": "Alla utrymmen där du kan skapa förråd har nått gränsen för antal förråd.",
+ "incorrect_root_url": "Denna Forgejo-instans är konfigurerad att serveras på \"%s\". Du tittar för närvarande på Forgejo via en annan URL, vilket kan leda till att delar av applikationen bryts. Den kanoniska webbadressen styrs av Forgejo-administratörer via inställningen ROOT_URL i app.ini.",
+ "error.not_found.title": "Sidan hittades inte",
+ "moderation.abuse_category.illegal_content": "Olagligt innehåll",
+ "moderation.abuse_category.other_violations": "Andra överträdelser av plattformsreglerna",
+ "moderation.report_remarks": "Anmärkningar",
+ "moderation.report_remarks.placeholder": "Ge några detaljer om det övergrepp som du rapporterar.",
+ "mail.actions.successful_run_after_failure_subject": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
+ "mail.actions.successful_run_after_failure": "Arbetsflöde %[1]s återställdes i förrådet %[2]s",
+ "mail.actions.not_successful_run": "Arbetsflödet %[1]s misslyckades i förrådet %[2]s",
+ "editor.textarea.shift_tab_hint": "Ingen indragning på den här raden. Tryck på Shift + Tab igen eller Escape för att lämna redigeringsläget.",
+ "meta.last_line": "Daniel Nylander heter jag och har översatt Forgejo. Mer information om mig på https://www.danielnylander.se",
+ "editor.textarea.tab_hint": "Raden är redan indragen. Tryck på Tab igen eller Escape för att lämna redigeringsläget.",
+ "home.welcome.no_activity": "Ingen aktivitet",
+ "home.welcome.activity_hint": "Det finns inget i ditt flöde ännu. Dina åtgärder och aktivitet från förråd som du bevakar kommer att visas här.",
+ "home.explore_repos": "Utforska förråd",
+ "home.explore_users": "Utforska användare",
+ "home.explore_orgs": "Utforska organisationer",
+ "relativetime.mins": {
+ "one": "%d minut sedan",
+ "other": "%d minuter sedan"
+ },
+ "relativetime.hours": {
+ "one": "%d timme sedan",
+ "other": "%d timmar sedan"
+ },
+ "relativetime.weeks": {
+ "one": "%d vecka sedan",
+ "other": "%d veckor sedan"
+ },
+ "relativetime.months": {
+ "one": "%d månad sedan",
+ "other": "%d månader sedan"
+ },
+ "relativetime.years": {
+ "one": "%d år sedan",
+ "other": "%d år sedan"
+ },
+ "admin.config.moderation_config": "Konfiguration av moderering",
+ "moderation.report_abuse": "Rapportera missbruk",
+ "moderation.report_content": "Rapportera innehåll",
+ "moderation.report_abuse_form.header": "Rapportera missbruk till administratör",
+ "moderation.report_abuse_form.details": "Detta formulär ska användas för att rapportera användare som skapar skräpprofiler, förråd, problem, kommentarer eller beter sig olämpligt.",
+ "moderation.report_abuse_form.invalid": "Ogiltiga argument",
+ "moderation.report_abuse_form.already_reported": "Du har redan rapporterat detta innehåll",
+ "moderation.abuse_category": "Kategori",
+ "moderation.abuse_category.placeholder": "Välj en kategori",
+ "moderation.abuse_category.spam": "Skräppost",
+ "moderation.abuse_category.malware": "Skadlig kod",
+ "settings.visibility.description": "Profilens synlighet påverkar andras möjlighet att komma åt dina icke-privata förråd. Läs mer",
+ "avatar.constraints_hint": "Anpassade avatarer får inte vara större än %[1] eller %[2]dx%[3] bildpunkter"
}
diff --git a/options/locale_next/locale_uk-UA.json b/options/locale_next/locale_uk-UA.json
index 20f68b06ca..33cb5a41a3 100644
--- a/options/locale_next/locale_uk-UA.json
+++ b/options/locale_next/locale_uk-UA.json
@@ -72,5 +72,43 @@
"one": "%d рік тому",
"few": "%d роки тому",
"many": "%d років тому"
- }
+ },
+ "admin.config.moderation_config": "Конфігурація модерування",
+ "moderation.abuse_category.placeholder": "Виберіть категорію",
+ "moderation.report_abuse_form.invalid": "Недійсні аргументи",
+ "moderation.report_abuse_form.already_reported": "Ви вже скаржилися на цей вміст",
+ "moderation.report_abuse": "Повідомити про порушення",
+ "moderation.report_content": "Поскаржитися на вміст",
+ "moderation.abuse_category.spam": "Спам",
+ "moderation.report_remarks.placeholder": "Будь ласка, докладно опишіть порушення, про яке ви повідомляєте.",
+ "moderation.submit_report": "Надіслати скаргу",
+ "moderation.abuse_category.malware": "Шкідливе ПЗ",
+ "moderation.abuse_category.illegal_content": "Нелегальний вміст",
+ "moderation.report_abuse_form.header": "Повідомити адміністраторам про порушення",
+ "moderation.report_abuse_form.details": "Використовуйте цю форму, щоб повідомити про користувачів, які створюють спам-профілі, репозиторії, задачі, коментарі або поводяться неналежним чином.",
+ "moderation.abuse_category": "Категорія",
+ "moderation.abuse_category.other_violations": "Інші порушення правил платформи",
+ "moderation.reporting_failed": "Не вдалося надіслати повідомлення про порушення: %v",
+ "moderation.report_remarks": "Подробиці",
+ "moderation.reported_thank_you": "Дякуємо за ваше повідомлення. Адміністрацію поінформовано про нього.",
+ "repo.form.cannot_create": "У всіх просторах, де ви можете створювати репозиторії, досягнуто обмеження кількості репозиторіїв.",
+ "repo.issue_indexer.title": "Індексатор задач",
+ "followers.incoming.list.self.none": "Ніхто не стежить за вашим профілем.",
+ "followers.incoming.list.none": "Ніхто не стежить за цим користувачем.",
+ "followers.outgoing.list.self.none": "Ви ні за ким не стежите.",
+ "followers.outgoing.list.none": "%s ні за ким не стежить.",
+ "stars.list.none": "Ніхто не додав цей репозиторій в обрані.",
+ "watch.list.none": "Ніхто не спостерігає за цим репозиторієм.",
+ "editor.textarea.tab_hint": "У рядку вже є відступ. Натисніть Tab ще раз або Esc, щоб вийти з редактора.",
+ "editor.textarea.shift_tab_hint": "У цьому рядку немає відступів. Натисніть Shift + Tab ще раз або Esc, щоб вийти з редактора.",
+ "admin.dashboard.cleanup_offline_runners": "Очистити неактивні раннери",
+ "settings.visibility.description": "Видимість профілю впливає на можливість інших користувачів отримати доступ до ваших неприватних репозиторіїв. Дізнатися більше",
+ "avatar.constraints_hint": "Розмір користувацького аватара не може перевищувати %[1]s або бути більшим за %[2]d×%[3]d пікселів",
+ "repo.diff.commit.next-short": "Наступний",
+ "repo.diff.commit.previous-short": "Попередній",
+ "keys.ssh.link": "Ключі SSH",
+ "keys.gpg.link": "Ключі GPG",
+ "profile.edit.link": "Редагувати профіль",
+ "feed.atom.link": "Стрічка Atom",
+ "profile.actions.tooltip": "Більше дій"
}
diff --git a/options/locale_next/locale_zh-CN.json b/options/locale_next/locale_zh-CN.json
index dab8832e9a..0f408997bf 100644
--- a/options/locale_next/locale_zh-CN.json
+++ b/options/locale_next/locale_zh-CN.json
@@ -40,5 +40,43 @@
"relativetime.2years": "两年前",
"relativetime.now": "现在",
"relativetime.2weeks": "两周前",
- "relativetime.days": "%d 天前"
+ "relativetime.days": "%d 天前",
+ "moderation.report_abuse_form.details": "此表单用于举报创建垃圾个人信息、仓库、议题、评论或行为不当的用户。",
+ "admin.config.moderation_config": "审核配置",
+ "moderation.report_abuse": "举报滥用",
+ "moderation.report_content": "举报内容",
+ "moderation.report_abuse_form.header": "向管理员举报滥用",
+ "moderation.report_abuse_form.invalid": "参数无效",
+ "moderation.report_abuse_form.already_reported": "您已举报此内容",
+ "moderation.abuse_category": "类别",
+ "moderation.abuse_category.placeholder": "选择类别",
+ "moderation.abuse_category.spam": "垃圾信息",
+ "moderation.abuse_category.malware": "恶意软件",
+ "moderation.abuse_category.illegal_content": "非法内容",
+ "moderation.abuse_category.other_violations": "其他违反平台规则的行为",
+ "moderation.report_remarks.placeholder": "请提供一些关于您所举报的滥用行为的详细信息。",
+ "moderation.report_remarks": "备注",
+ "moderation.submit_report": "提交举报",
+ "moderation.reporting_failed": "无法提交新的滥用举报:%v",
+ "moderation.reported_thank_you": "感谢您的举报,管理员已收到通知。",
+ "repo.form.cannot_create": "您可以创建仓库的所有空间均已达到仓库限制。",
+ "repo.issue_indexer.title": "议题索引器",
+ "watch.list.none": "没有人关注这个仓库。",
+ "followers.incoming.list.none": "没有人关注这位用户。",
+ "followers.outgoing.list.self.none": "你没有关注任何人。",
+ "followers.outgoing.list.none": "%s 没有关注任何人。",
+ "stars.list.none": "没有人点赞这个仓库。",
+ "followers.incoming.list.self.none": "没有人关注你的个人资料。",
+ "editor.textarea.tab_hint": "此行已缩进。再次按 Tab 或按 Escape 退出编辑器。",
+ "editor.textarea.shift_tab_hint": "此行无缩进。再次按 Shift + Tab 或按 Escape 退出编辑器。",
+ "admin.dashboard.cleanup_offline_runners": "清理离线运行器",
+ "settings.visibility.description": "个人资料可见性设置会影响他人对您的非私有仓库的访问。了解更多",
+ "avatar.constraints_hint": "自定义头像大小不得超过 %[1]s,或大于 %[2]d×%[3]d 像素",
+ "keys.ssh.link": "SSH 密钥",
+ "keys.gpg.link": "GPG 密钥",
+ "profile.actions.tooltip": "更多操作",
+ "repo.diff.commit.next-short": "下个",
+ "repo.diff.commit.previous-short": "上个",
+ "feed.atom.link": "Atom 订阅源",
+ "profile.edit.link": "编辑个人资料"
}
diff --git a/options/locale_next/locale_zh-TW.json b/options/locale_next/locale_zh-TW.json
index 222e8bb332..3ae0b00d2b 100644
--- a/options/locale_next/locale_zh-TW.json
+++ b/options/locale_next/locale_zh-TW.json
@@ -1,5 +1,77 @@
{
"repo.pulls.merged_title_desc": "將 %[1]d 次提交從 %[2]s
合併至 %[3]s
%[4]s",
"repo.pulls.title_desc": "請求將 %[1]d 次程式碼提交從 %[2]s
合併至 %[3]s
",
- "search.milestone_kind": "搜尋里程碑…"
+ "search.milestone_kind": "搜尋里程碑…",
+ "home.welcome.no_activity": "沒有活動",
+ "home.welcome.activity_hint": "您的動態摘要目前沒有任何內容。 您對關注的儲存庫所做的操作與活動將會顯示在這裡。",
+ "stars.list.none": "沒有人標星這個儲存庫。",
+ "watch.list.none": "沒有人關注這個儲存庫。",
+ "home.explore_repos": "探索儲存庫",
+ "home.explore_users": "探索使用者",
+ "home.explore_orgs": "探索組織",
+ "alert.range_error": " 必須是一個介於 %[1]s 和 %[2]s 之間的數字。",
+ "install.invalid_lfs_path": "無法在指定路徑建立 LFS 根目錄:%[1]s",
+ "relativetime.now": "現在",
+ "relativetime.future": "未來",
+ "repo.form.cannot_create": "您可以建立儲存庫的所有空間都已達到儲存庫上限。",
+ "repo.issue_indexer.title": "問題索引器",
+ "moderation.abuse_category": "分類",
+ "moderation.abuse_category.placeholder": "選擇分類",
+ "moderation.abuse_category.spam": "垃圾訊息",
+ "moderation.abuse_category.malware": "惡意軟體",
+ "moderation.abuse_category.illegal_content": "違法內容",
+ "moderation.report_remarks.placeholder": "請提供您所檢舉濫用行為的相關細節。",
+ "moderation.report_remarks": "備註",
+ "moderation.submit_report": "提交檢舉",
+ "moderation.reporting_failed": "無法提交新的濫用回報:%v",
+ "moderation.reported_thank_you": "感謝您的回報,管理團隊已收到相關通知。",
+ "mail.actions.successful_run_after_failure_subject": "儲存庫 %[2]s 中的工作流程 %[1]s 已恢復",
+ "error.not_found.title": "找不到頁面",
+ "incorrect_root_url": "這個 Forgejo 實例設定為在 \"%s\" 上提供服務。您目前是透過不同的 URL 存取 Forgejo,這可能會導致部分功能無法正常運作。正式的 URL 是由 Forgejo 管理員透過 app.ini 中的 ROOT_URL 設定所控制。",
+ "themes.names.forgejo-auto": "Forgejo(遵循系統主題)",
+ "themes.names.forgejo-light": "Forgejo 淺色",
+ "themes.names.forgejo-dark": "Forgejo 深色",
+ "followers.incoming.list.self.none": "沒有人關注您的個人資料。",
+ "followers.incoming.list.none": "沒有人關注這位使用者。",
+ "followers.outgoing.list.none": "%s 沒有追蹤任何人。",
+ "followers.outgoing.list.self.none": "您沒有追蹤任何人。",
+ "relativetime.mins": "%d 分鐘前",
+ "relativetime.hours": "%d 小時前",
+ "relativetime.days": "%d 天前",
+ "relativetime.weeks": "%d 周前",
+ "relativetime.months": "%d 個月前",
+ "relativetime.years": "%d 年前",
+ "relativetime.1day": "昨天",
+ "relativetime.2days": "兩天前",
+ "relativetime.1week": "上週",
+ "relativetime.2weeks": "兩週前",
+ "relativetime.1month": "上個月",
+ "relativetime.2months": "兩個月前",
+ "relativetime.1year": "去年",
+ "relativetime.2years": "兩年前",
+ "moderation.abuse_category.other_violations": "其他違反平台規則的行為",
+ "mail.actions.not_successful_run_subject": "儲存庫 %[2]s 中的工作流程 %[1]s 已失敗",
+ "mail.actions.successful_run_after_failure": "儲存庫 %[2]s 中的工作流程 %[1]s 已恢復",
+ "mail.actions.not_successful_run": "儲存庫 %[2]s 中的工作流程 %[1]s 已失敗",
+ "mail.actions.run_info_cur_status": "本次執行狀態:%[1]s(剛從 %[2]s 更新)",
+ "mail.actions.run_info_previous_status": "前一次執行狀態:%[1]s",
+ "mail.actions.run_info_ref": "分支:%[1]s (%[2]s)",
+ "mail.actions.run_info_trigger": "觸發原因:%[1]s,由 %[2]s 執行",
+ "discussion.locked": "此討論已被鎖定。僅限貢獻者留言。",
+ "alert.asset_load_failed": "無法從 {path} 載入資源檔案。請確保這些資源檔案可以被存取。",
+ "editor.textarea.tab_hint": "此行已縮排。再次按下 Tab 鍵或按下 Escape 鍵以離開編輯器。",
+ "editor.textarea.shift_tab_hint": "此行未縮排。請再次按下 Shift + Tab,或按下 Escape 鍵以離開編輯器。",
+ "admin.config.moderation_config": "審核設定",
+ "moderation.report_abuse": "回報濫用行為",
+ "moderation.report_content": "檢舉內容",
+ "moderation.report_abuse_form.header": "向管理員回報濫用",
+ "moderation.report_abuse_form.details": "這個表單是用來檢舉用戶建立垃圾帳號、儲存庫、問題、留言,或其他不當行為。",
+ "moderation.report_abuse_form.invalid": "無效參數",
+ "moderation.report_abuse_form.already_reported": "您已檢舉此內容",
+ "meta.last_line": "Rubi-chan? Hai! Nani ga suki? Choko minto yori mo a・na・ta♡ Ayumu-chan? Hai! Nani ga suki? Sutoroberii fureibaa yori mo a・na・ta♡ Shiki-chan! Hai! Nani ga suki? Kukkii and kuriimu yori mo a・na・ta♡ Minna? Hai! Nani ga suki? Mochiron daisuki AiScReam.",
+ "admin.dashboard.cleanup_offline_runners": "清理離線 runners",
+ "settings.visibility.description": "個人資料的可見度會影響他人存取您非私人儲存庫的能力。了解更多",
+ "avatar.constraints_hint": "自定義大頭貼的大小不得超過 %[1]s,且解析度不得大於 %[2]d×%[3]d 像素",
+ "repo.diff.commit.next-short": "下一個",
+ "repo.diff.commit.previous-short": "上一個"
}
diff --git a/package-lock.json b/package-lock.json
index 169292caa8..604ff38c18 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,14 +12,15 @@
"@github/markdown-toolbar-element": "2.2.3",
"@github/quote-selection": "2.1.0",
"@github/text-expander-element": "2.8.0",
+ "@google/model-viewer": "4.1.0",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.14.0",
"ansi_up": "6.0.5",
"asciinema-player": "3.8.2",
- "chart.js": "4.4.9",
+ "chart.js": "4.5.0",
"chartjs-adapter-dayjs-4": "1.0.4",
"chartjs-plugin-zoom": "2.2.0",
- "clippie": "4.1.6",
+ "clippie": "4.1.7",
"css-loader": "7.0.0",
"dayjs": "1.11.12",
"dropzone": "6.0.0-beta.2",
@@ -31,15 +32,15 @@
"idiomorph": "0.3.0",
"jquery": "3.7.1",
"katex": "0.16.22",
- "mermaid": "11.6.0",
+ "mermaid": "11.7.0",
"mini-css-extract-plugin": "2.9.2",
- "minimatch": "10.0.1",
+ "minimatch": "10.0.3",
"monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
- "postcss": "8.5.2",
+ "postcss": "8.5.5",
"postcss-loader": "8.1.1",
- "postcss-nesting": "13.0.1",
+ "postcss-nesting": "13.0.2",
"pretty-ms": "9.0.0",
"sortablejs": "1.15.6",
"swagger-ui-dist": "5.17.14",
@@ -51,56 +52,55 @@
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
- "vue": "3.5.14",
+ "vue": "3.5.16",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
- "webpack": "5.99.7",
+ "webpack": "5.99.9",
"webpack-cli": "6.0.1",
"wrap-ansi": "9.0.0"
},
"devDependencies": {
- "@axe-core/playwright": "4.10.1",
+ "@axe-core/playwright": "4.10.2",
"@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
"@playwright/test": "1.52.0",
"@stoplight/spectral-cli": "6.15.0",
- "@stylistic/eslint-plugin-js": "4.2.0",
+ "@stylistic/eslint-plugin": "4.4.1",
"@stylistic/stylelint-plugin": "3.1.2",
- "@typescript-eslint/parser": "8.31.1",
- "@vitejs/plugin-vue": "5.2.3",
- "@vitest/coverage-v8": "3.1.2",
- "@vitest/eslint-plugin": "1.1.43",
+ "@vitejs/plugin-vue": "5.2.4",
+ "@vitest/coverage-v8": "3.2.3",
+ "@vitest/eslint-plugin": "1.2.2",
"@vue/test-utils": "2.4.6",
- "eslint": "9.25.1",
- "eslint-import-resolver-typescript": "4.3.4",
+ "eslint": "9.28.0",
+ "eslint-import-resolver-typescript": "4.4.3",
"eslint-plugin-array-func": "5.0.2",
- "eslint-plugin-import-x": "4.11.0",
+ "eslint-plugin-import-x": "4.15.1",
"eslint-plugin-no-jquery": "3.1.1",
"eslint-plugin-no-use-extend-native": "0.7.2",
"eslint-plugin-playwright": "2.2.0",
- "eslint-plugin-regexp": "2.7.0",
+ "eslint-plugin-regexp": "2.9.0",
"eslint-plugin-sonarjs": "3.0.2",
"eslint-plugin-toml": "0.12.0",
- "eslint-plugin-unicorn": "59.0.0",
+ "eslint-plugin-unicorn": "59.0.1",
"eslint-plugin-vitest-globals": "1.5.0",
- "eslint-plugin-vue": "10.1.0",
- "eslint-plugin-vue-scoped-css": "2.9.0",
- "eslint-plugin-wc": "2.2.1",
+ "eslint-plugin-vue": "10.2.0",
+ "eslint-plugin-vue-scoped-css": "2.10.0",
+ "eslint-plugin-wc": "3.0.1",
"globals": "16.1.0",
- "happy-dom": "17.4.6",
+ "happy-dom": "18.0.0",
"license-checker-rseidelsohn": "4.4.2",
- "markdownlint-cli": "0.44.0",
+ "markdownlint-cli": "0.45.0",
"postcss-html": "1.8.0",
- "sharp": "0.34.1",
- "stylelint": "16.19.1",
+ "sharp": "0.34.2",
+ "stylelint": "16.20.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-declaration-strict-value": "1.10.11",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"typescript": "5.8.3",
- "typescript-eslint": "8.31.1",
+ "typescript-eslint": "8.34.0",
"vite-string-plugin": "1.3.4",
- "vitest": "3.1.2"
+ "vitest": "3.2.3"
},
"engines": {
"node": ">= 20.0.0"
@@ -165,13 +165,13 @@
}
},
"node_modules/@axe-core/playwright": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.1.tgz",
- "integrity": "sha512-EV5t39VV68kuAfMKqb/RL+YjYKhfuGim9rgIaQ6Vntb2HgaCaau0h98Y3WEUqW1+PbdzxDtDNjFAipbtZuBmEA==",
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/@axe-core/playwright/-/playwright-4.10.2.tgz",
+ "integrity": "sha512-6/b5BJjG6hDaRNtgzLIfKr5DfwyiLHO4+ByTLB0cJgWSM8Ll7KqtdblIS6bEkwSF642/Ex91vNqIl3GLXGlceg==",
"dev": true,
"license": "MPL-2.0",
"dependencies": {
- "axe-core": "~4.10.2"
+ "axe-core": "~4.10.3"
},
"peerDependencies": {
"playwright-core": ">= 1.0.0"
@@ -216,12 +216,12 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.27.2",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz",
- "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==",
+ "version": "7.27.5",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
+ "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.27.1"
+ "@babel/types": "^7.27.3"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -231,18 +231,18 @@
}
},
"node_modules/@babel/runtime": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
- "integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/types": {
- "version": "7.27.1",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz",
- "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==",
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
+ "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -438,9 +438,9 @@
}
},
"node_modules/@csstools/css-parser-algorithms": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
- "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz",
+ "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==",
"dev": true,
"funding": [
{
@@ -457,13 +457,13 @@
"node": ">=18"
},
"peerDependencies": {
- "@csstools/css-tokenizer": "^3.0.3"
+ "@csstools/css-tokenizer": "^3.0.4"
}
},
"node_modules/@csstools/css-tokenizer": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
- "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz",
+ "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==",
"dev": true,
"funding": [
{
@@ -559,9 +559,9 @@
}
},
"node_modules/@esbuild/aix-ppc64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz",
- "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz",
+ "integrity": "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==",
"cpu": [
"ppc64"
],
@@ -575,9 +575,9 @@
}
},
"node_modules/@esbuild/android-arm": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz",
- "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz",
+ "integrity": "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==",
"cpu": [
"arm"
],
@@ -591,9 +591,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz",
- "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz",
+ "integrity": "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==",
"cpu": [
"arm64"
],
@@ -607,9 +607,9 @@
}
},
"node_modules/@esbuild/android-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz",
- "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz",
+ "integrity": "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==",
"cpu": [
"x64"
],
@@ -623,9 +623,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz",
- "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz",
+ "integrity": "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==",
"cpu": [
"arm64"
],
@@ -639,9 +639,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz",
- "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz",
+ "integrity": "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==",
"cpu": [
"x64"
],
@@ -655,9 +655,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz",
- "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==",
"cpu": [
"arm64"
],
@@ -671,9 +671,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz",
- "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz",
+ "integrity": "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==",
"cpu": [
"x64"
],
@@ -687,9 +687,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz",
- "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz",
+ "integrity": "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==",
"cpu": [
"arm"
],
@@ -703,9 +703,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz",
- "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz",
+ "integrity": "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==",
"cpu": [
"arm64"
],
@@ -719,9 +719,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz",
- "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz",
+ "integrity": "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==",
"cpu": [
"ia32"
],
@@ -735,9 +735,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz",
- "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz",
+ "integrity": "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==",
"cpu": [
"loong64"
],
@@ -751,9 +751,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz",
- "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz",
+ "integrity": "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==",
"cpu": [
"mips64el"
],
@@ -767,9 +767,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz",
- "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz",
+ "integrity": "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==",
"cpu": [
"ppc64"
],
@@ -783,9 +783,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz",
- "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz",
+ "integrity": "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==",
"cpu": [
"riscv64"
],
@@ -799,9 +799,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz",
- "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz",
+ "integrity": "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==",
"cpu": [
"s390x"
],
@@ -815,9 +815,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz",
- "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz",
+ "integrity": "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==",
"cpu": [
"x64"
],
@@ -831,9 +831,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz",
- "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==",
"cpu": [
"arm64"
],
@@ -847,9 +847,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz",
- "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz",
+ "integrity": "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==",
"cpu": [
"x64"
],
@@ -863,9 +863,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz",
- "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz",
+ "integrity": "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==",
"cpu": [
"arm64"
],
@@ -879,9 +879,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz",
- "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz",
+ "integrity": "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==",
"cpu": [
"x64"
],
@@ -895,9 +895,9 @@
}
},
"node_modules/@esbuild/sunos-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz",
- "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz",
+ "integrity": "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==",
"cpu": [
"x64"
],
@@ -911,9 +911,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz",
- "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz",
+ "integrity": "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==",
"cpu": [
"arm64"
],
@@ -927,9 +927,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz",
- "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz",
+ "integrity": "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==",
"cpu": [
"ia32"
],
@@ -943,9 +943,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz",
- "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz",
+ "integrity": "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==",
"cpu": [
"x64"
],
@@ -1021,9 +1021,9 @@
}
},
"node_modules/@eslint/config-array": {
- "version": "0.20.0",
- "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz",
- "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==",
+ "version": "0.20.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz",
+ "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1035,17 +1035,6 @@
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
- "node_modules/@eslint/config-array/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/@eslint/config-array/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -1060,9 +1049,9 @@
}
},
"node_modules/@eslint/config-helpers": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz",
- "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==",
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz",
+ "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -1070,9 +1059,9 @@
}
},
"node_modules/@eslint/core": {
- "version": "0.13.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
- "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz",
+ "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -1123,17 +1112,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/@eslint/eslintrc/node_modules/globals": {
"version": "14.0.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
@@ -1168,13 +1146,16 @@
}
},
"node_modules/@eslint/js": {
- "version": "9.25.1",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.25.1.tgz",
- "integrity": "sha512-dEIwmjntEx8u3Uvv+kr3PDeeArL8Hw07H9kyYxCjnM9pBjfEhk6uLXSchxxzgiwtRhhzVzqmUSDFBOi1TuZ7qg==",
+ "version": "9.28.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz",
+ "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
}
},
"node_modules/@eslint/object-schema": {
@@ -1188,19 +1169,32 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.2.8",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
- "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz",
+ "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.13.0",
+ "@eslint/core": "^0.15.0",
"levn": "^0.4.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
},
+ "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz",
+ "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@github/combobox-nav": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.3.1.tgz",
@@ -1229,6 +1223,22 @@
"dom-input-range": "^1.2.0"
}
},
+ "node_modules/@google/model-viewer": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@google/model-viewer/-/model-viewer-4.1.0.tgz",
+ "integrity": "sha512-7WB/jS6wfBfRl/tWhsUUvDMKFE1KlKME97coDLlZQfvJD0nCwjhES1lJ+k7wnmf7T3zMvCfn9mIjM/mgZapuig==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@monogrid/gainmap-js": "^3.1.0",
+ "lit": "^3.2.1"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "peerDependencies": {
+ "three": "^0.172.0"
+ }
+ },
"node_modules/@humanfs/core": {
"version": "0.19.1",
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
@@ -1330,9 +1340,9 @@
}
},
"node_modules/@img/sharp-darwin-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.1.tgz",
- "integrity": "sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz",
+ "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==",
"cpu": [
"arm64"
],
@@ -1353,9 +1363,9 @@
}
},
"node_modules/@img/sharp-darwin-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.1.tgz",
- "integrity": "sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz",
+ "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==",
"cpu": [
"x64"
],
@@ -1529,9 +1539,9 @@
}
},
"node_modules/@img/sharp-linux-arm": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.1.tgz",
- "integrity": "sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz",
+ "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==",
"cpu": [
"arm"
],
@@ -1552,9 +1562,9 @@
}
},
"node_modules/@img/sharp-linux-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.1.tgz",
- "integrity": "sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz",
+ "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==",
"cpu": [
"arm64"
],
@@ -1575,9 +1585,9 @@
}
},
"node_modules/@img/sharp-linux-s390x": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.1.tgz",
- "integrity": "sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz",
+ "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==",
"cpu": [
"s390x"
],
@@ -1598,9 +1608,9 @@
}
},
"node_modules/@img/sharp-linux-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.1.tgz",
- "integrity": "sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz",
+ "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==",
"cpu": [
"x64"
],
@@ -1621,9 +1631,9 @@
}
},
"node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.1.tgz",
- "integrity": "sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz",
+ "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==",
"cpu": [
"arm64"
],
@@ -1644,9 +1654,9 @@
}
},
"node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.1.tgz",
- "integrity": "sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz",
+ "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==",
"cpu": [
"x64"
],
@@ -1667,9 +1677,9 @@
}
},
"node_modules/@img/sharp-wasm32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.1.tgz",
- "integrity": "sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz",
+ "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==",
"cpu": [
"wasm32"
],
@@ -1677,7 +1687,7 @@
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
"optional": true,
"dependencies": {
- "@emnapi/runtime": "^1.4.0"
+ "@emnapi/runtime": "^1.4.3"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -1686,10 +1696,30 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz",
+ "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
"node_modules/@img/sharp-win32-ia32": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.1.tgz",
- "integrity": "sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz",
+ "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==",
"cpu": [
"ia32"
],
@@ -1707,9 +1737,9 @@
}
},
"node_modules/@img/sharp-win32-x64": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.1.tgz",
- "integrity": "sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz",
+ "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==",
"cpu": [
"x64"
],
@@ -1726,6 +1756,27 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/@isaacs/cliui": {
"version": "8.0.2",
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -1970,6 +2021,21 @@
"integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==",
"license": "MIT"
},
+ "node_modules/@lit-labs/ssr-dom-shim": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.3.0.tgz",
+ "integrity": "sha512-nQIWonJ6eFAvUUrSlwyHDm/aE8PBDu5kRpL0vHMg6K8fK3Diq1xdPjTnsJSwxABhaZ+5eBi1btQB5ShUTKo4nQ==",
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@lit/reactive-element": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.0.tgz",
+ "integrity": "sha512-L2qyoZSQClcBmq0qajBVbhYEcG6iK0XfLn66ifLe/RfC0/ihpc+pl0Wdn8bJ8o+hj38cG0fGXRgSS20MuXn7qA==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.2.0"
+ }
+ },
"node_modules/@mcaptcha/core-glue": {
"version": "0.1.0-alpha-5",
"resolved": "https://registry.npmjs.org/@mcaptcha/core-glue/-/core-glue-0.1.0-alpha-5.tgz",
@@ -2022,24 +2088,36 @@
}
},
"node_modules/@mermaid-js/parser": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.4.0.tgz",
- "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==",
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.5.0.tgz",
+ "integrity": "sha512-AiaN7+VjXC+3BYE+GwNezkpjIcCI2qIMB/K4S2/vMWe0q/XJCBbx5+K7iteuz7VyltX9iAK4FmVTvGc9kjOV4w==",
"license": "MIT",
"dependencies": {
"langium": "3.3.1"
}
},
+ "node_modules/@monogrid/gainmap-js": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.1.0.tgz",
+ "integrity": "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw==",
+ "license": "MIT",
+ "dependencies": {
+ "promise-worker-transferable": "^1.0.4"
+ },
+ "peerDependencies": {
+ "three": ">= 0.159.0"
+ }
+ },
"node_modules/@napi-rs/wasm-runtime": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz",
- "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==",
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz",
+ "integrity": "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==",
"dev": true,
"license": "MIT",
"optional": true,
"dependencies": {
- "@emnapi/core": "^1.4.0",
- "@emnapi/runtime": "^1.4.0",
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
"@tybys/wasm-util": "^0.9.0"
}
},
@@ -2191,9 +2269,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz",
- "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.0.tgz",
+ "integrity": "sha512-xEiEE5oDW6tK4jXCAyliuntGR+amEMO7HLtdSshVuhFnKTYoeYMyXQK7pLouAJJj5KHdwdn87bfHAR2nSdNAUA==",
"cpu": [
"arm"
],
@@ -2205,9 +2283,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz",
- "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.0.tgz",
+ "integrity": "sha512-uNSk/TgvMbskcHxXYHzqwiyBlJ/lGcv8DaUfcnNwict8ba9GTTNxfn3/FAoFZYgkaXXAdrAA+SLyKplyi349Jw==",
"cpu": [
"arm64"
],
@@ -2219,9 +2297,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz",
- "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.0.tgz",
+ "integrity": "sha512-VGF3wy0Eq1gcEIkSCr8Ke03CWT+Pm2yveKLaDvq51pPpZza3JX/ClxXOCmTYYq3us5MvEuNRTaeyFThCKRQhOA==",
"cpu": [
"arm64"
],
@@ -2233,9 +2311,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz",
- "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.0.tgz",
+ "integrity": "sha512-fBkyrDhwquRvrTxSGH/qqt3/T0w5Rg0L7ZIDypvBPc1/gzjJle6acCpZ36blwuwcKD/u6oCE/sRWlUAcxLWQbQ==",
"cpu": [
"x64"
],
@@ -2247,9 +2325,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz",
- "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.0.tgz",
+ "integrity": "sha512-u5AZzdQJYJXByB8giQ+r4VyfZP+walV+xHWdaFx/1VxsOn6eWJhK2Vl2eElvDJFKQBo/hcYIBg/jaKS8ZmKeNQ==",
"cpu": [
"arm64"
],
@@ -2261,9 +2339,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz",
- "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.0.tgz",
+ "integrity": "sha512-qC0kS48c/s3EtdArkimctY7h3nHicQeEUdjJzYVJYR3ct3kWSafmn6jkNCA8InbUdge6PVx6keqjk5lVGJf99g==",
"cpu": [
"x64"
],
@@ -2275,9 +2353,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz",
- "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.0.tgz",
+ "integrity": "sha512-x+e/Z9H0RAWckn4V2OZZl6EmV0L2diuX3QB0uM1r6BvhUIv6xBPL5mrAX2E3e8N8rEHVPwFfz/ETUbV4oW9+lQ==",
"cpu": [
"arm"
],
@@ -2289,9 +2367,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz",
- "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.0.tgz",
+ "integrity": "sha512-1exwiBFf4PU/8HvI8s80icyCcnAIB86MCBdst51fwFmH5dyeoWVPVgmQPcKrMtBQ0W5pAs7jBCWuRXgEpRzSCg==",
"cpu": [
"arm"
],
@@ -2303,9 +2381,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz",
- "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.0.tgz",
+ "integrity": "sha512-ZTR2mxBHb4tK4wGf9b8SYg0Y6KQPjGpR4UWwTFdnmjB4qRtoATZ5dWn3KsDwGa5Z2ZBOE7K52L36J9LueKBdOQ==",
"cpu": [
"arm64"
],
@@ -2317,9 +2395,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz",
- "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.0.tgz",
+ "integrity": "sha512-GFWfAhVhWGd4r6UxmnKRTBwP1qmModHtd5gkraeW2G490BpFOZkFtem8yuX2NyafIP/mGpRJgTJ2PwohQkUY/Q==",
"cpu": [
"arm64"
],
@@ -2331,9 +2409,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz",
- "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.0.tgz",
+ "integrity": "sha512-xw+FTGcov/ejdusVOqKgMGW3c4+AgqrfvzWEVXcNP6zq2ue+lsYUgJ+5Rtn/OTJf7e2CbgTFvzLW2j0YAtj0Gg==",
"cpu": [
"loong64"
],
@@ -2345,9 +2423,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz",
- "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.0.tgz",
+ "integrity": "sha512-bKGibTr9IdF0zr21kMvkZT4K6NV+jjRnBoVMt2uNMG0BYWm3qOVmYnXKzx7UhwrviKnmK46IKMByMgvpdQlyJQ==",
"cpu": [
"ppc64"
],
@@ -2359,9 +2437,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz",
- "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.0.tgz",
+ "integrity": "sha512-vV3cL48U5kDaKZtXrti12YRa7TyxgKAIDoYdqSIOMOFBXqFj2XbChHAtXquEn2+n78ciFgr4KIqEbydEGPxXgA==",
"cpu": [
"riscv64"
],
@@ -2373,9 +2451,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz",
- "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.0.tgz",
+ "integrity": "sha512-TDKO8KlHJuvTEdfw5YYFBjhFts2TR0VpZsnLLSYmB7AaohJhM8ctDSdDnUGq77hUh4m/djRafw+9zQpkOanE2Q==",
"cpu": [
"riscv64"
],
@@ -2387,9 +2465,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz",
- "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.0.tgz",
+ "integrity": "sha512-8541GEyktXaw4lvnGp9m84KENcxInhAt6vPWJ9RodsB/iGjHoMB2Pp5MVBCiKIRxrxzJhGCxmNzdu+oDQ7kwRA==",
"cpu": [
"s390x"
],
@@ -2401,9 +2479,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz",
- "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.0.tgz",
+ "integrity": "sha512-iUVJc3c0o8l9Sa/qlDL2Z9UP92UZZW1+EmQ4xfjTc1akr0iUFZNfxrXJ/R1T90h/ILm9iXEY6+iPrmYB3pXKjw==",
"cpu": [
"x64"
],
@@ -2415,9 +2493,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz",
- "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.0.tgz",
+ "integrity": "sha512-PQUobbhLTQT5yz/SPg116VJBgz+XOtXt8D1ck+sfJJhuEsMj2jSej5yTdp8CvWBSceu+WW+ibVL6dm0ptG5fcA==",
"cpu": [
"x64"
],
@@ -2429,9 +2507,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz",
- "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.0.tgz",
+ "integrity": "sha512-M0CpcHf8TWn+4oTxJfh7LQuTuaYeXGbk0eageVjQCKzYLsajWS/lFC94qlRqOlyC2KvRT90ZrfXULYmukeIy7w==",
"cpu": [
"arm64"
],
@@ -2443,9 +2521,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz",
- "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.0.tgz",
+ "integrity": "sha512-3XJ0NQtMAXTWFW8FqZKcw3gOQwBtVWP/u8TpHP3CRPXD7Pd6s8lLdH3sHWh8vqKCyyiI8xW5ltJScQmBU9j7WA==",
"cpu": [
"ia32"
],
@@ -2457,9 +2535,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz",
- "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.0.tgz",
+ "integrity": "sha512-Q2Mgwt+D8hd5FIPUuPDsvPR7Bguza6yTkJxspDGkZj7tBRn2y4KSWYuIXpftFSjBra76TbKerCV7rgFPQrn+wQ==",
"cpu": [
"x64"
],
@@ -2679,17 +2757,6 @@
"node": "^12.20 || >=14.13"
}
},
- "node_modules/@stoplight/spectral-core/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/@stoplight/spectral-core/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -2988,15 +3055,18 @@
"node": "^12.20 || >=14.13"
}
},
- "node_modules/@stylistic/eslint-plugin-js": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-4.2.0.tgz",
- "integrity": "sha512-MiJr6wvyzMYl/wElmj8Jns8zH7Q1w8XoVtm+WM6yDaTrfxryMyb8n0CMxt82fo42RoLIfxAEtM6tmQVxqhk0/A==",
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz",
+ "integrity": "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ==",
"dev": true,
"license": "MIT",
"dependencies": {
+ "@typescript-eslint/utils": "^8.32.1",
"eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0"
+ "espree": "^10.3.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.2"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3005,6 +3075,19 @@
"eslint": ">=9.0.0"
}
},
+ "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/@stylistic/stylelint-plugin": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.2.tgz",
@@ -3055,10 +3138,20 @@
"tslib": "^2.4.0"
}
},
+ "node_modules/@types/chai": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz",
+ "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*"
+ }
+ },
"node_modules/@types/codemirror": {
- "version": "5.60.15",
- "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.15.tgz",
- "integrity": "sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==",
+ "version": "5.60.16",
+ "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-5.60.16.tgz",
+ "integrity": "sha512-V/yHdamffSS075jit+fDxaOAmdP2liok8NSNJnAZfDJErzOheuygHZEhAJrfmk5TEyM32MhkZjwo/idX791yxw==",
"license": "MIT",
"dependencies": {
"@types/tern": "*"
@@ -3327,6 +3420,13 @@
"@types/ms": "*"
}
},
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/es-aggregate-error": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@types/es-aggregate-error/-/es-aggregate-error-1.0.6.tgz",
@@ -3409,9 +3509,9 @@
"license": "MIT"
},
"node_modules/@types/node": {
- "version": "22.15.18",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.18.tgz",
- "integrity": "sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==",
+ "version": "20.19.1",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.1.tgz",
+ "integrity": "sha512-jJD50LtlD2dodAEO653i3YF04NWak6jN3ky+Ri3Em3mGR39/glWiboM/IePaRbgwSfqM1TpGXfAg8ohn/4dTgA==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
@@ -3437,8 +3537,7 @@
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "license": "MIT",
- "optional": true
+ "license": "MIT"
},
"node_modules/@types/unist": {
"version": "2.0.11",
@@ -3454,22 +3553,29 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/@types/whatwg-mimetype": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz",
+ "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@typescript-eslint/eslint-plugin": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.31.1.tgz",
- "integrity": "sha512-oUlH4h1ABavI4F0Xnl8/fOtML/eu8nI2A1nYd+f+55XI0BLu+RIqKoCiZKNo6DtqZBEQm5aNKA20G3Z5w3R6GQ==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz",
+ "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "8.31.1",
- "@typescript-eslint/type-utils": "8.31.1",
- "@typescript-eslint/utils": "8.31.1",
- "@typescript-eslint/visitor-keys": "8.31.1",
+ "@typescript-eslint/scope-manager": "8.34.0",
+ "@typescript-eslint/type-utils": "8.34.0",
+ "@typescript-eslint/utils": "8.34.0",
+ "@typescript-eslint/visitor-keys": "8.34.0",
"graphemer": "^1.4.0",
- "ignore": "^5.3.1",
+ "ignore": "^7.0.0",
"natural-compare": "^1.4.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3479,22 +3585,32 @@
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0",
+ "@typescript-eslint/parser": "^8.34.0",
"eslint": "^8.57.0 || ^9.0.0",
"typescript": ">=4.8.4 <5.9.0"
}
},
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
"node_modules/@typescript-eslint/parser": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.31.1.tgz",
- "integrity": "sha512-oU/OtYVydhXnumd0BobL9rkJg7wFJ9bFFPmSmB/bf/XWN85hlViji59ko6bSKBXyseT9V8l+CN1nwmlbiN0G7Q==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz",
+ "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/scope-manager": "8.31.1",
- "@typescript-eslint/types": "8.31.1",
- "@typescript-eslint/typescript-estree": "8.31.1",
- "@typescript-eslint/visitor-keys": "8.31.1",
+ "@typescript-eslint/scope-manager": "8.34.0",
+ "@typescript-eslint/types": "8.34.0",
+ "@typescript-eslint/typescript-estree": "8.34.0",
+ "@typescript-eslint/visitor-keys": "8.34.0",
"debug": "^4.3.4"
},
"engines": {
@@ -3509,15 +3625,37 @@
"typescript": ">=4.8.4 <5.9.0"
}
},
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.31.1.tgz",
- "integrity": "sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==",
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz",
+ "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.31.1",
- "@typescript-eslint/visitor-keys": "8.31.1"
+ "@typescript-eslint/tsconfig-utils": "^8.34.0",
+ "@typescript-eslint/types": "^8.34.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz",
+ "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.34.0",
+ "@typescript-eslint/visitor-keys": "8.34.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3527,17 +3665,34 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz",
+ "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <5.9.0"
+ }
+ },
"node_modules/@typescript-eslint/type-utils": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.31.1.tgz",
- "integrity": "sha512-fNaT/m9n0+dpSp8G/iOQ05GoHYXbxw81x+yvr7TArTuZuCA6VVKbqWYVZrV5dVagpDTtj/O8k5HBEE/p/HM5LA==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz",
+ "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "8.31.1",
- "@typescript-eslint/utils": "8.31.1",
+ "@typescript-eslint/typescript-estree": "8.34.0",
+ "@typescript-eslint/utils": "8.34.0",
"debug": "^4.3.4",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3552,9 +3707,9 @@
}
},
"node_modules/@typescript-eslint/types": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.31.1.tgz",
- "integrity": "sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz",
+ "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3566,20 +3721,22 @@
}
},
"node_modules/@typescript-eslint/typescript-estree": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.31.1.tgz",
- "integrity": "sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz",
+ "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.31.1",
- "@typescript-eslint/visitor-keys": "8.31.1",
+ "@typescript-eslint/project-service": "8.34.0",
+ "@typescript-eslint/tsconfig-utils": "8.34.0",
+ "@typescript-eslint/types": "8.34.0",
+ "@typescript-eslint/visitor-keys": "8.34.0",
"debug": "^4.3.4",
"fast-glob": "^3.3.2",
"is-glob": "^4.0.3",
"minimatch": "^9.0.4",
"semver": "^7.6.0",
- "ts-api-utils": "^2.0.1"
+ "ts-api-utils": "^2.1.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3592,6 +3749,23 @@
"typescript": ">=4.8.4 <5.9.0"
}
},
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -3609,16 +3783,16 @@
}
},
"node_modules/@typescript-eslint/utils": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.31.1.tgz",
- "integrity": "sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz",
+ "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "8.31.1",
- "@typescript-eslint/types": "8.31.1",
- "@typescript-eslint/typescript-estree": "8.31.1"
+ "@eslint-community/eslint-utils": "^4.7.0",
+ "@typescript-eslint/scope-manager": "8.34.0",
+ "@typescript-eslint/types": "8.34.0",
+ "@typescript-eslint/typescript-estree": "8.34.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -3633,13 +3807,13 @@
}
},
"node_modules/@typescript-eslint/visitor-keys": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.31.1.tgz",
- "integrity": "sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz",
+ "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "8.31.1",
+ "@typescript-eslint/types": "8.34.0",
"eslint-visitor-keys": "^4.2.0"
},
"engines": {
@@ -3650,10 +3824,38 @@
"url": "https://opencollective.com/typescript-eslint"
}
},
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.1.tgz",
+ "integrity": "sha512-dd7yIp1hfJFX9ZlVLQRrh/Re9WMUHHmF9hrKD1yIvxcyNr2BhQ3xc1upAVhy8NijadnCswAxWQu8MkkSMC1qXQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.1.tgz",
+ "integrity": "sha512-EzUPcMFtDVlo5yrbzMqUsGq3HnLXw+3ZOhSd7CUaDmbTtnrzM+RO2ntw2dm2wjbbc5djWj3yX0wzbbg8pLhx8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
"node_modules/@unrs/resolver-binding-darwin-arm64": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz",
- "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.1.tgz",
+ "integrity": "sha512-nB+dna3q4kOleKFcSZJ/wDXIsAd1kpMO9XrVAt8tG3RDWJ6vi+Ic6bpz4cmg5tWNeCfHEY4KuqJCB+pKejPEmQ==",
"cpu": [
"arm64"
],
@@ -3665,9 +3867,9 @@
]
},
"node_modules/@unrs/resolver-binding-darwin-x64": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz",
- "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.1.tgz",
+ "integrity": "sha512-aKWHCrOGaCGwZcekf3TnczQoBxk5w//W3RZ4EQyhux6rKDwBPgDU9Y2yGigCV1Z+8DWqZgVGQi+hdpnlSy3a1w==",
"cpu": [
"x64"
],
@@ -3679,9 +3881,9 @@
]
},
"node_modules/@unrs/resolver-binding-freebsd-x64": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz",
- "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.1.tgz",
+ "integrity": "sha512-4dIEMXrXt0UqDVgrsUd1I+NoIzVQWXy/CNhgpfS75rOOMK/4Abn0Mx2M2gWH4Mk9+ds/ASAiCmqoUFynmMY5hA==",
"cpu": [
"x64"
],
@@ -3693,9 +3895,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz",
- "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.1.tgz",
+ "integrity": "sha512-vtvS13IXPs1eE8DuS/soiosqMBeyh50YLRZ+p7EaIKAPPeevRnA9G/wu/KbVt01ZD5qiGjxS+CGIdVC7I6gTOw==",
"cpu": [
"arm"
],
@@ -3707,9 +3909,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz",
- "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.1.tgz",
+ "integrity": "sha512-BfdnN6aZ7NcX8djW8SR6GOJc+K+sFhWRF4vJueVE0vbUu5N1bLnBpxJg1TGlhSyo+ImC4SR0jcNiKN0jdoxt+A==",
"cpu": [
"arm"
],
@@ -3721,9 +3923,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz",
- "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.1.tgz",
+ "integrity": "sha512-Jhge7lFtH0QqfRz2PyJjJXWENqywPteITd+nOS0L6AhbZli+UmEyGBd2Sstt1c+l9C+j/YvKTl9wJo9PPmsFNg==",
"cpu": [
"arm64"
],
@@ -3735,9 +3937,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-arm64-musl": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz",
- "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.1.tgz",
+ "integrity": "sha512-ofdK/ow+ZSbSU0pRoB7uBaiRHeaAOYQFU5Spp87LdcPL/P1RhbCTMSIYVb61XWzsVEmYKjHFtoIE0wxP6AFvrA==",
"cpu": [
"arm64"
],
@@ -3749,9 +3951,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz",
- "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.1.tgz",
+ "integrity": "sha512-eC8SXVn8de67HacqU7PoGdHA+9tGbqfEdD05AEFRAB81ejeQtNi5Fx7lPcxpLH79DW0BnMAHau3hi4RVkHfSCw==",
"cpu": [
"ppc64"
],
@@ -3763,9 +3965,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz",
- "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.1.tgz",
+ "integrity": "sha512-fIkwvAAQ41kfoGWfzeJ33iLGShl0JEDZHrMnwTHMErUcPkaaZRJYjQjsFhMl315NEQ4mmTlC+2nfK/J2IszDOw==",
"cpu": [
"riscv64"
],
@@ -3777,9 +3979,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz",
- "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.1.tgz",
+ "integrity": "sha512-RAAszxImSOFLk44aLwnSqpcOdce8sBcxASledSzuFAd8Q5ZhhVck472SisspnzHdc7THCvGXiUeZ2hOC7NUoBQ==",
"cpu": [
"riscv64"
],
@@ -3791,9 +3993,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz",
- "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.1.tgz",
+ "integrity": "sha512-QoP9vkY+THuQdZi05bA6s6XwFd6HIz3qlx82v9bTOgxeqin/3C12Ye7f7EOD00RQ36OtOPWnhEMMm84sv7d1XQ==",
"cpu": [
"s390x"
],
@@ -3805,9 +4007,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-x64-gnu": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz",
- "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.1.tgz",
+ "integrity": "sha512-/p77cGN/h9zbsfCseAP5gY7tK+7+DdM8fkPfr9d1ye1fsF6bmtGbtZN6e/8j4jCZ9NEIBBkT0GhdgixSelTK9g==",
"cpu": [
"x64"
],
@@ -3819,9 +4021,9 @@
]
},
"node_modules/@unrs/resolver-binding-linux-x64-musl": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz",
- "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.1.tgz",
+ "integrity": "sha512-wInTqT3Bu9u50mDStEig1v8uxEL2Ht+K8pir/YhyyrM5ordJtxoqzsL1vR/CQzOJuDunUTrDkMM0apjW/d7/PA==",
"cpu": [
"x64"
],
@@ -3833,9 +4035,9 @@
]
},
"node_modules/@unrs/resolver-binding-wasm32-wasi": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz",
- "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.1.tgz",
+ "integrity": "sha512-eNwqO5kUa+1k7yFIircwwiniKWA0UFHo2Cfm8LYgkh9km7uMad+0x7X7oXbQonJXlqfitBTSjhA0un+DsHIrhw==",
"cpu": [
"wasm32"
],
@@ -3843,16 +4045,16 @@
"license": "MIT",
"optional": true,
"dependencies": {
- "@napi-rs/wasm-runtime": "^0.2.9"
+ "@napi-rs/wasm-runtime": "^0.2.11"
},
"engines": {
"node": ">=14.0.0"
}
},
"node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz",
- "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.1.tgz",
+ "integrity": "sha512-Eaz1xMUnoa2mFqh20mPqSdbYl6crnk8HnIXDu6nsla9zpgZJZO8w3c1gvNN/4Eb0RXRq3K9OG6mu8vw14gIqiA==",
"cpu": [
"arm64"
],
@@ -3864,9 +4066,9 @@
]
},
"node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz",
- "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.1.tgz",
+ "integrity": "sha512-H/+d+5BGlnEQif0gnwWmYbYv7HJj563PUKJfn8PlmzF8UmF+8KxdvXdwCsoOqh4HHnENnoLrav9NYBrv76x1wQ==",
"cpu": [
"ia32"
],
@@ -3878,9 +4080,9 @@
]
},
"node_modules/@unrs/resolver-binding-win32-x64-msvc": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz",
- "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.1.tgz",
+ "integrity": "sha512-rS86wI4R6cknYM3is3grCb/laE8XBEbpWAMSIPjYfmYp75KL5dT87jXF2orDa4tQYg5aajP5G8Fgh34dRyR+Rw==",
"cpu": [
"x64"
],
@@ -3892,9 +4094,9 @@
]
},
"node_modules/@vitejs/plugin-vue": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz",
- "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==",
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz",
+ "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3906,15 +4108,16 @@
}
},
"node_modules/@vitest/coverage-v8": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.1.2.tgz",
- "integrity": "sha512-XDdaDOeaTMAMYW7N63AqoK32sYUWbXnTkC6tEbVcu3RlU1bB9of32T+PGf8KZvxqLNqeXhafDFqCkwpf2+dyaQ==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.3.tgz",
+ "integrity": "sha512-D1QKzngg8PcDoCE8FHSZhREDuEy+zcKmMiMafYse41RZpBE5EDJyKOTdqK3RQfsV2S2nyKor5KCs8PyPRFqKPg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.3.0",
"@bcoe/v8-coverage": "^1.0.2",
- "debug": "^4.4.0",
+ "ast-v8-to-istanbul": "^0.3.3",
+ "debug": "^4.4.1",
"istanbul-lib-coverage": "^3.2.2",
"istanbul-lib-report": "^3.0.1",
"istanbul-lib-source-maps": "^5.0.6",
@@ -3929,8 +4132,8 @@
"url": "https://opencollective.com/vitest"
},
"peerDependencies": {
- "@vitest/browser": "3.1.2",
- "vitest": "3.1.2"
+ "@vitest/browser": "3.2.3",
+ "vitest": "3.2.3"
},
"peerDependenciesMeta": {
"@vitest/browser": {
@@ -3949,13 +4152,15 @@
}
},
"node_modules/@vitest/eslint-plugin": {
- "version": "1.1.43",
- "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.43.tgz",
- "integrity": "sha512-OLoUMO67Yg+kr7E6SjF5+Qvl2f6uNJ7ImQYnXT8WgnPiZE41ZQBsnzn70jehXrhFVadphHs2smk+yl0TFKLV5Q==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.2.2.tgz",
+ "integrity": "sha512-R8NwW+VxyKqVGcMfYsUbdThQyMbtNcoeg+jJeTgMHqWdFdcS0nrODAQXhkplvWzgd7jIJ+GQeydGqFLibsxMxg==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^8.24.0"
+ },
"peerDependencies": {
- "@typescript-eslint/utils": ">= 8.24.0",
"eslint": ">= 8.57.0",
"typescript": ">= 5.0.0",
"vitest": "*"
@@ -3970,14 +4175,15 @@
}
},
"node_modules/@vitest/expect": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.1.2.tgz",
- "integrity": "sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.3.tgz",
+ "integrity": "sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.1.2",
- "@vitest/utils": "3.1.2",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "3.2.3",
+ "@vitest/utils": "3.2.3",
"chai": "^5.2.0",
"tinyrainbow": "^2.0.0"
},
@@ -3986,13 +4192,13 @@
}
},
"node_modules/@vitest/mocker": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.1.2.tgz",
- "integrity": "sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.3.tgz",
+ "integrity": "sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/spy": "3.1.2",
+ "@vitest/spy": "3.2.3",
"estree-walker": "^3.0.3",
"magic-string": "^0.30.17"
},
@@ -4001,7 +4207,7 @@
},
"peerDependencies": {
"msw": "^2.4.9",
- "vite": "^5.0.0 || ^6.0.0"
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"peerDependenciesMeta": {
"msw": {
@@ -4013,9 +4219,9 @@
}
},
"node_modules/@vitest/mocker/node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
@@ -4040,9 +4246,9 @@
}
},
"node_modules/@vitest/pretty-format": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.1.2.tgz",
- "integrity": "sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.3.tgz",
+ "integrity": "sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4053,27 +4259,28 @@
}
},
"node_modules/@vitest/runner": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.1.2.tgz",
- "integrity": "sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.3.tgz",
+ "integrity": "sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/utils": "3.1.2",
- "pathe": "^2.0.3"
+ "@vitest/utils": "3.2.3",
+ "pathe": "^2.0.3",
+ "strip-literal": "^3.0.0"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/snapshot": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.1.2.tgz",
- "integrity": "sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.3.tgz",
+ "integrity": "sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.1.2",
+ "@vitest/pretty-format": "3.2.3",
"magic-string": "^0.30.17",
"pathe": "^2.0.3"
},
@@ -4092,26 +4299,26 @@
}
},
"node_modules/@vitest/spy": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.1.2.tgz",
- "integrity": "sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.3.tgz",
+ "integrity": "sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "tinyspy": "^3.0.2"
+ "tinyspy": "^4.0.3"
},
"funding": {
"url": "https://opencollective.com/vitest"
}
},
"node_modules/@vitest/utils": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.1.2.tgz",
- "integrity": "sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.3.tgz",
+ "integrity": "sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/pretty-format": "3.1.2",
+ "@vitest/pretty-format": "3.2.3",
"loupe": "^3.1.3",
"tinyrainbow": "^2.0.0"
},
@@ -4120,39 +4327,39 @@
}
},
"node_modules/@vue/compiler-core": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.14.tgz",
- "integrity": "sha512-k7qMHMbKvoCXIxPhquKQVw3Twid3Kg4s7+oYURxLGRd56LiuHJVrvFKI4fm2AM3c8apqODPfVJGoh8nePbXMRA==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz",
+ "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.2",
- "@vue/shared": "3.5.14",
+ "@vue/shared": "3.5.16",
"entities": "^4.5.0",
"estree-walker": "^2.0.2",
"source-map-js": "^1.2.1"
}
},
"node_modules/@vue/compiler-dom": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.14.tgz",
- "integrity": "sha512-1aOCSqxGOea5I80U2hQJvXYpPm/aXo95xL/m/mMhgyPUsKe9jhjwWpziNAw7tYRnbz1I61rd9Mld4W9KmmRoug==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz",
+ "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-core": "3.5.14",
- "@vue/shared": "3.5.14"
+ "@vue/compiler-core": "3.5.16",
+ "@vue/shared": "3.5.16"
}
},
"node_modules/@vue/compiler-sfc": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.14.tgz",
- "integrity": "sha512-9T6m/9mMr81Lj58JpzsiSIjBgv2LiVoWjIVa7kuXHICUi8LiDSIotMpPRXYJsXKqyARrzjT24NAwttrMnMaCXA==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz",
+ "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==",
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.27.2",
- "@vue/compiler-core": "3.5.14",
- "@vue/compiler-dom": "3.5.14",
- "@vue/compiler-ssr": "3.5.14",
- "@vue/shared": "3.5.14",
+ "@vue/compiler-core": "3.5.16",
+ "@vue/compiler-dom": "3.5.16",
+ "@vue/compiler-ssr": "3.5.16",
+ "@vue/shared": "3.5.16",
"estree-walker": "^2.0.2",
"magic-string": "^0.30.17",
"postcss": "^8.5.3",
@@ -4168,92 +4375,64 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
- "node_modules/@vue/compiler-sfc/node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
"node_modules/@vue/compiler-ssr": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.14.tgz",
- "integrity": "sha512-Y0G7PcBxr1yllnHuS/NxNCSPWnRGH4Ogrp0tsLA5QemDZuJLs99YjAKQ7KqkHE0vCg4QTKlQzXLKCMF7WPSl7Q==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz",
+ "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.14",
- "@vue/shared": "3.5.14"
+ "@vue/compiler-dom": "3.5.16",
+ "@vue/shared": "3.5.16"
}
},
"node_modules/@vue/reactivity": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.14.tgz",
- "integrity": "sha512-7cK1Hp343Fu/SUCCO52vCabjvsYu7ZkOqyYu7bXV9P2yyfjUMUXHZafEbq244sP7gf+EZEz+77QixBTuEqkQQw==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz",
+ "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==",
"license": "MIT",
"dependencies": {
- "@vue/shared": "3.5.14"
+ "@vue/shared": "3.5.16"
}
},
"node_modules/@vue/runtime-core": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.14.tgz",
- "integrity": "sha512-w9JWEANwHXNgieAhxPpEpJa+0V5G0hz3NmjAZwlOebtfKyp2hKxKF0+qSh0Xs6/PhfGihuSdqMprMVcQU/E6ag==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz",
+ "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.14",
- "@vue/shared": "3.5.14"
+ "@vue/reactivity": "3.5.16",
+ "@vue/shared": "3.5.16"
}
},
"node_modules/@vue/runtime-dom": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.14.tgz",
- "integrity": "sha512-lCfR++IakeI35TVR80QgOelsUIdcKjd65rWAMfdSlCYnaEY5t3hYwru7vvcWaqmrK+LpI7ZDDYiGU5V3xjMacw==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz",
+ "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==",
"license": "MIT",
"dependencies": {
- "@vue/reactivity": "3.5.14",
- "@vue/runtime-core": "3.5.14",
- "@vue/shared": "3.5.14",
+ "@vue/reactivity": "3.5.16",
+ "@vue/runtime-core": "3.5.16",
+ "@vue/shared": "3.5.16",
"csstype": "^3.1.3"
}
},
"node_modules/@vue/server-renderer": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.14.tgz",
- "integrity": "sha512-Rf/ISLqokIvcySIYnv3tNWq40PLpNLDLSJwwVWzG6MNtyIhfbcrAxo5ZL9nARJhqjZyWWa40oRb2IDuejeuv6w==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz",
+ "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-ssr": "3.5.14",
- "@vue/shared": "3.5.14"
+ "@vue/compiler-ssr": "3.5.16",
+ "@vue/shared": "3.5.16"
},
"peerDependencies": {
- "vue": "3.5.14"
+ "vue": "3.5.16"
}
},
"node_modules/@vue/shared": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.14.tgz",
- "integrity": "sha512-oXTwNxVfc9EtP1zzXAlSlgARLXNC84frFYkS0HHz0h3E4WZSP9sywqjqzGCP9Y34M8ipNmd380pVgmMuwELDyQ==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz",
+ "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==",
"license": "MIT"
},
"node_modules/@vue/test-utils": {
@@ -4493,9 +4672,9 @@
}
},
"node_modules/acorn": {
- "version": "8.14.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz",
- "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
"bin": {
"acorn": "bin/acorn"
@@ -4676,18 +4855,20 @@
}
},
"node_modules/array-includes": {
- "version": "3.1.8",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
- "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz",
+ "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
+ "call-bind": "^1.0.8",
+ "call-bound": "^1.0.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
- "es-object-atoms": "^1.0.0",
- "get-intrinsic": "^1.2.4",
- "is-string": "^1.0.7"
+ "es-abstract": "^1.24.0",
+ "es-object-atoms": "^1.1.1",
+ "get-intrinsic": "^1.3.0",
+ "is-string": "^1.1.1",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -4790,6 +4971,35 @@
"node": ">=4"
}
},
+ "node_modules/ast-v8-to-istanbul": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.3.tgz",
+ "integrity": "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "estree-walker": "^3.0.3",
+ "js-tokens": "^9.0.1"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul/node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
"node_modules/astral-regex": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
@@ -4860,9 +5070,10 @@
}
},
"node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true,
"license": "MIT"
},
"node_modules/base64-js": {
@@ -4914,14 +5125,23 @@
"license": "ISC"
},
"node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+ "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
+ "node_modules/brace-expansion/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/braces": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
@@ -4935,9 +5155,9 @@
}
},
"node_modules/browserslist": {
- "version": "4.24.5",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz",
- "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==",
+ "version": "4.25.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz",
+ "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==",
"funding": [
{
"type": "opencollective",
@@ -4954,8 +5174,8 @@
],
"license": "MIT",
"dependencies": {
- "caniuse-lite": "^1.0.30001716",
- "electron-to-chromium": "^1.5.149",
+ "caniuse-lite": "^1.0.30001718",
+ "electron-to-chromium": "^1.5.160",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.3"
},
@@ -5037,9 +5257,9 @@
}
},
"node_modules/cacheable": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.9.0.tgz",
- "integrity": "sha512-8D5htMCxPDUULux9gFzv30f04Xo3wCnik0oOxKoRTPIBoqA7HtOcJ87uBhQTs3jCfZZTrUBGsYIZOgE0ZRgMAg==",
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-1.10.0.tgz",
+ "integrity": "sha512-SSgQTAnhd7WlJXnGlIi4jJJOiHzgnM5wRMEPaXAU4kECTAMpBoYKoZ9i5zHmclIEZbxcu3j7yY/CF8DTmwIsHg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5048,9 +5268,9 @@
}
},
"node_modules/cacheable/node_modules/keyv": {
- "version": "5.3.3",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz",
- "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==",
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz",
+ "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -5126,9 +5346,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001718",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz",
- "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==",
+ "version": "1.0.30001724",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz",
+ "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==",
"funding": [
{
"type": "opencollective",
@@ -5212,9 +5432,9 @@
}
},
"node_modules/chart.js": {
- "version": "4.4.9",
- "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.9.tgz",
- "integrity": "sha512-EyZ9wWKgpAU0fLJ43YAEIF8sr5F2W3LqbS40ZJyHIner2lY14ufqv2VMp69MAiZ2rpwxEUxEhIH/0U3xyRynxg==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.0.tgz",
+ "integrity": "sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==",
"license": "MIT",
"dependencies": {
"@kurkle/color": "^0.3.0"
@@ -5370,9 +5590,9 @@
}
},
"node_modules/clippie": {
- "version": "4.1.6",
- "resolved": "https://registry.npmjs.org/clippie/-/clippie-4.1.6.tgz",
- "integrity": "sha512-1M3xZRNWcVwRkh3i2XcVYFjVtfC6FCLmIpk5s54uT3+jkBa25KRE3dB0Fgkt/YLoeR7AABWkVTlb0WziQYGgaw==",
+ "version": "4.1.7",
+ "resolved": "https://registry.npmjs.org/clippie/-/clippie-4.1.7.tgz",
+ "integrity": "sha512-l8BmUmWqOt4mpxeSflcfODJJOU+DsE5atWj82k1zsxd2X82haz2+g12PJPMOt6e1Cs4/ZnOWdRAV+nY9n2o1Rg==",
"license": "BSD-2-Clause"
},
"node_modules/cliui": {
@@ -5554,13 +5774,13 @@
}
},
"node_modules/core-js-compat": {
- "version": "3.42.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz",
- "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==",
+ "version": "3.43.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.43.0.tgz",
+ "integrity": "sha512-2GML2ZsCc5LR7hZYz4AXmjQw8zuy2T//2QntwdnpuYI7jteT6GVYJL7F6C2C57R7gSYrcqVW3lAALefdbhBLDA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "browserslist": "^4.24.4"
+ "browserslist": "^4.25.0"
},
"funding": {
"type": "opencollective",
@@ -6358,9 +6578,9 @@
}
},
"node_modules/decode-named-character-reference": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz",
- "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.2.0.tgz",
+ "integrity": "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6576,9 +6796,9 @@
}
},
"node_modules/dompurify": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.5.tgz",
- "integrity": "sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==",
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz",
+ "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==",
"license": "(MPL-2.0 OR Apache-2.0)",
"optionalDependencies": {
"@types/trusted-types": "^2.0.7"
@@ -6662,6 +6882,23 @@
"node": ">=14"
}
},
+ "node_modules/editorconfig/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/editorconfig/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/editorconfig/node_modules/minimatch": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz",
@@ -6679,9 +6916,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.153",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.153.tgz",
- "integrity": "sha512-4bwluTFwjXZ0/ei1qDpHDGzVveuBfx4wiZ9VQ8j/30+T2JxSF2TfZ00d1X+wNMeDyUdZXgLkJFbarJdAMtd+/w==",
+ "version": "1.5.171",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz",
+ "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==",
"license": "ISC"
},
"node_modules/emoji-regex": {
@@ -6755,9 +6992,9 @@
}
},
"node_modules/es-abstract": {
- "version": "1.23.9",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz",
- "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==",
+ "version": "1.24.0",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
+ "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -6765,18 +7002,18 @@
"arraybuffer.prototype.slice": "^1.0.4",
"available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.8",
- "call-bound": "^1.0.3",
+ "call-bound": "^1.0.4",
"data-view-buffer": "^1.0.2",
"data-view-byte-length": "^1.0.2",
"data-view-byte-offset": "^1.0.1",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
- "es-object-atoms": "^1.0.0",
+ "es-object-atoms": "^1.1.1",
"es-set-tostringtag": "^2.1.0",
"es-to-primitive": "^1.3.0",
"function.prototype.name": "^1.1.8",
- "get-intrinsic": "^1.2.7",
- "get-proto": "^1.0.0",
+ "get-intrinsic": "^1.3.0",
+ "get-proto": "^1.0.1",
"get-symbol-description": "^1.1.0",
"globalthis": "^1.0.4",
"gopd": "^1.2.0",
@@ -6788,21 +7025,24 @@
"is-array-buffer": "^3.0.5",
"is-callable": "^1.2.7",
"is-data-view": "^1.0.2",
+ "is-negative-zero": "^2.0.3",
"is-regex": "^1.2.1",
+ "is-set": "^2.0.3",
"is-shared-array-buffer": "^1.0.4",
"is-string": "^1.1.1",
"is-typed-array": "^1.1.15",
- "is-weakref": "^1.1.0",
+ "is-weakref": "^1.1.1",
"math-intrinsics": "^1.1.0",
- "object-inspect": "^1.13.3",
+ "object-inspect": "^1.13.4",
"object-keys": "^1.1.1",
"object.assign": "^4.1.7",
"own-keys": "^1.0.1",
- "regexp.prototype.flags": "^1.5.3",
+ "regexp.prototype.flags": "^1.5.4",
"safe-array-concat": "^1.1.3",
"safe-push-apply": "^1.0.0",
"safe-regex-test": "^1.1.0",
"set-proto": "^1.0.0",
+ "stop-iteration-iterator": "^1.1.0",
"string.prototype.trim": "^1.2.10",
"string.prototype.trimend": "^1.0.9",
"string.prototype.trimstart": "^1.0.8",
@@ -6811,7 +7051,7 @@
"typed-array-byte-offset": "^1.0.4",
"typed-array-length": "^1.0.7",
"unbox-primitive": "^1.1.0",
- "which-typed-array": "^1.1.18"
+ "which-typed-array": "^1.1.19"
},
"engines": {
"node": ">= 0.4"
@@ -6821,18 +7061,18 @@
}
},
"node_modules/es-aggregate-error": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.13.tgz",
- "integrity": "sha512-KkzhUUuD2CUMqEc8JEqsXEMDHzDPE8RCjZeUBitsnB1eNcAJWQPiciKsMXe3Yytj4Flw1XLl46Qcf9OxvZha7A==",
+ "version": "1.0.14",
+ "resolved": "https://registry.npmjs.org/es-aggregate-error/-/es-aggregate-error-1.0.14.tgz",
+ "integrity": "sha512-3YxX6rVb07B5TV11AV5wsL7nQCHXNwoHPsQC8S4AmBiqYhyNCJ5BRKXkXyDJvs8QzXN20NgRtxe3dEEQD9NLHA==",
"dev": true,
"license": "MIT",
"dependencies": {
"define-data-property": "^1.1.4",
"define-properties": "^1.2.1",
- "es-abstract": "^1.23.2",
+ "es-abstract": "^1.24.0",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
- "globalthis": "^1.0.3",
+ "globalthis": "^1.0.4",
"has-property-descriptors": "^1.0.2",
"set-function-name": "^2.0.2"
},
@@ -6930,9 +7170,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.25.4",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz",
- "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==",
+ "version": "0.25.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz",
+ "integrity": "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
@@ -6942,31 +7182,31 @@
"node": ">=18"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.25.4",
- "@esbuild/android-arm": "0.25.4",
- "@esbuild/android-arm64": "0.25.4",
- "@esbuild/android-x64": "0.25.4",
- "@esbuild/darwin-arm64": "0.25.4",
- "@esbuild/darwin-x64": "0.25.4",
- "@esbuild/freebsd-arm64": "0.25.4",
- "@esbuild/freebsd-x64": "0.25.4",
- "@esbuild/linux-arm": "0.25.4",
- "@esbuild/linux-arm64": "0.25.4",
- "@esbuild/linux-ia32": "0.25.4",
- "@esbuild/linux-loong64": "0.25.4",
- "@esbuild/linux-mips64el": "0.25.4",
- "@esbuild/linux-ppc64": "0.25.4",
- "@esbuild/linux-riscv64": "0.25.4",
- "@esbuild/linux-s390x": "0.25.4",
- "@esbuild/linux-x64": "0.25.4",
- "@esbuild/netbsd-arm64": "0.25.4",
- "@esbuild/netbsd-x64": "0.25.4",
- "@esbuild/openbsd-arm64": "0.25.4",
- "@esbuild/openbsd-x64": "0.25.4",
- "@esbuild/sunos-x64": "0.25.4",
- "@esbuild/win32-arm64": "0.25.4",
- "@esbuild/win32-ia32": "0.25.4",
- "@esbuild/win32-x64": "0.25.4"
+ "@esbuild/aix-ppc64": "0.25.5",
+ "@esbuild/android-arm": "0.25.5",
+ "@esbuild/android-arm64": "0.25.5",
+ "@esbuild/android-x64": "0.25.5",
+ "@esbuild/darwin-arm64": "0.25.5",
+ "@esbuild/darwin-x64": "0.25.5",
+ "@esbuild/freebsd-arm64": "0.25.5",
+ "@esbuild/freebsd-x64": "0.25.5",
+ "@esbuild/linux-arm": "0.25.5",
+ "@esbuild/linux-arm64": "0.25.5",
+ "@esbuild/linux-ia32": "0.25.5",
+ "@esbuild/linux-loong64": "0.25.5",
+ "@esbuild/linux-mips64el": "0.25.5",
+ "@esbuild/linux-ppc64": "0.25.5",
+ "@esbuild/linux-riscv64": "0.25.5",
+ "@esbuild/linux-s390x": "0.25.5",
+ "@esbuild/linux-x64": "0.25.5",
+ "@esbuild/netbsd-arm64": "0.25.5",
+ "@esbuild/netbsd-x64": "0.25.5",
+ "@esbuild/openbsd-arm64": "0.25.5",
+ "@esbuild/openbsd-x64": "0.25.5",
+ "@esbuild/sunos-x64": "0.25.5",
+ "@esbuild/win32-arm64": "0.25.5",
+ "@esbuild/win32-ia32": "0.25.5",
+ "@esbuild/win32-x64": "0.25.5"
}
},
"node_modules/esbuild-loader": {
@@ -7022,9 +7262,9 @@
}
},
"node_modules/eslint": {
- "version": "9.25.1",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.25.1.tgz",
- "integrity": "sha512-E6Mtz9oGQWDCpV12319d59n4tx9zOTXSTmc8BLVxBx+G/0RdM5MvEEJLU9c0+aleoePYYgVTOsRblx433qmhWQ==",
+ "version": "9.28.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz",
+ "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7032,10 +7272,10 @@
"@eslint-community/regexpp": "^4.12.1",
"@eslint/config-array": "^0.20.0",
"@eslint/config-helpers": "^0.2.1",
- "@eslint/core": "^0.13.0",
+ "@eslint/core": "^0.14.0",
"@eslint/eslintrc": "^3.3.1",
- "@eslint/js": "9.25.1",
- "@eslint/plugin-kit": "^0.2.8",
+ "@eslint/js": "9.28.0",
+ "@eslint/plugin-kit": "^0.3.1",
"@humanfs/node": "^0.16.6",
"@humanwhocodes/module-importer": "^1.0.1",
"@humanwhocodes/retry": "^0.4.2",
@@ -7098,41 +7338,45 @@
"eslint": ">=6.0.0"
}
},
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "node_modules/eslint-import-context": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.8.tgz",
+ "integrity": "sha512-bq+F7nyc65sKpZGT09dY0S0QrOnQtuDVIfyTGQ8uuvtMIF7oHp6CEP3mouN0rrnYF3Jqo6Ke0BfU/5wASZue1w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.1"
+ "get-tsconfig": "^4.10.1",
+ "stable-hash-x": "^0.1.1"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-context"
+ },
+ "peerDependencies": {
+ "unrs-resolver": "^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "unrs-resolver": {
+ "optional": true
+ }
}
},
"node_modules/eslint-import-resolver-typescript": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.3.4.tgz",
- "integrity": "sha512-buzw5z5VtiQMysYLH9iW9BV04YyZebsw+gPi+c4FCjfS9i6COYOrEWw9t3m3wA9PFBfqcBCqWf32qrXLbwafDw==",
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.3.tgz",
+ "integrity": "sha512-elVDn1eWKFrWlzxlWl9xMt8LltjKl161Ix50JFC50tHXI5/TRP32SNEqlJ/bo/HV+g7Rou/tlPQU2AcRtIhrOg==",
"dev": true,
"license": "ISC",
"dependencies": {
- "debug": "^4.4.0",
- "get-tsconfig": "^4.10.0",
+ "debug": "^4.4.1",
+ "eslint-import-context": "^0.1.8",
+ "get-tsconfig": "^4.10.1",
"is-bun-module": "^2.0.0",
- "stable-hash": "^0.0.5",
- "tinyglobby": "^0.2.13",
- "unrs-resolver": "^1.6.3"
+ "stable-hash-x": "^0.1.1",
+ "tinyglobby": "^0.2.14",
+ "unrs-resolver": "^1.7.11"
},
"engines": {
"node": "^16.17.0 || >=18.6.0"
@@ -7168,23 +7412,21 @@
}
},
"node_modules/eslint-plugin-import-x": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.11.0.tgz",
- "integrity": "sha512-NAaYY49342gj09QGvwnFFl5KcD5aLzjAz97Lo+upnN8MzjEGSIlmL5sxCYGqtIeMjw8fSRDFZIp2xjRLT+yl4Q==",
+ "version": "4.15.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.15.1.tgz",
+ "integrity": "sha512-JfVpNg1qMkPD66iaSgmMoSYeUCGS8UFSm3GwHV0IbuV3Knar/SyK5qqCct9+AxoMIzaM+KSO7KK5pOeOkC/3GQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/utils": "^8.31.0",
+ "@typescript-eslint/types": "^8.33.1",
"comment-parser": "^1.4.1",
- "debug": "^4.4.0",
- "eslint-import-resolver-node": "^0.3.9",
- "get-tsconfig": "^4.10.0",
+ "debug": "^4.4.1",
+ "eslint-import-context": "^0.1.7",
"is-glob": "^4.0.3",
"minimatch": "^9.0.3 || ^10.0.1",
- "semver": "^7.7.1",
- "stable-hash": "^0.0.5",
- "tslib": "^2.8.1",
- "unrs-resolver": "^1.7.0"
+ "semver": "^7.7.2",
+ "stable-hash-x": "^0.1.1",
+ "unrs-resolver": "^1.7.10"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7193,7 +7435,17 @@
"url": "https://opencollective.com/eslint-plugin-import-x"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
+ "@typescript-eslint/utils": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0",
+ "eslint-import-resolver-node": "*"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/utils": {
+ "optional": true
+ },
+ "eslint-import-resolver-node": {
+ "optional": true
+ }
}
},
"node_modules/eslint-plugin-no-jquery": {
@@ -7261,9 +7513,9 @@
}
},
"node_modules/eslint-plugin-regexp": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.7.0.tgz",
- "integrity": "sha512-U8oZI77SBtH8U3ulZ05iu0qEzIizyEDXd+BWHvyVxTOjGwcDcvy/kEpgFG4DYca2ByRLiVPFZ2GeH7j1pdvZTA==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-regexp/-/eslint-plugin-regexp-2.9.0.tgz",
+ "integrity": "sha512-9WqJMnOq8VlE/cK+YAo9C9YHhkOtcEtEk9d12a+H7OSZFwlpI6stiHmYPGa2VE0QhTzodJyhlyprUaXDZLgHBw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7303,6 +7555,23 @@
"eslint": "^8.0.0 || ^9.0.0"
}
},
+ "node_modules/eslint-plugin-sonarjs/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint-plugin-sonarjs/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/eslint-plugin-sonarjs/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@@ -7319,6 +7588,19 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/eslint-plugin-sonarjs/node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/eslint-plugin-toml": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-toml/-/eslint-plugin-toml-0.12.0.tgz",
@@ -7342,9 +7624,9 @@
}
},
"node_modules/eslint-plugin-unicorn": {
- "version": "59.0.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.0.tgz",
- "integrity": "sha512-7IEeqkymGa7tr6wTWS4DolfXnfcE3QjcD0g7I+qCfV5GPMvVsFsLT7zTIYvnudqwAm5nWekdGIOTTXA93Sz9Ow==",
+ "version": "59.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-59.0.1.tgz",
+ "integrity": "sha512-EtNXYuWPUmkgSU2E7Ttn57LbRREQesIP1BiLn7OZLKodopKfDXfBUkC/0j6mpw2JExwf43Uf3qLSvrSvppgy8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7376,6 +7658,33 @@
"eslint": ">=9.22.0"
}
},
+ "node_modules/eslint-plugin-unicorn/node_modules/@eslint/core": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.13.0.tgz",
+ "integrity": "sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/eslint-plugin-unicorn/node_modules/@eslint/plugin-kit": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.8.tgz",
+ "integrity": "sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^0.13.0",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/eslint-plugin-vitest-globals": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-vitest-globals/-/eslint-plugin-vitest-globals-1.5.0.tgz",
@@ -7384,9 +7693,9 @@
"license": "MIT"
},
"node_modules/eslint-plugin-vue": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.1.0.tgz",
- "integrity": "sha512-/VTiJ1eSfNLw6lvG9ENySbGmcVvz6wZ9nA7ZqXlLBY2RkaF15iViYKxglWiIch12KiLAj0j1iXPYU6W4wTROFA==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.2.0.tgz",
+ "integrity": "sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7406,9 +7715,9 @@
}
},
"node_modules/eslint-plugin-vue-scoped-css": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.9.0.tgz",
- "integrity": "sha512-zXeKtEUpfk3PlsgKnr9/2U8K2xcsCV1M9hXWRhKbl3wipVowGXfHrhqUzHFVWNAHzEQv0DCDXGFWrmsGFqhGGA==",
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue-scoped-css/-/eslint-plugin-vue-scoped-css-2.10.0.tgz",
+ "integrity": "sha512-oH2NY7XFHF3EGOotvuPdnhB0x4uOmjoRoWZVfMnJ2PILDKVgZgM8WZ0rhDlh+fsr9jO9P8CAXO5/9s9v/GZNhg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7433,23 +7742,23 @@
}
},
"node_modules/eslint-plugin-wc": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-2.2.1.tgz",
- "integrity": "sha512-KstLqGmyQz088DvFlDYHg0sHih+w2QeulreCi1D1ftr357klO2zqHdG/bbnNMmuQdVFDuNkopNIyNhmG0XCT/g==",
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-3.0.1.tgz",
+ "integrity": "sha512-0p1wkSlA2Ue3FA4qW+5LZ+15sy0p1nUyVl1eyBMLq4rtN1LtE9IdI49BXNWMz8N8bM/y7Ulx8SWGAni5f8XO5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-valid-element-name": "^1.0.0",
- "js-levenshtein-esm": "^1.2.0"
+ "js-levenshtein-esm": "^2.0.0"
},
"peerDependencies": {
"eslint": ">=8.40.0"
}
},
"node_modules/eslint-scope": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz",
- "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==",
+ "version": "8.4.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+ "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
@@ -7464,9 +7773,9 @@
}
},
"node_modules/eslint-visitor-keys": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
- "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
"license": "Apache-2.0",
"engines": {
@@ -7477,9 +7786,9 @@
}
},
"node_modules/eslint/node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
@@ -7500,17 +7809,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/eslint/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/eslint/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -7532,15 +7830,15 @@
}
},
"node_modules/espree": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
- "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
"license": "BSD-2-Clause",
"dependencies": {
- "acorn": "^8.14.0",
+ "acorn": "^8.15.0",
"acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^4.2.0"
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -7629,9 +7927,9 @@
}
},
"node_modules/exsolve": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz",
- "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==",
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz",
+ "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==",
"license": "MIT"
},
"node_modules/fast-deep-equal": {
@@ -8060,9 +8358,9 @@
}
},
"node_modules/get-tsconfig": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz",
- "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==",
+ "version": "4.10.1",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz",
+ "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==",
"license": "MIT",
"dependencies": {
"resolve-pkg-maps": "^1.0.0"
@@ -8111,17 +8409,6 @@
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
"license": "BSD-2-Clause"
},
- "node_modules/glob/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
"node_modules/glob/node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -8276,17 +8563,18 @@
}
},
"node_modules/happy-dom": {
- "version": "17.4.6",
- "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-17.4.6.tgz",
- "integrity": "sha512-OEV1hDe9i2rFr66+WZNiwy1S8rAJy6bRXmXql68YJDjdfHBRbN76om+qVh68vQACf6y5Bcr90e/oK53RQxsDdg==",
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-18.0.0.tgz",
+ "integrity": "sha512-o3p2Axi1EdIfMaOUulDzO/5yXzLLV0g/54eLPVrkt3u20r3yOuOenHpyp2clAJ0eHMc+HyE139ulQxl+8pEJIw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "webidl-conversions": "^7.0.0",
+ "@types/node": "^20.0.0",
+ "@types/whatwg-mimetype": "^3.0.2",
"whatwg-mimetype": "^3.0.0"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/has-bigints": {
@@ -8388,9 +8676,9 @@
}
},
"node_modules/hookified": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.0.tgz",
- "integrity": "sha512-2yEEGqphImtKIe1NXWEhu6yD3hlFR4Mxk4Mtp3XEyScpSt4pQ4ymmXA1zzxZpj99QkFK+nN0nzjeb2+RUi/6CQ==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.9.1.tgz",
+ "integrity": "sha512-u3pxtGhKjcSXnGm1CX6aXS9xew535j3lkOCegbA6jdyh0BaAjTbXI4aslKstCr6zUNtoCxFGFKwjbSHdGrMB8g==",
"dev": true,
"license": "MIT"
},
@@ -8523,6 +8811,12 @@
"node": ">= 4"
}
},
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "license": "MIT"
+ },
"node_modules/immer": {
"version": "9.0.21",
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
@@ -8992,6 +9286,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -9049,6 +9356,12 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/is-promise": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
+ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==",
+ "license": "MIT"
+ },
"node_modules/is-proto-prop": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/is-proto-prop/-/is-proto-prop-3.0.1.tgz",
@@ -9385,6 +9698,23 @@
"node": ">=14"
}
},
+ "node_modules/js-beautify/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-beautify/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/js-beautify/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -9433,9 +9763,9 @@
}
},
"node_modules/js-levenshtein-esm": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz",
- "integrity": "sha512-fzreKVq1eD7eGcQr7MtRpQH94f8gIfhdrc7yeih38xh684TNMK9v5aAu2wxfIRMk/GpAJRrzcirMAPIaSDaByQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-2.0.0.tgz",
+ "integrity": "sha512-1n4LEPOL4wRXY8rOQcuA7Iuaphe5xCMayvufCzlLAi+hRsnBRDbSS6XPuV58CBVJxj5D9ApFLyjQ7KzFToyHBw==",
"dev": true,
"license": "MIT"
},
@@ -9748,6 +10078,15 @@
"npm": ">=8"
}
},
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "license": "MIT",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
"node_modules/lilconfig": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
@@ -9776,6 +10115,37 @@
"uc.micro": "^2.0.0"
}
},
+ "node_modules/lit": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.0.tgz",
+ "integrity": "sha512-DGVsqsOIHBww2DqnuZzW7QsuCdahp50ojuDaBPC7jUDRpYoH0z7kHBBYZewRzer75FwtrkmkKk7iOAwSaWdBmw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit/reactive-element": "^2.1.0",
+ "lit-element": "^4.2.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-element": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.0.tgz",
+ "integrity": "sha512-MGrXJVAI5x+Bfth/pU9Kst1iWID6GHDLEzFEnyULB/sFiRLgkd8NPK/PeeXxktA3T6EIIaq8U3KcbTU5XFcP2Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@lit-labs/ssr-dom-shim": "^1.2.0",
+ "@lit/reactive-element": "^2.1.0",
+ "lit-html": "^3.3.0"
+ }
+ },
+ "node_modules/lit-html": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.0.tgz",
+ "integrity": "sha512-RHoswrFAxY2d8Cf2mm4OZ1DgzCoBKUKSPvA1fhtSELxUERq2aQQ2h05pO9j81gS1o7RIRJ+CePLogfyahwmynw==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@types/trusted-types": "^2.0.2"
+ }
+ },
"node_modules/loader-runner": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
@@ -9881,9 +10251,9 @@
"license": "MIT"
},
"node_modules/loupe": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz",
- "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==",
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz",
+ "integrity": "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==",
"dev": true,
"license": "MIT"
},
@@ -9974,52 +10344,52 @@
}
},
"node_modules/markdownlint": {
- "version": "0.37.4",
- "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.37.4.tgz",
- "integrity": "sha512-u00joA/syf3VhWh6/ybVFkib5Zpj2e5KB/cfCei8fkSRuums6nyisTWGqjTWIOFoFwuXoTBQQiqlB4qFKp8ncQ==",
+ "version": "0.38.0",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.38.0.tgz",
+ "integrity": "sha512-xaSxkaU7wY/0852zGApM8LdlIfGCW8ETZ0Rr62IQtAnUMlMuifsg09vWJcNYeL4f0anvr8Vo4ZQar8jGpV0btQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "markdown-it": "14.1.0",
- "micromark": "4.0.1",
- "micromark-core-commonmark": "2.0.2",
- "micromark-extension-directive": "3.0.2",
+ "micromark": "4.0.2",
+ "micromark-core-commonmark": "2.0.3",
+ "micromark-extension-directive": "4.0.0",
"micromark-extension-gfm-autolink-literal": "2.1.0",
"micromark-extension-gfm-footnote": "2.1.0",
- "micromark-extension-gfm-table": "2.1.0",
+ "micromark-extension-gfm-table": "2.1.1",
"micromark-extension-math": "3.1.0",
- "micromark-util-types": "2.0.1"
+ "micromark-util-types": "2.0.2"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/DavidAnson"
}
},
"node_modules/markdownlint-cli": {
- "version": "0.44.0",
- "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.44.0.tgz",
- "integrity": "sha512-ZJTAONlvF9NkrIBltCdW15DxN9UTbPiKMEqAh2EU2gwIFlrCMavyCEPPO121cqfYOrLUJWW8/XKWongstmmTeQ==",
+ "version": "0.45.0",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.45.0.tgz",
+ "integrity": "sha512-GiWr7GfJLVfcopL3t3pLumXCYs8sgWppjIA1F/Cc3zIMgD3tmkpyZ1xkm1Tej8mw53B93JsDjgA3KOftuYcfOw==",
"dev": true,
"license": "MIT",
"dependencies": {
"commander": "~13.1.0",
- "glob": "~10.4.5",
- "ignore": "~7.0.3",
+ "glob": "~11.0.2",
+ "ignore": "~7.0.4",
"js-yaml": "~4.1.0",
"jsonc-parser": "~3.3.1",
"jsonpointer": "~5.0.1",
- "markdownlint": "~0.37.4",
- "minimatch": "~9.0.5",
+ "markdown-it": "~14.1.0",
+ "markdownlint": "~0.38.0",
+ "minimatch": "~10.0.1",
"run-con": "~1.3.2",
- "smol-toml": "~1.3.1"
+ "smol-toml": "~1.3.4"
},
"bin": {
"markdownlint": "markdownlint.js"
},
"engines": {
- "node": ">=18"
+ "node": ">=20"
}
},
"node_modules/markdownlint-cli/node_modules/commander": {
@@ -10033,36 +10403,55 @@
}
},
"node_modules/markdownlint-cli/node_modules/glob": {
- "version": "10.4.5",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
- "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
+ "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==",
"dev": true,
"license": "ISC",
"dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^3.1.2",
- "minimatch": "^9.0.4",
+ "foreground-child": "^3.3.1",
+ "jackspeak": "^4.1.1",
+ "minimatch": "^10.0.3",
"minipass": "^7.1.2",
"package-json-from-dist": "^1.0.0",
- "path-scurry": "^1.11.1"
+ "path-scurry": "^2.0.0"
},
"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": "7.0.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz",
- "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
+ "node_modules/markdownlint-cli/node_modules/jackspeak": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz",
+ "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==",
+ "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",
@@ -10070,17 +10459,28 @@
"dev": true,
"license": "MIT"
},
- "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==",
+ "node_modules/markdownlint-cli/node_modules/lru-cache": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.1.0.tgz",
+ "integrity": "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==",
"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": {
- "brace-expansion": "^2.0.1"
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
@@ -10162,14 +10562,14 @@
}
},
"node_modules/mermaid": {
- "version": "11.6.0",
- "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz",
- "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==",
+ "version": "11.7.0",
+ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.7.0.tgz",
+ "integrity": "sha512-/1/5R0rt0Z1Ak0CuznAnCF3HtQgayRXUz6SguzOwN4L+DuCobz0UxnQ+ZdTSZ3AugKVVh78tiVmsHpHWV25TCw==",
"license": "MIT",
"dependencies": {
"@braintree/sanitize-url": "^7.0.4",
"@iconify/utils": "^2.1.33",
- "@mermaid-js/parser": "^0.4.0",
+ "@mermaid-js/parser": "^0.5.0",
"@types/d3": "^7.4.3",
"cytoscape": "^3.29.3",
"cytoscape-cose-bilkent": "^4.1.0",
@@ -10178,7 +10578,7 @@
"d3-sankey": "^0.12.3",
"dagre-d3-es": "7.0.11",
"dayjs": "^1.11.13",
- "dompurify": "^3.2.4",
+ "dompurify": "^3.2.5",
"katex": "^0.16.9",
"khroma": "^2.1.0",
"lodash-es": "^4.17.21",
@@ -10196,9 +10596,9 @@
"license": "MIT"
},
"node_modules/mermaid/node_modules/marked": {
- "version": "15.0.11",
- "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.11.tgz",
- "integrity": "sha512-1BEXAU2euRCG3xwgLVT1y0xbJEld1XOrmRJpUwRCcy7rxhSCwMrmEu9LXoPhHSCJG41V7YcQ2mjKRr5BA3ITIA==",
+ "version": "15.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz",
+ "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==",
"license": "MIT",
"bin": {
"marked": "bin/marked.js"
@@ -10208,9 +10608,9 @@
}
},
"node_modules/micromark": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz",
- "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==",
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
+ "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
"dev": true,
"funding": [
{
@@ -10244,9 +10644,9 @@
}
},
"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==",
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
+ "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
"dev": true,
"funding": [
{
@@ -10279,9 +10679,9 @@
}
},
"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==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz",
+ "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10337,9 +10737,9 @@
}
},
"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==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
+ "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -10727,9 +11127,9 @@
"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==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
+ "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
"dev": true,
"funding": [
{
@@ -10808,12 +11208,12 @@
}
},
"node_modules/minimatch": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
- "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
+ "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
"license": "ISC",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "@isaacs/brace-expansion": "^5.0.0"
},
"engines": {
"node": "20 || >=22"
@@ -11632,9 +12032,9 @@
}
},
"node_modules/postcss": {
- "version": "8.5.2",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz",
- "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==",
+ "version": "8.5.5",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz",
+ "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==",
"funding": [
{
"type": "opencollective",
@@ -11651,7 +12051,7 @@
],
"license": "MIT",
"dependencies": {
- "nanoid": "^3.3.8",
+ "nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -11853,9 +12253,9 @@
}
},
"node_modules/postcss-nesting": {
- "version": "13.0.1",
- "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz",
- "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==",
+ "version": "13.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.2.tgz",
+ "integrity": "sha512-1YCI290TX+VP0U/K/aFxzHzQWHWURL+CtHMSbex1lCdpXD1SoR2sYuxDu5aNI9lPoXpKTCggFZiDJbwylU0LEQ==",
"funding": [
{
"type": "github",
@@ -11868,7 +12268,7 @@
],
"license": "MIT-0",
"dependencies": {
- "@csstools/selector-resolve-nested": "^3.0.0",
+ "@csstools/selector-resolve-nested": "^3.1.0",
"@csstools/selector-specificity": "^5.0.0",
"postcss-selector-parser": "^7.0.0"
},
@@ -11880,9 +12280,9 @@
}
},
"node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz",
- "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.1.0.tgz",
+ "integrity": "sha512-mf1LEW0tJLKfWyvn5KdDrhpxHyuxpbNwTIwOYLIvsTffeyOf85j5oIzfG0yosxDgx/sswlqBnESYUcQH0vgZ0g==",
"funding": [
{
"type": "github",
@@ -12058,6 +12458,16 @@
"dev": true,
"license": "Unlicense"
},
+ "node_modules/promise-worker-transferable": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz",
+ "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "is-promise": "^2.1.0",
+ "lie": "^3.0.2"
+ }
+ },
"node_modules/proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
@@ -12189,6 +12599,23 @@
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
},
+ "node_modules/read-package-json/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/read-package-json/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/read-package-json/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -12683,9 +13110,9 @@
}
},
"node_modules/semver": {
- "version": "7.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
- "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "version": "7.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
+ "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
@@ -12704,18 +13131,18 @@
}
},
"node_modules/seroval": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.1.tgz",
- "integrity": "sha512-F+T9EQPdLzgdewgxnBh4mSc+vde+EOkU6dC9BDuu/bfGb+UyUlqM6t8znFCTPQSuai/ZcfFg0gu79h+bVW2O0w==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz",
+ "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/seroval-plugins": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.1.tgz",
- "integrity": "sha512-dOlUoiI3fgZbQIcj6By+l865pzeWdP3XCSLdI3xlKnjCk5983yLWPsXytFOUI0BUZKG9qwqbj78n9yVcVwUqaQ==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.3.2.tgz",
+ "integrity": "sha512-0QvCV2lM3aj/U3YozDiVwx9zpH0q8A60CTWIv4Jszj/givcudPb48B+rkU5D51NJ0pTpweGMttHjboPa9/zoIQ==",
"license": "MIT",
"engines": {
"node": ">=10"
@@ -12786,16 +13213,16 @@
}
},
"node_modules/sharp": {
- "version": "0.34.1",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.1.tgz",
- "integrity": "sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==",
+ "version": "0.34.2",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz",
+ "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==",
"dev": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"dependencies": {
"color": "^4.2.3",
- "detect-libc": "^2.0.3",
- "semver": "^7.7.1"
+ "detect-libc": "^2.0.4",
+ "semver": "^7.7.2"
},
"engines": {
"node": "^18.17.0 || ^20.3.0 || >=21.0.0"
@@ -12804,8 +13231,8 @@
"url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.34.1",
- "@img/sharp-darwin-x64": "0.34.1",
+ "@img/sharp-darwin-arm64": "0.34.2",
+ "@img/sharp-darwin-x64": "0.34.2",
"@img/sharp-libvips-darwin-arm64": "1.1.0",
"@img/sharp-libvips-darwin-x64": "1.1.0",
"@img/sharp-libvips-linux-arm": "1.1.0",
@@ -12815,15 +13242,16 @@
"@img/sharp-libvips-linux-x64": "1.1.0",
"@img/sharp-libvips-linuxmusl-arm64": "1.1.0",
"@img/sharp-libvips-linuxmusl-x64": "1.1.0",
- "@img/sharp-linux-arm": "0.34.1",
- "@img/sharp-linux-arm64": "0.34.1",
- "@img/sharp-linux-s390x": "0.34.1",
- "@img/sharp-linux-x64": "0.34.1",
- "@img/sharp-linuxmusl-arm64": "0.34.1",
- "@img/sharp-linuxmusl-x64": "0.34.1",
- "@img/sharp-wasm32": "0.34.1",
- "@img/sharp-win32-ia32": "0.34.1",
- "@img/sharp-win32-x64": "0.34.1"
+ "@img/sharp-linux-arm": "0.34.2",
+ "@img/sharp-linux-arm64": "0.34.2",
+ "@img/sharp-linux-s390x": "0.34.2",
+ "@img/sharp-linux-x64": "0.34.2",
+ "@img/sharp-linuxmusl-arm64": "0.34.2",
+ "@img/sharp-linuxmusl-x64": "0.34.2",
+ "@img/sharp-wasm32": "0.34.2",
+ "@img/sharp-win32-arm64": "0.34.2",
+ "@img/sharp-win32-ia32": "0.34.2",
+ "@img/sharp-win32-x64": "0.34.2"
}
},
"node_modules/shebang-command": {
@@ -13024,14 +13452,14 @@
}
},
"node_modules/solid-js": {
- "version": "1.9.6",
- "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.6.tgz",
- "integrity": "sha512-PoasAJvLk60hRtOTe9ulvALOdLjjqxuxcGZRolBQqxOnXrBXHGzqMT4ijNhGsDAYdOgEa8ZYaAE94PSldrFSkA==",
+ "version": "1.9.7",
+ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.7.tgz",
+ "integrity": "sha512-/saTKi8iWEM233n5OSi1YHCCuh66ZIQ7aK2hsToPe4tqGm7qAejU1SwNuTPivbWAYq7SjuHVVYxxuZQNRbICiw==",
"license": "MIT",
"dependencies": {
"csstype": "^3.1.0",
- "seroval": "^1.1.0",
- "seroval-plugins": "^1.1.0"
+ "seroval": "~1.3.0",
+ "seroval-plugins": "~1.3.0"
}
},
"node_modules/sortablejs": {
@@ -13161,12 +13589,15 @@
"spdx-ranges": "^2.0.0"
}
},
- "node_modules/stable-hash": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz",
- "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==",
+ "node_modules/stable-hash-x": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.1.1.tgz",
+ "integrity": "sha512-l0x1D6vhnsNUGPFVDx45eif0y6eedVC8nm5uACTrVFJFtl2mLRW17aWtVyxFCpn5t94VUPkjU8vSLwIuwwqtJQ==",
"dev": true,
- "license": "MIT"
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
},
"node_modules/stackback": {
"version": "0.0.2",
@@ -13193,6 +13624,20 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/stop-iteration-iterator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz",
+ "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "internal-slot": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
@@ -13335,6 +13780,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/strip-literal": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz",
+ "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^9.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
"node_modules/style-search": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -13343,9 +13801,9 @@
"license": "ISC"
},
"node_modules/stylelint": {
- "version": "16.19.1",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.19.1.tgz",
- "integrity": "sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw==",
+ "version": "16.20.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.20.0.tgz",
+ "integrity": "sha512-B5Myu9WRxrgKuLs3YyUXLP2H0mrbejwNxPmyADlACWwFsrL8Bmor/nTSh4OMae5sHjOz6gkSeccQH34gM4/nAw==",
"dev": true,
"funding": [
{
@@ -13369,15 +13827,15 @@
"cosmiconfig": "^9.0.0",
"css-functions-list": "^3.2.3",
"css-tree": "^3.1.0",
- "debug": "^4.3.7",
+ "debug": "^4.4.1",
"fast-glob": "^3.3.3",
"fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^10.0.8",
+ "file-entry-cache": "^10.1.0",
"global-modules": "^2.0.0",
"globby": "^11.1.0",
"globjoin": "^0.1.4",
"html-tags": "^3.3.1",
- "ignore": "^7.0.3",
+ "ignore": "^7.0.4",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
"known-css-properties": "^0.36.0",
@@ -13449,9 +13907,9 @@
}
},
"node_modules/stylelint/node_modules/@csstools/media-query-list-parser": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
- "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz",
+ "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==",
"dev": true,
"funding": [
{
@@ -13468,8 +13926,8 @@
"node": ">=18"
},
"peerDependencies": {
- "@csstools/css-parser-algorithms": "^3.0.4",
- "@csstools/css-tokenizer": "^3.0.3"
+ "@csstools/css-parser-algorithms": "^3.0.5",
+ "@csstools/css-tokenizer": "^3.0.4"
}
},
"node_modules/stylelint/node_modules/@csstools/selector-specificity": {
@@ -13495,74 +13953,38 @@
"postcss-selector-parser": "^7.0.0"
}
},
- "node_modules/stylelint/node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true,
- "license": "MIT"
- },
"node_modules/stylelint/node_modules/file-entry-cache": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.0.tgz",
- "integrity": "sha512-Et/ex6smi3wOOB+n5mek+Grf7P2AxZR5ueqRUvAAn4qkyatXi3cUC1cuQXVkX0VlzBVsN4BkWJFmY/fYiRTdww==",
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-10.1.1.tgz",
+ "integrity": "sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==",
"dev": true,
"license": "MIT",
"dependencies": {
- "flat-cache": "^6.1.9"
+ "flat-cache": "^6.1.10"
}
},
"node_modules/stylelint/node_modules/flat-cache": {
- "version": "6.1.9",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.9.tgz",
- "integrity": "sha512-DUqiKkTlAfhtl7g78IuwqYM+YqvT+as0mY+EVk6mfimy19U79pJCzDZQsnqk3Ou/T6hFXWLGbwbADzD/c8Tydg==",
+ "version": "6.1.10",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.10.tgz",
+ "integrity": "sha512-B6/v1f0NwjxzmeOhzfXPGWpKBVA207LS7lehaVKQnFrVktcFRfkzjZZ2gwj2i1TkEUMQht7ZMJbABUT5N+V1Nw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "cacheable": "^1.9.0",
+ "cacheable": "^1.10.0",
"flatted": "^3.3.3",
- "hookified": "^1.8.2"
+ "hookified": "^1.9.1"
}
},
"node_modules/stylelint/node_modules/ignore": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz",
- "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
- "node_modules/stylelint/node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
"node_modules/stylelint/node_modules/postcss-safe-parser": {
"version": "7.0.1",
"resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
@@ -13673,6 +14095,21 @@
"node": ">=16 || 14 >=14.17"
}
},
+ "node_modules/sucrase/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/sucrase/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/sucrase/node_modules/commander": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
@@ -13930,22 +14367,22 @@
}
},
"node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
+ "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/terser": {
- "version": "5.39.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.1.tgz",
- "integrity": "sha512-Mm6+uad0ZuDtcV8/4uOZQDQ8RuiC5Pu+iZRedJtF7yA/27sPL7d++In/AJKpWZlU3SYMPPkVfwetn6sgZ66pUA==",
+ "version": "5.43.1",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
+ "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
+ "acorn": "^8.14.0",
"commander": "^2.20.0",
"source-map-support": "~0.5.20"
},
@@ -14011,6 +14448,23 @@
"node": ">=18"
}
},
+ "node_modules/test-exclude/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+ "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/test-exclude/node_modules/glob": {
"version": "10.4.5",
"resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
@@ -14076,6 +14530,13 @@
"node": ">=0.8"
}
},
+ "node_modules/three": {
+ "version": "0.172.0",
+ "resolved": "https://registry.npmjs.org/three/-/three-0.172.0.tgz",
+ "integrity": "sha512-6HMgMlzU97MsV7D/tY8Va38b83kz8YJX+BefKjspMNAv0Vx6dxMogHOrnRl/sbMIs3BPUKijPqDqJ/+UwJbIow==",
+ "license": "MIT",
+ "peer": true
+ },
"node_modules/throttle-debounce": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
@@ -14105,9 +14566,9 @@
"license": "MIT"
},
"node_modules/tinyglobby": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
- "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "version": "0.2.14",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
+ "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -14122,9 +14583,9 @@
}
},
"node_modules/tinyglobby/node_modules/fdir": {
- "version": "6.4.4",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
- "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "version": "6.4.6",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
+ "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -14150,9 +14611,9 @@
}
},
"node_modules/tinypool": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz",
- "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz",
+ "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==",
"dev": true,
"license": "MIT",
"engines": {
@@ -14170,9 +14631,9 @@
}
},
"node_modules/tinyspy": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz",
- "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz",
+ "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==",
"dev": true,
"license": "MIT",
"engines": {
@@ -14411,15 +14872,15 @@
}
},
"node_modules/typescript-eslint": {
- "version": "8.31.1",
- "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.31.1.tgz",
- "integrity": "sha512-j6DsEotD/fH39qKzXTQRwYYWlt7D+0HmfpOK+DVhwJOFLcdmn92hq3mBb7HlKJHbjjI/gTOqEcc9d6JfpFf/VA==",
+ "version": "8.34.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.34.0.tgz",
+ "integrity": "sha512-MRpfN7uYjTrTGigFCt8sRyNqJFhjN0WwZecldaqhWm+wy0gaRt8Edb/3cuUy0zdq2opJWT6iXINKAtewnDOltQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/eslint-plugin": "8.31.1",
- "@typescript-eslint/parser": "8.31.1",
- "@typescript-eslint/utils": "8.31.1"
+ "@typescript-eslint/eslint-plugin": "8.34.0",
+ "@typescript-eslint/parser": "8.34.0",
+ "@typescript-eslint/utils": "8.34.0"
},
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -14494,9 +14955,9 @@
}
},
"node_modules/unrs-resolver": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz",
- "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==",
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.1.tgz",
+ "integrity": "sha512-4AZVxP05JGN6DwqIkSP4VKLOcwQa5l37SWHF/ahcuqBMbfxbpN1L1QKafEhWCziHhzKex9H/AR09H0OuVyU+9g==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -14504,26 +14965,28 @@
"napi-postinstall": "^0.2.2"
},
"funding": {
- "url": "https://github.com/sponsors/JounQin"
+ "url": "https://opencollective.com/unrs-resolver"
},
"optionalDependencies": {
- "@unrs/resolver-binding-darwin-arm64": "1.7.2",
- "@unrs/resolver-binding-darwin-x64": "1.7.2",
- "@unrs/resolver-binding-freebsd-x64": "1.7.2",
- "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2",
- "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2",
- "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2",
- "@unrs/resolver-binding-linux-arm64-musl": "1.7.2",
- "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2",
- "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2",
- "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2",
- "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2",
- "@unrs/resolver-binding-linux-x64-gnu": "1.7.2",
- "@unrs/resolver-binding-linux-x64-musl": "1.7.2",
- "@unrs/resolver-binding-wasm32-wasi": "1.7.2",
- "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2",
- "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2",
- "@unrs/resolver-binding-win32-x64-msvc": "1.7.2"
+ "@unrs/resolver-binding-android-arm-eabi": "1.9.1",
+ "@unrs/resolver-binding-android-arm64": "1.9.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.9.1",
+ "@unrs/resolver-binding-darwin-x64": "1.9.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.9.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.9.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.9.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.9.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.9.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.9.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.9.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.9.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.9.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.9.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.9.1"
}
},
"node_modules/update-browserslist-db": {
@@ -14705,17 +15168,17 @@
}
},
"node_modules/vite-node": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.1.2.tgz",
- "integrity": "sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.3.tgz",
+ "integrity": "sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"cac": "^6.7.14",
- "debug": "^4.4.0",
- "es-module-lexer": "^1.6.0",
+ "debug": "^4.4.1",
+ "es-module-lexer": "^1.7.0",
"pathe": "^2.0.3",
- "vite": "^5.0.0 || ^6.0.0"
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0"
},
"bin": {
"vite-node": "vite-node.mjs"
@@ -14735,16 +15198,16 @@
"license": "BSD-2-Clause"
},
"node_modules/vite/node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"dev": true,
"license": "MIT"
},
"node_modules/vite/node_modules/fdir": {
- "version": "6.4.4",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
- "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "version": "6.4.6",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz",
+ "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==",
"dev": true,
"license": "MIT",
"peerDependencies": {
@@ -14784,43 +15247,14 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/vite/node_modules/postcss": {
- "version": "8.5.3",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
- "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.8",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
"node_modules/vite/node_modules/rollup": {
- "version": "4.40.2",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz",
- "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==",
+ "version": "4.44.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.44.0.tgz",
+ "integrity": "sha512-qHcdEzLCiktQIfwBq420pn2dP+30uzqYxv9ETm91wdt2R9AFcWfjNAmje4NWlnCIQ5RMTzVf0ZyisOKqHR6RwA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@types/estree": "1.0.7"
+ "@types/estree": "1.0.8"
},
"bin": {
"rollup": "dist/bin/rollup"
@@ -14830,56 +15264,58 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.40.2",
- "@rollup/rollup-android-arm64": "4.40.2",
- "@rollup/rollup-darwin-arm64": "4.40.2",
- "@rollup/rollup-darwin-x64": "4.40.2",
- "@rollup/rollup-freebsd-arm64": "4.40.2",
- "@rollup/rollup-freebsd-x64": "4.40.2",
- "@rollup/rollup-linux-arm-gnueabihf": "4.40.2",
- "@rollup/rollup-linux-arm-musleabihf": "4.40.2",
- "@rollup/rollup-linux-arm64-gnu": "4.40.2",
- "@rollup/rollup-linux-arm64-musl": "4.40.2",
- "@rollup/rollup-linux-loongarch64-gnu": "4.40.2",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2",
- "@rollup/rollup-linux-riscv64-gnu": "4.40.2",
- "@rollup/rollup-linux-riscv64-musl": "4.40.2",
- "@rollup/rollup-linux-s390x-gnu": "4.40.2",
- "@rollup/rollup-linux-x64-gnu": "4.40.2",
- "@rollup/rollup-linux-x64-musl": "4.40.2",
- "@rollup/rollup-win32-arm64-msvc": "4.40.2",
- "@rollup/rollup-win32-ia32-msvc": "4.40.2",
- "@rollup/rollup-win32-x64-msvc": "4.40.2",
+ "@rollup/rollup-android-arm-eabi": "4.44.0",
+ "@rollup/rollup-android-arm64": "4.44.0",
+ "@rollup/rollup-darwin-arm64": "4.44.0",
+ "@rollup/rollup-darwin-x64": "4.44.0",
+ "@rollup/rollup-freebsd-arm64": "4.44.0",
+ "@rollup/rollup-freebsd-x64": "4.44.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.44.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.44.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.44.0",
+ "@rollup/rollup-linux-arm64-musl": "4.44.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.44.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.44.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.44.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.44.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.44.0",
+ "@rollup/rollup-linux-x64-gnu": "4.44.0",
+ "@rollup/rollup-linux-x64-musl": "4.44.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.44.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.44.0",
+ "@rollup/rollup-win32-x64-msvc": "4.44.0",
"fsevents": "~2.3.2"
}
},
"node_modules/vitest": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.1.2.tgz",
- "integrity": "sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==",
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.3.tgz",
+ "integrity": "sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@vitest/expect": "3.1.2",
- "@vitest/mocker": "3.1.2",
- "@vitest/pretty-format": "^3.1.2",
- "@vitest/runner": "3.1.2",
- "@vitest/snapshot": "3.1.2",
- "@vitest/spy": "3.1.2",
- "@vitest/utils": "3.1.2",
+ "@types/chai": "^5.2.2",
+ "@vitest/expect": "3.2.3",
+ "@vitest/mocker": "3.2.3",
+ "@vitest/pretty-format": "^3.2.3",
+ "@vitest/runner": "3.2.3",
+ "@vitest/snapshot": "3.2.3",
+ "@vitest/spy": "3.2.3",
+ "@vitest/utils": "3.2.3",
"chai": "^5.2.0",
- "debug": "^4.4.0",
+ "debug": "^4.4.1",
"expect-type": "^1.2.1",
"magic-string": "^0.30.17",
"pathe": "^2.0.3",
+ "picomatch": "^4.0.2",
"std-env": "^3.9.0",
"tinybench": "^2.9.0",
"tinyexec": "^0.3.2",
- "tinyglobby": "^0.2.13",
- "tinypool": "^1.0.2",
+ "tinyglobby": "^0.2.14",
+ "tinypool": "^1.1.0",
"tinyrainbow": "^2.0.0",
- "vite": "^5.0.0 || ^6.0.0",
- "vite-node": "3.1.2",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0",
+ "vite-node": "3.2.3",
"why-is-node-running": "^2.3.0"
},
"bin": {
@@ -14895,8 +15331,8 @@
"@edge-runtime/vm": "*",
"@types/debug": "^4.1.12",
"@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
- "@vitest/browser": "3.1.2",
- "@vitest/ui": "3.1.2",
+ "@vitest/browser": "3.2.3",
+ "@vitest/ui": "3.2.3",
"happy-dom": "*",
"jsdom": "*"
},
@@ -14934,6 +15370,19 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
+ "node_modules/vitest/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/vitest/node_modules/tinyexec": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
@@ -14991,16 +15440,16 @@
"license": "MIT"
},
"node_modules/vue": {
- "version": "3.5.14",
- "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.14.tgz",
- "integrity": "sha512-LbOm50/vZFG6Mhy6KscQYXZMQ0LMCC/y40HDJPPvGFQ+i/lUH+PJHR6C3assgOQiXdl6tAfsXHbXYVBZZu65ew==",
+ "version": "3.5.16",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz",
+ "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==",
"license": "MIT",
"dependencies": {
- "@vue/compiler-dom": "3.5.14",
- "@vue/compiler-sfc": "3.5.14",
- "@vue/runtime-dom": "3.5.14",
- "@vue/server-renderer": "3.5.14",
- "@vue/shared": "3.5.14"
+ "@vue/compiler-dom": "3.5.16",
+ "@vue/compiler-sfc": "3.5.16",
+ "@vue/runtime-dom": "3.5.16",
+ "@vue/server-renderer": "3.5.16",
+ "@vue/shared": "3.5.16"
},
"peerDependencies": {
"typescript": "*"
@@ -15090,9 +15539,9 @@
}
},
"node_modules/watchpack": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
- "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
+ "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"license": "MIT",
"dependencies": {
"glob-to-regexp": "^0.4.1",
@@ -15103,19 +15552,15 @@
}
},
"node_modules/webidl-conversions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
- "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=12"
- }
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "license": "BSD-2-Clause"
},
"node_modules/webpack": {
- "version": "5.99.7",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.7.tgz",
- "integrity": "sha512-CNqKBRMQjwcmKR0idID5va1qlhrqVUKpovi+Ec79ksW8ux7iS1+A6VqzfZXgVYCFRKl7XL5ap3ZoMpwBJxcg0w==",
+ "version": "5.99.9",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.99.9.tgz",
+ "integrity": "sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==",
"license": "MIT",
"dependencies": {
"@types/eslint-scope": "^3.7.7",
@@ -15235,9 +15680,9 @@
}
},
"node_modules/webpack/node_modules/@types/estree": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz",
- "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==",
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
"license": "MIT"
},
"node_modules/webpack/node_modules/eslint-scope": {
@@ -15263,9 +15708,9 @@
}
},
"node_modules/webpack/node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
+ "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
"license": "MIT",
"engines": {
"node": ">=10.13.0"
@@ -15291,12 +15736,6 @@
"webidl-conversions": "^3.0.0"
}
},
- "node_modules/whatwg-url/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "license": "BSD-2-Clause"
- },
"node_modules/which": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
@@ -15573,15 +16012,15 @@
}
},
"node_modules/yaml": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz",
- "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==",
+ "version": "2.8.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz",
+ "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
}
},
"node_modules/yargs": {
diff --git a/package.json b/package.json
index 81b7e6c3ad..3d71e94cd3 100644
--- a/package.json
+++ b/package.json
@@ -11,14 +11,15 @@
"@github/markdown-toolbar-element": "2.2.3",
"@github/quote-selection": "2.1.0",
"@github/text-expander-element": "2.8.0",
+ "@google/model-viewer": "4.1.0",
"@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
"@primer/octicons": "19.14.0",
"ansi_up": "6.0.5",
"asciinema-player": "3.8.2",
- "chart.js": "4.4.9",
+ "chart.js": "4.5.0",
"chartjs-adapter-dayjs-4": "1.0.4",
"chartjs-plugin-zoom": "2.2.0",
- "clippie": "4.1.6",
+ "clippie": "4.1.7",
"css-loader": "7.0.0",
"dayjs": "1.11.12",
"dropzone": "6.0.0-beta.2",
@@ -30,15 +31,15 @@
"idiomorph": "0.3.0",
"jquery": "3.7.1",
"katex": "0.16.22",
- "mermaid": "11.6.0",
+ "mermaid": "11.7.0",
"mini-css-extract-plugin": "2.9.2",
- "minimatch": "10.0.1",
+ "minimatch": "10.0.3",
"monaco-editor": "0.52.2",
"monaco-editor-webpack-plugin": "7.1.0",
"pdfobject": "2.3.0",
- "postcss": "8.5.2",
+ "postcss": "8.5.5",
"postcss-loader": "8.1.1",
- "postcss-nesting": "13.0.1",
+ "postcss-nesting": "13.0.2",
"pretty-ms": "9.0.0",
"sortablejs": "1.15.6",
"swagger-ui-dist": "5.17.14",
@@ -50,56 +51,55 @@
"tributejs": "5.1.3",
"uint8-to-base64": "0.2.0",
"vanilla-colorful": "0.7.2",
- "vue": "3.5.14",
+ "vue": "3.5.16",
"vue-chartjs": "5.3.1",
"vue-loader": "17.4.2",
"vue3-calendar-heatmap": "2.0.5",
- "webpack": "5.99.7",
+ "webpack": "5.99.9",
"webpack-cli": "6.0.1",
"wrap-ansi": "9.0.0"
},
"devDependencies": {
- "@axe-core/playwright": "4.10.1",
+ "@axe-core/playwright": "4.10.2",
"@eslint-community/eslint-plugin-eslint-comments": "4.5.0",
"@playwright/test": "1.52.0",
"@stoplight/spectral-cli": "6.15.0",
- "@stylistic/eslint-plugin-js": "4.2.0",
+ "@stylistic/eslint-plugin": "4.4.1",
"@stylistic/stylelint-plugin": "3.1.2",
- "@typescript-eslint/parser": "8.31.1",
- "@vitejs/plugin-vue": "5.2.3",
- "@vitest/coverage-v8": "3.1.2",
- "@vitest/eslint-plugin": "1.1.43",
+ "@vitejs/plugin-vue": "5.2.4",
+ "@vitest/coverage-v8": "3.2.3",
+ "@vitest/eslint-plugin": "1.2.2",
"@vue/test-utils": "2.4.6",
- "eslint": "9.25.1",
- "eslint-import-resolver-typescript": "4.3.4",
+ "eslint": "9.28.0",
+ "eslint-import-resolver-typescript": "4.4.3",
"eslint-plugin-array-func": "5.0.2",
- "eslint-plugin-import-x": "4.11.0",
+ "eslint-plugin-import-x": "4.15.1",
"eslint-plugin-no-jquery": "3.1.1",
"eslint-plugin-no-use-extend-native": "0.7.2",
"eslint-plugin-playwright": "2.2.0",
- "eslint-plugin-regexp": "2.7.0",
+ "eslint-plugin-regexp": "2.9.0",
"eslint-plugin-sonarjs": "3.0.2",
- "eslint-plugin-unicorn": "59.0.0",
"eslint-plugin-toml": "0.12.0",
+ "eslint-plugin-unicorn": "59.0.1",
"eslint-plugin-vitest-globals": "1.5.0",
- "eslint-plugin-vue": "10.1.0",
- "eslint-plugin-vue-scoped-css": "2.9.0",
- "eslint-plugin-wc": "2.2.1",
+ "eslint-plugin-vue": "10.2.0",
+ "eslint-plugin-vue-scoped-css": "2.10.0",
+ "eslint-plugin-wc": "3.0.1",
"globals": "16.1.0",
- "happy-dom": "17.4.6",
+ "happy-dom": "18.0.0",
"license-checker-rseidelsohn": "4.4.2",
- "markdownlint-cli": "0.44.0",
+ "markdownlint-cli": "0.45.0",
"postcss-html": "1.8.0",
- "sharp": "0.34.1",
- "stylelint": "16.19.1",
+ "sharp": "0.34.2",
+ "stylelint": "16.20.0",
"stylelint-declaration-block-no-ignored-properties": "2.8.0",
"stylelint-declaration-strict-value": "1.10.11",
"stylelint-value-no-unknown-custom-properties": "6.0.1",
"svgo": "3.2.0",
"typescript": "5.8.3",
- "typescript-eslint": "8.31.1",
+ "typescript-eslint": "8.34.0",
"vite-string-plugin": "1.3.4",
- "vitest": "3.1.2"
+ "vitest": "3.2.3"
},
"browserslist": [
"defaults"
diff --git a/release-notes-published/11.0.2.md b/release-notes-published/11.0.2.md
new file mode 100644
index 0000000000..a1a8549984
--- /dev/null
+++ b/release-notes-published/11.0.2.md
@@ -0,0 +1,33 @@
+
+
+
+
+## Release notes
+
+- Features
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7986) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7991)): feat: make Forgejo Actions server logs less noisy
+- Bug fixes
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8155) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8167)): fix: do not fail when release or wiki is set in `/repos/migrate` API
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7976) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7985)): fix: ignore expired artifacts for quota calculation
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7979) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7983)): fix: pull request cross references
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7883) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7886)): fix: quote reply in Chromium
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7775) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7779)): fix: make hash pattern more strict
+- Included for completeness but not worth a release note
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8112) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8120)): fix: remove download attribute from external assets
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8110): Update bleve to v2.5.2 with changes made in backport of 2.5.0
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8094) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8095)): fix: show membership of limited orgs
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8059): Update dependency go to v1.24.3 (v11.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8057): chore: drop unused `@typescript-eslint/parser` package
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/8021) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8022)): chore(cleanup): suppress non actionable XORM warnings
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7987) ([backported](https://codeberg.org/forgejo/forgejo/pulls/8000)): fix: aggregate deleted team as ghost team
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7925) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7937)): fix(ui): center footer links
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7894) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7903)): fix(ui): fix force-push compare line layout
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7884) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7887)): fix: parse `change-id` in the git commit header
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7885): Update module github.com/blevesearch/bleve/v2 to v2.5.1 (v11.0/forgejo) - abandoned
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7746) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7871)): fix(ui): improve force-push compare line layout
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7640) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7869)): fix: Remove "create branch" button on mirrored repos
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7858): Update module github.com/msteinert/pam/v2 to v2.1.0 (v11.0/forgejo)
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7817) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7821)): fix: replace ß with ss in normalizeUserName
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7784) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7786)): fix(api): document `is_system_webhook` field
+ - [PR](https://codeberg.org/forgejo/forgejo/pulls/7773) ([backported](https://codeberg.org/forgejo/forgejo/pulls/7774)): fix: remove artificial delay for PR update
+
diff --git a/release-notes-published/12.0.0.md b/release-notes-published/12.0.0.md
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/release-notes/6813.md b/release-notes/6813.md
new file mode 100644
index 0000000000..bd9da8dc39
--- /dev/null
+++ b/release-notes/6813.md
@@ -0,0 +1 @@
+Reimplemented editor Tab key handling with accessibility safeguards. Balance having the editor work as expected by developers (with Tab key affecting indentation) while also not impeding keyboard navigation.
diff --git a/release-notes/8035.md b/release-notes/8035.md
new file mode 100644
index 0000000000..541fe35277
--- /dev/null
+++ b/release-notes/8035.md
@@ -0,0 +1 @@
+The `forgejo docs` command is deprecated and CLI errors are now displayed on stderr instead of stdout. These breaking changes happened because the package used to parse the command line arguments was [upgraded from v2 to v3](https://cli.urfave.org/migrate-v2-to-v3/). A [separate project was initiated](https://github.com/urfave/cli-docs) to re-implement the `docs` command, but it is not yet production ready.
diff --git a/renovate.json b/renovate.json
index 3903e316db..7796490544 100644
--- a/renovate.json
+++ b/renovate.json
@@ -8,14 +8,13 @@
],
"baseBranches": [
"$default",
- "/^v7\\.\\d+/forgejo$/",
"/^v11\\.\\d+/forgejo$/"
],
"postUpdateOptions": ["gomodTidy", "gomodUpdateImportPaths", "npmDedupe"],
"prConcurrentLimit": 10,
"osvVulnerabilityAlerts": true,
"automergeStrategy": "squash",
- "labels": ["dependency-upgrade","test/not-needed"],
+ "labels": ["dependency-upgrade", "test/not-needed"],
"packageRules": [
{
"description": "Require approval for python minor version",
@@ -37,8 +36,7 @@
"description": "Schedule some deps less frequently",
"matchPackageNames": [
"code.forgejo.org/f3/gof3/**",
- "github.com/google/pprof",
- "github.com/golangci/misspell/cmd/misspell"
+ "github.com/google/pprof"
],
"extends": ["schedule:quarterly"]
},
@@ -145,21 +143,19 @@
"matchPackageNames": ["monaco-editor"],
"minimumReleaseAge": "30 days"
},
+ {
+ "description": "Disable indirect updates for stable branches",
+ "matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"],
+ "matchManagers": ["gomod"],
+ "matchUpdateTypes": ["major", "minor", "patch", "digest"],
+ "matchDepTypes": ["indirect"],
+ "enabled": false
+ },
{
"description": "Require approval for stable branches (must be last rule to override all others)",
"matchBaseBranches": ["/^v\\d+\\.\\d+\\/forgejo$/"],
"dependencyDashboardApproval": true,
"schedule": ["at any time"]
}
- ],
- "customManagers": [
- {
- "description": "Update deps inside Makefile",
- "customType": "regex",
- "fileMatch": ["^Makefile$"],
- "matchStrings": [
- " \\?= (?Do not use if there is no strong requirement. Do not use grey/black buttons, they don't work well with dark theme.
- - - - - - diff --git a/templates/devtest/hashbox.tmpl b/templates/devtest/hashbox.tmpl new file mode 100644 index 0000000000..7321c9956d --- /dev/null +++ b/templates/devtest/hashbox.tmpl @@ -0,0 +1,82 @@ +{{template "base/head" .}} + +